隨著蘋果和微信小程序強制使用HTTPS協(xié)議傳輸徘熔,越來越多的公司和企業(yè)開始使用HTTPS门躯。下面我來分享下給Docker容器中的Nginx搭建HTTPS環(huán)境
什么是HTTPS
超文本傳輸安全協(xié)議(英語:Hypertext Transfer Protocol Secure,縮寫:HTTPS酷师,常稱為HTTP over TLS讶凉,HTTP over SSL或HTTP Secure)是一種透過計算機網(wǎng)絡(luò)進行安全通信的傳輸協(xié)議。HTTPS經(jīng)由HTTP進行通信山孔,但利用SSL/TLS來加密數(shù)據(jù)包懂讯。HTTPS開發(fā)的主要目的,是提供對網(wǎng)站服務(wù)器的身份認證台颠,保護交換數(shù)據(jù)的隱私與完整性褐望。這個協(xié)議由網(wǎng)景公司(Netscape)在1994年首次提出,隨后擴展到互聯(lián)網(wǎng)上串前。
上面這段介紹來自維基百科瘫里,想要一兩句話解釋清楚什么是HTTPS,以及HTTPS的到底是什么也不是一件易事荡碾,本文這里不做探討谨读,感興趣的朋友可以去搜索了解。
怎么獲得證書
國內(nèi)有很多服務(wù)商出售證書坛吁,價格從幾千到上萬不等劳殖,但是我們也可以通過阿里云、騰訊云拨脉、又拍云等獲取免費證書闷尿,本文會以阿里云、騰訊云分別為例申請證書搭建HTTPS環(huán)境
準備工作
準備兩個域名
我這里準備了2個二級域名用于申請上述兩家提供的證書: aliyun.0558web.com女坑、tencent.0558web.com 并把域名解析到對應(yīng)的服務(wù)器
使用Docker創(chuàng)建Nginx環(huán)境
- 首先確保本機已經(jīng)安裝Docker,使用以下命令拉取nginx image
docker pull nginx
創(chuàng)建文件夾
在你的服務(wù)器上創(chuàng)建三個文件夾,nginx用于存放證書和nginx配置文件,www用于存放項目代碼统舀,ssl用于存放證書匆骗,這里演示在當前目錄下創(chuàng)建文件夾
mkdir -p nginx/{aliyun,tencent} www/{aliyun,tencent} ssl/{aliyun,tencent}
下面來演示一下在阿里云和騰訊云申請的SSL證書來搭建HTTPS環(huán)境
阿里云
申請SSL證書
登錄阿里云平臺,進入控制臺>選擇產(chǎn)品與服務(wù)>搜索SSL證書,在SSL證書頁面點擊右上角的購買證書誉简,購買頁面提供的證書種類有很多種碉就,每次我都是找半天才找到免費證書,民間土豪或企業(yè)可以直接購買收費的證書闷串,如果是和我一樣選擇免費證書請記住以下幾步:選擇品牌(Symantec)>保護類型(1個域名)>證書類型(免費型DV SSL)>購買
購買成功以后瓮钥,在SSL證書頁面會看到剛才購買的證書,補全資料等待審核通過以后就可以下載我們的證書了,因為本文是在nginx下搭建HTTPS環(huán)境,所以這里下載證書 for Nginx
申請成功以后下載證書上傳到/ssl/aliyun/目錄下
編寫配置nginx配置文件
在/nginx/aliyun/文件夾下編寫配置文件,用于映射到docker容器中
events{
worker_connections 1024;
}
http{
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
}
server {
listen 443;
server_name localhost;
# ssl on;
root html;
index index.html index.htm;
ssl_certificate /etc/ssl/cert/*****.pem;
ssl_certificate_key /etc/ssl/cert/*****.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
}
添加項目代碼
在/www/aliyun/文件下新建index.html
<!---簡單的輸出一個Hello aliyun-->
Hello aliyun
創(chuàng)建nginx容器
運行一個nginx容器, 命名aliyun
docker run
-p 8080:80
-p 8081:443
-v $PWD/nginx/aliyun/nginx.conf:/etc/nginx/nginx.conf
-v $PWD/www/aliyun:/usr/share/nginx/html
-v $PWD/ssl/aliyun:/ect/nginx/cert/aliyun
--name aliyun -d nginx
啟動以后碉熄,使用下面的命令查看是否會輸Hello aliyun,如果輸出則表示啟動成功桨武,否則可以使用docker logs 容器ID查看錯誤日志
curl 127.0.0.1:8080
綁定域名、轉(zhuǎn)發(fā)端口
- 在你的服務(wù)器上安裝nginx,用于轉(zhuǎn)發(fā)端口和綁定域名
安裝成功以后锈津,在/etc/nginx/sites-available/下新建aliyun.conf,然后來編寫我們的配置文件
server {
listen 80;
server_name aliyun.0558web.com;
return 301 https://$server_name:8081$request_uri
}
- 編寫以后在/etc/nginx/sites-enabled/下添加軟連接
cd ../sites-enabled
# 添加軟連接
ln -s ../sites-available/aliyun.conf aliyun.conf
# 查看配置文件是否配置成功
nginx -t
# 重啟你的本機nginx
service nginx restart
測試HTTPS環(huán)境是否成功
在瀏覽器中輸入http://aliyun.0558web.com或https://aliyun.0558web.com:8081就能看會看到綠鎖
這個時候使用阿里云提供的免費SSL證書呀酸,我們成功搭建了HTTPS環(huán)境
但是你會發(fā)現(xiàn),HTTPS是可以使用了琼梆,但是后面還帶著端口性誉,這顯然不是你想要的,下面分享一下我的兩種解決辦法
- 如果在一臺服務(wù)器上只創(chuàng)建一個HTTPS環(huán)境完全可以把端口修改一下
docker run
# 本機的80端口->docker容器的80端口
-p 80:80
# 本機的443端口->docker容器的443端口
-p 443:443
-v $PWD/nginx/aliyun/nginx.conf:/etc/nginx/nginx.conf
-v $PWD/www/aliyun:/usr/share/nginx/html
-v $PWD/ssl/aliyun:/ect/nginx/cert/aliyun
--name aliyun -d nginx
- 如果一臺服務(wù)器上創(chuàng)建多個docker容器茎杂,并且要為每個容器配置HTTPS環(huán)境怎么辦呢错览?下面我們申請騰訊云提供的免費SSL證書來演示一下
騰訊云
申請證書
登錄騰訊云,進入控制臺>云產(chǎn)品>搜索SSL證書管理,進入證書管理頁面點擊購買煌往,選擇域名型免費版(DV)免費申請倾哺,剩下的步驟和阿里云差不多,補全資料等待證書下發(fā)
這里通過騰訊云提供的SSL做一下演示
編寫nginx配置文件
在nginx/tencent/文件夾下新增配置文件,用于映射到docker容器中
events {
woker_connections 1024;
}
http {
server{
listen 80;
server_name location;
root /usr/share/nginx/html;
}
}
編寫項目代碼
在www/tencent/文件夾下新建index.html
<!---簡單的輸出一個Hello Tencent-->
Hello Tencent
啟動nginx
運行nginx容器携冤,命名:tencent
docker run -p 8082:80
-v $PWD/nginx/tencent/nginx.conf:/etc/nginx/nginx.conf
-v $PWD/www/tencent:/usr/share/nginx/html
--name tencent -d nginx
判斷是否運行成功
curl 127.0.0.1:8082
# 輸出 Hello Tencent 表示運行成功
# 否則 通過 docker logs 容器ID查看錯誤日志
轉(zhuǎn)發(fā)端口綁定域名
- 在/etc/nginx/sites-available/下新建配置文件tencent.conf
server{
listen 80;
server_name tencent.0558web.com;
return 301 https://$server_name$request_uri
}
server {
listen 443 default_server ssl;
server_name tencent.0558web.com;
ssl_certificate /root/project/ssl/tencent/1_tencent.0558web.com_bundle.crt;
ssl_certificate_key /root/project/ssl/tencent/2_tencent.0558web.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location /{
index index.html index.htm;
proxy_pass http://tencent.0558web.com:8082;
}
}
- 添加軟鏈接 重啟nginx
# 在/etc/nginx/sites-enabled/下添加鏈接
ln -s /etc/nginx/sites-available/tencent.conf /etc/nginx/sites-enabled/tencent.conf
# 查看nginx是否配置成功
nginx -t
# 重啟nginx
service nginx restart
這個時候我們在瀏覽器中打開
tencent.0558web.com 或者https://tencent.0558web.com都會看到綠鎖
遇到的坑
- no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: ,,,, server: 0.0.0.0:443
大致意思是說在監(jiān)聽的端口上沒有設(shè)置證書悼粮,但是我們命名已經(jīng)設(shè)置,而且nginx -t 也沒有報錯曾棕,可能是我們設(shè)置的443 服務(wù)器端口沒有監(jiān)聽到
解決辦法:
server{
listen 443 default_server ssl;
.
.
.
}
- the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /etc/nginx/nginx.conf:14
nginx已經(jīng)棄用的ssl指令
解決辦法
server{
# 注釋ssl on
listen 443 ssl;
# ssl on;
}
總結(jié):本文分享了通過阿里云和騰訊云提供的免費SSL證書,給docker中的nginx搭建HTTPS環(huán)境,主要用了nginx的端口轉(zhuǎn)發(fā)扣猫,本人對Nginx只是屬于入門階段,文中難免有錯誤和不足翘地,還請大佬們指正