使用 Nginx 反向代理 WordPress 并配置 SSL
此举是为了将原先部署在 443 端口的 WordPress 网站使用反向代理的方式重新部署。部署反代的过程踩了不少的坑,主要还是因为 WordPress 作为动态博客框架所具有的特殊机制。(说起这个就要后悔当时为啥没搞个静态博客了)
首先介绍一下环境,我的 WordPress 网站运行在 docker 容器下,由 Apache 服务启动,原先的配置是 docker 容器内的 Apache 配置了 SSL 证书,并将容器 443 端口映射至宿主机。
为了在宿主机上用 Nginx 做反代,首先要对容器内的服务进行一些修改。两次 SSL 肯定是不划算的,因此首先要将容器内的 Apache 服务停用 https,然后我们修改容器的端口绑定为 0.0.0.0:8000->80/tcp
(这个 8000 随便选一个宿主机的空闲端口即可,后面 Nginx 配置反代时会用到)。注意:这个时候 WordPress 数据库内站点的地址仍然是 https 的地址,为了站点的优雅,这里的地址不要改动。
接下来,配置 Nginx,首先要确保安装的 Nginx 支持 SSL(可通过 nginx -V
查看是否有 SSL 相关的模块)。
server{
listen 80;
listen 443 ssl;
server_name blog.fyz666.xyz;
index index.php index.html index.htm;
ssl_certificate /etc/letsencrypt/live/fyz666.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/fyz666.xyz/privkey.pem;
if ($scheme = http){
return 301 https://$host$request_uri;
}
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Powered-By the-internet;
add_header Content-Security-Policy upgrade-insecure-requests;
}
}
以上配置是针对我自己的域名、网站服务情况。在运行该配置的 Nginx 前,需要确认 80、443 端口是空闲的。
- 首先,声明监听的两个端口,其中 443 端口开启 SSL。
- 然后我们指定前面使用 Let’s Encrypt 生成的 SSL 证书,对于 Nginx,我们只需要 fullchain 与 privkey 两个文件。
- 接下来做一个 301 跳转,将 http 跳转到 https。
- 最后的
location
配置,则是反向代理的核心。
首先,我们的反向代理的是将整个站点反代到 443 端口的根路径,因此 location
指定为 /
。然后是在 proxy_pass
字段指定位于 localhost 上的 8000 端口(这个端口是前面 docker 容器在宿主机上的映射),接下来必不可少的一条配置是 proxy_set_header Host $host:$server_port;
而这里有一个小坑。
如果我们代理的是个静态的 Web 网站,只需要这样即可:proxy_set_header Host $host;
,但对于 WordPress,我们必须带上 $server_port
进行转发。这是因为 WordPress 会将该地址与数据库内的站点地址进行比较,若不同,则会进行 301 跳转。这里若 Nginx 转发时不带上 443 这个端口,在反代后面的 WordPress 看来,转发至它的端口则是 8000,与数据库内的 443 端口不一致,它会强制将访问转发到 443 端口,重新交给 Nginx 处理,而 Nginx 又会重新反代到 8000 端口,可见这样操作会引发无限的重定向!
另一条重要的配置是 add_header Content-Security-Policy upgrade-insecure-requests;
它是为了让 WordPress 能访问到其静态文件。
但仅仅配置了 Nginx 是不够的,因为 WordPress 自身并不支持反向代理,我们还需要修改一下 WordPress 的源代码。
打开 WordPress 网站根路径下的 wp-config.php
文件,找到包含 ABSPATH
的这段代码,在它前面添加三行:
//添加下面三行代码
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_HOST'] ) ) {
$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
}
/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}
这样配置下来,反向代理的 WordPress 网站已经可以正常运作了。