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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@iaasweb ~]# firewall-cmd --permanent --add-port=80/tcp [root@iaasweb ~]# firewall-cmd --permanent --add-port=443/tcp [root@iaasweb ~]# firewall-cmd --reload [root@iaasweb ~]# systemctl start nginx && systemctl enable nginx [root@iaasweb ~]# systemctl status nginx ● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-12-19 17:23:31 WIB; 6s ago Main PID: 14053 (nginx) CGroup: /system.slice/nginx.service ├─14053 nginx: master process /usr/sbin/nginx ├─14054 nginx: worker process └─14055 nginx: worker process Dec 19 17:23:31 iaasweb.iaas.web.id systemd[1]: Starting The nginx HTTP and reverse proxy server... Dec 19 17:23:31 iaasweb.iaas.web.id nginx[14048]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok Dec 19 17:23:31 iaasweb.iaas.web.id nginx[14048]: nginx: configuration file /etc/nginx/nginx.conf test is successful Dec 19 17:23:31 iaasweb.iaas.web.id systemd[1]: Started The nginx HTTP and reverse proxy server. |
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
1 2 3 4 5 | pm = dynamic pm.max_children = 50 pm.start_servers = 8 pm.min_spare_servers = 4 pm.max_spare_servers = 12 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # === InnoDB Settings === default_storage_engine = InnoDB innodb_buffer_pool_instances = 4 innodb_buffer_pool_size = 1024M innodb_buffer_pool_dump_at_shutdown = ON innodb_buffer_pool_load_at_startup = ON innodb_log_file_size = 512M innodb_log_buffer_size = 8M # === Tweak I/O ==== innodb_file_per_table = 1 innodb_open_files = 400 innodb_io_capacity = 400 innodb_flush_method = O_DIRECT innodb_read_io_threads = 64 innodb_write_io_threads = 64 innodb_buffer_pool_instances = 3 |
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
1 2 3 4 | proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; |
- Tweak Max Execution PHP pada /etc/php.ini atau /etc/php/fpm(version)
1 | max_execution_time = 600 |
- Apabila menggunakan PHP-FPM silahkan naikkan timeout directive di nginx.conf atau virtualhosts terkait yang mengalami error
1 | fastcgi_read_timeout 600; |
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
1 2 3 4 5 6 7 | [root@iaasweb ~]# nginx -t nginx: [warn] conflicting server name "mnginx.iaas.web.id" on 0.0.0.0:80, ignored nginx: [warn] conflicting server name "www.mnginx.iaas.web.id" on 0.0.0.0:80, ignored nginx: [warn] conflicting server name "mnginx.iaas.web.id" on [::]:80, ignored nginx: [warn] conflicting server name "www.mnginx.iaas.web.id" on [::]:80, ignored nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful |
PHP-FPM Connection Reset
1 | recv() failed (104: Connection reset by peer) while reading response header from upstream |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | [root@iaasweb ~]# pkill nginx [root@iaasweb ~]# systemctl start nginx [root@iaasweb ~]# systemctl status nginx ● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-12-19 22:58:54 WIB; 3s ago Process: 15316 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 15313 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Process: 15311 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 15318 (nginx) CGroup: /system.slice/nginx.service ├─15318 nginx: master process /usr/sbin/nginx ├─15319 nginx: worker process └─15320 nginx: worker process Dec 19 22:58:53 iaasweb.iaas.web.id systemd[1]: Starting The nginx HTTP and reverse proxy server... Dec 19 22:58:53 iaasweb.iaas.web.id nginx[15313]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok Dec 19 22:58:53 iaasweb.iaas.web.id nginx[15313]: nginx: configuration file /etc/nginx/nginx.conf test is successful Dec 19 22:58:54 iaasweb.iaas.web.id systemd[1]: Started The nginx HTTP and reverse proxy server. |
- Kill PID nginx dan restart servisnya
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@iaasweb ~]# pgrep nginx 15348 15349 15350 [root@iaasweb ~]# kill -9 15348 15349 15350 [root@iaasweb ~]# pgrep nginx [root@iaasweb ~]# systemctl start nginx && systemctl status nginx ● nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-12-19 23:01:01 WIB; 14ms ago Process: 15368 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS) Process: 15364 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS) Process: 15362 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS) Main PID: 15370 (nginx) CGroup: /system.slice/nginx.service ├─15370 nginx: master process /usr/sbin/nginx ├─15371 nginx: worker process └─15372 nginx: worker process Dec 19 23:01:01 iaasweb.iaas.web.id systemd[1]: Starting The nginx HTTP and reverse proxy server... Dec 19 23:01:01 iaasweb.iaas.web.id nginx[15364]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok Dec 19 23:01:01 iaasweb.iaas.web.id nginx[15364]: nginx: configuration file /etc/nginx/nginx.conf test is successful Dec 19 23:01:01 iaasweb.iaas.web.id systemd[1]: Started The nginx HTTP and reverse proxy server. |
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