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?

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 kinerja tinggi , dilisensikan di bawah lisensi BSD. Berjalan pada UNIX, GNU / Linux, varian BSD, Mac OS X, Solaris, dan Microsoft Windows.

Kenapa Nginx ?

1. Kecepatan

Cukup satu core proses untuk menangani ribuan koneksi, sehingga beban CPU dan konsumsi memory jauh lebih ringan.

2. 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.

3. Plug-in system ( disini disebut sebagai “modules” )

4. 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.

Dalam proses instalasi web server, dibutuhkan beberapa tools dan parameter yang harus kita putuskan pada saat kompilasi, dan beberapa konfigurasi tambahan yang harus dilakukan dan disesuaikan dengan sistem kita.

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 :

1. Mengenal lebih jauh bagaimana sistem web server yang kita gunakan itu bekerja.

2 .(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 | Pacman | Aptitude | Yast) untuk versi yang terbaru. Kebanyakan menyediakan versi lama yang sudah out of date alias basi. x_x.

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 )

Pertama, mari kita download web server kita dari http://nginx.org/download/nginx-1.0.5.tar.gz

( Saat saya menulis artikel ini 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 :

1. 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 atau killall apache2

2. 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" ( tanpa quote ) 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) librarykarena Rewrite dan HTTP Core modules dari Nginx menggunakan PCRE sebagai syntax regular expressions mereka.

Sekarang tergantung pilihan kita, jika kita :

1. membutuhkan rewrite module, kita harus install PCRE terlebih dahulu:

apt-get install libpcre3 libpcre3-dev

2. 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 ruang kerja Nginx pada direktori /usr/local/nginx

membuat init script untuk Nginx

buat file dengan nama nginx pada direktori /etc/init.d

nano /etc/init.d/nginx

kemudian copy paste shell script di bawah ini kemudian save

#! /bin/sh
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC="nginx daemon"

test -x $DAEMON || exit 0

# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
    . /etc/default/nginx
fi

set -e

case "$1" in
    start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/nginx.pid \
            --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
    stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/nginx.pid \
            --exec $DAEMON
        echo "$NAME."
        ;;
    restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
            /usr/local/nginx/logs/nginx.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
            /usr/local/nginx/logs/nginx.pid --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
    reload)
        echo -n "Reloading $DESC configuration: "
        start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/nginx.pid \
            --exec $DAEMON
        echo "$NAME."
        ;;
    *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|force-reload}" >&2
    exit 1
    ;;
esac
exit 0

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 anda.

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

nano /etc/init.d/php-fastcgi

Copy paste shell script di bawah ini.

#!/bin/bash
BIND=127.0.0.1:9000
USER=www-data
PHP_FCGI_CHILDREN=15
PHP_FCGI_MAX_REQUESTS=1000

PHP_CGI=/usr/bin/php-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0

start() {
    echo -n "Starting PHP FastCGI: "
    start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
    RETVAL=$?
    echo "$PHP_CGI_NAME."
}
stop() {
    echo -n "Stopping PHP FastCGI: "
    killall -q -w -u $USER $PHP_CGI
    RETVAL=$?
    echo "$PHP_CGI_NAME."
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
    echo "Usage: php-fastcgi {start|stop|restart}"
    exit 1
    ;;
esac
exit $RETVAL

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 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.

nano /usr/local/nginx/conf/nginx.conf

Karena root public html kita berada di /var/www/nginx maka konfigurasi sebagai berikut :

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /var/www/nginx;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/nginx$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_script_name;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

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 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 atau belum..

[ Nginx Security Issue ]

Layaknya sebuah aplikasi, pasti tidak akan lepas dari yang namanya bugs. Begitu juga dengan Nginx.

Nginx “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 Nginxmelalui fitur cgi.fix_pathinfo sehingga Nginx mengeksekusi file .gif tersebut sebagai script php!

Cara mengatasi :

1. Ubah cgi.fix_pathinfo=1 menjadi cgi.fix_pathinfo=0 pada php.ini

2. Edit /usr/local/nginx/conf/nginx.conf dan tambahkan sctipt berikut di antara block server { }

#code start
error_page   400 402 403 404  /40x.html;
   location = /40x.html {
       root   html;
}

#code end

LIBRARY

Module 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_moduleMenonaktifkan module Charset untuk re-encoding halaman web.

--without-http_gzip_moduleMenonaktifkan module kompresi Gzip.

--without-http_ssi_moduleMenonaktifkan Server Side Include module.

--without-http_userid_moduleMenonaktifkan User ID module yang menyediakan identifikasi pengguna menggunakan cookies.

--without-http_access_moduleMenonaktifkan module pembatasan akses yang memungkinkan kita untuk konfigurasi akses untuk IP range tertentu. misal : deny 192.168.1.1/24

--without-http_auth_basic_moduleMenonaktifkan Basic Authentication module. (seperti Auth Basic Apache )

--without-http_autoindex_moduleMenonaktifkan Automatic Index module.

--without-http_geo_moduleMenonaktifkan module yang memungkinkan kita untuk mendefinisikan variabel menurut IP range tertentu.

--without-http_map_moduleModule ini memungkinkan kita untuk mengklasifikasikan suatu nilai menjadi nilai yang berbeda, menyimpan hasilnya dalam bentuk variabel.

--without-http_referer_moduleModule ini memungkinkan untuk memblokir akses berdasarkan header http referer.

--without-http_rewrite_moduleMenonaktifkan module Rewrite.

--without-http_proxy_moduleMenonaktifkan module proxy untuk request transfer ke server lain.

--without-http_fastcgi_moduleMenonaktifkan module untuk interaksi dengan proses FastCGI.

--without-http_memcached_moduleMenonaktifkan module untuk interaksi dengan daemon memcache.

--without-http_limit_zone_moduleModul ini memungkinkan untuk membatasi jumlah koneksi untuk alamat / direktori tertentu.

--without-http_limit_req_moduleMenonaktifkan module limit request yang memungkinkan kita untuk membatasi jumlah request per user.

--without-http_empty_gif_moduleMenampilkan gambar .gif transparan berukuran 1x1px. ( Berguna untuk web designer )

--without-http_browser_moduleMenonaktifkan module yang menungkinkan kita untuk membaca string User Agent.

--without-http_upstream_ip_hash_moduleMenonaktifkan 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_moduleMengaktifkan module SSL untuk website menggunakan protokol https://

--with-http_realip_moduleMengaktifkan module untuk membaca alamat IP yang sebenarnya dari sebuah request.

--with-http_addition_moduleMengaktifkan module yang memungkinkan kita menambahkan data ke halaman website.

--with-http_xslt_moduleMengaktifkan module untuk transformasi XSL ke XML. Catatan: Perlu menginstal libxml2 dan libxslt library.

--with-http_image_filter_moduleMengaktifkan module yang memungkinkan kita untuk modifikasi gambar. Catatan: Perlu menginstal libgd library untuk modul ini.

--with-http_sub_moduleMengaktifkan module untuk melakukan replace teks dalam halaman web.

--with-http_dav_moduleMengaktifkan fitur WebDAV

--with-http_flv_moduleMengaktifkan module khusus untuk handle flash video file ( .flv ).

--with-http_gzip_static_moduleMengaktifkan module Gzip static compression.

--with-http_random_index_moduleMengaktifkan 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 options

( Mengaktifkan IPv6 )

--with-ipv6

Menambahkan third-party module yang bisa di download dari internet. Misal dari http://wiki.nginx.org/3rdPartyModules (asli keren2 )

--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/

Teman2 juga bisa download nginx dan php-fastcgi init script nya jika males copy paste scriptnya