ubuntu - 使用 NGINX 作为 Postgres 代理的超时问题
问题描述
我正在设置代理服务器来拦截所有流量并将其转发到我的 Postgres 数据库。我正在使用 NGINX 1.19.2 来实现这一点。
我遇到的问题是运行超过 10 分钟的任何查询都会超时。所有较短的查询似乎都运行得很好。
这是我的全部nginx.conf
:
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
stream {
server {
# Allow up to 30s to establish a connection with the proxied database
proxy_connect_timeout 30s;
proxy_socket_keepalive on;
listen 5432;
proxy_pass my-server.rds.amazonaws.com:5432;
}
}
我已经尝试了几个与 NGINX 代理相关的配置选项(例如proxy_read_timeout
),但是,它们在上下文中不起作用stream { }
,需要在http { }
上下文中。为了连接到 Postgres,我不能使用 http。
- 有谁知道我可以做些什么来使用 NGINX 流/代理消除这 10 分钟的连接超时?
- 有谁知道一个更好的替代方案来完成我正在尝试做的事情,它使用 NGINX 以外的东西?
- 我在 Ubuntu 上试过
simpleproxy
,但 2 小时后超时(是的,我们必须支持一些长时间运行的查询,例如VACUUM
对十亿多行表的操作)
- 我在 Ubuntu 上试过
解决方案
/var/log/nginx/error.log
您是否看到与这些请求相关的任何错误?
如果您看到Connection reset by peer
这意味着您的上游(Postgres)正在关闭连接,而不是 Nginx。
另外,你确定这不是你的下游吗?您是直接连接到此服务器还是有负载均衡器 -> Nginx -> Postgres?负载均衡器可能正在终止连接。
我会尝试将所有超时设置设置得非常高,它们会进入server {}
上下文
proxy_cache_lock_timeout
proxy_connect_timeout
proxy_next_upstream_timeout
proxy_read_timeout
proxy_send_timeout
client_body_timeout
client_header_timeout
keepalive_timeout
lingering_timeout
resolver_timeout
send_timeout
# Not sure if you're using fastcgi
fastcgi_cache_lock_timeout
fastcgi_connect_timeout
fastcgi_next_upstream_timeout
fastcgi_read_timeout
fastcgi_send_timeout
有关每个说明,请参阅文档:
- http://nginx.org/en/docs/http/ngx_http_proxy_module.html
- http://nginx.org/en/docs/http/ngx_http_core_module.html
- http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html
对于诸如VACUUM
连接可能终止但进程可能仍在运行之类的事情。您可以检查 Postgres 中正在运行的进程以确认它何时完成。
推荐阅读
- amazon-web-services - Snowflake 与 Jumpcloud 集成引发 http 400 错误
- android - 如何从 android 的深层链接中获取值?
- java - 在回收站视图中从 Firebase 顶部显示新数据
- android - 我应该如何处理 2 个应用程序相同数据库的 Rest 服务
- r - 使用R计算第一列大于或等于第二列多少次
- wildfly - 将 Wildfly 作为 Windows 服务启动并等待启动完成
- mongodb - 无法通过 kubernetes 部署文件在 mongodb 中自动创建副本集的步骤
- android - 应用程序生成错误时,运行控制台中出现随机数是什么意思?
- powerbi - Sum where version is high by another variable that can be split by another columns
- python - 用角度渲染 tkinter create_text