WordPress 配置前端服务器转发优化速度

Anson 教程 122 次浏览 评论已关闭

WordPress 反代流程图

访问流程如上图。虽然绕了一圈,但能以较低成本优化网站速度(线路好主机用不起高配套餐),也可以隐藏源站 IP,在被攻击时方便切换服务器。

服务器 A(源站端)配置

先解析域名到源站,配置好网站环境,确保网站正常运行,然后下面设置。

修改 Nginx 网站配置文件,改用 IP + 端口 方式开放访问。

# 备份配置文件
cp /etc/nginx/conf.d/example.com.conf /etc/nginx/conf.d/example.com.conf.backup
# 编辑配置文件
vi /etc/nginx/conf.d/example.com.conf

例如配置使用 57319 端口。

server {
    listen      57319;
    listen      [::]:57319;
    server_name  _;
    root        /var/www/example.com;
    index       index.html index.htm index.php;

    省略其他部分...

}

设置端口权限。

# 防火墙仅允许反代机访问目标端口
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address=12.34.56.78 port port=57319 protocol=tcp accept'
firewall-cmd --permanent --add-rich-rule 'rule family="ipv6" source address=2001:0db8:86a3:08d3:1319:8a2e:0370:7344 port port=57319 protocol=tcp accept'
firewall-cmd --reload

# 设置 SELinux 允许 httpd 进程使用端口
semanage port -a -t http_port_t -p tcp 57319

创建配置文件(其中红色部分是反代机 IP),以支持在日志里记录访客 IP

cat > /etc/nginx/conf.d/http_realip.conf << "EOF"
set_real_ip_from 12.34.56.78;
set_real_ip_from 2001:0db8:86a3:08d3:1319:8a2e:0370:7344;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
EOF

刷新 Nginx 服务使配置生效。

nginx -s reload

这时就不需要 SSL 证书了,可以删除它,以后需要再申请。

# 删除 SSL 证书
acme.sh --remove -d example.com
rm -rf ~/.acme.sh/example.com

# 查询删除后的 SSL 证书域名列表
acme.sh --list

编辑 WordPress 根目录下的 wp-config.php 文件,将下面内容添加到 /* Add any custom values between this line and the "stop editing" line. *//* That's all, stop editing! Happy publishing. */ 之间,以避免反代后出现重定向循环问题。

/* WordPress reverse proxy fixes */
define('FORCE_SSL_ADMIN', true);
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
    $_SERVER['HTTPS'] = 'on';
}

服务器 B(反代端)配置

将域名解析到反代服务器,安装好 Nginx 并申请配置好 SSL 证书,用下面命令设置 SELinux 权限。

# 允许 HTTPD 脚本和模块连接网络(不设置反代会报错 502-Bad Gateway)
setsebool -P httpd_can_network_connect 1

然后创建网站反代配置文件。

vi /etc/nginx/conf.d/example.com.conf

示例反代配置如下(自行按需修改),其中 Gzip 配置在反代机上开启了,就不用在源站机上再开启,源站上的 location 规则不用复制到反代配置上,它会转发按源站规则处理。

这里没有配置反代缓存,配置上缓存会比较好,可以节省流量和减少静态资源这类非必要内容反复请求,直接在反代机上响应。

upstream wordpress_backend {
    server 12.34.56.78:57319;
    keepalive 32;
}

server {
    listen      443 ssl http2;
    listen      [::]:443 ssl http2;
    server_name example.com;

    ssl_certificate           /etc/pki/tls/certs/example.com.cer;
    ssl_certificate_key       /etc/pki/tls/private/example.com.key;
    ssl_dhparam               /etc/pki/tls/certs/dhparam.pem;

    ssl_buffer_size           4k;
    ssl_session_timeout       10m;
    ssl_session_cache         shared:SSL:10m;
    ssl_protocols             TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers               ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_stapling              on;
    ssl_stapling_verify       on;
    ssl_trusted_certificate   /etc/pki/tls/certs/example.com.cer;

    include /etc/nginx/snippets/enable-gzip-compression.conf;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log warn;

    include /etc/nginx/snippets/letsencrypt-acme-challenge.conf;

    location / {
        proxy_pass                         http://wordpress_backend;
        proxy_http_version                 1.1;
        proxy_set_header Connection        "";
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host  $host;
        proxy_set_header X-Forwarded-Port  $server_port;
        proxy_buffers                      8 16k;
        proxy_buffer_size                  16k;
        proxy_busy_buffers_size            24k;
        proxy_connect_timeout              75s;
        proxy_send_timeout                 300s;
        proxy_read_timeout                 300s;
    }
}

之后刷新 Nginx 配置就可以访问测试了。

nginx -s reload