Bukan rahasia umum bahwa sampai saat ini web server yang paling banyak digunakan adalah Apache
, tapi bagaimana dengan web server lain? Apakah tidak se-powerful Apache?
WARNING: Artikel ini sudah berusia lebih dari 10 tahun, silahkan kunjungi situs official untuk informasi paling up-to-date!
Nginx
, sebuah web server yang di-develop oleh Igor Sysoev pada tahun 2002 Menjadi sebuah alternatif baru pengganti Apache.
Nginx (pengucapan “Engine X”) adalah web server / reverse proxy dan e-mail (IMAP/POP3) proxy yang ringan dengan performa, dilisensikan di bawah lisensi BSD. Berjalan pada UNIX, GNU / Linux, varian BSD, Mac OS X, Solaris, dan Microsoft Windows.
Kenapa Nginx?
Kecepatan
Cukup satu core proses untuk menangani ratusan koneksi, sehingga beban CPU dan konsumsi memory jauh lebih ringan.Mudah digunakan
Konfigurasi file jauh lebih mudah dimengerti dan dimodifikasi daripada konfigurasi web server lainnya seperti Apache. Beberapa baris saja sudah cukup untuk menciptakan sebuah virtual host yang cukup lengkap.Plug-in system (disini disebut sebagai
modules
)dan yang paling penting, Open Source (BSD-like license)
Beberapa contoh website besar yang menggunakan Nginx entah itu sebagai web server atau sebagai reserve proxy sebagai backend Apache antara lain : kaskus.us, indowebster.com, wordpress.com, sourceforge.net, github.com dll.
Pilihan metode installasi
Dalam proses instalasi web server, kita memiliki banyak pilihan, seperti mengunakan package manager dari distribusi Linux yang digunakan, mendownload binary yang sudah dirilis, atau bahkan mengcompile dari source code yang ada.
Nah, kali ini kita memilih untuk men-download source code aplikasi dan menginstalnya secara manual daripada menginstal menggunakan package manager. Ada beberapa alasan kenapa orang memilih melakukan instalasi secara manual :
- Mengenal lebih jauh bagaimana sistem web server yang kita gunakan itu bekerja.
- (Mungkin) tidak tersedia dalam repositori dari distribusi Linux yang sedang digunakan.
Disamping itu jarang repositori yang menawarkan untuk men-download dan menginstal Nginx menggunakan package manager ( yum
| aptitude
| yast
) untuk versi yang terbaru. Kebanyakan menyediakan versi lama yang sudah out of date alias basi (Kecuali pada distro rolling-release seperti Arch Linux yang menyediakan package yang up-to-date dari upstream).
Berikut ini ada capture screen video yang sudah saya buat sebelumnya. Mungkin bisa membantu dalam proses installasi. (tidak perlu sama persis, yang penting tau proses dan cara kerja-nya)
Proses installasi Nginx
Pertama, mari kita download web server kita dari http://nginx.org/download/nginx-1.0.5.tar.gz (saat artikel ini dibuat, versi stable terbarunya adalah 1.0.5
).
wget http://nginx.org/download/nginx-1.0.5.tar.gz
setelah itu, copy source tersebut ke /usr/local/src/
kemudian extract
cp nginx-1.0.5.tar.gz /usr/local/src/
tar -xvzf /usr/local/src/nginx-1.0.5.tar.gz
Catatan :
Sebelum proses installasi, lebih baik cek apakah port 80 sedang digunakan atau tidak. Saya menggunakan distro BackTrack dan secara default Apache menggunakan port 80 pada saat startup.
/etc/init.d/apache2 stop
ataukillall apache2
untuk mensetop proses Apache.Nginx adalah program yang dibuat menggunakan bahasa
C
, jadi untuk dapat menggunakannya pertama-tama kita harus punya tools seperti GNU Compiler Collection (GCC
) pada komputer kita. GCC biasanya sudah terinstall pada kebanyakan Linux distro.
untuk memastikannya, jalankan saja gcc
melalui terminal. Jika anda mendapatkan output “gcc: no input files” berarti GCC sudah terinstall pada komputer anda. Jika tidak, anda perlu menginstallnya terlebih dahulu.
Oke, lanjott..
masuk ke folder nginx-1.0.5
pada direktori /usr/local/src/
dan mulai lakukan kompilasi.
cd /usr/local/src/nginx-1.0.5
./configure
Info : Secara default, HTTP rewrite module onomatis ikut terinstall saat instalasi default Nginx. Module ini memerlukan PCRE (Perl Compatible Regular Expression) library karena Rewrite dan HTTP Core modules dari Nginx menggunakan PCRE sebagai syntax regular expressions mereka.
Sekarang tergantung pilihan kita, jika kita :
- Membutuhkan
rewrite module
, kita harus install PCRE terlebih dahulu:
apt-get install libpcre3 libpcre3-dev
- jika kita tidak membutuhkannya :
./configure --without-http_rewrite_module
Pilihan kita jatuh pada opsi pertama karena nantinya kebanyakan situs yang digunakan sangat membutuhkan rewrite module tersebut. Maka setelah melakukan instalasi PCRE, kita harus melakukan konfigurasi kembali.
./configure
lakukan proses installasi :
make && make install
proses instalasi default yang kita lakukan di atas akan menempatkan working directory Nginx pada direktori /usr/local/nginx
Membuat init script untuk Nginx
buat file dengan nama nginx
pada direktori /etc/init.d
vim /etc/init.d/nginx
kemudian copy paste bash script
di bawah ini kemudian save
|
|
chmod +x supaya script dapat dieksekusi
chmod +x /etc/init.d/nginx
Setelah ini, maka kita dapat melakukan start
, stop
, restart
atau reload
Nginx melalui script tersebut. Mari kita coba jalankan nginx. Mari kita coba jalankan nginx.
/etc/init.d/nginx start
Maka seharusnya kita mendapatkan pesan sambutan “welcome to nginx!” saat mengakses localhost
dari brwoser.
Instalasi dan konfigurasi PHP FAST CGI ( spawn-fcgi ) dengan Nginx
Download PHP spawn-fcgi
apt-get install php5-cgi spawn-fcgi
setelah proses installasi melalui package manager selesai, buat file bernama php-fastcgi
pada direktori /etc/init.d
vim /etc/init.d/php-fastcgi
Copy paste bash script di bawah ini:
|
|
jangan lupa chmod +x supaya script dapat dieksekusi
chmod +x /etc/init.d/php-fastcgi
Kemudian sebelum menjalankan php-fastcgi
tersebut, kita bangun dulu struktur website yang akan kita gunakan. (saya memilih direktori /var/www/nginx
)
mkdir /var/www/nginx; cd /var/www/nginx
buat file dengan nama info.php
berisi phpinfo();
(sekedar melakukan testing apakah php sudah berjalan atau belum.)
echo "<?php phpinfo(); ?>" > info.php
kemudian edit konfigurasi Nginx agar sesuai dengan struktur website yang sedang kita bangun.
vim /usr/local/nginx/conf/nginx.conf
Karena root public html kita berada di /var/www/nginx
maka konfigurasi sebagai berikut :
|
|
perhatikan bahwa saya mengganti variable root
dan fastcgi_param SCRIPT_FILENAME
(video menit 7.00)
untuk melakukan testing apakah konfigurasi yang kita buat sudah benar maka kita bisa jalankan command sebagai berikut :
/usr/local/nginx/sbin/nginx -t
jika syntax dan test sukses, maka restart Nginx menggunakan file init.d
yang tadi pada awal sudah kita buat.
/etc/init.d/nginx restart
Test akses file info.php tadi melalui browser http://localhost/test.php
Dari situ kita dapat menentukan apakah Nginx sudah dapat berjalan dengan PHP CGI atau belum..
Nginx Security Issue: “no input file specified” PHP fast-cgi 0day Exploit
Setelah Nginx dan PHP CGI berjalan, cobalah test mengakses http://localhost/terserah.php
Jika browser menunjukan “no input file specified”, konfigurasi kita masih vulns dan belum layak dipakai.
Exploit : Buat file apaaja.gif
menggunakan GIMP. Pada kotak komentar isi dengan script PHP <?php phpinfo(); ?>
dan letakan pada direktori nginx server root ( jika dalam artikel kali ini /var/www/nginx/apaaja.gif
).
Secara normal, jika kita akses dari browser http://localhost/apaaja.gif
akan nampak sebagai gambar .gif biasa. Tapi coba akses url dengan tersebut dari http://localhost/apaaja.gif/terserah.php
maka hasilnya luar biasa :
File .gif tersebut dieksekusi sebagai file PHP ( ingat coment pada file .gif <?php phpinfo(); ?>
)Tentu saja http://localhost/apaaja.gif/terserah.php
sebenarnya tidak ada. Tapi tiap request yang diakhiri dengan .php
akan DIEKSEKUSI sebagai script PHP oleh Nginx melalui fitur cgi.fix_pathinfo
sehingga Nginx mengeksekusi file .gif tersebut sebagai script PHP!
Cara mengatasi :
- Ubah
cgi.fix_pathinfo=1
menjadicgi.fix_pathinfo=0
padaphp.ini
- Edit
/usr/local/nginx/conf/nginx.conf
dan tambahkan sctipt berikut di antaraserver { }
block
|
|
Compile options
Saat proses konfigurasi, beberapa module akan aktif secara default, dan beberapa module perlu diaktifkan secara manual.
Berikut ini module-module yang otomatis aktif saat command ./configure
dijalankan
Tambahkan perintah-perintah di bawah untuk me-disable module tersebut.
--without-http_charset_module
: Menonaktifkan module Charset untuk re-encoding halaman web.
--without-http_gzip_module
: Menonaktifkan module kompresi Gzip.
--without-http_ssi_module
: Menonaktifkan Server Side Include module.
--without-http_userid_module
: Menonaktifkan User ID module yang menyediakan identifikasi pengguna menggunakan cookies.
--without-http_access_module
: Menonaktifkan module pembatasan akses yang memungkinkan kita untuk konfigurasi akses untuk IP range tertentu. misal :deny 192.168.1.1/24
--without-http_auth_basic_module
: Menonaktifkan Basic Authentication module. (sepertiAuth Basic Apache
)
--without-http_autoindex_module
: Menonaktifkan Automatic Index module.
--without-http_geo_module
: Menonaktifkan module yang memungkinkan kita untuk mendefinisikan variabel lokasi GEO IP menurut IP range tertentu.
--without-http_map_module
: Module ini memungkinkan kita untuk mengklasifikasikan suatu nilai menjadi nilai yang berbeda, menyimpan hasilnya dalam bentuk variabel.
--without-http_referer_module
: Module ini memungkinkan untuk memblokir akses berdasarkan header http referer.
--without-http_rewrite_module
: Menonaktifkan module Rewrite.
--without-http_proxy_module
: Menonaktifkan module proxy untuk request transfer ke server lain.
--without-http_fastcgi_module
: Menonaktifkan module untuk interaksi dengan proses FastCGI.
--without-http_memcached_module
: Menonaktifkan module untuk interaksi dengan daemon memcache.
--without-http_limit_zone_module
: Modul ini memungkinkan untuk membatasi jumlah koneksi untuk alamat / direktori tertentu.
--without-http_limit_req_module
: Menonaktifkan module limit request yang memungkinkan kita untuk membatasi jumlah request per user.
--without-http_empty_gif_module
: Menampilkan gambar .gif transparan berukuran 1x1px. (Berguna untuk web designer)
--without-http_browser_module
: Menonaktifkan module yang menungkinkan kita untuk membaca string User Agent.
--without-http_upstream_ip_hash_module
: Menonaktifkan module Upstream untuk load-balancing.
Berikut ini module-module yang tidak aktif saat command ./configure
dijalankan
Tambahkan perintah-perintah di bawah untuk me-enable module tersebut.
--with-http_ssl_module
: Mengaktifkan module SSL untuk website menggunakan protokol https://
--with-http_realip_module
: Mengaktifkan module untuk membaca alamat IP yang sebenarnya dari sebuah request.
--with-http_addition_module
: Mengaktifkan module yang memungkinkan kita menambahkan data ke halaman website.
--with-http_xslt_module
: Mengaktifkan module untuk transformasi XSL ke XML. Catatan: Perlu menginstal libxml2 dan libxslt library.
--with-http_image_filter_module
: Mengaktifkan module yang memungkinkan kita untuk modifikasi gambar. Catatan: Perlu menginstal libgd library untuk modul ini.
--with-http_sub_module
: Mengaktifkan module untuk melakukan replace teks dalam halaman web.
--with-http_dav_module
: Mengaktifkan fitur WebDAV
--with-http_flv_module
: Mengaktifkan module khusus untuk handle flash video file ( .flv ).
--with-http_gzip_static_module
: Mengaktifkan module Gzip static compression.
--with-http_random_index_module
: Mengaktifkan module untuk memilih file secara acak sebagai index file pada suatu direktori.
--with-http_secure_link_module
: Mengaktifkan module untuk memeriksa request URL dengan security token yang dibutuhkan. ( Mantap juga buat antisipasi CSRF )
--with-http_stub_status_module
: Mengaktifkan module yang menggenerate server statistik dan informasi halaman.
Miscellaneous compile options
--with-ipv6
: Mengaktifkan IPv6
Menambahkan third-party module yang bisa di download dari internet. Misal dari http://wiki.nginx.org/3rdPartyModules
--add-module=/folder/ke/module/tambahan
Seperti yang kita lihat, perintah yang cukup mudah untuk konfigurasi sebuah web server. Pada umunya kita hanya perlu untuk menambahkan module SSL untuk konten HTTPS, dan “Real IP” untuk mengambil alamat IP pengunjung jika menggunakan proxy atau kita menjalankan Nginx sebagai backend server dengan web server lain.
Contoh untuk konfigurasi dengan semua module :
./configure --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module
Untuk referensi bahan bacaan :
- http://wiki.nginx.org/
- http://markmail.org/browse/ru.sysoev.nginx
- http://www.joeandmotorboat.com/2008/02/28/apache-vs-nginx-web-server-performance-deathmatch/
Halaman ini diconvert dari artikel original “Compile Nginx latest stable version dari Source Code”.
Komentar