Docker部署Vue/Node.js+Nginx出现connect()失败(111:拒绝连接)排查
我来帮你一步步排查这个问题,这种错误本质上就是Nginx找不到或者连不上你配置的vue服务,常见原因和解决方法如下:
服务名称/端口不匹配
你Nginx配置里的proxy_pass http://vue:8081是在找名叫vue的服务,并且访问它的8081端口。你得先核对你的docker-compose.yml:- 前端服务的名称是不是真的叫
vue?比如如果docker-compose里的服务块写的是frontend:而不是vue:,那Nginx肯定找不到这个服务。 - 前端容器实际监听的端口是不是8081?Vue项目默认启动端口是8080,如果你的前端容器里启动的是8080,那写8081就会直接被拒绝。
解决方法:把Nginx的proxy_pass改成和docker-compose里服务名、实际端口一致的地址,比如如果服务名叫frontend,端口是8080,就改成http://frontend:8080。
- 前端服务的名称是不是真的叫
容器不在同一个网络
Docker Compose默认会给所有服务创建一个专属的内部网络,只有在同一个网络里的容器才能通过服务名互相访问。如果你的Nginx容器和前端vue容器被分到了不同的网络,那肯定连不上。
解决方法:检查docker-compose.yml里的网络配置,如果手动指定了网络,确保两个服务都加入了同一个网络;如果没手动配置,那默认情况下compose会把所有服务放在同一个网络里,这部分一般没问题。前端服务启动慢,Nginx先跑起来了
有时候Nginx容器启动速度很快,但前端Vue项目还在安装依赖、编译打包,这时候Nginx去连接还没就绪的前端服务,就会出现连接拒绝。
解决方法:可以在docker-compose的Nginx服务里加上depends_on来保证启动顺序:depends_on: - vue不过要注意,
depends_on只是让Nginx在vue容器启动后再启动,不会等服务完全就绪。如果需要确保前端服务真的能访问了再启动Nginx,可以用wait-for-it这类工具写个启动脚本,让Nginx等前端的8081端口能通了再启动。前端服务本身启动失败
有可能你的Vue项目在容器里根本没启动成功,比如依赖安装失败、编译报错,导致8081端口根本没被监听。
解决方法:用docker logs <你的前端容器名>查看容器日志,看看有没有报错信息,先把前端服务本身的启动问题解决掉,确保它能正常监听指定端口。
内容的提问来源于stack exchange,提问作者mending3

