Docker部署Nginx反向代理的坑与解决方案实战记录
作者:爱笑男孩424
前言
大家购买域名的第一件事肯定是想让自己网站的访问地址变得好看一点,我的想法也的确如此,我就会用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容器
-d
:表示容器后台运行-p
:端口映射,前面的是宿主机的端口,后面的是容器内的端口,表示容器内的80端口映射到宿主机的80端口上--name
:表示启动容器的名称-v
:表示数据卷挂载,:
前面的是宿主机上的文件**(根据自己的来)**,:
后面的是容器内的文件,这样我们在宿主机上修改文件的内容时,容器内的文件也会发生响应的变化
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文件
在
/youpath/nginx/conf
文件夹下,编辑 nginx.conf 文件,在文件的http
下添加以下配置:
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无法连接到后端服务,可能是后端服务未启动或网络配置错误。
解决方法:
确保后端服务正在运行,并且可以通过指定的地址和端口访问。
检查Nginx配置文件中的
proxy_pass
是否正确。使用
docker logs
查看Nginx容器的日志,确认具体的错误信息。
2. 404 Not Found
原因:请求的资源未找到,可能是路径配置错误或后端服务未正确返回内容。
解决方法:
检查
location
块的路径是否与后端服务的路径一致。确保后端服务返回的内容路径正确。可以尝试直接访问后端服务的地址,确认是否能正常返回内容。
3. SSL证书问题
原因:如果使用了SSL证书,但证书路径或证书内容不正确,可能会导致连接失败。
解决方法:
确保SSL证书和密钥文件的路径正确,并且文件内容无误。
在Nginx配置文件中正确配置
ssl_certificate
和ssl_certificate_key
的路径。
4. 权限问题
原因:Nginx容器可能没有足够的权限访问挂载的配置文件或目录。
解决方法:
确保挂载的目录和文件的权限正确。可以使用以下命令调整权限:
sudo chown -R 101:101 /path/to/your/conf.d sudo chown -R 101:101 /path/to/your/ssl
5. Docker网络问题
原因:如果后端服务和Nginx容器不在同一个网络中,可能会导致连接失败。
解决方法:
使用Docker Compose时,确保所有服务都在同一个网络中。例如:
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反向代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!