docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker部署Nginx反向代理

Docker部署Nginx反向代理的坑与解决方案实战记录

作者:爱笑男孩424

这篇文章主要介绍了Docker部署Nginx反向代理的坑与解决方案的相关资料,通过本文的介绍,你可以掌握如何在Docker中部署Nginx作为反向代理,并解决了常见的报错问题,需要的朋友可以参考下

前言

大家购买域名的第一件事肯定是想让自己网站的访问地址变得好看一点,我的想法也的确如此,我就会用Nginx的反向代理来部署我的域名信息

不过我在Linux宿主机上部署没那么多问题,在Docker上部署Nginx的时候需要考虑环境隔离、端口映射等因素,这里还是有比较多的坑,所以今天就给大家分享一下在Docker上部署Nginx实现反向代理的过程

一、前期准备

1、购买域名:可以去阿里云、腾讯云等各大厂商购买对应的域名,这里大家自行去购买即可

2、域名备案:购买好域名之后要进行备案,但是备案有个前提条件,比如你在阿里云购买的域名,你需要在阿里云有一台大于一个月有效时间的云服务器,各大厂商也有对应的学生优惠,大家也可自行选择(这里估计得要一个星期)

3、域名解析:域名备案完成后你就可以对其进行解析,比如解析成www.abc.com这种前缀不同的,记录类型选择A,记录值填对应的服务器IP即可

4、SSL证书申请:域名解析完成后就去申请对应的SSL证书,这个证书信息在Nginx实现反向代理需要用到的,一般几分钟就能签发成功,签发成功后点击下载,服务类型选择Nginx的即可

5、上传证书:在服务器中新建一个cert的文件夹,然后将刚才下载好的证书信息上传到该文件夹下

前期准备完成!

二、准备后端服务

我们需要启动一个后端的服务用来验证结果,我这里就准备了一个简单的demo来测试,实际的可以根据自己的来

在本地我们可以通过java -jar xxx.jar命令运行jar来查看效果

能够看到运行之后没啥问题,然后将jar包上传到服务器上,如何运行这里就不演示了,需要在服务器上启动一个后端的服务,后面配置的时候会用到

三、实战部署

1、安装Docker

由于要使用 Docker 进行 Nginx 的部署,首先需要在系统上安装 Docker。本文以 CentOS 7.9 操作系统为例,可按照以下方式进行安装。

2、启动临时容器

首先需要启动一个临时的Nginx容器,将容器中的nginx.conf等配置文件拷贝到宿主机中,方便我们在后面对数据挂载进行操作

# 1、拉取Nginx最新镜像
docker pull nginx

# 2、启动Nginx容器
docker run -d --name nginx -p 80:80 nginx

# 3、拷贝文件
docker cp nginx:/etc/nginx/nginx.conf /project/nginx/conf 
docker cp nginx:/etc/nginx/conf.d/default.conf /project/nginx/conf.d

# 4、删除Nginx临时容器
docker rm -f nginx

# 5、赋予宿主机对配置文件的操作权限
chmod 777 /youpath/nginx/{html,logs,conf.d/default.conf,conf/nginx.conf}

# 6、将ssl证书信息拷贝到容器内(这一步放到启动正式容器后做)
docker cp /youpath/nginx/cert nginx:/etc/nginx/cert

3、启动正式容器

现在我们有了配置文件之后就可以进行文件挂载启动容器了,用下面的命令启动一个Nginx容器

docker run -d -p 80:80 --name nginx \
-v /youpath/nginx/logs:/var/log/nginx \
-v /youpath/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /youpath/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
nginx

启动成功后我们可以用docker ps命令可以查看到运行的Nginx容器了,并且/youpath/nginx下面也有对应的文件

我们可以在浏览器用服务器ip来查看效果,默认会访问/usr/share/html下面的静态文件

404是因为/usr/share/html下面没有文件

4、 编辑nginx.conf文件

server {
    listen 80;
    server_name www.abc.test;
    location / {
     proxy_pass: http:127.0.0.1:8080/;
    };
}

上面那段配置的意思就是,将来自 www.abc.test 域名的 HTTP 请求转发到本地(服务器)运行在端口 8080 的应用

配置完成之后我们用docker restart <nginx容器名或ID>重启Nginx容器使配置生效。

