WordPress 配合Nginx 实现Http认证

今天折腾了半个下午,总算解决了这个问题,就作为第一篇文章,记录一下。

我在服务器上安装了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域名访问,这次就正确加载出来了。


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注