Кратак одговор
Грешка 502 Бад Gateway значи да Nginx не може да добије исправан одговор од бацкенд сервиса (PHP-FPM, Node.js, Гуницорн). Проверите да ли бацкенд процес ради, да ли су сокети и портови доступни и да ли су логови пуни грешака. У већини случајева решење је рестарт бацкенд сервиса или исправка конфигурације.
Како се проблем препознаје
- Сајт приказује белу страницу са текстом 502 Бад Gateway
- Неке странице раде, а динамичке (PHP, API) враћају 502
- У еррор логу Nginx-a појављује се цоннецт() фаилед
- Бацкенд сервис (PHP-FPM, Node) је пао или се рестартује
- 502 се појављује повремено, посебно под оптерећењем
Најчешћи узроци
Бацкенд сервис не ради
PHP-FPM, Node.js, Гуницорн или други апликативни server је пао или је заустављен. Nginx тада нема коме да проследи захтев.
Погрешан сокет или порт у конфигурацији
Nginx упућује на непостојећи Unix сокет или порт на којем бацкенд не слуша. До грешке долази и после промене конфигурације или надоградње.
Преоптерећен бацкенд
Ако PHP-FPM или апликација потроше све ресурсе, не могу да прихвате нове захтеве. Nginx тада враћа 502 или 504.
Дозволе над сокетом
Nginx корисник (нпр. www-data или nginx) нема право приступа Unix сокету. То се често дешава после промене власника или SELinux политике.
Бацкенд се руши због грешке у коду
Фатална грешка у апликацији може да обори радни процес. У логовима се види сегфаулт или PHP Фатал еррор.
Решење корак по корак
- 1
Проверите статус бацкенд сервиса
Покрените
systemctl status php8.2-fpm(или одговарајући сервис:php-fpm,node,gunicorn). Ако је сервис неактиван, покушајтеsystemctl restart php8.2-fpm. Ако се одмах поново заустави, пређите на читање логова. - 2
Прегледајте Nginx еррор лог
Отворите
/var/log/nginx/error.log(или путању изnginx -T). Тражите линије саconnect() failedилиno live upstreams. Оне показују да ли Nginx не може да се повеже на сокет или порт. - 3
Проверите да ли бацкенд слуша
За Unix сокет:
ls -l /run/php/php8.2-fpm.sock. За TCP порт:ss -tlnp | grep 3000. Ако нема излаза, бацкенд не слуша и проблем је у његовој конфигурацији или старту. - 4
Ускладите путању у Nginx конфигурацији
У фајлу сајта (нпр.
/etc/nginx/sites-enabled/example.conf) проверитеfastcgi_passилиproxy_pass. Путања сокета или порт мора да одговара ономе што бацкенд заиста користи. После измене покренитеnginx -tпаsystemctl reload nginx. - 5
Проверите дозволе над сокетом
Сокет треба да буде власништво корисника под којим ради бацкенд, а Nginx корисник мора да има приступ. По потреби подесите дозволе (нпр.
chmod 660и одговарајућу групу) и рестартујте оба сервиса. - 6
Пратите логове апликације
Погледајте PHP еррор лог (
/var/log/php8.2-fpm.log),journalctl -u php8.2-fpm -n 50или лог апликације. Ако видите фаталне грешке, исправите код или конфигурацију пре даљег рестартовања. - 7
Тестирајте приступ локално на серверу
Са сервера покрените
curl -I -H 'Host: example.com' http://127.0.0.1иcurl -I http://127.0.0.1:3000(ако апликација слуша на том порту). Ако локално ради а споља не, проблем је у мрежи, firewall-u или Nginx конфигурацији. - 8
Рестартујте сервисе по реду
Прво рестартујте бацкенд (
systemctl restart php8.2-fpm), па Nginx (systemctl restart nginx). Затим поново учитајте сајт. Ако 502 и даље постоји, вратите се на логове.
Ако ништа не помогне
Ако су сервиси активни, сокети доступни и логови без очигледне грешке, проверите да ли је проблем у мрежи или SELinux-u. Команда getenforce показује да ли је SELinux у режиму Енфорцинг; привремено га можете поставити у Permissive (setenforce 0) ради теста, али га обавезно вратите у Енфорцинг (setenforce 1). Такође проверите да ли је диск пун (df -h) и да ли има довољно меморије (free -m). Ако се 502 јавља само под оптерећењем, повећајте број PHP-FPM процеса или worker_connections у Nginx-u. За продукционо окружење размотрите мониторинг који ће вас обавестити пре него што корисници примете грешку.
Како да спречите да се понови
- Редовно пратите рад бацкенд сервиса и поставите аларм за пад
- Држите Nginx и PHP-FPM конфигурацију усклађену са стварним сокетима
- Пратите потрошњу ресурса и повећајте лимите на време
- Тестирајте измене конфигурације са `nginx -t` пре релоад-а
Када је боље позвати стручњака
Ако се грешка понавља и захтева измене у конфигурацији или коду, или ако немате приступ логовима и root дозволама, боље је да позовете IT подршку. Они могу брзо да изолују узрок и спрече дужи прекид рада сајта.
Одржавање IT инфраструктуре · Сервери, мреже, backup, безбедност и хелпдескЧеста питања
Да ли је 502 исто што и 504?
Није. 502 значи да је бацкенд вратио неисправан одговор или да Nginx није могао да се повеже, док 504 значи да је бацкенд предуго ћутао. У пракси се често решавају слично, провером бацкенд сервиса и логова.
Зашто се 502 јавља само на неким страницама?
Статичне фајлове Nginx сервира директно, па раде. Динамичке странице зависе од бацкенд-а, па оне пријављују 502. То потврђује да је проблем у апликативном серверу, а не у Nginx-u.
Могу ли да рестартујем само PHP-FPM?
Да, ако је проблем у PHP-FPM-у, довољан је `systemctl restart php8.2-fpm`. Nginx рестартујте само ако сте мењали његову конфигурацију или ако проблем и даље траје.