重启完成后我们在浏览器中访问www.abc.test,可以发现访问不通

这是因为Docker启动的容器是环境隔离的,访问www.abc.test的时候不会转发到服务器上的8080端口,而是会转发到nginx容器的8080端口,但是后端服务是启动在服务器上的,所以就访问不通了

# 我们需要将127.0.0.1修改成服务器的ip地址,这样就直接会去访问服务器上运行的8080端口的服务了
server {
    listen 80;
    server_name www.abc.test;
    location / {
     proxy_pass: http:<服务器ip>:8080/;
    };
}

修改完成后我们再次重启Nginx容器,然后在浏览器上用刚刚的方式进行访问,可以看到访问成功了

5、修配置域名证书信息

1. 修改 nginx.conf 配置文件,添加 SSL 证书相关配置:

server {
    listen 443 ssl;
    server_name www.abc.test; #修改成自己的
    ssl_certificate /etc/nginx/cert/www.abc.test_bundle.crt; #修改成自己的
    ssl_certificate_key /etc/nginx/cert/www.abc.test.key; #修改成自己的
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    location / {
      proxy_pass http://<服务器>:8080; #修改成自己的
      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 X-Forwarded-Proto $scheme;
    } 
}

修改完成后重启Nginx容器,在浏览器用https://www.abc.test的形式去访问

可以看到访问不通,这是为啥呢,明明证书信息没错,域名和代理地址都写对了,为啥就是访问不通呢

2. 访问不通的问题及解决方法

修改完成后重启 Nginx 容器,在浏览器中用https://www.abc.test的形式去访问,可能会出现访问不通的情况。可能的原因有以下几点:

1、域名未解析到云服务器的 IP:检查域名解析记录,确保域名已正确解析到云服务器 IP。

2、服务器防火墙未开启 443 端口:使用systemctl status firewalld查看防火墙开启状态,若未开启 443 端口,需开启后再尝试。

3、安全组未开启:安全组是一种虚拟防火墙,用于设置云服务器、负载均衡、云数据库等实例的网络访问控制。默认情况下为关闭状态,需开启服务器的安全组设置后再尝试。

4、Nginx容器未映射443端口(本文作者遇到的情况):因为我们在Nginx上监听了443端口,客户端访问域名的时候会先走到Nginx这里,然后通过方向代理到proxy_pass的地址,但由于我们没有开启443的端口,所以访问不了

如果是第四种原因的话就先删除容器,然后用以下的命令重新运行容器

docker run -d -p 80:80 -p 443:443 --name nginx \
-v /project/nginx/logs:/var/log/nginx \
-v /project/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ 
-v /project/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
nginx

重启完成后,再次用 https 访问,此时应该可以访问成功。

四、总结

通过以上步骤,我们成功地在 Docker 上部署了 Nginx 实现反向代理,并解决了过程中遇到的各种问题。在实际操作中,可能会遇到不同的情况,但只要按照上述方法进行排查和解决,相信大家都能顺利完成部署。希望本文能对大家在 Docker 上部署 Nginx 反向代理提供有益的参考。

附:常见报错及解决方法

1. 502 Bad Gateway

原因:Nginx无法连接到后端服务,可能是后端服务未启动或网络配置错误。

解决方法

2. 404 Not Found

原因:请求的资源未找到,可能是路径配置错误或后端服务未正确返回内容。

解决方法

3. SSL证书问题

原因:如果使用了SSL证书,但证书路径或证书内容不正确,可能会导致连接失败。

解决方法

4. 权限问题

原因:Nginx容器可能没有足够的权限访问挂载的配置文件或目录。

解决方法

sudo chown -R 101:101 /path/to/your/conf.d
sudo chown -R 101:101 /path/to/your/ssl

5. Docker网络问题

原因:如果后端服务和Nginx容器不在同一个网络中,可能会导致连接失败。

解决方法

yaml复制

version: '3'
services:
  nginx:
    image: custom-nginx-proxy
    ports:
      - "80:80"
    networks:
      - my-network
  backend:
    image: your-backend-image
    networks:
      - my-network

networks:
  my-network:
    driver: bridge

到此这篇关于Docker部署Nginx反向代理的坑与解决方案的文章就介绍到这了,更多相关Docker部署Nginx反向代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文