首页 > 解决方案 > 使用 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。

标签: ubuntunginxproxy

解决方案


/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

有关每个说明,请参阅文档:

对于诸如VACUUM连接可能终止但进程可能仍在运行之类的事情。您可以检查 Postgres 中正在运行的进程以确认它何时完成。


推荐阅读