Docker nginx https二級域名無端口訪問多個web項目 前言 正題 總結 關於作者

前言

Docker nginx部署二級域名無端口訪問多個web項目 在這篇文章中,我們已經實現了在docker容器中利用二級域名無端口地去訪問不同的項目。

繼續進階一下,搞一下https訪問多個項目,提升一下安全性。

另外,再提一下,我們現在的框架結構爲 docker 下的多個不同的nginx容器來管理項目的,沒有跟傳統的服務器下直接配置nginx管理多個項目一樣,而是多了一層docker的裝載。

雖然可能大多數情況下,直接服務器下部署nginx會簡單方便很多,但是,爲了學習多樣化的、虛擬化的docker+nginx,瞭解更多端口轉發、重定向、host網絡等相關的東西。

當然,你也可以使用docker+單nginx容器的方式來實現,只需要把配置文件組合在一起就OK了,實際上更簡單一些。但是如果我們想要隔離來管理不同的服務和網站web,更深入的實踐和了解內部原理。目前依舊是docker+多nginx服務的方式來實現的。

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

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

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

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

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

[TOC]

收穫

學習完這篇文章你將收穫:

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

期望

keep999.cn是一級域名,通過它訪問到我朋友的項目,並且走https協議,http請求轉發爲https請求

a.keep999.cn是二級域名,通過它訪問到我的項目,並且走https協議,http請求轉發爲https請求

正題

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

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

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

但是,情況比較特殊的是,我們需要在docker中來跑申請和續約的腳本

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

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

1、http

2、dns驗證

http方式的話,需要80端口是空閒的纔行,而我的80端口已經被佔了(nginx服務),所以只能使用dns方式

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

1、申請阿里雲accesskey

阿里雲服務器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 的環境變量參數 爲你自己的,生成的證書會在你pwd(當前目錄)的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來管理

先介紹一下具體架構

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容器內部的證書目錄

配置文件加入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;    #監聽的URL
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}

server {
     listen 443 ssl;
     server_name  a.keep999.cn;    #監聽的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;    #監聽的URL
    rewrite ^(.*)$ https://${server_name}$1 permanent;

}
server {
    listen       443 ssl ;
    server_name  keep999.cn;    #監聽的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這層容器的關係,端口映射出來,很多端口都會被佔據,比如80、443端口,一個容器佔據了,其他容器就不能使用了。

所以,只有使用多域名不同端口的轉發的方式來實現。

三、docker+單nginx來管理

其實,我們也可以在docker中用單nginx來管理多個項目,這樣的話,配置會簡單一些,實現起來也簡單一些,只是管理不同的服務,沒有那麼靈活。這裏,採用基於二級域名的方式來實現的。

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;    #監聽的URL
        rewrite ^(.*)$ https://${server_name}$1 permanent;
    }
    
    
    server {
        listen 80;
        server_name  keep999.cn;    #監聽的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;
}

總結

已經把網站從開發->docker、nginx部署->http->https這一套流程都走完了,docker和其他微服務的聯合應用,docker與主機的端口、映射路徑、容器內部隔離等關係都理解清楚。

相信大家也收穫了很多,生命不息,學習不止,繼續加油吧💪

關於作者

作者是一個熱愛學習、開源、分享,傳播正能量,喜歡打籃球、頭髮還很多的程序員-。-

熱烈歡迎大家關注、點贊、評論交流!

簡書:https://www.jianshu.com/u/d234d1569eed

github:https://github.com/fly7632785

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章