如何为Nginx,Apache和WordPress设置反向代理服务器

Apache以其速度而闻名。 相反,Apache因其肿且在高流量下表现良好而赢得了声誉。 但是,Apache仍然是全球范围内最流行的Web服务器,并且由于其熟悉性和htaccess而被许多托管公司使用。 如果您出于某种原因仍然喜欢Apache,并且想加快WordPress网站的速度,则可以在Apache前面放置Nginx反向代理缓存解决方案,为用户提供更快的选择。

Nginx在Apache之前充当反向代理缓存。 Nginx侦听端口80,Apache侦听端口8080。Nginx将提供任何内容,可以缓存,同时所有其他请求都路由到Apache,以使用MySQL或MariaDB进行PHP处理。

注意: 本指南 不适用于WooCommerce,将发布适用于WooCommerce的Nginx新指南。

常规安装信息

Nginx反向代理的Apache配置说明

Apache打开端口文件

sudo nano /etc/apache2/ports.conf

将端口更改为8080

Listen 8080

打开Apache虚拟主机

nano /etc/apache2/sites-available/wordpress.conf

更改虚拟主机中的端口8080

<VirtualHost *:8080>

按Ctrl + X,Y和Enter保存

您将需要改变 您所有的Apache虚拟主机监听端口8080。

安装和配置Apache之后,将恢复它,以避免任何Nginx停机。

安装Nginx

安装Nginx和Nginx-extras以获取模块 ngx_cache_purge这将使管理Nginx代理缓存更加容易。

sudo apt-get install nginx nginx-extras -y

创建nginx配置

sudo nano /etc/nginx/sites-available/reverse

粘贴Nginx配置,我们需要在顶部有一个缓冲区来防止此错误( 来源

upstream sent too big header while reading response header from upstream errors with buffers

这是Nginx代理缓存的实际配置,请注意,它并未针对WooCommerce进行优化。

#fix 504 gateway timeouts, can go in nginx.conf
proxy_connect_timeout       600;
proxy_send_timeout          600;
proxy_read_timeout          600;
send_timeout                600;
#set the location of the cached files, zone, name, size (1000 MB) and how long to cache for 600 minutes
proxy_cache_path  /var/run/proxy_cache levels=1:2 keys_zone=WORDPRESS-PROXY:10m max_size=1000m inactive=600m;
proxy_cache_key $scheme$host$request_uri;
#prevent header too large errors
proxy_buffers 256 16k;
proxy_buffer_size 32k;
#httpoxy exploit protection
proxy_set_header Proxy "";

server {
listen          80 default;
access_log /var/log/nginx/proxy-access.log;
error_log /var/log/nginx/proxy-error.log;
add_header X-Cache $upstream_cache_status;

set $do_not_cache 0;
set $bypass 0;

#security for bypass
if ($remote_addr ~ "^(127.0.0.1|Web.Server.IP)$") {
        set $bypass $http_secret_header;
    }

if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
            set $do_not_cache 1;
        }

location / {
	proxy_set_header Host $host;
        proxy_redirect off;
        proxy_cache WORDPRESS-PROXY;
        proxy_cache_revalidate on;
        proxy_ignore_headers  Expires Cache-Control;
        proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
        proxy_cache_bypass $bypass $do_not_cache;
        proxy_no_cache $do_not_cache;
        proxy_cache_valid 200 301 302 500m;
        proxy_cache_valid 404 1m;
        #can rename PURGE to whatever you want, should restrict it to backend server requests for security
	proxy_cache_purge PURGE from 127.0.0.1 Web.Server.IP;
        proxy_pass  http://127.0.0.1:8080;
        }

location ~ /purge(/.*) {
        allow 127.0.0.1;
        allow Web.Server.IP;
        deny all;
        proxy_cache_purge WORDPRESS-PROXY $scheme$host$1;
        }
}

按Ctrl + X,Y并按Enter

为WordPress虚拟主机的Nginx反向代理缓存创建符号链接,以在我们重新启动Nginx时启用它

sudo ln -s /etc/nginx/sites-available/reverse /etc/nginx/sites-enabled/reverse

取消链接Nginx默认虚拟主机

unlink /etc/nginx/sites-enabled/default

重新启动Apache和Nginx

sudo service apache2 restart
sudo service nginx restart

测试Nginx反向代理缓存

我们可以使用curl来检查Nginx反向代理缓存在我们的WordPress网站上是否正在运行。

sudo apt-get install curl -y

现在已经安装了Curl,我们可以开始在Apache前面测试Nginx反向代理。

在Web服务器上使用SSH运行cURL命令。 这将检查反向代理是否缓存了您的主页,并且-I标志确保我们从反向代理获取了响应头。

curl -I https://andreyex.ru/

这里的关键是X-Cache状态

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:28:26 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Cache: HIT

如果未缓存主页,您将在响应中获得X-Cache

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:28:26 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Cache: MISS

有时,您可能需要两次对同一URL进行cURL获取HIT响应。

Nginx缓存存储

如果查看proxy_cache_path文件夹,您会看到一堆随机字母和数字,它们在级别= 1:2下解析。这似乎很奇怪,因为Nginx将缓存作为基于proxy_cache_key的url的md5哈希存储。 我们使用$ scheme $ host $ uri where

  • $ scheme = http
  • $主机=域
  • $ request_uri =网址

所以对于此页面https://andreyex.ru/kontakty

  • $ scheme是https
  • $主机是andreyex.ru
  • $ request_uri是/ kontakty

我们可以通过Debian上的md5生成器来传递它

