Docker nginx https二級域名無端口訪問多個web項目

前言

Docker nginx部署二級域名無端口訪問多個web項目 在這篇文章中拴孤,我們已經(jīng)實現(xiàn)了在docker容器中利用二級域名無端口地去訪問不同的項目弊决。

繼續(xù)進階一下危融,搞一下https訪問多個項目陵刹,提升一下安全性啃洋。

另外霞怀,再提一下惫东,我們現(xiàn)在的框架結(jié)構(gòu)為 docker 下的多個不同的nginx容器來管理項目的,沒有跟傳統(tǒng)的服務(wù)器下直接配置nginx管理多個項目一樣毙石,而是多了一層docker的裝載廉沮。

雖然可能大多數(shù)情況下,直接服務(wù)器下部署nginx會簡單方便很多徐矩,但是滞时,為了學(xué)習(xí)多樣化的、虛擬化的docker+nginx滤灯,了解更多端口轉(zhuǎn)發(fā)漂洋、重定向、host網(wǎng)絡(luò)等相關(guān)的東西力喷。

當(dāng)然刽漂,你也可以使用docker+單nginx容器的方式來實現(xiàn),只需要把配置文件組合在一起就OK了弟孟,實際上更簡單一些贝咙。但是如果我們想要隔離來管理不同的服務(wù)和網(wǎng)站web,更深入的實踐和了解內(nèi)部原理拂募。目前依舊是docker+多nginx服務(wù)的方式來實現(xiàn)的庭猩。

一般nginx部署多個項目有3種方法:

1、利用二級域名配置不同的項目

2陈症、利用不同的端口配置不同的項目

3蔼水、利用不同的url路徑來配置不同的項目

具體詳情可以參見使用nginx部署多個前端項目

[TOC]

收獲

學(xué)習(xí)完這篇文章你將收獲:

  • docker下申請免費自動續(xù)簽的證書
  • 二級域名訪問不同的項目
  • nginx配置https

期望

keep999.cn是一級域名,通過它訪問到我朋友的項目录肯,并且走h(yuǎn)ttps協(xié)議趴腋,http請求轉(zhuǎn)發(fā)為https請求

a.keep999.cn是二級域名,通過它訪問到我的項目,并且走h(yuǎn)ttps協(xié)議优炬,http請求轉(zhuǎn)發(fā)為https請求

image-20200708172123463

正題

一颁井、docker 使用arme.sh申請免費證書

arme.sh 可以免費申請證書,我們將用它來申請證書蠢护。

arme.sh主要做的事情就是申請證書雅宾,并通過一個cronjob腳本來定期檢查和申請更新證書

但是,情況比較特殊的是葵硕,我們需要在docker中來跑申請和續(xù)約的腳本眉抬。

github上就有docker如果使用arme.sh的方法Run acme.sh in docker

申請證書的話有2種方式:

1、http

2懈凹、dns驗證

http方式的話蜀变,需要80端口是空閑的才行,而我的80端口已經(jīng)被占了(nginx服務(wù))蘸劈,所以只能使用dns方式

我是阿里云,如果你其他的云尊沸,可以參看這里的用法:How to use DNS API

1威沫、申請阿里云accesskey

阿里云服務(wù)器dns驗證的話,就是去申請一個accessKey和accesSecret

image-20200708173552369

2洼专、docker運行arme.sh

docker run --rm  -itd  \
  -v "$(pwd)/out":/acme.sh  \
  -e Ali_Key=你的accessKey \
  -e Ali_Secret=你的accessSecret \
  --net=host \
  --name=acme.sh \
  neilpang/acme.sh daemon

注意修改-e 的環(huán)境變量參數(shù) 為你自己的棒掠,生成的證書會在你pwd(當(dāng)前目錄)的out目錄下

運行之后就可以使用 arme.sh 的命令來申請證書了

3、申請證書

自己生成一個目錄來管理證書

mkdir /mydockerdata/arme

進入管理證書的目錄

cd /mydockerdata/arme

申請證書

docker exec acme.sh --issue --dns dns_ali -d *.keep999.cn -d keep999.cn

注意:我這里是給自己的域名及其二級域名都申請證書

