今天在云上部署WordPress时遇到的一个大坑。
本来云服务器上有一个正在运行的docker里的nginx服务,与是将其用来给WordPress套一个https。使用
https://github.com/docker/awesome-compose/blob/master/wordpress-mysql/compose.yaml
提供的脚本一通操作,然后悲剧了。

WordPress地址配置见上图,管理页面可以正常访问,管理页面https://labmem.space/wp-admin可以正常访问,但是主页会重定向到https://172.17.0.1/导致无法访问,172.17.0.1是宿主机用于跟docker容器桥接的本地地址。
经研究将nginx配置调整如下就可以了。
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/labmem.space/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/labmem.space/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
server_name labmem.space;
index index.php index.html index.htm;
proxy_redirect off;
port_in_redirect off;
location ^~ / {
proxy_pass http://172.17.0.1:8001;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_redirect off;
proxy_buffering off;
proxy_read_timeout 1m;
proxy_connect_timeout 1m;
proxy_set_header Proxy "";
proxy_set_header Accept-Encoding "";
}
}
其实就添加了一条配置proxy_set_header Host $host
。这一行的作用是把原http请求的Header中的Host字段也放到转发的请求里。
如果不加这一行的话,nginx转发的请求header里就不会有Host字段,而服务器是靠这个Host值来区分你请求的是哪个域名的资源的。