Banyak orang beranggapan bahwa web server nginx adalah web server dengan speed tercepat dan paling hemat resource jika dibandingkan dengan web server lain seperti apache. Anggapan tersebut tidak sepenuhnya benar, namun juga tidak sepenuhnya salah. Semuanya dikembalikan kepada web master (pemilik web) itu sendiri. Semuanya itu tergantung bagaimana web master tersebut melakukan pengaturan dan konfigurasi pada web server nginx yang ia gunakan.
Beberapa waktu yang lalu, saya berhasil membangun sebuah web blog dengan menggunakan nginx web server dan CMS wordpress pada VPS Digitalocean yang saya miliki. Pada saat itu saya belum melakukan optimasi nginx sedikit pun, semuanya saya biarkan apa adanya, termasuk theme wordpress yang digunakan merupakan theme bawaan dari proses instalasi wordpress.
Berikut ini adalah hasil speedtest web blog tersebut dari situs GTmetrix :
Setelah melihat hasil test yang cukup memprihatinkan tersebut, saya coba lakukan optimasi nginx dengan merubah beberapa konfigurasi dibawah ini :
- Menyesuaikan nginx worker_processes
Worker processes adalah hal yang paling penting yang wajib anda sesuaikan pada konfigurasi web server nginx. Worker processes adalah pengaturan jumlah proses per core (inti) CPU yang anda punya. Jadi, jika VPS anda hanya memiliki satu core CPU, maka worker processes nginx sebaiknya tidak lebih dari satu.Untuk dapat mengetahui jumlah core CPU VPS anda, silahkan berikan command :grep ^processor /proc/cpuinfo | wc -l
Setelah mengetahui jumlah core CPU VPS anda, silahkan anda edit file /etc/nginx/nginx.confnano /etc/nginx/nginx.conf
Secara default biasanya worker_processesnya berjumlah 4, silahkan ganti angka 4 tersebut dengan jumlah core CPU VPS anda.
- Menyesuaikan nginx worker_connections
Nginx worker connections adalah jumlah maksimum orang atau koneksi yang dapat dilayani oleh nginx worker process secara bersamaan. Nilai nginx worker connections default adalah 768, tapi anda dapat merubah dan menyesuaikannya sampai nilai maksimum (limit) core (inti) CPU anda.Untuk mengetahui limit core CPU VPS anda, silahkan berikan perintah :ulimit -n
Pada VPS saya, limit core CPU-nya adalah 1024, maka saya rubah worker connections yang terdapat pada bagian events di file /etc/nginx/nginx.conf menjadi 1024. Dengan konfigurasi seperti itu, maka dapat disimpulkan bahwa setiap satu core CPU dapat melayani sebanyak 1024 client per second.Jika mengacu pada rumus yang berlaku bahwa jumlah maksimal client adalah worker processes dikali dengan worker connections, maka maksimal client yang dapat dilayani oleh server saya adalah 1×1024, yaitu 1024 client dapat mengakses nginx secara bersamaan. Disamping itu, saya juga mengaktifkan multi accept dan menggunakan epoll seperti pada screenshot berikut :
- Buffer Size
Selanjutnya yang tidak kalah penting adalah konfigurasi buffer size pada web server nginx. Jika pengaturan buffer sizenya terlalu rendah, maka bisa berakibat nginx akan membuat file temporari yang dapat menyababkan harddisk akan menulis dan membaca file tersebut berulang kali.Berikut adalah beberapa konfigurasi buffer yang biasa digunakan :- client_body_buffer_size = Digunakan untuk menangani buffer size client pada bagian body.
- client_header_buffer_size = Digunakan untuk menangani buffer size client pada bagian header.
- client_max_body_size = Adalah ukuran maksimal permintaan client pada nginx. Jika permintaan client pada nginx melampaui ukuran maksimal tersebut, maka nginx akan memberikan pesan error 413 atau Request Entity Too Large.
- large_client_header_buffers = Adalah ukuran maksimum dan ukuran buffer untuk header klien besar.
Berikut adalah konfigurasi buffer nginx yang saya gunakan :
client_body_buffer_size 10K; client_header_buffer_size 1k; client_max_body_size 8m; large_client_header_buffers 2 1k;
Masukkan konfigurasi buffer seperti baris-baris diatas pada file /etc/nginx/nginx.conf. Gunakan editor yang biasa anda pakai untuk menambahkan baris-baris tersebut.
- Timeout
Konfigurasi timeout juga dapat meningkatkan performa nginx secara signifikan.- client_body_timeout dan client_header_timeout = Berfungsi untuk memberi waktu kepada server supaya mengirimkan client body dan atau client header yang diminta.
- keepalive_timeout = Berfungsi untuk membatasi waktu koneksi dengan client, yang artinya, nginx akan memutuskan koneksi dengan client apabila sudah mencapai batas waktu yang sudah ditentukan.
- send_timeout = Berguna untuk menentukan waktu koneksi. Jika setelah mencapai batas waktu yang ditentukan, client tidak melakukan apapun, maka nginx akan mematikan (memutuskan) koneksinya.
Berikut adalah konfigurasi timeout yang saya gunakan :
client_body_timeout 12; client_header_timeout 12; keepalive_timeout 15; send_timeout 10;
Masukkan baris diatas masih pada file /etc/nginx/nginx.conf. - Gzip Compression
Gzip compression dapat membantu mengurangi beban transfer pada nginx dengan sangat singnifikan. Berhati-hatilah pada saat menentukan gzip_comp_level. Jika gzip_comp_level diatur terlalu tinggi, maka akan malah menambah beban kerja CPU.Berikut adalah konfigurasi Gzip compression yang saya gunakan :gzip on; gzip_vary on; gzip_comp_level 3; gzip_min_length 10240; gzip_proxied expired no-cache no-store private auth; gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml; gzip_disable "MSIE [1-6]\.";
Silahkan masukkan dan sesuaikan seperti pada contoh konfigurasi diatas pada file /etc/nginx/nginx.conf.
- Logging
Sekedar untuk diketahui bahwa nginx mencatat setiap permintaan (request) dalam log file. Jika anda ingin menonaktifkaan fitur logging ini, silahkan tambahkan baris berikut pada file /etc/nginx/nginx.conf :access_log off;
Pastikan anda sudah memberikan tanda pagar sebelum baris berikut :
access_log /var/log/nginx/access.log;
Jangan lupa simpan semua konfigurasi diatas.
- Static File Caching
Ini adalah faktor yang sangat penting yang harus anda lakukan jika ingin melakukan optimasi terhadap web dengan web server nginx. Silahkan buka file konfigurasi nginx server blocks (virtual hosts) anda. Biasanya terletak di /etc/nginx/sites-enabled/namafile, kemudian tambahkan baris-baris berikut kedalam file tersebut :location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { access_log off; log_not_found off; expires 356d; }
Jangan lupa simpan konfigurasi tersebut sebelum anda keluar dari file /etc/nginx/sites-enabled/namafile.
- Port Redirect
Hanya bagi yang menggunakan varnish cache sebagai frontend, anda wajib menonaktifkan port redirect dengan menambahkan baris berikut pada file konfigurasi nginx server blocks anda :port_in_redirect off;
Jika tidak menonaktifkan port redirect, anda tidak akan bisa membuka halaman web anda, karena selalu dibawa ke port 8080. Bagi anda yang ingin menggunakan varnish cache silahkan baca artikel cara install dan konfigurasi varnish cache dengan nginx di ubuntu.
Demikian beberapa konfigurasi yang dapat anda atur sedemikian rupa untuk mengoptimalkan dan meningkatkan performa web server nginx yang anda gunakan. Konfigurasi diatas adalah konfigurasi nginx versi 1.4.6 (versi default ubuntu 14.04). Silahkan anda sesuaikan saja apabila anda mengunakan versi nginx diatas atau dibawah versi yang saya gunakan.
Berikut ini adalah screenshot hasil test speed web blog tersebut dari GTmetrix setelah saya melakukan optimasi nginx seperti diatas :
Jika anda merasa speed seperti diatas masih kurang bagus, silahkan anda gunakan layanan Content Delivery Network (CDN) dari para penyedia CDN seperti CloudFlare, MaxCDN, CacheFly, CDN77, CDNetworks dan lain sebagainya. Bagi anda yang ingin mencoba mempercepat website dengan CDN gratis dari CoudFlare silahkan baca artikel cara mempercepat loading website dengan CDN CloudFlare.