【问题标题】:Timeout issues using NGINX as a Postgres Proxy使用 NGINX 作为 Postgres 代理的超时问题
【发布时间】:2020-09-17 07:42:32
【问题描述】:

我正在设置代理服务器来拦截所有流量并将其转发到我的 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 nginx proxy


    【解决方案1】:

    您是否在/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 中检查正在运行的进程以确认它何时完成。

    【讨论】:

    • 我检查了错误日志并看到了Connection reset by peer,它表明 Postgres 切断了连接....奇怪的是我可以使用 simpleproxy 并且可以运行更长的时间而不会丢失连接.也许 NGINX 在 10 分钟后会做一些事情,也许是为了保持连接活跃,这导致 Postgres 取消查询?嗯...嗯,这是帮助我调试的开始。
    • 好吧,我想通了!您在上面提供的链接是针对 ngx_http_* 模块的,但我需要的是这里的 ngx_stream_proxy_module 模块:nginx.org/en/docs/stream/ngx_stream_proxy_module.html 原来它就像设置 proxy_timeout 6h 以增加超时一样简单。问题解决了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多