Loading
0

解决:多docker站点部署SSL证书HTTPS访问方法

技术小学生微信公众号
腾讯云服务器大促销。
华为服务器

前言:最近老有网友咨询在docker容器中部署了多个站点,现在访问域名都需要加上端口号,但实际情况需要使用独立域名不加端口访问网站(http和https),告知了各位网友可以在宿主服务器上安装nginx通过反向代理方式实现,但自己没有实际测试过,所以有了本教程,一方面是防止自己忘记做个笔记,另一方面是方便新手朋友。
本教程详细啰嗦,适合新手朋友。
需求:
1、三个容器,分别对应三个不同网站。容器内的端口根据自己情况。
  • 8081 ---> 对应容器 blog.tag.gg 的 80 端口
  • 8082 ---> 对应容器 web1.tag.gg 的 80 端口
  • 8083 ---> 对应容器 web2.tag.gg 的 80 端口
2、访问
  1. 访问 http://blog.tag.gg 或 https://blog.tag.gg 显示 “容器 blog.tag.gg”的内容。
  2. 访问 http://web1.tag.gg 或 https://web1.tag.gg 显示 “容器 web1.tag.gg”的内容。
  3. 访问 http://web2.tag.gg 或 https://web2.tag.gg 显示 “容器 web2.tag.gg”的内容。

如果是生产环境,操作前请做好备份或快照。
实现方法:如果已在容器中部署了站点,则可以忽略这一步
1、创建测试容器环境

docker run --name blog.tag.gg -p 8081:80 -d nginx docker run --name blog.tag.gg -p 8081:80 -d nginx docker run --name blog.tag.gg -p 8081:80 -d nginx docker run --name blog.tag.gg -p 8081:80 -d nginx docker run --name blog.tag.gg -p 8081:80 -d nginx
docker run --name web1.tag.gg -p 8082:80 -d nginx
docker run --name web2.tag.gg -p 8083:80 -d nginx

如果要进入某个容器,可用如下命令:

docker exec -it blog.tag.gg bash docker exec -it blog.tag.gg bash

2、创建后的容器情况如下,创建后可以用ip或域名加端口号可以访问到容器服务,例如 http://8.8.8.8:8081/ 或 http://blog.tag.gg:8081访问。能访问则说明正常。

[root@blog-tag-gg ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                                   NAMES
7f407693d191   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8083->80/tcp, :::8083->80/tcp   web2.tag.gg
dc631daf0120   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8082->80/tcp, :::8082->80/tcp   web1.tag.gg
8d1e4e2212e5   nginx     "/docker-entrypoint.…"   2 hours ago         Up 2 hours         0.0.0.0:8081->80/tcp, :::8081->80/tcp   blog.tag.gg
[root@blog-tag-gg ~]#

宿主上执行命令“netstat -lunpt”可以看到如下:
[root@blog-tag-gg ~]# netstat -lunpt

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1375/sshd             
tcp        0      0 0.0.0.0:8081            0.0.0.0:*               LISTEN      3480/docker-proxy   
tcp        0      0 0.0.0.0:8082            0.0.0.0:*               LISTEN      4384/docker-proxy   
tcp        0      0 0.0.0.0:8083            0.0.0.0:*               LISTEN      4492/docker-proxy  

tcp6       0      0 :::8081                 :::*                    LISTEN      3486/docker-proxy   
tcp6       0      0 :::8082                 :::*                    LISTEN      4390/docker-proxy   
tcp6       0      0 :::8083                 :::*                    LISTEN      4498/docker-proxy   

如图:

3、在宿主(服务器系统)中安装nginx。
说明:
若系统已安装了nginx,可以跳过安装这一步。
若服务器中80和443已被其他服务占用,则无法安装,这个需要自己核实清楚(安装前建议做好备份或快照,万一安装出了问题还可以还原
Centos安装nginx

yum -y install nginx

Ubuntu安装nginx

sudo apt install nginx

4、配置nginx:
找到nginx.conf配置文件,yum方式安装的nginx一半在“/etc/nginx/nginx.conf”。
在配置文件最后的一个“}”前面增加如下规则(添加的地方要正确,否则nginx无法启动,为了避免修改错误,操作前建议将nginx.conf文件复制备份一个

server
{
    listen 80;
   server_name blog.tag.gg;
  
#PROXY-START反向代理配置
location ^~ /
{
    proxy_pass http://127.0.0.1:8083;
    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_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;
    # proxy_hide_header Upgrade;

    add_header X-Cache $upstream_cache_status;
    #Set Nginx Cache

    set $static_fileqiDzCVTA 0;
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
    {
        set $static_fileqiDzCVTA 1;
        expires 1m;
    }
    if ( $static_fileqiDzCVTA = 0 )
    {
        add_header Cache-Control no-cache;
    }
}

#PROXY-END 反向代理配置结束

#设置访问日志以及错误日志,具体路径更换为自己的
    access_log  /www/wwwlogs/blog.tag.gg.log;
    error_log  /www/wwwlogs/blog.tag.gg.error.log;
#日志结束
}

如果多个站点,分别复制然后修改一下绑定的域名和反向代理的端口号即可。
执行如下命令检测配置是否有问题。

nginx -t

若显示如下则表示配置没问题。

[root@blog-tag-gg conf]# nginx -t
nginx: the configuration file /www/server/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /www/server/nginx/conf/nginx.conf test is successful

重启nginx服务以便配置生效。

service nginx restart

此时,使用http://blog.tag.gg和 http://web1.tag.gg 以及 http://web2.tag.gg 分别可以访问到对应容器里面内容了。(http)
但我们有时候需要https可以访问怎么操作呢?可以将上面代码替换为如下:

server
{
    listen 80;
    listen 443 ssl http2;
    server_name blog.tag.gg;
    
 #SSL证书配置,证书文件更换为自己额。
    #error_page 404/404.html;
    ssl_certificate    /www/blog.tag.gg.crt;
    ssl_certificate_key    /www/blog.tag.gg.pem;

    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;


   
#PROXY-START反向代理配置
location ^~ /
{
    proxy_pass http://127.0.0.1:8083;
    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_set_header REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_http_version 1.1;
    # proxy_hide_header Upgrade;

    add_header X-Cache $upstream_cache_status;
    #Set Nginx Cache

    set $static_fileqiDzCVTA 0;
    if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" )
    {
        set $static_fileqiDzCVTA 1;
        expires 1m;
    }
    if ( $static_fileqiDzCVTA = 0 )
    {
        add_header Cache-Control no-cache;
    }
}
#PROXY-END 反向代理配置结束

#设置访问日志以及错误日志,具体路径更换为自己的
    access_log  /www/wwwlogs/blog.tag.gg.log;
    error_log  /www/wwwlogs/blog.tag.gg.error.log;
#日志结束
}

配置后参考上面步骤检测配置是否正确,若正确,然后重启nginx服务.
重启后使用 http或https就可以访问了。如下:

 

 

至此,配置完成了,希望对您有帮助。
如果配置有问题,可以扫描如下添加“技术小学生”微信公众要回复问题,我看到后可以给与协助。

技术小学生微信公众号
华为服务器
腾讯云服务器大促销。

声明:站长码字很辛苦啊,转载时请保留本声明及附带文章链接:https://blog.tag.gg/showinfo-7-36320-0.html
亲爱的:若该文章解决了您的问题,可否收藏+评论+分享呢?
上一篇:解决Nginx报error while loading shared libraries: libjemalloc.so.2: cannot open
下一篇:Nginx如何监听IPV6地址方法