введение
Обычно мы посещаем веб-сайт, или запрашиваем какие-то интерфейсы на работе, или тревогу онлайн-сервиса, мы часто видим два кода состояния 502 и 504. Если студенты, занимающиеся эксплуатацией и техническим обслуживанием, получают обратную связь о проблеме 502 или 504, обычно первое, что нужно сделать, это перезапустить службу, что часто бывает просто прекрасно.Перезапуск Дафа непобедим, хахаха. В этой статье будут рассмотрены обстоятельства, при которых появляются эти два кода состояния, и способы их устранения при обнаружении этих двух кодов состояния.
Значение 502 и 504
502 Bad Gateway
буквально означаетОшибка шлюза. Более официальное заявление заключается в том, что сервер, работающий в качестве шлюза или прокси, получил недопустимый ответ от вышестоящего сервера при попытке выполнить запрос.
504 Gateway Time-out
в прямом смыслеВремя ожидания шлюза истекло. Официально, когда сервер, работающий в качестве шлюза или прокси-сервера, пытается выполнить запрос, он не может получить своевременный ответ от вышестоящего сервера (сервера, идентифицируемого URI, например, HTTP, FTP, LDAP) или вторичного сервера (например, как DNS)
Приведенные выше объяснения являются относительно абстрактными, и следующие конкретные примеры используются для иллюстрации причин этих двух состояний, чтобы глубже понять значение этих двух кодов состояний.
Причины 502 и 504
502 Bad Gateway
Прежде всего, все мы знаем, что коды состояния, начинающиеся с 5, являются проблемами на стороне сервера. Мы столкнемся с такой ситуацией в нашей жизни, Когда мы бежали за билетами на Праздник Весны, мы обнаружили, что было 502, или у определенной знаменитости был горячий поиск, и у определенного блога было 502. С точки зрения непрофессионала, это потому, чтоНа веб-сайт внезапно поступает большое количество запросов, и сервер другой стороны не может вовремя их обработать, что приводит к ошибке 502.
С профессиональной точки зрения, когда приходит запрос с веб-страницы, nginx передает запрос в php-fpm для обработки, в это время по какой-то причине запрос еще не выполнен, и процесс обработки запрос прекращается.
Эта ситуация на самом деле связана с настройкой php-fpm, в основном обратите внимание на следующие три конфигурации:
max_execution_time в php.ini
This sets the maximum time in seconds a script is allowed to run before it is terminated by the parser. This helps prevent poorly written scripts from tying up the server. The default setting is 30. When running PHP from the command line the default setting is 0.
官方文档:https://www.php.net/manual/en/info.configuration.php#ini.max-execution-time
Предположительно, вышеизложенное означает, что этот параметр устанавливает максимальное время (в секундах), в течение которого скрипту разрешено работать до того, как анализатор завершится. Это помогает предотвратить использование ресурсов сервера неправильно написанными сценариями. По умолчанию установлено значение 30. При запуске PHP из командной строки по умолчанию установлено значение 0. Поэтому, когда запрос превышает 30 секунд без результата, он завершается, и мы получаем ошибку 502.
request_terminate_timeout в php-fpm.conf
; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
Выше приведен файл конфигурации php-fpm.conf, комментарии к конфигурации примерно означают: request_terminate_timeout подходит для случаев, когда max_execution_time не может по какой-то причине завершить скрипт, php-fpm убьет запрос
max_children в php-fpm.conf
Смысл этой конфигурации также объяснен в предыдущей статье (Всестороннее понимание CGI, FastCGI, PHP-FPM), что значитМаксимальное количество дочерних процессов, которые могут существовать одновременно. Когда за определенный период времени поступает большое количество запросов, что приводит к максимальному количеству ответов от php-fpm, в последующих запросах появляется 502. Здесь вы можете использовать следующую команду для просмотра текущего количества подключений.
#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回结果示例:
LAST_ACK 5 (正在等待处理的请求数)
SYN_RECV 30
ESTABLISHED 1597 (正常数据传输状态)
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057 (处理完毕,等待超时结束的请求数)
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
来自:https://www.cnblogs.com/linyouyi/p/10108440.html
Выше мы упоминали, что когда это происходит, студенты, занимающиеся эксплуатацией и обслуживанием, перезапускаются.После перезапуска php-fpm, php-fpm освобождает ресурсы, но в течение трех минут обнаруживается, что ситуация 502 возникает снова.В этом случае , как правило, необходимо проверить, не имеет ли база данных большое количество заблокированных процессов, то есть взаимоблокировка базы данных вызывает тайм-аут, в этом случае необходимо перезапустить базу данных или убить заблокированный SQL-процесс.
504 Gateway Time-out
504 обычно связан с конфигурацией nginx. Например, nginx устанавливает период ожидания, когда nginx не получает ответ от php-fpm в течение периода ожидания, он возвращает клиенту 504. Когда буфер fastcgi слишком мал, что приводит к приостановке процесса fastcgi, это также приводит к ошибке 504.
В основном это касается следующих параметров конфигурации в nginx:
fastcgi_connect_timeout
含义:定义用于与FastCGI服务器建立连接的超时时间
fastcgi_send_timeout
含义:设置将请求传输到FastCGI服务器的超时时间。 超时仅在两个连续的写操作之间设置,而不用于整个请求的传输。 如果FastCGI服务器在此时间内未收到任何信息,则连接将关闭
fastcgi_read_timeout
含义:定义用于从FastCGI服务器读取响应的超时时间。 超时仅在两次连续的读取操作之间设置,而不用于传输整个响应。 如果FastCGI服务器在此时间内未传输任何内容,则连接将关闭
fastcgi_buffer_size
含义:设置size用于读取从FastCGI服务器接收到的响应的第一部分的缓冲区。这部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一个内存页
fastcgi_buffers
含义:为单个连接设置用于从FastCGI服务器读取响应的缓冲区的number和size。默认情况下,缓冲区大小等于一个内存页
fastcgi_busy_buffers_size
含义:当缓冲中启用了从FastCGI的服务器响应,限制总size的缓冲区,可以是正忙于发送到客户端的响应,而响应尚不充分阅读。同时,其余的缓冲区可用于读取响应,并在需要时将响应的一部分缓冲到临时文件中。默认情况下,size受限于fastcgi_buffer_size和fastcgi_buffers指令设置的两个缓冲区的大小
fastcgi_temp_file_write_size
fastcgi_intercept_errors
以上大家可参考官方文档:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html