Nginx 反向代理到 Docker 502 错误网关
Nginx Reverse Proxy to Docker 502 Bad Gateway
在这上面花了整整一周的时间,并尝试了所有相关的 Whosebug post。感谢您的光临。
我有一个 Ubuntu VM 运行 nginx,反向代理指向不同端口上的各种 docker 守护进程并发 运行。我所有的静态网站都完美无缺。但是,我有一个容器 运行 一个 expressjs 应用程序。
我在重新启动服务器大约一个小时后收到响应。然后我得到 502 Bad Gateway。 刷新会使站点恢复大约 5 秒,直到它永久关闭。这是可重现的。
docker 容器在容器内 0.0.0.0:8090 上进行了快速侦听
容器是运行
02e1917991e6 docker/express-site "docker-entrypoint.s…" About an hour ago Up About an hour 127.0.0.1:8090->8090/tcp express-site
Dockerfile 中公开了 8090 端口。
我尝试了其他端口。
关闭时,我可以在检查时从容器内卷曲网站。
关闭时,从 VM 内卷曲站点会产生
curl: (52) Empty reply from server
容器内和 VM 内的内存和 CPU 使用率勉强达到 5%。
网站通常有 SSL,但也尝试过 http。
尝试了各种 nginx 代理设置(见下面的配置)
使用开箱即用 nginx.conf
考虑到可能与超时或docker网络设置有关...
我的站点可用配置文件如下所示:
server {
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:8090;
#proxy_set_header Host $host;
#proxy_buffering off;
#proxy_buffer_size 16k;
#proxy_busy_buffers_size 24k;
#proxy_buffers 64 4k;
}
listen 80;
listen [::]:80;
#listen 443 ssl; # managed by Certbot
#ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
#ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
#include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
#ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
Nginx 错误日志显示:
2021/01/02 23:50:00 [error] 13901#13901: *46 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: ***.**.**.***, server: example.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:8090/favicon.ico", host: "www.example.com", referrer: "http://www.example.com"
还有其他人有想法吗?
没有得到太多反馈,但我做了更多研究,现在问题已经稳定,所以我想 post 我的发现。
我已经确定了 docker 容器的问题。 Nginx 可以直接在 VM 上使用相同的应用 运行。
我将 docker 容器映像从 node:12-alpine
更新为 node:14-alpine
。该站点已正常运行 42 小时。
如果再次随机失败,则可能是负载问题。
我希望这能解决某人的问题。
更新 2021-10-24
同样的问题开始了,我已将其缩小到我的 Ubuntu 版本上的端口 and/or docker。我可以推荐...
- 更改端口
- 正在重启您的电脑
- 正在安装最新的 OS 和 docker 更新
在这上面花了整整一周的时间,并尝试了所有相关的 Whosebug post。感谢您的光临。
我有一个 Ubuntu VM 运行 nginx,反向代理指向不同端口上的各种 docker 守护进程并发 运行。我所有的静态网站都完美无缺。但是,我有一个容器 运行 一个 expressjs 应用程序。
我在重新启动服务器大约一个小时后收到响应。然后我得到 502 Bad Gateway。 刷新会使站点恢复大约 5 秒,直到它永久关闭。这是可重现的。
docker 容器在容器内 0.0.0.0:8090 上进行了快速侦听
容器是运行
02e1917991e6 docker/express-site "docker-entrypoint.s…" About an hour ago Up About an hour 127.0.0.1:8090->8090/tcp express-site
Dockerfile 中公开了 8090 端口。
我尝试了其他端口。
关闭时,我可以在检查时从容器内卷曲网站。
关闭时,从 VM 内卷曲站点会产生
curl: (52) Empty reply from server
容器内和 VM 内的内存和 CPU 使用率勉强达到 5%。
网站通常有 SSL,但也尝试过 http。
尝试了各种 nginx 代理设置(见下面的配置)
使用开箱即用
nginx.conf
考虑到可能与超时或docker网络设置有关...
我的站点可用配置文件如下所示:
server {
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:8090;
#proxy_set_header Host $host;
#proxy_buffering off;
#proxy_buffer_size 16k;
#proxy_busy_buffers_size 24k;
#proxy_buffers 64 4k;
}
listen 80;
listen [::]:80;
#listen 443 ssl; # managed by Certbot
#ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem; # managed by Certbot
#ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; # managed by Certbot
#include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
#ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
Nginx 错误日志显示:
2021/01/02 23:50:00 [error] 13901#13901: *46 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: ***.**.**.***, server: example.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://127.0.0.1:8090/favicon.ico", host: "www.example.com", referrer: "http://www.example.com"
还有其他人有想法吗?
没有得到太多反馈,但我做了更多研究,现在问题已经稳定,所以我想 post 我的发现。
我已经确定了 docker 容器的问题。 Nginx 可以直接在 VM 上使用相同的应用 运行。
我将 docker 容器映像从 node:12-alpine
更新为 node:14-alpine
。该站点已正常运行 42 小时。
如果再次随机失败,则可能是负载问题。
我希望这能解决某人的问题。
更新 2021-10-24
同样的问题开始了,我已将其缩小到我的 Ubuntu 版本上的端口 and/or docker。我可以推荐...
- 更改端口
- 正在重启您的电脑
- 正在安装最新的 OS 和 docker 更新