502 adalah cara Nginx mengabari Anda bahwa ia meminta halaman itu kepada sesuatu yang lain dan menerima jawaban yang tak bisa dipakainya. Nginx sendiri berjalan — seandainya tidak, Anda takkan melihat apa pun — jadi kesalahannya ada di belakangnya, dan hampir selalu di PHP.
Kenali yang mana dari keempatnya
Bacalah log galatnya lebih dulu. Ia menyebut sebabnya dalam satu baris, dan tiap menit yang dihabiskan untuk menerka adalah menit yang tidak dihabiskan untuk membacanya.
tail -50 /var/log/nginx/error.log
- connect() failed (111: Connection refused) — PHP-FPM tidak berjalan.
- upstream timed out — PHP berjalan tetapi memakan waktu lebih lama daripada batas yang diberikan.
- recv() failed (104: Connection reset by peer) — pekerja PHP mati di tengah permintaan, biasanya karena kehabisan memori.
- no live upstreams — di kolamnya tak ada pekerja tersisa untuk menjawab.
PHP-FPM tidak berjalan
- Periksalah — systemctl status php8.3-fpm — layanan yang berhenti mengatakannya di baris pertama.
- Jalankan — systemctl start php8.3-fpm
- Cari tahu mengapa ia berhenti — journalctl -u php8.3-fpm --since "1 hour ago" — satu baris yang salah di konfigurasi kolam menghentikannya sejak awal, dan ia akan berhenti lagi.
php-fpm8.3 -t. Ia memeriksa berkas-berkas kolamnya dan menyebutkan baris yang tak disukainya.PHP terlalu lambat bagi batas waktunya
Bawaannya memberi PHP 60 detik. Impor yang lambat atau API luar yang berhenti menjawab akan melewatinya, dan Nginx mengembalikan 502 alih-alih menunggu selamanya.
location ~ \.php$ {
fastcgi_read_timeout 300;
}
Pekerjanya mati
Permintaan yang melampaui memory_limit membunuh pekerjanya sendiri, dan Nginx melihat sambungannya disetel ulang. Log galat PHP menyebut berkas dan barisnya.
grep -i "allowed memory size" /var/log/php8.3-fpm.log | tail
Kolamnya kehabisan pekerja
Semua pekerjanya sibuk, jadi permintaan baru tak punya tempat untuk pergi. Itu masalah daya tampung, dan perbaikan yang jujur adalah mengurangi permintaan yang lambat atau menambah pekerja — tetapi menambah pekerja pada memori yang sama hanya memindahkan kegagalannya.
pm.max_children = 20
pm.max_requests = 500