Centos7.4下用Docker-Compose部署WordPress(续)-服务器端用Nginx作为反向代理并添加SSL证书(阿里云免费DV证书)
前言
在我写完Centos7.4下用Docker-Compose部署WordPress这篇文章后,我的个人博客已经正式的开始运作。但考虑到网站访问的安全性以及今后可能会重复利用服务器来部署其他网站的可能,因此我决定在原有基础上来加上Nginx
用作反向代理,并添加SSL 证书
使博客运行在HTTPS
协议上。
本文中统一使用www.fujiabin.com这个域名,在实际操作中,你应该全部替换成自己的域名。
准备SSL证书
现在有很多免费的DV(Domain Valicated Certificate)
证书提供商,比如比较火的Let's encrypt
,然而我并没有使用它:)。我用的都是阿里云的服务,所以证书也用了阿里云提供的。以下是用screentogif生成的一个申请阿里云免费DV的动图,如果图没动,请在浏览器中直接打开图片:https://i2.wp.com/www.fujiabin.com/wp-content/uploads/2017/11/aliyun-dv.gif?resize=1024%2C512&ssl=1:
- 阿里云后台地址:https://home.console.aliyun.com/new#/(需要注册才能访问)。
- 如果你的域名也是在阿里云上申请的话,域名的验证将会变得特别简单,在补全域名信息的时候,将选项
证书绑定的域名在【阿里云的云解析】产品中,授权系统自动添加一条记录以完成域名授权验证。
勾上即可,阿里云将自动在你的域名管理中添加一条用以验证的解析记录。 - CSR你可以选
自己生成CSR
,或者直接选用系统生成CSR
,两个并没有区别,但是如果你觉得系统生成的不够安全,可以自己手动生成。 - 如果选用的是
系统生成CSR
选项,在域名审核通过后(因为DV是系统自动审核的,所以也就几分钟时间状态就会变成已签发
状态),可以在我的证书
菜单中,找到对应的域名,并点击下载
按钮下载你的证书和秘钥文件包(里面将包含一个xxx.key的秘钥文件和一个xxx.pem的证书文件)。
配置
添加一个Docker Network
$ docker network create nginx-proxy
手动创建Docker Network
,这样就可以将所有yml中的容器连接到这个网络上来互相联通。
docker-compose.yml
这个配置文件是在前一片文章的基础上修改的,只有修改部分我添加了注释,其他部分的说明可参考:Centos7.4下用Docker-Compose部署WordPress中相关部分。
version: '3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: xxxx
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wp_site:/var/www/html
expose: # 容器将暴露80端口,80是默认端口,所以这个不写也没问题,如果用其他端口的话,就一定需要写一下
- 80
restart: always
environment:
VIRTUAL_HOST: www.fujiabin.com,fujiabin.com
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
# 以下是nginx反向代理服务的配置
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
restart: always
ports:
- "80:80"
- "443:443" # ssl 默认是443端口,因此需要将443端口映射到宿主机上
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro # 将宿主机的docker.sock绑定到nginx,这样,今后添加新的站点时,nginx将会自动发现站点并重启服务
- wp_certs:/etc/nginx/certs:ro # 将nginx中的证书目录,映射到宿主机中
volumes:
db_data:
wp_site:
wp_certs: # nginx证书命名卷(named volume)
# 配置一个公共外部网络来联通所有容器
networks:
default:
external:
name: nginx-proxy
添加ssl证书
还记得刚才在阿里云后台获得的证书文件吗?现在马上要派上用场了。以下命令均在宿主机中执行:
$ docker volume ls
这个命令将在宿主机中查看Docker
中所有的卷信息,你会看到一个VOLUME NAME
为xxx_wp_certs
(前缀是Docker
自动添加的,后面的wp_certs
是yml配置中指定的)的卷。
$ docker volume inspect --format '{{ .Mountpoint }}' xxx_wp_certs
执行这个命令,将打印出xxx_wp_certs
(这个卷名应该替换成上一步中获得的真实卷名)这个卷在宿主机中的实际路径,一般可能是:/var/lib/docker/volumes/xxx_wp_certs/_data
。
$ cd /var/lib/docker/volumes/xxx_wp_certs/_data && sudo vim www.fujiabin.com.key
这个命令相当于在Nginx
添加ssl秘钥文件www.fujiabin.com.key
,将在阿里云后台下载的文件xxx.key
中的内容黏贴进来并保存。
$ cd /var/lib/docker/volumes/xxx_wp_certs/_data && sudo vim www.fujiabin.com.crt
这个命令相当于在Nginx
添加ssl秘证书文件www.fujiabin.com.crt
,将在阿里云后台下载的文件xxx.pem
中的内容黏贴进来并保存。
镜像nginx-proxy
中的脚本包含了如下功能:
如果在certs文件夹下找到当前域名的.crt
和.key
文件,则将自动将访问转到HTTPS
协议,因此到此为止,我们已经完成了所有需要做的工作,是不是感觉特别简单优雅?
$ sudo docker-compose down
$ sudo docker-compose up -d
重启服务,此时再次访问网站(即使是用http://www.fujiabin.com这个地址),将自动跳转到https://www.fujiabin.com。
本文在博客园和我的个人博客www.fujiabin.com上同步发布。转载请注明来源。