Вопрос или проблема
Я владею игровым сервером (Counter Strike 2) на Ближнем Востоке. Я пытаюсь настроить веб-панель для него, которая размещена в Европе на VPS с Ubuntu 22. На этом сайте есть инструмент, который позволяет выполнять удалённые команды на игровом сервере с сайта, используя протокол RCON от Source.
Сайт использует PHP (Laravel). Когда я пытаюсь использовать консоль RCON на сайте для выполнения команд, я получаю ошибку Nginx 504 – истечение времени ожидания шлюза.
Лог Nginx показывает следующее:
2024/12/25 22:21:34 [error] 1431#1431: *2081 upstream timed out (110: Unknown error) while reading response header from upstream, client: 88.196.213.143, server: some.domain.com, request: "GET /servers/1/players HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.3-fpm.sock", host: "some.domain.com", referrer: "https://some.domain.com/"
Сначала я подумал, что, возможно, есть проблема с подключением между VPS в Европе и моим игровым сервером, поэтому я установил rcon-cli на своем VPS в Европе, и с его помощью смог успешно подключиться к игровому серверу. В результате я пришел к выводу, что проблема связана только с инструментом RCON на PHP.
Поскольку многие люди используют эту веб-панель и не имеют проблем, у меня есть сомнения, что с кодом что-то не так. Единственное, что приходит мне в голову, это моя конфигурация Nginx.
Вот мой конфигурационный файл site.conf для Nginx:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
server_name some.domain.com;
root /var/www/html/aim1/public; ##<----ЭТО ФАКТИЧЕСКИЙ ПУТЬ
ssl_certificate /root/cert/some.domain.com/fullchain.pem;
ssl_certificate_key /root/cert/some.domain.com/privkey.pem;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Может кто-то помочь мне избавиться от этой ошибки Nginx?
Ответ или решение
Решение проблемы с ошибкой Nginx "upstream timed out (110: Unknown error)"
Ошибка Nginx "504 Gateway Timeout" (или "upstream timed out") может возникать по разным причинам, и её диагностика может занять некоторое время. Давайте разберем вашу ситуацию, учитывая все представленные сведения.
Описание проблемы
Вы являетесь владельцем игрового сервера Counter Strike 2, размещенного на сервере в Ближнем Востоке, и парой веб-панели, хостящейся в Европе на VPS под управлением Ubuntu 22. Ваша панель использует PHP (Laravel) и выполняет команды на игровом сервере с помощью протокола RCON. При попытке выполнить команды через веб-панель появляется ошибка Nginx 504 Gateway Time-out, что указывает на проблему с взаимодействием между вашим веб-сервером и приложением.
Анализ логов Nginx
Лог ошибки:
2024/12/25 22:21:34 [error] 1431#1431: *2081 upstream timed out (110: Unknown error) while reading response header from upstream, client: 88.196.213.143, server: some.domain.com, request: "GET /servers/1/players HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.3-fpm.sock", host: "some.domain.com", referrer: "https://some.domain.com/"
Эта строка указывает на то, что Nginx не получал ответ от PHP-FPM в течение установленного времени ожидания. Возможно, это связано с тем, что запросы к API RCON выполняются слишком долго, и PHP-FPM не успевает ответить на них.
Потенциальные решения
Вот несколько направлений для решения вашей проблемы:
-
Увеличение времени ожидания:
Возможно, текущие настройки времени ожидания (timeout) слишком низкие. Параметрыfastcgi_read_timeout
иproxy_read_timeout
можно увеличить. Добавьте следующие строки в секцию вашего конфигурационного файла Nginx:location ~ \.php$ { fastcgi_pass unix:/run/php/php8.3-fpm.sock; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; fastcgi_hide_header X-Powered-By; # Увеличение времени ожидания fastcgi_read_timeout 300; }
-
Проверка логов PHP-FPM:
Обратите внимание на логи PHP-FPM, которые могут дать дополнительные сведения о том, почему выполнение ваших команд через RCON занимает много времени или выдает ошибку. Это можно сделать, проверив настройки логирования в конфигурационном файле/etc/php/8.3/fpm/pool.d/www.conf
. -
Оптимизация кода Laravel:
Если увеличение времени ожидания не помогло, рекомендую тщательно проверить код веб-приложения, отвечающего за выполнение RCON-команд. Убедитесь, что ваши асинхронные запросы и обработка ответов происходят эффективно. Использование адекватных методов кэширования может также ускорить процесс. -
Тестирование запроса:
Попробуйте выполнить команду RCON через консольный клиент на вашем VPS, как вы уже делали. Сравните время отклика с веб-версией и убедитесь, что разница существенна. Если да, возможно, проблема действительно связана с обработкой в PHP. -
Настройки сети и безопасности:
Проверьте настройки брандмауэра и сети на обоих серверах (игровом и VPS). Возможно, существует проблема с временными задержками или фрагментацией пакетов, которые могут вызывать тайм-ауты.
Заключение
Ошибка Nginx 504 Gateway Timeout может иметь множество причин. Важным шагом будет систематическая диагностика и устранение потенциальных проблем. Начните с увеличения времени ожидания и изучения логов, а затем проверяйте код и сетевые настройки. Эти шаги помогут вам добиться более стабильной работы вашего веб-приложения и устранить проблему с тайм-аутами.
Если вы продолжите сталкиваться с проблемами, не стесняйтесь подробнее описать свои шаги, и я смогу помочь с более углубленной диагностикой.