Тайм-аут Nginx 504 с Docker - PullRequest
0 голосов
/ 07 июня 2019

Я использую PHP и Apache с nginx для обратного прокси-сервера, все в Docker, и у меня есть пара длительных вызовов, которые синхронизируются через 60 секунд, что приводит к тайм-ауту шлюза 504.Я знаю, что мое приложение вызывается успешно, потому что я отслеживаю журнал моего приложения PHP и вижу, что оно активно записывает в журнал.Каждый раз это 60-секундный тайм-аут, но я не могу понять, где находится этот параметр.

Я попробовал предложения в этом посте , но ничего не получалось.Я обновил свой файл php.ini, установив несколько настроек времениПримерно через 60 секунд я не думаю, что это проблема.

Что касается обновления настроек nginx, я изначально следовал этому руководству по настройке тайм-аута nginx-прокси, но это нене работаетЯ отменил изменения, затем ssh'd в контейнер и вручную обновил /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 -s reloadфайл nginx.conf.Я не уверен, где еще искать, потому что все, с чем я сталкивался, в значительной степени то, что я уже сделал.Что еще может вызывать тайм-аут nginx через 60 секунд?Спасибо

Вот мой докер-файл PHP

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 Ответ

0 голосов
/ 07 июня 2019

Проблема в том, что у nginx есть собственные таймауты. В идеале вы должны синхронизировать nginx и PHP. Я не могу говорить с Apache здесь, так как я не знаю, в каком режиме вы его используете (FPM или mod_php). Я также не совсем уверен, почему вы используете Nginx и Apache, но если вы получаете ответ 504, а PHP все еще обрабатывает запрос, Nginx завершает запрос и возвращает ответ 504. Nginx не работает как Apache с mod_php, где процессы - это одно и то же. 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;
...