项目实战:服务器中的nginx和docker起的nginx冲突怎么办
今天,后端过来说有个需求需要前端帮忙,我立即摆谱:“哼,什么问题?”
他连忙跑到我的座位前,窜着手机跟我说:“我发你一个链接,能不能把这些代码放到 hosts 文件里。”
我说:“这是什么?为什么要放。”
经过他的解释,大致是
前端点击一个按钮,调用 API ,后端返回一个 url,url 是第三方链接(后端对接第三方公司返回的链接),因为第三方链接的测试环境需要内网环境才能测试,所以要测试这个产品需要配置 hosts 文件
我的理解是,这个只需要在本机上添加 hosts 文件,让测试添加即可,管我前端什么事!
后来经过拉锯战,他找来技术负责人,负责人亲自讲解,希望我把这些代码放到前端服务器的 hosts 文件中
没办法,说了不听,听了不悦,要我做。官大一级压死人。这里也很有意思,技术人员中,如果你技术真的过硬,听你的,确实没问题,到后面下级还能学到东西。但是如果上级技术一般,这个知识点不是很懂,那么只能试,试就需要成本,这次就是一次成本代价
我在服务器上的 hosts 中添加代码后,网站就访问不了了,nginx 502
我感觉删掉添加的代码,再重启 DNS 服务,结果还是不行
继续搞,搞半天才想起来我的站点部署在 docker 中,启动服务器的 nginx 没用
搞 docker
常用命令
docker ps
查看运行的容器docker exec -it containerID /bin/bash
进入指定容器的 docker 服务
先删掉原本的 docker,在手动启动 docker 命令(同事写好的 bash 文件)
直接报错,反向代理不能用字母
host not found in upstream "XXX.com" in /etc/nginx/conf.d/default.conf:18
nginx: [emerg] host not found in upstream "XXX.com" in /etc/nginx/conf.d/default.conf:18
暂时找不到原因,先改,改成 ip 后,启动成功,使用
docker exec -it containerID /bin/bash
进入容器中,查看 docker 中的 nginx 和静态文件是否有问题,发现都是最新的,理论上是没问题的
回到服务中,再查看端口占用
ps -ef | grep nginx
有好几个 nginx 的服务是启动的
所以猜想是不是 hosts 文件添加之后,docker 自动被弄坏了,然后我再启动了 nginx,nginx 和 docker 启动的 nginx 冲突,所以即使把 hosts 文件恢复了,因为 nginx 一直启动着,所以 docker 启动的容器一直不能访问
解决方案
简单来说,把服务器中的 nginx
关掉,再重启 docker
容器即可
一、查找 nginx
所占的端口
ps -ef | grep nginx
二、杀掉所有的与 nginx
相关的端口
kill -9 12782
三、重启 docker
相关容器
docker restart f4d
总结
到最后解决方案很简单,但主要是排查能力和对命令的熟悉
这次排查唤起了我对很多 nginx 和 docker 的知识点,明年要对这两块做重新的知识梳理