当前位置: 首页 > 知识库问答 >
问题:

带Docker的Nginx 504网关超时

景光赫
2023-03-14

我使用PHP和Apache以及nginx作为反向代理,所有这些都在Docker上,我有几个长时间运行的调用在60秒后计时,导致504网关超时。我知道我的应用程序被成功调用,因为我正在跟踪我的PHP应用程序的日志,我可以看到它正在积极地向日志写入。每次都是60秒的超时,但我似乎不知道那个设置在哪里。

我尝试了这篇文章中的建议,但没有任何效果。我已经用一些与时间相关的设置更新了php.ini文件,并验证了这些设置是用phpinfo设置的

max_input_time = 0
max_execution_time = 500

我还将内存限制增加到512,但考虑到每次超时约60秒,我不认为这是问题所在。

至于更新nginx设置,我最初遵循了调整nginx-proxy超时的教程,但这并不起作用。我撤消了更改,然后SSH到容器中,并手动更新/etc/nginx/nginx.conf,http部分如下所示

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout           500;
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    send_timeout                600;
    client_max_body_size        5000;
    client_header_timeout       600;
    client_body_timeout         600;
    fastcgi_read_timeout        300;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

我确保在更新nginx.conf文件后运行nginx-s reload。我不知道还能去哪里看,因为我遇到的一切都是我已经做过的。还有什么可能导致nginx在60秒后超时?谢谢

这是我的PHP dockerfile

FROM php:7.2-fpm-alpine3.7

RUN apk update; \
    apk upgrade;

RUN docker-php-ext-install pdo_mysql

RUN apk add --no-cache php7-pear php7-dev gcc musl-dev make
RUN pecl install xdebug


RUN pecl install -o -f redis \
&&  rm -rf /tmp/pear \
&&  docker-php-ext-enable redis

共有1个答案

戎亦
2023-03-14

问题是nginx有自己的超时时间。理想情况下,您应该同步nginx和PHP。我不能在这里与Apache交谈,因为我不知道您用什么模式运行它(FPM或mod_php)。我也不确定为什么要运行Nginx和Apache,但是,如果您得到的是504响应,而PHP仍在处理该请求,那么Nginx将终止该请求并返回504响应。Nginx不像使用mod_php的Apache那样运行,其中进程是相同的。Nginx将中继请求并等待任何进程返回响应。

有关Nginx的超时,请参阅配置中的以下设置。

# Timeouts
# The client_body_timeout and client_header_timeout directives are
# responsible for the time a server will wait for a client body or
# client header to be sent after request. If neither a body or header
# is sent, the server will issue a 408 error or Request time out.
#
# The keepalive_timeout assigns the timeout for keep-alive connections
# with the client. Simply put, Nginx will close connections with the
# client after this period of time.
#
# Finally, the send_timeout is a timeout for transmitting a response
# to the client. If the client does not receive anything within this
# time, then the connection will be closed. Send the client a "request
# timed out" if the body is not loaded by this time. Default 60.
client_body_timeout   32;
client_header_timeout 32;
# Every 60 seconds server broadcasts Sync packets, so 90 is a conservative upper bound. Default is 65
keepalive_timeout 90;
send_timeout 300;
 类似资料:
  • 网关的标准超时时间是30秒。但是在一些复杂的流中,需要比这个标准更长的时间。如何解决这个问题?Corda作为一个平台有没有提供任何解决方案?

  • 我对API网关有一些问题。我做了几个API方法,有时它们的工作时间超过10秒,Amazon返回504错误。下面是截图: 请救命!如何增加超时?

  • 我在一个Spring boot项目中工作,有一个请求返回网关超时504。我可以增加这个超时吗?这是一个属性,我可以改变在独立的完整。xml?我使用的是wildfly服务器。 请求在1分钟内触发两次,每次触发时间为1分钟。

  • 你知道是怎么回事吗?

  • 很多次,当我试图在UI中打开某些DAG的树状视图或任务持续时间页面时,我得到错误:504网关超时。有时在那之后,我甚至无法打开包含DAG列表的页面。你知道这个问题可能来自哪里吗? 运行Airflow的机器的CPU和内存似乎很好,我使用RDS作为元数据。 谢谢!

  • 我们在项目中使用Spring cloud。我们有几个微服务,每个服务都有自己的。yml文件。 以下属性仅在zuul服务器中 下面是我在关联服务中得到的错误 以下是我在帐户服务中得到的错误 如果我保持睡眠时间为4500,它会给我响应,但如果是>=4800,它会抛出上面的异常。我想这与功能区超时无关,而是其他一些东西。任何特定原因导致上述异常后的某一点。 测试2 (这是一个很长的描述,但为了使它更清楚