说来也怪,这个其实是我搞梯子的时候研究Nginx的副产物。
先提一下VPS的当前环境:从Vultr直接部署的WordPress主机,Ubuntu 18.04.6 LTS,Nginx 1.20.1。已经使用了Let’s Encrypt的SSL服务获取了证书。其他的都没啥关系,就不提了。
如果你还没有获取到SSL证书,你可以使用Certbot获取一个免费的,虽是英文教程但浅显易懂,中文教程也好找。
编译替换Nginx
我发现附带的Nginx是没有IPv6支持的,可以使用这个命令来验证:nginx -V
。输出大概是这样:
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
命令解压。
安装一下依赖库,命令如下:
sudo apt upgrade
sudo apt install build-essential libtool libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev
进入刚刚解压的文件目录,并执行
./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模块:
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;
,然后在后面加入一行
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目录