root@keep999:/mydockerdata# cd arme/
root@keep999:/mydockerdata/arme# ls
out
root@keep999:/mydockerdata/arme# cd out/
root@keep999:/mydockerdata/arme/out# ls
account.conf  ca  http.header  *.keep999.cn
root@keep999:/mydockerdata/arme/out# cd \*.keep999.cn/
root@keep999:/mydockerdata/arme/out/*.keep999.cn# ls
backup  ca.cer  fullchain.cer  *.keep999.cn.cer  *.keep999.cn.conf  *.keep999.cn.csr  *.keep999.cn.csr.conf  *.keep999.cn.key
root@keep999:/mydockerdata/arme/out/*.keep999.cn#

你的accessKeyaccessSecret就在account.conf里面

好啦屁商,證書就在*.keep999.cn目錄下

如果使用nginx的話烟很,就需要使用fullchain.cer和*.keep999.cn.key

二、docker+多nginx來管理

先介紹一下具體架構(gòu)

image-20200708180645691

1蜡镶、配置我的項目nginx

docker run -p 8080:443 --name mynginx -v /mydockerdata/nginx/log/:/var/log/nginx \
-v /mydockerdata/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /mydockerdata/nginx/dist/:/usr/share/nginx/html  \
-v /mydockerdata/arme/out/*.keep999.cn/:/etc/nginx/cert \
-d nginx

注意-v /mydockerdata/arme/out/*.keep999.cn/:/etc/nginx/cert \就是映射證書目錄到nginx容器內(nèi)部的證書目錄

配置文件加入server

server {
        listen 443 ssl;
        server_name a.keep999.cn;
        root  /usr/share/nginx/html;           #項目路徑
        index index.html index.htm;
        ssl_certificate   cert/fullchain.cer;
        ssl_certificate_key  cert/*.keep999.cn.key;
        location / {
            try_files $uri $uri/ /index.html;
        }
}
ssl_certificate   cert/fullchain.cer;
ssl_certificate_key  cert/*.keep999.cn.key;

cert/fullchain.cer就是相對nginx.conf的路徑下的證書目錄下的文件

具體怎么生成nginx和映射配置文件雾袱,請參看Docker nginx部署二級域名無端口訪問多個web項目

2、配置他的項目nginx

docker run -p 8081:443 --name web_nginx -v /mydockerdata/web_nginx/log/:/var/log/nginx \
-v /mydockerdata/web_nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /var/www/html:/usr/share/nginx/html  \
-v /mydockerdata/arme/out/*.keep999.cn/:/etc/nginx/cert \
-d nginx

配置文件加入server

server {
    listen 443 ssl;
    server_name keep999.cn;
    root  /usr/share/nginx/html;           #項目路徑
    index index.html index.htm;
    ssl_certificate   cert/fullchain.cer;
    ssl_certificate_key  cert/*.keep999.cn.key;
    location / {
        try_files $uri $uri/ /index.html;
    }
}

3官还、配置代理nginx

docker run -p 80:80  -p 443:443 --name proxy_nginx \
-v /mydockerdata/proxy_nginx/log/:/var/log/nginx \
-v /mydockerdata/proxy_nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /mydockerdata/arme/out/*.keep999.cn/:/etc/nginx/cert \
-d nginx

配置文件加入多個server

server {
    listen 80;
    server_name  a.keep999.cn;    #監(jiān)聽的URL
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
     listen 443 ssl;
     server_name  a.keep999.cn;    #監(jiān)聽的URL
    ssl_certificate   cert/fullchain.cer;
    ssl_certificate_key  cert/*.keep999.cn.key;
    location / {
         proxy_redirect off;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_pass https://a.keep999.cn:8080;
    }

}

server {
    listen 80;
    server_name  keep999.cn;    #監(jiān)聽的URL
    rewrite ^(.*)$ https://${server_name}$1 permanent;

}
server {
    listen       443 ssl ;
    server_name  keep999.cn;    #監(jiān)聽的URL
    ssl_certificate   cert/fullchain.cer;
    ssl_certificate_key  cert/*.keep999.cn.key;
    location / {
           proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass https://keep999.cn:8081;
    }
}

完成芹橡!

image-20200708181201853

這里呢是直接把最終方案寫了出來,但其實在探索的過程中望伦,嘗試了很多種方式林说,有很多種方式都行不通,因為包裹了docker這層容器的關(guān)系屯伞,端口映射出來腿箩,很多端口都會被占據(jù),比如80劣摇、443端口珠移,一個容器占據(jù)了,其他容器就不能使用了。

所以剑梳,只有使用多域名不同端口的轉(zhuǎn)發(fā)的方式來實現(xiàn)唆貌。

三、docker+單nginx來管理

其實垢乙,我們也可以在docker中用單nginx來管理多個項目锨咙,這樣的話,配置會簡單一些追逮,實現(xiàn)起來也簡單一些酪刀,只是管理不同的服務(wù),沒有那么靈活钮孵。這里骂倘,采用基于二級域名的方式來實現(xiàn)的。

docker run -p 80:80  -p 443:443 --name all_nginx \
-v /mydockerdata/all_nginx/log/:/var/log/nginx \
-v /mydockerdata/all_nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /mydockerdata/nginx/dist/:/usr/share/nginx/html1  \
-v /var/www/html:/usr/share/nginx/html2  \
-v /mydockerdata/arme/out/*.keep999.cn/:/etc/nginx/cert \
-d nginx

不過映射的話要注意一下巴席,mydockerdata/nginx/dist/:/usr/share/nginx/html1 把我的項目映射到html1,

/var/www/html:/usr/share/nginx/html2另一個項目映射到html2

完整的配置文件:

user  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;
    
    server {
        listen 80;
        server_name  a.keep999.cn;    #監(jiān)聽的URL
        rewrite ^(.*)$ https://${server_name}$1 permanent;
    }
    
    
    server {
        listen 80;
        server_name  keep999.cn;    #監(jiān)聽的URL
        rewrite ^(.*)$ https://${server_name}$1 permanent;
    }
    
    
    server {
            listen 443 ssl;
            server_name a.keep999.cn;
            root  /usr/share/nginx/html1;           #項目路徑
            index index.html index.htm;
            ssl_certificate   cert/fullchain.cer;
            ssl_certificate_key  cert/*.keep999.cn.key;
            location / {
                try_files $uri $uri/ /index.html;
            }
    }
    
    server {
        listen 443 ssl;
        server_name keep999.cn;
        root  /usr/share/nginx/html2;           #項目路徑
        index index.html index.htm;
        ssl_certificate   cert/fullchain.cer;
        ssl_certificate_key  cert/*.keep999.cn.key;
        location / {
            try_files $uri $uri/ /index.html;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}

總結(jié)

已經(jīng)把網(wǎng)站從開發(fā)->docker历涝、nginx部署->http->https這一套流程都走完了,docker和其他微服務(wù)的聯(lián)合應(yīng)用漾唉,docker與主機的端口荧库、映射路徑、容器內(nèi)部隔離等關(guān)系都理解清楚赵刑。

相信大家也收獲了很多分衫,生命不息,學(xué)習(xí)不止般此,繼續(xù)加油吧??

關(guān)于作者

作者是一個熱愛學(xué)習(xí)蚪战、開源、分享铐懊,傳播正能量邀桑,喜歡打籃球、頭發(fā)還很多的程序員-科乎。-

熱烈歡迎大家關(guān)注概漱、點贊、評論交流喜喂!

簡書:http://www.reibang.com/u/d234d1569eed

github:https://github.com/fly7632785

CSDN:https://blog.csdn.net/fly7632785

掘金:https://juejin.im/user/5efd8d205188252e58582dc7/posts

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓤摧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子玉吁,更是在濱河造成了極大的恐慌照弥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件进副,死亡現(xiàn)場離奇詭異这揣,居然都是意外死亡悔常,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門给赞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來机打,“玉大人,你說我怎么就攤上這事片迅〔醒” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵柑蛇,是天一觀的道長芥挣。 經(jīng)常有香客問我,道長耻台,這世上最難降的妖魔是什么空免? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮盆耽,結(jié)果婚禮上蹋砚,老公的妹妹穿的比我還像新娘。我一直安慰自己摄杂,他們只是感情好坝咐,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匙姜,像睡著了一般畅厢。 火紅的嫁衣襯著肌膚如雪冯痢。 梳的紋絲不亂的頭發(fā)上氮昧,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音浦楣,去河邊找鬼袖肥。 笑死,一個胖子當(dāng)著我的面吹牛振劳,可吹牛的內(nèi)容都是我干的椎组。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼历恐,長吁一口氣:“原來是場噩夢啊……” “哼寸癌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起弱贼,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒸苇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吮旅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溪烤,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了檬嘀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片槽驶。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸳兽,靈堂內(nèi)的尸體忽然破棺而出掂铐,到底是詐尸還是另有隱情,我是刑警寧澤贸铜,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布堡纬,位于F島的核電站,受9級特大地震影響蒿秦,放射性物質(zhì)發(fā)生泄漏烤镐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一棍鳖、第九天 我趴在偏房一處隱蔽的房頂上張望炮叶。 院中可真熱鬧,春花似錦渡处、人聲如沸镜悉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侣肄。三九已至,卻和暖如春醇份,著一層夾襖步出監(jiān)牢的瞬間稼锅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工僚纷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矩距,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓怖竭,卻偏偏與公主長得像锥债,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痊臭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354