今天折腾了半个下午,总算解决了这个问题,就作为第一篇文章,记录一下。
我在服务器上安装了Docker,按照chatgpt的操作,使用docker-compose运行了Wordpress的容器。将外部8080端口映射到容器内部80端口。
version: '3.8'
services:
db:
image: mysql:5.7
volumes:
- ./db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
image: wordpress:latest
volumes:
- ./wordpress_data:/var/www/html
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
操作容器的命令如下
# 进入docker-compose.yml所在目录
cd wordpress-docker
# 关闭移除容器
sudo docker-compose down
# 创建并启动容器
sudo docker-compose up -d
接着,我在外面安装了nginx。
现在我需要对我的域名,进行https认证,所以我下载了certbot。
但因为Certbot的问题,我不能认证example.com,只能认证www.example.com。
然后我需要在nginx上增加一个配置,让WordPress能够使用HTTPS。
# 第一个server是nginx默认的配置,使用根域名用80默认端口,进入nginx欢迎页面
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}
# 第二个server是强制将来自www.example.com的80端口,重定向到Https
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri; # 强制所有 HTTP 请求重定向到 HTTPS
}
# 第三个server是监听443端口,www.example.com的域名的访问,将其代理到本地的8080端口
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
proxy_pass http://127.0.0.1:8080; # 代理到本地的8080端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
完成之后,我却访问不到https端的wordpress站点。我以为是nginx配置不对,自己改了好几遍,然而最好的效果,也只是能进wordpress站点,但是样式与图片都不能加载。
研究后发现,尽管我从https的域名访问的,但wordpress仍然在使用ip+端口去请求资源,所以造成了该问题。
原因在于Wordpress的设置里,有一项是wordpress url和站点url。这里我按照gpt的提示,改成了https+域名,结果很意外,直接连不上去了。此时用ip+端口也访问不了。
这时感觉很不对劲,研究了好些方向,最后发现,是我之前修改nginx配置,造成了地址匹配的错误。按照最开始gpt给的设置,就又成功了。
最后我稳妥起见,将wordpress容器卸载重装,
重装后第一次登录,就从https域名访问,这次就正确加载出来了。
发表回复