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