当时腾讯申请域名的时候可以免费申请SSL证书,所以我就把这个站点变成了https的访问方式。如何开启SSL并且处理SSL证书,我想了好多个办法,这里写一下我采取的各种方案:
- 像最开始的文章写道的,利用wordpress自带的apache web server启用SSL,并做了http到https的redirect。但是这个比较麻烦,需要重新打包wordpress容器。以后wordpress官方容器升级了,你如果想更新,还得重新打包。
- 后来学习Azure的七层负载均衡,就使用Azure的application gateway做了SSL卸载。将IIS类型的证书上传到application gateway,并将我的服务器配置到application gateway的后端,启用http和https,并配置http到https的redirect。这个方案最大的问题就是贵。看账单,网站没什么流量的情况下,application gateway的费用比服务器的费用还高。
- 正好这几天在学习Nginx,想到用Nginx做反向代理并做SSL证书卸载。同时Nginx、wordpress和后端的MySQL都以容器的方式运行
这里写一下第三个方案具体是怎么实现的。
都已经有三个容器了,我就使用docker-compose做了个简单的编排。步骤如下:
1、docker中建一个bridge的网络,这样三个网络都在这个网络下运行,实现三个容器之间使用主机名就能通信。(其实docker-compose会根据project的名称自动建一个bridge的网络并将所有的service都运行在这个网络下)
docker create network wordpress_network
2、建一个临时的Nginx容器,并将临时容器里的/etc/nginx文件夹的内容都拷贝到本机。
docker run --name nginx -d -p 8085:80 nginx
docker cp nginx:/etc/nginx /home/hui/wordpress/
docker stop nginx
docker rm nginx
3、编辑docker-compose.yml文件,编排三个容器的运行,内容如下:
version: '3'
services:
db:
image: mysql:5.7
volumes:
- /home/hui/wordpress/mysql:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- /home/hui/wordpress/app:/var/www/html
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
nginx:
depends_on:
- wordpress
image: nginx:latest
volumes:
- /home/hui/wordpress/nginx:/etc/nginx
ports:
- "80:80"
- "443:443"
restart: always
networks:
default:
external:
name: wordpress_network
4、将Nginx类型的证书两个文件拷贝至相应的文件夹,编辑/home/hui/wordpress/nginx/nginx.conf文件,配置Nginx的反向代理、SSL证书卸载以及http到https的重定向:
server {
listen 80;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name www.gaohui.xyz;
keepalive_timeout 70;
ssl_certificate /etc/nginx/ssl/1_www.gaohui.xyz_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/2_www.gaohui.xyz.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real_ip $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://wordpress;
}
}
5、配置文件写好之后,在docker-compose.yml所在的路径运行命令:
docker-compose up -d
6、使用浏览器访问网站,配置wordpress。
最后说一下,wordpress使用SSL访问,并且前端是Nginx这种反向代理的话,是需要特殊配置的,nginx配置文件里proxy_set_header X-Forwarded-Proto $scheme;这个参数就是这个目的。详细可以参考wordpress的文档:
https://wordpress.org/support/topic/compatibility-with-wordpress-behind-a-reverse-proxy/