NGINX sangat populer karena kecepatannya yang tinggi dan kemampuannya untuk menangani banyak permintaan secara efisien. NGINX juga sering digunakan sebagai reverse proxy, yaitu sebuah server yang menerima permintaan dari client dan mengirimkan permintaan tersebut ke server lain untuk diproses. Selain itu, NGINX juga dapat digunakan sebagai load balancer, yaitu sebuah server yang menyebarkan beban kerja ke beberapa server lain untuk meningkatkan skalabilitas dan kinerja sistem.

Tentu saja dalam melakukan konfigurasi server pada NGINX tidak akan terlepas dari eror yang sering terjadi, dan biasanya log error disimpan pada /var/log/nginx/error.log. Tujuan dari artikel ini saya buat adalah untuk menjadi pengingat bagi saya di masa yang akan mendatang jika mengalaminya lagi

The connection has timed out

Error diatas biasanya terjadi ketika NGINX tidak di start atau enable setelah melakukan instalasi, solusinya adalah menghidupkan dan melakukan persistent start pada NGINX, lalu menambahkan port 80/443

Mungkin beberapa error yang mirip akan seperti ini:

  • The server at domain.tld is taking too long to respond
  • Unable to connect/Refused to Connect
  • Firefox can’t establish a connection to the server at domain.tld
  • domain.tld refused to connect
  • The site can’t be reached, domain.tld unexpectedly closed the connection

fork() failed while spawning “worker process” (12: Cannot allocate memory)

Pesan kesalahan “fork() failed while spawning “worker process” (12: Cannot allocation memory)” menunjukkan bahwa sistem tidak dapat mengalokasikan cukup memori untuk membuat proses baru. Hal ini dapat disebabkan oleh berbagai faktor, seperti:

  • Memory (RAM) yang kecil
  • Flooding memory pada fungsi atau script tertentu
  • Terdapat proses lain yang memakan resource terlalu banyak

Solusinya adalah menambahkan memory secara fisik, dan melakukan scalling server secara pelan-pelan untuk melihat workload dan traffic yang dapat ditangani oleh server

403 Forbidden

Error 403 Forbidden menunjukkan bahwa server memahami permintaan tetapi menolak untuk mengotorisasinya. Status ini mirip dengan 401 (Tidak Sah), tetapi menunjukkan bahwa klien harus mengautentikasi dirinya sendiri untuk mendapatkan respons yang diminta

Ada beberapa kemungkinan penyebab error 403 Forbidden saat menggunakan NGINX sebagai web server. Beberapa yang paling umum termasuk:

  • Incorrect File Permissions: Jika izin pada file atau direktori yang sedang diakses salah, server dapat mengembalikan kesalahan 403 Forbidden
  • IP Address Block: Server dikonfigurasi untuk memblokir akses dari alamat IP tertentu atau rentang alamat IP
  • Blocked UA (User Agent): Server dikonfigurasi untuk memblokir akses user agent tertentu (misalnya, web crawler)
  • Mod_security rules: Ada kemungkinan server terkonfigurasi bersama dengan modsec, dan bisa saja ada beberapa rules yang memblokirnya

Untuk mengatasi beberapa error diatas adalah memastikan antara user yang berjalan pada nginx dan permission pada direktori dimana website tersebut akan diakses sudah benar setelah itu jalankan dengan command nginx -t

  • Folder: 775
  • File: 644

404 Not Found

HTTP 404 Not Found menunjukkan bahwa server tidak dapat menemukan resource yang diminta. Klien mungkin dapat mengakses halaman lain di situs web, tetapi halaman yang diminta tidak ada.

Ada beberapa kemungkinan penyebab error 404 Not Found saat menggunakan NGINXsebagai web server. Beberapa yang paling umum adalah:

  • Incorrect URL: Kesalahan mengetik URL yang sudah rusak atau expired
  • Deleted or moved resource: File yang ada pada URL tersebut sudah dihapus
  • Incorrect configuration: Ada kesalahan atau kekurangan yang belum dimasukkan pada virtual host config pada NGINX

Untuk melakukan pengecekan error tersebut dapat menggunakan beberapa cara berikut:

  • Konfigurasi root directives pada block nginx pada /usr/local/nginx yang harus disesuaikan ulang dengan lokasi file
  • Biasanya PHP-FPM belum dijalankan, untuk menjalankannya silahkan ketik systemctl start php-fpm atau di cek terlebih dahulu versi PHP-FPM yang sedang berjalan menggunakan perintah systemctl status php-fpm*
  • Tambahkan script try_files $uri $uri/ /index.php?$query_string; pada virtualhosts NGINX