echo https://andreyex.ru/kontakty | md5sum

它产生这个md5数量

c301d2e9d39fa7434a56322a09dbab17

Nginx使用哪一个基于proxy_cache_path = 1:2级别创建文件夹结构

c301d2e9d39fa7434a56322a09dbab17

从级别= 1:2,其中1成为顶层文件夹,2成为其子目录,原始md5哈希作为文件名

/var/run/proxy-cache/7/b1/c301d2e9d39fa7434a56322a09dbab17

了解Nginx缓存的工作方式意味着我们可以有选择地从反向代理缓存中删除项目。

刷新和使Nginx反向代理缓存无效

多亏了模块 ngx_cache_purge它包含在Nginx-extras模块中,我们有几种方法可以强制选择性地使缓存失效。 我们的目标是使用此插件缓存整个站点,以便您的WordPress站点被完全缓存并且始终保持快速。 更新内容时,我们希望清除那些已更改的帖子,页面或类别的缓存,并立即用新的新元素替换这些旧元素,以便您的用户获得最快的体验。

  • Nginx代理缓存存储在/ var / run / proxy-cache文件夹中的文件夹结构中,在其中我们可以有选择地删除某些项目或删除所有内容以清除整个缓存
  • BYPASS允许您通过询问Web服务器在新版本中建议使用WordPress的位置来强制刷新帖子或页面
    • 更新的项目将替换Nginx反向代理缓存中不推荐使用的项目
  • 清除方法proxy_cache_purge允许使用非RFC HTTP方法 从缓存中清除特定项目
  • URL /清除,该方法允许您将URL附加到清除位置以清除特定元素

清除Nginx反向代理中的所有缓存

如果要清除整个缓存,则只需手动删除代理缓存文件夹的内容

rm -R /var/run/proxy-cache/*

如果需要,还可以通过生成完整URL的MD5哈希来删除特定项,或者要递归地清除和删除proxy_cache_path文件夹中的特定文件夹和子文件夹。

如果要使用正则表达式(也称为通配符)清除整个缓存,则唯一的选择是使用 Nginx加那要花钱。 Nginx Plus工程师知道,拥有高性能的WordPress网站意味着始终将整个网站保持在缓存中,因此大型公司将为灵活的缓存管理付费。

使用BYPASS方法更新Nginx反向代理中的产品

到目前为止,绕过是更新Nginx反向代理缓存的最佳方法。 使用proxy_cache_bypass,您可以从WordPress Web服务器强制使用URL的新版本,并用新的新版本替换旧的过时版本。 您的用户将永远不会以这种方式获取旧内容,也永远不会从Web服务器上即时获取缓慢的PHP编译(除非它们是可缓存的)。

在上面的块中,我们已经实现了 proxy_cache_bypass 仅用于来自我们的Web服务器或反向代理服务器本身的请求

我们为来自Web服务器和反向代理的传入请求启用了一个秘密标头,因此我们可以使用这些服务器中带有Curl的秘密标头进行检查。

curl -I https://andreyex.ru -H "secret-header: true"

您将看到此输出显示 BYPASSX-Cache header

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:28:26 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Cache: BYPASS

如果您从另一台服务器尝试相同的Curl命令,则只会看到HIT响应

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:28:26 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Cache: HIT

使用PURGE方法更新Nginx反向代理中的项目

PURGE方法由模块提供 ngx_cache_purge 在nginx-extras包中。

为了使这种方法起作用,我找到了proxy_cache_key,它应该设置为$ scheme $ host $ request_uri,但是您的经验可能会有所不同。

要发送PURGE请求,请使用以下语法,proxy_cache_purge模块会将请求转换为URL的md5哈希,并从Nginx反向代理虚拟主机的proxy_cache_path文件夹中删除该项目。

curl -X PURGE -I https://andreyex.ru

如果反向代理具有文件,则您将收到200响应,表示成功

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:38:26 GMT
Content-Type: text/html
Content-Length: 277
Connection: keep-alive

如果Nginx反向代理服务器没有此特定的缓存URL,则您将获得404

HTTP/1.1 404 Not Found
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:38:26 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

如果Nginx反向代理检测到您的IP地址上不允许PURGE请求,您将收到响应:403 Forbidden

HTTP/1.1 403 Forbidden
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:38:26 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

这种类型的Nginx反向代理安全性很重要,因为它将PURGE请求限制在您信任的服务器的白名单中

使用/清除URL方法清除Nginx反向代理中的项目

/清除URL方法使用特定的URL来调用我们上面实现的Nginx proxy_cache_purge方法。

Curl命令用于用url清除以清除主页,并显示斜线

curl https://andreyex.ru/purge/ -I

如果主页被Nginx缓存到反向代理,并且您成功清除了它,您将看到此响应。

HTTP/1.1 200 OK
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:38:26 GMT
Content-Type: text/html
Content-Length: 277
Connection: keep-alive

如果您的Nginx反向代理在WordPress中没有缓存的主页,则会看到404错误

HTTP/1.1 404 Not Found
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:38:26 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

如果您的Nginx反向代理不允许您访问位置/清除,则会收到错误消息:403 Forbidden

HTTP/1.1 403 Forbidden
Server: nginx/1.8.1
Date: Fri, 03 Feb 2017 13:38:26 GMT
Content-Type: text/html
Content-Length: 168
Connection: keep-alive

与PURGE方法类似,我们通过将IP地址列入白名单来限制对/清除位置的访问,以使攻击者无法使WordPress Web服务器超载。

Sidebar