记一次为 Vultr 的 WordPress 主机配置 IPv6 + SSL 访问

说来也怪,这个其实是我搞梯子的时候研究 Nginx 的副产物。

先提一下 VPS 的当前环境:从 Vultr 直接部署的 WordPress 主机,Ubuntu 18.04.6 LTS,Nginx 1.20.1。已经使用了 Let’s Encrypt 的 SSL 服务获取了证书。其他的都没啥关系,就不提了。

如果你还没有获取到 SSL 证书,你可以使用 Certbot 获取一个免费的,虽是英文教程但浅显易懂,中文教程也好找。

编译替换 Nginx

我发现附带的 Nginx 是没有 IPv6 支持的,可以使用这个命令来验证:nginx -V。输出大概是这样:

text
1
2
3
4
5
nginx version: nginx/1.20.1
built by gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.20.1/debian/debuild-base/nginx-1.20.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

不过截至写这篇文章的时候,Vultr 已经可以部署基于 Ubuntu 20.04 的 WordPress 主机了。如果你运行上面的命令,发现带有 “–with-ipv6” 的话,那么就可以跳过这一步了。如果没有,就先把 configure arguments 后面的内容复制下来备用。

SSH 连接服务器,使用 wget https://nginx.org/download/nginx-1.20.1.tar.gz 下载 Nginx 1.20.1 版本(或者核对上面命令输出中的 nginx version,一定要确认版本一致),使用 tar -zxvf nginx-1.20.1.tar.gz 命令解压。

安装一下依赖库,命令如下:

bash
1
2
sudo apt upgrade
sudo apt install build-essential libtool libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev

进入刚刚解压的文件目录,并执行

bash
1
./configure --what-you-have-copied-just-now --with-ipv6

将其中 --what-you-have-copied-just-now 替换成你刚刚复制的内容。不过,不加 –with-ipv6 其实也可以,新编译的默认是带有 IPv6 支持的。

如果没有任何报错的话,再执行 make 来编译(不要 make install)。否则可以将报错内容 Google 一下,多半是少了什么库,对照着装就是了。

Vultr 的 WordPress 主机,Nginx 可执行文件在 / usr/sbin,配置文件在 / etc/nginx/conf.d。做一下备份,然后将新编译好的 nginx 可执行文件替换进原文件,然后重启服务即可加入 IPv6 模块:

bash
1
2
3
mv /usr/sbin/nginx /usr/sbin/nginx.bak
mv objs/nginx /usr/sbin/
systemctl restart nginx.service

设置 DNS 解析

我使用的是阿里云 DNS,直接将原域名 AAAA 解析至服务器的 IPv6 地址即可。这个应该不难。

等一小会后,执行 nslookup your.domain,解析到的应该是 IPv6 和 v4 两个地址。

编辑 Nginx 配置文件

先备份,再用你喜欢的方法编辑 / etc/nginx/conf.d/wordpress_https.conf。如果内有两个 server 开头的大括号,有一个带有”managed by Certbot“标记,就注释掉或者删掉另外一个大括号连同里面的内容。我之前就是没有注意到实际的配置文件,导致 IPv6 访问死活没有 SSL。

找到 listen 443 ssl;,然后在后面加入一行

text
1
listen [::]:443 ssl ipv6only=on;

即可让 Nginx 监听 IPv6 的 443 端口内容。如果你还想保留 IPv6 的 HTTP 访问(无 SSL),再编辑 /etc/nginx/conf.d/wordpress_http.conf,在 listen 80; 后面加入一行 listen [::]:80;

检验 IPv6 访问及证书

SSL Server Test (Powered by Qualys SSL Labs) 中输入你的域名,可以分别检验 IPv6 和 v4 下的 SSL 访问情况。你也可以自行打开网页检验。

参考文献

Ubuntu 编译安装 nginx 以及配置自动启动 - 浮梦云烟 - 博客园 (cnblogs.com)

Linux 中查找 nginx 安装目录和 nginx.conf 配置文件目录 _纸上得来终觉浅,绝知此事要躬行 - CSDN 博客 _查找 nginx 目录