給Docker中的Nginx搭建HTTPS環(huán)境

隨著蘋果和微信小程序強制使用HTTPS協(xié)議傳輸徘熔,越來越多的公司和企業(yè)開始使用HTTPS门躯。下面我來分享下給Docker容器中的Nginx搭建HTTPS環(huán)境

Photo by [Yuichi Kageyama]

什么是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.comhttps://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只是屬于入門階段,文中難免有錯誤和不足翘地,還請大佬們指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末申尤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子衙耕,更是在濱河造成了極大的恐慌昧穿,老刑警劉巖闹蒜,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虎韵,死亡現(xiàn)場離奇詭異,居然都是意外死亡曹体,警方通過查閱死者的電腦和手機厅瞎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門饰潜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人和簸,你說我怎么就攤上這事彭雾。” “怎么了锁保?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵薯酝,是天一觀的道長半沽。 經(jīng)常有香客問我,道長吴菠,這世上最難降的妖魔是什么者填? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮橄务,結(jié)果婚禮上幔托,老公的妹妹穿的比我還像新娘。我一直安慰自己蜂挪,他們只是感情好重挑,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棠涮,像睡著了一般谬哀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上严肪,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天史煎,我揣著相機與錄音,去河邊找鬼驳糯。 笑死篇梭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的酝枢。 我是一名探鬼主播恬偷,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼帘睦!你這毒婦竟也來了袍患?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤竣付,失蹤者是張志新(化名)和其女友劉穎诡延,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體古胆,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肆良,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逸绎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妖滔。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖桶良,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沮翔,我是刑警寧澤陨帆,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布曲秉,位于F島的核電站,受9級特大地震影響疲牵,放射性物質(zhì)發(fā)生泄漏承二。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一纲爸、第九天 我趴在偏房一處隱蔽的房頂上張望亥鸠。 院中可真熱鬧,春花似錦识啦、人聲如沸负蚊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽家妆。三九已至,卻和暖如春冕茅,著一層夾襖步出監(jiān)牢的瞬間伤极,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工姨伤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哨坪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓乍楚,卻偏偏與公主長得像当编,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炊豪,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348