目录
背景
过程
日志
检查配置文件
重启服务
检查容器内的配置文件
容器和宿主机
其他
背景
用了两年的nginx新加的反向代理不生效
Docker挂载的配置文件启动的Nginx,配置一切正常,但是反向代理不生效,???先自查一波
过程
日志
按照常规排查思路,先查看日志
找到nginx的access.log和error.log两个日志文件,执行命令查看:tail -f error.log。
检查配置文件
嗯,没什么报错,接下来,打开配置文件,检查下配置
执行nginx -t ,测试 Nginx 配置文件的语法是否正确,(docker中命令为docker exec -it nginx nginx -t )
(docker exec -it <container_name_or_id>:在指定的容器中执行命令, 后面是具体执行的命令)
当然,也没啥问题
重启服务
又试着不使用reload命令重启,关闭服务再打开,重启容器,删除重建容器等方法,也没有效果
检查容器内的配置文件
是否挂载文件未生效
使用docker exec -it nginx bash命令,进入容器,查看了下配置文件,和挂载文件一致
容器和宿主机
确定的是nginx 本身是绝对没问题的,因为代理的静态文件是没有问题的,可以正常访问,这时候忽然想到一个问题,静态文件的映射是创建容器时指定了映射目录,新加的反向代理指向的地址是127.0.0.1:8089,是按照linux的配置来的,指向的地址是容器内部!
想到这里,霍然开朗。
修改nginx配置location指向地址
proxy_pass http://127.0.0.1:8089/;
改为
proxy_pass http://host.docker.internal:8089/;
这里,
host.docker.internal
是一个特殊的DNS名称,用于从Docker容器内部访问宿主机。
最后,重启!
至此,关于Nginx反向代理不生效的问题排查结束
其他
- 另一种方法是在Nginx配置中使用宿主机的实际IP地址作为代理的目标。
- 虽然不推荐,但你可以通过启动容器时使用
--net=host
选项来让容器使用宿主机的网络栈。这样,容器内的服务就能像宿主机上的服务一样直接访问网络。但请注意,这样做会丧失Docker提供的网络隔离和安全性。
直接从Docker容器中的Nginx代理到宿主机上的端口通常不是一个好的做法。更好的解决方案是将所有相关服务都容器化,并通过Docker的网络功能进行通信。如果确实需要这样做,可能需要重新考虑应用架构或寻找其他替代方案。