500 Internal Server Error

500 Internal Server Error menunjukkan bahwa server mengalami kondisi tak terduga yang mencegahnya memenuhi permintaan. Ini adalah error untuk berbagai jenis kesalahan, seperti masalah dengan konfigurasi server, masalah dengan kode aplikasi, atau masalah dengan database.

Ada beberapa kemungkinan penyebab 500 Internal Server Error saat menggunakan NGINXsebagai web server. Beberapa yang paling umum termasuk:

  • Syntax Config: Server akan mengembalikan 500 Internal Server Error ketika ada kesalahan pada file nginx.conf ataupun virtualhosts, cek menggunakan nginx -t
  • Permission: Server mengembalikan kesalahan 500 Internal Server Error jika tidak memiliki izin yang memadai untuk mengakses file atau direktori
  • Application: Lakukan debug pada aplikasi pada website yang sedang berjalan untuk melihat kesalahan yang mengakibatkan 500 Internal Server Error
  • Database: Pastikan MySQL/MariaDB sudah berjalan dengan benar

Untuk mengatasi 500 Internal Server Error NGINX dapat mencoba langkah-langkah berikut:

  • Periksa error log NGINX untuk informasi lebih lanjut. Error log biasanya terletak di /var/log/nginx/error.log
  • Periksa file konfigurasi Nginx untuk kesalahan sintaks dengan menjalankan perintah nginx -t
  • Periksa permission pada file atau folder yang sedang diakses, default folder adalah 755 dan file adalah 644
  • Periksa menggunakan journal log dengan mengetik journalctl -xe
  • Pastikan database sudah running dan atur menggunakan persistent dengan mengetik perintah systemctl start mariadb && systemctl enable mariadb atau systemctl start mysqld && systemctl enable mysqld
  • Lihat log pada php-fpm di /var/log/php-fpm dan analisa apa saja yang terjadi pada log tersebut
  • Reload/Restart php-fpm systemctl restart php-fpm*
  • Install modul php menggunakan remi repo

502 Bad Gateway

502 Bad Gateway seringkali disebabkan oleh masalah teknis pada sisi konfigurasi NGINX dan PHP-FPM, berikut yang perlu dipastikan adalah:

  • Memastikan PHP-FPM sudah berjalan dan persistent auto start systemctl start php-fpm && systemctl enable php-fpm
  • PHP-FPM sudah berjalan dengan lancar namun masih error, berikutnya yang perlu di cek pada file /etc/php/php-fpm.d/www.conf kemudian cek user dan group pada php-fpm untuk lengkapnya silahkan baca cara install PHP-FPM NGINX

503 Service Temporarily Unavailable

503 Service Temporarily Unavailable di situs web yang menggunakan server web NGINX, itu berarti server saat ini tidak dapat menangani permintaan masuk karena overload atau maintenance sementara. Kesalahan ini sering terlihat saat server sedang mengalami traffic yang tinggi atau sedang menjalani maintenance.

Ada beberapa kemungkinan penyebab kesalahan ini di server NGINX:

  • Server mungkin mengalami lalu lintas tingkat tinggi dan tidak dapat menangani semua permintaan yang masuk
  • Mungkin ada masalah dengan kode sisi server atau konfigurasi yang menyebabkan server overload
  • Server mungkin mengalami hardware failure atau software failure terkait NGINX atau aplikasi pendukung server lainnya

503 Service Temporarily Unavailable hanya dapat diatasi dan diketahui oleh pemilik website atau penglelola server, karena error tersebut berkaitan dengan konfigurasi server dan aplikasi yang berjalan diatas server serta hardware pendukung lainnya. Untuk memperbaiki kesalahan diatas biasanya saya akan melakukan beberapa langkah sebagai berikut:

  • Mengecek akses log di /var/log/nginx/access.log
  • Mengecek error log di /var/log/nginx/error.log
  • Mematikan auto update pada CMS seperti WordPress, Magento, Ghost ataupun semacamnya yang memiliki fitur auto update
  • Mengaktifkan error log pada aplikasi

Tweak PHP-FPM di /etc/php-fpm.d/www.conf

pm = PHP-FPM secara dinamis membuat child process. Tidak ada jumlah proses child process yang tetap.
pm.max_children = Membuat maksimal child process sebanyak 50 dan sesuaikan dengan RAM yang dimiliki (rata-rata waktu eksekusi skrip PHP) * (permintaan PHP per detik)
pm.start_servers = Memulai 8 process (nilai ini tidak boleh kurang dari min_spare_servers dan tidak lebih besar dari max_spare_servers)
pm.min_spare_servers = Setidaknya ada 4 proses idle untuk menunggu eksekusi program selanjutnya
pm.max_spare_servers = Maksimal terdapat 12 proses idle untuk menunggu eksekusi program selanjutnya

