使用Docker加Nginx配置HTTPS
阿新 • • 發佈:2022-03-13
使用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 容器名:檔案路徑 物理機路徑。
- /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的配置。
下面這份配置稍加修改既可使用:
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。以及本人的部落格https://gmfan.cn/。