前言
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請求
正題
一颁井、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
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#
你的accessKey和accessSecret就在account.conf里面
好啦屁商,證書就在*.keep999.cn目錄下
如果使用nginx的話烟很,就需要使用fullchain.cer和*.keep999.cn.key
二、docker+多nginx來管理
先介紹一下具體架構(gòu)
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;
}
}
完成芹橡!
這里呢是直接把最終方案寫了出來,但其實在探索的過程中望伦,嘗試了很多種方式林说,有很多種方式都行不通,因為包裹了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