504 Gateway Timeout

504 Gateway Timeout adalah kode status HTTP sisi server yang menunjukkan bahwa server saat bertindak sebagai gateway atau proxy tidak menerima respons tepat waktu dari server upstream. Error ini sering terlihat saat server bertindak sebagai gateway atau proxy dan tidak dapat menerima respons dari server upstream secara tepat waktu.

Ada beberapa kemungkinan penyebab kesalahan ini:

  • Server upstream mungkin mengalami tingkat lalu lintas yang tinggi atau mungkin sedang dalam pemeliharaan
  • Mungkin ada masalah dengan koneksi jaringan antara server dan server upstream
  • Hardware failure terkait server fisik
  • Mungkin ada masalah dengan kode sisi server atau konfigurasi di server

Untuk error 504 Gateway Timeout cukup banyak kemungkinan yang perlu di runtut untuk menemukan sumber error, saya akan memulai beberapa tweak pada servis berikut ini:

  • Tweak MySQL/MariaDB di file /etc/my.cnf

innodb_buffer_pool_size: Sesuikan dengan RAM yang digunakan minimal setengah dari jumlah total RAM, apabila RAM yang digunakan dibawah 1GB saya sarankan untuk menggunakan kelipatan 64, 128, 256, 512.
innodb_buffer_pool_instances: Sesuaikan dengan jumlah CPU Core pada VM
I/O: Setting maksimal adalah 64

Apabila ingin melakukan rekomendasi tweak lainnya ada disini https://gist.github.com/fevangelou/fb72f36bbe333e059b66

  • Cek pada NGINX access log di file /etc/nginx/access.log dan analisa request yang mencurigakan
  • Tweak Timeout NGINX pada /etc/nginx/nginx.conf
  • Tweak Max Execution PHP pada /etc/php.ini atau /etc/php/fpm(version)
  • Apabila menggunakan PHP-FPM silahkan naikkan timeout directive di nginx.conf atau virtualhosts terkait yang mengalami error

Conflicting Server Name

Hal ini bisa terjadi ketika melakukan pembuatan virtualhosts dan ternyata memasukkan domain yang sama pada 2 virtualhosts yang berbeda. Sebaiknya segera diganti atau dihapus agar konfigurasi tidak menyebabkan error yang lain

PHP-FPM Connection Reset

Error kali ini mungkin bisa diabaikan saja karena ini biasanya terjadi ketika PHP-FPM di restart secara paksa atau manual

Invalid PID number “” in “/run/nginx.pid”

Error ini biasanya menunjukkan bahwa NGINX tidak dapat memulai atau memuat ulang karena tidak dapat membaca atau menulis ke file PID, yang merupakan file yang digunakan untuk menyimpan ID proses daemon NGINX. File PID ditentukan dalam arahan pid di file konfigurasi Nginx, dan lokasi defaultnya adalah /run/nginx.pid

Ada beberapa kemungkinan penyebab kesalahan ini:

  • File PID mungkin hilang atau terhapus. Dalam hal ini bisa dicoba untuk membuat file dan memberikan permission yang benar
  • Proses Nginx mungkin tidak memiliki izin yang benar untuk membaca atau menulis ke file PID. Dalam hal ini, bisa di coba untuk mengubah owner atau permission file
  • Ada masalah izin dengan direktori yang berisi file PID. Dalam hal ini dapat dicoba untuk mengubah owner atau permission file

Untuk menyelesaikan error diatas biasanya saya melakukan beberapa cara berikut ini:

  • Kill proses NGINX dan restart servisnya
  • Kill PID nginx dan restart servisnya

CloudFlare Errors Related

Berikut adalah beberapa error NGINX terkait CloudFlare ketika proxy server diaktifkan

  • 521 Web Server is Down: Pastikan NGINX sudah running dan pastikan port 80 dan 443 sudah terbuka
  • The page isn’t redirecting properly: Error ini biasanya terkait dengan SSL, dimana pada block server NGINX melakukan redirect HTTP ke HTTPS yang membuat looping. Solusinya adalah Dashboard CloudFlare > Overview > Full (strict) Encrypts end-to-end, but requires a trusted CA or Cloudflare Origin CA certificate on the server
Last modified: January 2, 2023