使用Docker加Nginx配置HTTPS
本文將介紹如何將網站HTTP協議升級為HTTPS。部署的網站是Hexo。
前置
- 服務器已經安裝Docker
- 已經拉取了Nginx鏡像
- 雲服務器有安全組的已開放80和443端口
- 擁有SSL證書並下載了Nginx版本
部署
- 本文中Nginx使用的版本為1.21.6
部署總共分為以下幾個部分
- 設置掛載目錄
- 將SSL證書上傳到服務器的掛載目錄
- 配置Nginx
- 啟動Nginx鏡像
設置掛載目錄
設置掛載目錄的目的在於將Docker的虛擬機目錄映射到物理機上,例如使用-v /a:/b配合之后,虛擬機訪問目錄b的資源時,不會直接從b中獲取,而是從物理機的a目錄下去獲取需要訪問的資源,讀寫操作同樣。設置掛載目錄是在最后啟動Nginx鏡像執行的
這里我們設置了四個掛載目錄:
- /etc/localtime:作用是將虛擬機的時間與物理機同步,這個設置在很多應用中都要開啟,虛擬機時間不一致可能會導致服務不可用,后台服務的時間與Redis緩存服務的時間不一致,會導致用戶頻繁掉線。
- /etc/nginx:將Nginx的配置文件映射到物理機中,方便修改配置。設置這個掛載前要將容器中同目錄下的其他文件復制到物理機中沒有復制的話會導致Nginx無法加載到配置文件而無法啟動,可以使用命令
docker cp 容器ID:容器內目錄 物理機目錄
。 - /usr/share/nginx/html:這是Nginx默認的網站文件路徑
- /var/log/nginx:Nginx的日志
本文設置的掛載目錄:
-v /etc/localtime:/etc/localtime
-v /gmfan/conf/nginx:/etc/nginx
-v /gmfan/dist:/usr/share/nginx/html
-v /gmfan/log/nginx:/var/log/nginx
將證書上傳到掛載目錄中
由於本文以及將物理機下的/gmfan/conf/nginx映射到了/etc/nginx中,所以我在物理機下的這個目錄創建了一個cert目錄用於存放證書。
[root@gmfan cert]# pwd
/gmfan/conf/nginx/cert
[root@gmfan cert]# ls
7395890_www.gmfan.cn.key 7395890_www.gmfan.cn.pem
配置Nginx
由於我已經將容器內的配置文件復制到了物理機上了,所以只需要修改物理機上對應的配置文件既可以,一下就是nginx.conf的配置。需要特別注意的是nginx.conf文件需要放到/etc/nginx目錄下而不是conf.d下,因為work_processes指令要在/etc/nginx目錄下否則將報("worker_processes" directive is not allowed here in /etc/nginx/conf.d/nginx.)錯誤。
下面這份配置稍加修改既可使用:
# 設置線程數
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#ssl on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
include /etc/nginx/conf.d/*.conf;
server {
listen 443 ssl;
#證書綁定域名
server_name www.gmfan.cn;
#證書
ssl_certificate /etc/nginx/cert/1_www.gmfan.cn.pem;
#私鑰
ssl_certificate_key /etc/nginx/cert/1_www.gmfan.cn.key;
ssl_session_timeout 5m;
#按照以下協議配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#按照以下套件配置,配置加密套件,寫法遵循 openssl 標准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
root /usr/share/nginx/html;
location / {
}
}
#設置重定向,HTTP重定向到HTTPS
server{
listen 80;
# 需要重定向的域名
server_name www.gmfan.cn gmfan.cn;
return 301 https://$host$request_uri;
}
}
其中證書的路徑是相對於容器內的,由於我已經將證書上傳到/gmfan/conf/nginx/cert這個目錄下並且設置了容器目錄/etc/nginx映射到/gmfan/conf/nginx此目錄上,所以我的證書對應的容器目錄為/etc/nginx/cert/1_www.gmfan.cn.pem私鑰同理。
最后啟動Nginx容器
由於HTTPS的默認端口為443,HTTP的默認端口為80故需要將物理機的端口映射到容器上使用命令-p 物理機端口號:實體機端口號。本文的啟動命令為:
docker run \
-p 80:80 \
-p 443:443 \
--name nginx \
-v /etc/localtime:/etc/localtime \
-v /gmfan/conf/nginx:/etc/nginx \
-v /gmfan/dist:/usr/share/nginx/html \
-v /gmfan/log/nginx:/var/log/nginx \
-d nginx
-d的意思是后台執行。
最后推薦一個好用且免費的SSH與SFTP工具MobaXterm。