如何修复 nginx 中的 502 Bad Gateway 错误?
How to fix 502 Bad Gateway error in nginx?
我有一个服务器运行宁docker-compose。 Docker-compose 有 2 个服务:nginx(作为反向代理)和 back(作为处理 2 个请求的 api)。另外,还有一个数据库不在服务器上,而是单独存在的(数据库即服务)。
后台处理的请求数:
- get('/api') - 后台服务简单地回复“API is 运行ning”
- get('/db') - 后台服务向外部数据库发送一个简单查询 ('SELECT random() as random, current_database() as db')
请求 1 - 工作正常,请求 2 - 后台服务崩溃,nginx 继续工作,控制台出现 502 Bad Gateway 错误。
- nginx服务日志报错:upstream prematurely
从上游读取响应 header 时关闭连接。
- 后台服务日志:由于连接超时,连接终止。
这些都是相当模糊的错误。而且我不知道还有什么方法可以接近它们,因为代码不在容器中,没有 Nginx 并且使用相同的数据库,它可以正常工作。
我尝试过的:
- 增加内核和 RAM 的数量(现在是 2 个内核和 4 GB 的 Ram);
- add/remove/change proxy_read_timeout、proxy_send_timeout 和 proxy_connect_timeout 参数;
- 通过 postman 和 curl 测试 www.test.com/db 请求(失败并出现相同的错误);
- 运行 没有容器的本地计算机上的代码,使用相同的池和相同的 ip 组合并连接到相同的数据库(一切正常,两个请求都可以工作并发送你需要的东西);
- 更改参数worker_processes(测试值为 1 和 auto);
- add/remove 属性 proxy_set_header 主机 $http_host,将 $http_host 替换为“www.test.com”。
问题:
我还能尝试什么来修复错误并使数据库请求正常工作?
我的nginx.conf:
worker_processes 1;
events {
worker_connections 1024;
}
http{
upstream back-stream {
server back:8080;
}
server {
listen 80;
listen [::]:80;
server_name test.com www.test.com;
location / {
root /usr/share/nginx/html;
resolver 121.0.0.11;
proxy_pass http://back-stream;
}
}
}
我的docker-compose.yml:
version: '3.9'
services:
nginx-proxy:
image: nginx:stable-alpine
container_name: nginx-proxy
ports:
- 80:80
- 443:443
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- network
back:
image: "mycustomimage"
container_name: back
restart: unless-stopped
ports:
- '81:8080'
networks:
- network
networks:
network:
driver: bridge
如果需要,我可以上传其他文件。仅考虑到代码在容器中无法正常工作这一事实,问题在于设置容器。
如有任何帮助,我将不胜感激。
后面的代码:here
错误的原因是这样的:我忘记将我的服务器的ip添加到数据库集群的允许地址列表中。
我有一个服务器运行宁docker-compose。 Docker-compose 有 2 个服务:nginx(作为反向代理)和 back(作为处理 2 个请求的 api)。另外,还有一个数据库不在服务器上,而是单独存在的(数据库即服务)。
后台处理的请求数:
- get('/api') - 后台服务简单地回复“API is 运行ning”
- get('/db') - 后台服务向外部数据库发送一个简单查询 ('SELECT random() as random, current_database() as db')
请求 1 - 工作正常,请求 2 - 后台服务崩溃,nginx 继续工作,控制台出现 502 Bad Gateway 错误。
- nginx服务日志报错:upstream prematurely 从上游读取响应 header 时关闭连接。
- 后台服务日志:由于连接超时,连接终止。
这些都是相当模糊的错误。而且我不知道还有什么方法可以接近它们,因为代码不在容器中,没有 Nginx 并且使用相同的数据库,它可以正常工作。
我尝试过的:
- 增加内核和 RAM 的数量(现在是 2 个内核和 4 GB 的 Ram);
- add/remove/change proxy_read_timeout、proxy_send_timeout 和 proxy_connect_timeout 参数;
- 通过 postman 和 curl 测试 www.test.com/db 请求(失败并出现相同的错误);
- 运行 没有容器的本地计算机上的代码,使用相同的池和相同的 ip 组合并连接到相同的数据库(一切正常,两个请求都可以工作并发送你需要的东西);
- 更改参数worker_processes(测试值为 1 和 auto);
- add/remove 属性 proxy_set_header 主机 $http_host,将 $http_host 替换为“www.test.com”。
问题: 我还能尝试什么来修复错误并使数据库请求正常工作?
我的nginx.conf:
worker_processes 1;
events {
worker_connections 1024;
}
http{
upstream back-stream {
server back:8080;
}
server {
listen 80;
listen [::]:80;
server_name test.com www.test.com;
location / {
root /usr/share/nginx/html;
resolver 121.0.0.11;
proxy_pass http://back-stream;
}
}
}
我的docker-compose.yml:
version: '3.9'
services:
nginx-proxy:
image: nginx:stable-alpine
container_name: nginx-proxy
ports:
- 80:80
- 443:443
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
networks:
- network
back:
image: "mycustomimage"
container_name: back
restart: unless-stopped
ports:
- '81:8080'
networks:
- network
networks:
network:
driver: bridge
如果需要,我可以上传其他文件。仅考虑到代码在容器中无法正常工作这一事实,问题在于设置容器。
如有任何帮助,我将不胜感激。
后面的代码:here
错误的原因是这样的:我忘记将我的服务器的ip添加到数据库集群的允许地址列表中。