Eu tenho um servidor de jogo (counter strike 2) no Oriente Médio. Estou tentando configurar um painel web para ele que está hospedado na Europa em um VPS Ubuntu 22. Este site tem uma ferramenta que permite que comandos remotos sejam executados no servidor de jogo a partir do site usando o protocolo RCON de origem.
O site usa PHP (Laravel). Quando tento usar o console RCON no site para executar comandos, recebo Nginx 504 gateway time-out.
O log do Nginx mostra o seguinte:
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/"
No começo, pensei que talvez houvesse um problema de conexão entre o VPS da Europa e meu servidor de jogo, então instalei o rcon-cli no meu VPS da Europa e, usando isso, consegui conectar com sucesso ao servidor de jogo. Como resultado, imaginei que o problema estivesse relacionado apenas à ferramenta PHP RCON.
Já que muitas pessoas estão usando este painel de site e não têm problemas, duvido que haja algo errado com o código também. A única coisa que me vem à mente é minha configuração Nginx.
Aqui está meu Nginx site.conf:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
server_name some.domain.com;
root /var/www/html/aim1/public; ##<----THIS IS THE ACTUAL PATH
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;
}
}
Aqui está meu fastcgi.conf:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
E por último, aqui está meu arquivo nginx.conf:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
Alguém pode me ajudar a me livrar desse erro do Nginx?
A mensagem de erro do nginx informa que o tempo limite do soquete PHP-FPM expirou ao aguardar uma resposta:
Ou seja, o problema ocorre no estágio de execução do código PHP - ele prossegue por mais tempo do que os timeouts definidos no nginx (60 segundos por padrão). Muito provavelmente, o script está tendo problemas para se conectar ao servidor do jogo, ou há outros problemas. Verifique o log de erros do PHP.
Se você suspeitar que o código pode ficar em execução por muito tempo, você pode tentar aumentar os tempos limite do nginx adicionando
site.conf
naslocation ~ \.php$
diretivasfastcgi_connect_timeout
,fastcgi_read_timeout
,fastcgi_send_timeout
o número necessário de segundos: https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html