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请求

image-20200708172123463

正题

一、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

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 的环境变量参数 为你自己的,生成的证书会在你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来管理

先介绍一下具体架构

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容器内部的证书目录

配置文件加入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;
    }
}

完成!

image-20200708181201853

这里呢是直接把最终方案写了出来,但其实在探索的过程中,尝试了很多种方式,有很多种方式都行不通,因为包裹了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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343