Коротко: 502 Bad Gateway в вашем случае почти всегда означает, что nginx не может достучаться до PHP-FPM (upstream). В nginx 1.30 действительно изменён layout пакета у некоторых дистрибутивов — папок sites-available/sites-enabled может не быть, конфиги по умолчанию идут из /etc/nginx/nginx.conf и /etc/nginx/conf.d/*.conf. Ниже — чеклист и готовые примеры конфигураций, чтобы быстро починить работу Laravel / любого PHP.
1) Проверки, с которых начать
- Убедитесь, что php-fpm установлен и запущен:
sudo systemctl status php*-fpm
- Посмотрите, на чем слушает php-fpm (socket или порт):
grep -R "listen =" /etc/php* /etc/php-fpm* /etc/php-fpm.d 2>/dev/null
либо откройте пул: /etc/php/*/fpm/pool.d/www.conf (параметр listen)
- Посмотрите ошибки nginx:
sudo tail -n 50 /var/log/nginx/error.log
В 502-случаях там будет что-то вроде "connect() to unix:/run/php/php8.2-fpm.sock failed: No such file or directory" или "connection refused".
2) Если php-fpm слушает unix-сокет
- Обычно путь /run/php/php8.*/php-fpm.sock или /var/run/php-fpm/www.sock.
- Убедитесь в правах: сокет должен быть доступен пользователю nginx (nginx или www-data). Можно изменить в пуле www.conf:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
(или добавить nginx в группу владельца сокета)
- SELinux: на RHEL/CentOS/AlmaLinux можно столкнуться с SELinux-блокировкой. Для отладки временно отключите SELinux или проверьте audit.log. Для включения сетевых подключений:
sudo setsebool -P httpd_can_network_connect 1
3) Если php-fpm слушает TCP (например 127.0.0.1:9000)
- Убедитесь, что fastcgi_pass в nginx указывает на 127.0.0.1:9000.
4) Куда ставить конфиг nginx в 1.30
- Используйте /etc/nginx/conf.d/your-site.conf (обычно nginx.conf включает эту папку).
- Если хотите старые sites-available/sites-enabled — можно добавить include в /etc/nginx/nginx.conf, но это необязательно.
5) Примеры конфигураций
a) Минимальный сервер для простого PHP (php-fpm на unix-сокете /run/php/php8.2-fpm.sock):
server {
listen 80;
server_name example.com;
root /var/www/example/public; # для Laravel — public
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php/php8.2-fpm.sock; # замените на ваш путь или 127.0.0.1:9000
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_read_timeout 300;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
b) Пример для Laravel (тот же, но с оптимизациями):
server {
listen 80;
server_name example.com;
root /var/www/example/public;
index index.php;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
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; }
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
location ~ /\.(?!well-known).* { deny all; }
}
6) После правок
- Проверить конфиг nginx:
sudo nginx -t
- Перезапустить сервисы:
sudo systemctl restart php*-fpm
sudo systemctl reload nginx
7) Диагностика, если всё ещё 502
- Посмотрите журнал ошибок nginx и php-fpm:
sudo journalctl -u php*-fpm -e
sudo tail -n 100 /var/log/nginx/error.log
- Проверьте, существует ли сокет:
ls -l /run/php/*.sock
- Попробуйте временно переключить на TCP: в php-fpm pool (listen = 127.0.0.1:9000) и в nginx fastcgi_pass 127.0.0.1:9000. Если так заработало — проблема в сокете/прав ах/SELinux.
- Убедитесь, что DocumentRoot указывает на Laravel/public, а не на корень проекта.
8) Тест простого PHP
- Создайте /var/www/example/public/info.php с содержимым:
<?php phpinfo();
- Зайдите на http://example.com/info.php — если выдаёт phpinfo, значит nginx<->php-fpm работает.
Если скажете ваш дистрибутив (Ubuntu/Debian/CentOS/Alma/ Rocky) и версию PHP (8.1/8.2 и т. п.), пошлю точную команду для поиска socket и готовый конфиг с правильными путями.