前言
在我寫完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上同步發布。轉載請注明來源。