Bagaimana perasaan Anda ketika klien Anda mengirimkan tangkapan layar situs webnya melalui WhatsApp yang bertuliskan 502 bad gateway NGINX kesalahan? Tidak ada yang lebih buruk dari ini (untuk memulai hari Anda), bukan? Meskipun saya berharap Anda tidak memulai hari Anda seperti itu, saya akan menjelaskan cara memulihkan diri jika Anda berada dalam situasi itu.
Sebelum kita membahas masalah &solusinya, saya ingin mengingatkan bahwa lingkungan hosting saya didukung oleh server web NGINX dengan pengendali FPM PHP.
Alasan untuk kesalahan NGINX Gateway 502 Buruk
Saya mulai men-debug kesalahan dari log kesalahan NGINX (/var/log/nginx/nginx.log)
dan menemukan pesan kesalahan di bawah ini.
2019/12/11 04:30:43 [error] 27570#27570: *48599 connect() to unix:/var/run/php-fpm/php-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 17.58.98.98, server: techglimpse.com, request: "GET /pure-css3-shapes/ HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "techglimpse.com"
Jelas bahwa pesan kesalahan terkait dengan penangan PHP dan itu mengarahkan saya untuk melihat log kesalahan PHP-FPM di /var/log/php-fpm/error.log
dan perhatikan pesan kesalahan di bawah ini:
[08-Dec-2019 03:30:01] NOTICE: error log file re-opened [10-Dec-2019 21:00:16] WARNING: [pool www] server reached pm.max_children setting (50), consider raising it
Sekarang jelas bahwa proses master PHP-FPM tidak dapat menelurkan proses anak baru karena pm.max_children
mencapai batas, menyebabkan 502 kesalahan gateway yang buruk.
Cara memperbaiki kesalahan:server mencapai setelan pm.max_children, pertimbangkan untuk menaikkannya
Solusinya adalah meningkatkan pm.max_children
batas berdasarkan spesifikasi server. Catatan, jangan membabi buta meningkatkan batas, karena jika situs web menerima lalu lintas besar, maka pekerja tidak pernah didaur ulang, penggunaan RAM akan bertambah tanpa batas dari waktu ke waktu dan server akan kehabisan memori.
Oleh karena itu, pm.max_children
harus ditingkatkan secara hati-hati dan bertahap sambil memantau penggunaan swap.
pm.max_children = ((total RAM in MB) - (RAM usage by MySQL and others taken together in MB)) / 80Catatan
Di sini 80MB adalah bobot rata-rata dari proses pekerja PHP-FPM.
Berdasarkan perhitungan di atas, naikkan nilai pm.max_children di masing-masing file konfigurasi domain PHP-FPM. Dalam kasus saya: /etc/php-fpm.d/techglimpse.conf
pm = ondemand pm.max_children = 200
Sekarang restart layanan PHP-FPM dan NGINX
systemctl restart php-fpm nginxCatatan
Filter semua domain yang terpengaruh dengan pm.max_children
dan terapkan setelan di atas hanya untuk yang terpengaruh.
Cara menemukan memori yang digunakan oleh aplikasi
Jalankan perintah di bawah ini untuk menemukan memori yang digunakan oleh masing-masing aplikasi.
#ps -o pid,user,%mem,command ax | sort -b -k3 -r PID USER %MEM COMMAND 1355 mysql 14.5 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid 543 root 0.3 /usr/lib/systemd/systemd-journald 9254 nginx 0.3 php-fpm: pool www 9251 nginx 0.3 php-fpm: pool www
Dalam contoh di atas, MySQL menggunakan hampir 14% dari total memori.