Pengen Punya WebSite instan kualitas intan ?

Showing posts with label nginx. Show all posts
Showing posts with label nginx. Show all posts

Friday, May 27, 2011

Handling of static files with nginx

Dalam praktiknya, sebuah server dengan Web Servernya melayani rekues Http (HTTP Request) untuk diproses dan kemudian dikembalikan lagi ke user sebagai respons Http (HTTP Response). Bentuk dari rekuest Http itu sendiri terdiri halaman web (berupa HTML atau skripting) dan komponen atau entitas seperti image, JavaScript, CSS. Dan Web Server memproses semua rekues tersebut.

Dengan mengaplikasikan dua Web Server dalam satu server ini bertujuan untuk membagi tugas antara satu Web Server dengan Web Server lainnya. semisal, satu Web Server untuk melayani rekues halaman web terutama halaman web yang dinamis (menggunakan Php, Asp, ColdFusion sebagai bahasa pemrogamannya) dan satu Web Server lagi untuk melayani rekues file-file statik (jpg, gif, js, css).

Karena dua Web Server mengerjakan tugasnya yang berbeda, maka sebuah rekues halaman web akan diproses secara simultan oleh dua Web Server. Tentunya ini akan memperkecil waktu akses yang dialami user.

Sebelum mengaplikasikannya, kita perlu set-up nginx sebagai reverse proxy terlebih dauhu. Selanjutnya tinggal menambahkan beberapa baris konfigurasi pada nginx.conf agar jika ada request dari http client yang berupa file static, langsung bisa dilayani oleh nginx (front-end) dan tidak perlu di teruskan ke server apache (back-end).

Mendefinisikan tipe-tipe file static ( File statik adalah file yang langsung direspons oleh Web Server tanpa melalui proses pengolahan content)yang akan dilayani oleh nginx :
.:: tambahkan baris berikut dalam konfigurasi nginx.
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|w$
    {
    root   /path/dari/file-file/static;
    }

contoh isi vhost dari  nginx.conf
server {
   listen  80;
   server_name  idprayoga.com;
   access_log  /path/log/idprayoga.com.access.log ;
   error_log    /path/log/idprayoga.com.error.log ;
   location / {
        proxy_pass http://10.100.100.99:8080;
        include         /etc/nginx/conf.d/proxy.conf;
   }
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
    {
    root   /path/directory/idprayoga.com/htdocs;
    }
}

.:: restart nginx

.:: Pengujian:
Kita dapat mengetahui kedua Web Server telah bekerja sesuai tugasnya masing-masing dengan melihat log access-nya. Untuk log access di Apache dapat kita lihat kalau Apache tidak menerima file-file statik. Tetapi log access di Nginx terlihat semua rekues Http ada disana, baik file-file statik maupun halaman dinamis. Ini terjadi karena semua rekues Http masuk terlebih dahulu melalui Nginx (karena Nginx berjalan di port default HTTP, yaitu port 80) kemudian diteruskan ke Apache apabila Http rekues bukan file statik.

Semoga dengan menggunakan dua Web Server dapat mempercepat waktu akses user ketika merekues halaman web.

Mohon dikasih masukan jika ada yang salah atau kurang. Terimakasih :)

Load Balancing dengan Nginx

Load Balancing

Load balancing adalah sebuah konsep yang gunanya untuk menyeimbangkan beban atau muatan pada infrastruktur TI sebuah perusahaan.

Dalam hal ini, nginx menggunakan  algoritma round robin sederhana. Third-party module yang digunakan adalah http upstream hash.

Round Robin

Algoritma Round Robin (RR) didisain untuk sistem time sharing. Algoritma ini mirip dengan penjadwalan FCFS (First Come First Served), namun preemption ditambahkan untuk switch (peralihan proses) antara proses. Antrian ready diperlakukan atau dianggap sebagai antrian sirkular. CPU menglilingi antrian ready dan mengalokasikan masing-masing proses untuk interval waktu tertentu sampai satu time slice /quantum. [read more]

Load Balancing dengan nginx

Dalam tulisan ini menggunakan nginx sebagai front-end server.
.:: konfigurasi pada vhost / nginx.conf
[root@server01 conf]# cd /etc/nginx/conf.d/
[root@server01 conf.d]# nano idprayoga.com.conf
#isi file konfigurasi
upstream bagi {
    server 10.100.100.98;
    server 10.100.100.99;
    server 10.100.100.100;
}
server {
   listen  80;
   server_name  idprayoga.com www.idprayoga.com;
   access_log  /var/log/nginx/idprayoga.com.access.log ;
   error_log    /var/log/nginx/idprayoga.com.error.log ;
   location / {
        proxy_pass      http://bagi;
        include         /etc/nginx/conf.d/proxy.conf;
   }
}

.:: restart nginx

Tips-Trix
Tips-Trix untuk mencoba Load Balancing jika hanya memiliki 1 server.
Dalam contoh tulisan ini menggunakan nginx sebagai front-end server dan menggunakan apache sebagai back-end server. Karena menggunakan satu server, jadi pembagiannya berdasarkan port dalam satu server. Untuk implementasi yang sesungguhnya tinggal menyesuaikan sesuai kebutuhan.

siapkan back-end server agar berjalan dengan multiple port (misal 8080, 8090. 8091)
.:: copy file konfigurasi apache (httpd.conf)
[root@server01 conf.d]# cd /etc/httpd/conf
[root@server01 conf.d]# cp httpd.conf httpd8090.conf
[root@server01 conf.d]# cp httpd.conf httpd8091.conf

jadi sekarang ada 3 file konfigurasi, httpd.conf, httpd8090.conf, dan httpd8091.conf. Ganti masing-masing port agar berjalan di port yang berbeda dengan mengubah Listen sesui nama file konfigurasi. Misal httpd.conf Listen 8080 , httpd8090.conf Listen 8090 , dan httpd8091.conf Listen 8091

.:: Selanjutnya jalankan perintah untuk alternatif ServerConfigFile
[root@server01 conf]# httpd -f /etc/httpd/conf/httpd8090.conf
[root@server01 conf]# httpd -f /etc/httpd/conf/httpd8091.conf

.:: cek port
[root@server01 conf]# netstat -tlnup |grep 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      7640/nginx.conf
tcp        0      0 :::8080                     :::*                        LISTEN      7654/httpd
tcp        0      0 :::8090                     :::*                        LISTEN      7672/httpd
tcp        0      0 :::8091                     :::*                        LISTEN      7686/httpd

jika sudah terlihat apache berjalan pada multiple port, sekarang tinggal buat konfigurasi vhost pada masing-masing file.
.:: contoh isi pada httpd.conf, httpd8090.conf, dan httpd8091.conf ( sesuaikan port-nya )
ServerName idprayoga.com
ServerAlias www.idprayoga.com
DocumentRoot "/home/8080/www/idprayoga.com/htdocs"
CustomLog "|/usr/sbin/cronolog /var/apachelogs/prayoga/%Y/%m/%d/idprayoga.com.access_log" combined
ErrorLog "|/usr/sbin/cronolog /var/apachelogs/prayoga/%Y/%m/%d/idprayoga.com.error_log"
ScriptAlias /cgi-bin/ "/home/prayoga/www/idprayoga.com/cgi-bin/"
Options All
AllowOverride All
Order allow,deny
Allow from all
### add these line in VirtualHost configuration
        RPAFenable      On
        RPAFsethostname On
        RPAFproxy_ips   10.100.100.99 ### can use multiple IP address

buat file pada direktori masing-masing berisi index.html dengan isi Port 8080,  Port 8090, dan Port 8091 atau isi lain yang intinya saat test untuk mengetahui kita sedang mengakses dari server port mana.
.:: konfigurasi pada vhost / nginx.conf
[root@server01 conf]# cd /etc/nginx/conf.d/
[root@server01 conf.d]# nano idprayoga.com.conf
#isi file konfigurasi
upstream bagi {
    server 10.100.100.99:8080;
    server 10.100.100.99:8090;
    server 10.100.100.99:8091;
}
server {
   listen  80;
   server_name  idprayoga.com;
   access_log  /var/log/nginx/idprayoga.com.access.log ;
   error_log    /var/log/nginx/idprayoga.com.error.log ;
   location / {
        proxy_pass      http://bagi;
        include         /etc/nginx/conf.d/proxy.conf;
   }
}

.:: restart httpd dan nginx
[root@server01 conf.d]# /etc/init.d/nginx restart
[root@server01 conf.d]# killall -9 httpd
[root@server01 conf.d]# /etc/init.d/httpd start
[root@server01 conf]# httpd -f /etc/httpd/conf/httpd8090.conf
[root@server01 conf]# httpd -f /etc/httpd/conf/httpd8091.conf

.:: testing

Akses idprayoga.com dari browser dan refresh. Perhatikan, seharusnya setiap refresh seharusnya tampilan berubah-ubah Port 8080, Port 8090, dan Port 8091.

Konfigurasi ini juga bisa berfungsi sebagai Fault Tolerance (bisa dijadikan server primary backup) dengan menambahkan parameter backup di belakangnya. Contoh, dalam keadaan normal, request di tangani oleh server primary (8080), namun jika server primary (8080) mati, request dari client akan di tangani oleh server backup (8090)
upstream bagi {
    server 10.100.100.99:8080;
    server 10.100.100.99:8090 backup;
   
}


bila ada yang salah mohon dikasih masukan. Terimakasih :)

Nginx sebagai reverse proxy

Nginx (baca: engine x) adalah server HTTP dan reverse proxy gratis berbasis open-source berkemampuan tinggi. Perangkat lunak ini diciptakan oleh Igor Sysoev pada tahun 2002, dan dirilis untuk pertama kalinya secara umum pada tahun 2004. Nginx terkenal karena performanya yang tinggi, stabil, memiliki banyak fitur, mudah dikonfigurasi, dan menggunakan sedikit sumberdaya pada server.

Kalau saya sebutkan kata Proxy mungkin yang pertama terlintas dibenak orang kebanyakan adalah server yang berjalan antara komputer kita (client) dan internet. Dan umumnya berfungsi sebagai caching halaman-halaman web yang pernah dikunjungi, pengalokasian bandwidh, atau rule mengenai user, content filtering dan fungsi-fungsi lainnya yang diusung oleh bermacam aplikasi Proxy.

Sebenarnya jenis proxy tersebut adalah Forward Proxy. Sebaliknya, ada jenis Proxy yang berjalan dari sisi lainnya yaitu sisi server, Web Server lebih tepatnya, dan inilah yang dimaksud dengan Reverse Proxy. Pada Reverse Proxy ini, Proxy berada di garda depan menerima Rekues HTTP. Request (umumnya diport 80). Di port 80 Reverse Proxy tidak menggantikan fungsi Web Server, melainkan dia akan melanjutkan rekues HTTP tersebut ke Web Server untuk diolah.

Installasi nginx sebagai reverse proxy dan apache sebagai web server.

Dalam catatan kali ini, mesin yang digunakan CentOS 5.6 (64bit)
.:: install epel
Karena default repo pada mesin tidak ada paket nginx, maka perlu menambahkan EPEL. EPEL (Extra Packages for Enterprise Linux) adalah kumpulan paket-paket rpm dari fedora yang dapat digunakan pada Enterprise Linux yaitu RHEL dan CentOS.
[root@martin.server ~]# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm

.:: install nginx
[root@martin.server ~]#  yum install nginx

.:: konfigurasi nginx sebagai reverse proxy
buat file reverse proxy
[root@martin.server ~]# cd /etc/nginx/conf.d/
[root@martin.server conf.d]# nano proxy.conf
###isi dari file proxy.conf
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;

.:: set-up proxy_pass pada vhost / nginx.conf
[root@martin.server ~]# cd /etc/nginx/conf.d/
[root@martin.server conf.d]# nano idprayoga.com.conf
###isi dari file idprayoga.com.conf
server {
   listen  80;
   server_name  idprayoga.com www.idprayoga.com;
   access_log  /var/log/nginx/idprayoga.com.access.log ;
   error_log /var/log/nginx/idprayoga.com.error.log ;
   location / {
proxy_pass http://10.100.100.99:8080/ ;     #ip web server
include /etc/nginx/conf.d/proxy.conf;
   }
}

.:: testing konfigurasi dan restart nginx
[root@martin.server conf.d]# nginx -t
[root@martin.server conf.d]# /etc/init.d/nginx restart

.:: install rpaf module
mod_rpaf merupakan modul yang diperlukan untuk menerima IP sebenar daripada nginx. Jika tanpa menggunaka module ini, webserver akan menerima ip dari server nginx.
[root@martin.server conf.d]# yum install mod_rpaf.x86_64

setelah install rpaf, pastikan di konfigurasi httpd.conf module ter-load
LoadModule rpaf_module /usr/lib64/httpd/modules/mod_rpaf-2.0.so

konfigurasi httpd.conf untuk menggunakan reverse proxy nginx
Listen 8080

.:: enable rpaf module pada vhost apache
[root@server01 ~]# nano /etc/httpd/conf/httpd.conf
### add these line in VirtualHost configuration
        RPAFenable      On
        RPAFsethostname On
        RPAFproxy_ips   10.100.100.99 ### can use multiple IP address

.:: restart apache
[root@server01 ~]# /etc/init.d/httpd restart

.:: cek port
[root@server01 ~]# netstat -tlnup |grep 80
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      7640/nginx.conf
tcp        0      0 :::8080                     :::*                        LISTEN      7654/httpd

testing

akses idprayoga.com, seharusnya menunjukkan halaman dari apache, bukan halaman nginx.

bila ada kekurangan, mohon dikasih masukan. Terimakasih :)

Thursday, March 31, 2011

Proteksi Folder pada Nginx dengan htpasswd

Jika pada catatan sebelumnya menggunakan htpasswd pada apache, kali ini catatan menggunakan htpasswd untuk proteksi folder pada nginx.

Pertama, generate password menggunakan Perl. (optional)

[root@prayoga ~]# perl -le 'print crypt("your_password", "salt")'

buat file htpasswd pada folder yang ditentukan misal pada  /etc/nginx/conf.d/

username:password hasil generate:just comment

tambahkan pada configurasi vhost/tempat folder yang akan diproteksi

location / {
       root   /usr/share/nginx/html/your_folder;
       index  index.php index.html index.htm;
       auth_basic       "Restricted";
       auth_basic_user_file /etc/nginx/conf.d/htpasswd;
   }


restart service nginx
terakhir coba akses folder web yang diproteksi, jika dia meminta password untuk diakses, dan setelah memasukkan login password yang sesuai baru bisa masuk, brarti benar :)

Tuesday, March 29, 2011

Konfigurasi vhost pada nginx

Buat direktory untuk vhost :

[root@prayoga www]# mkdir -p alecsite.com/{htdocs,logs,status}

buat file vhost :

[root@prayoga www]# nano /etc/nginx/conf.d/alecsite.com.conf

isi file konfigurasi sebagai berikut :


server {
   listen  80;
   server_name  alecsite.com;


   access_log  /usr/share/nginx/html/alecsite.com/logs/access.log ;
   error_log   /usr/share/nginx/html/alecsite.com/logs/error.log ;


   location / {
       root   /usr/share/nginx/html/alecsite.com/htdocs;
       index  index.php index.html index.htm;


   }


   error_page   500 502 503 504  /50x.html;
   location = /50x.html {
       root   /usr/share/nginx/html/alecsite.com/htdocs;
   }


  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                root    /usr/share/nginx/html/nalecsite.com/htdocs;
                fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html/alecsite.com/htdocs$fastcgi_script_name;
                include fastcgi_params;
        }


   location ~ /\.ht {
       deny  all;
   }
}

restart php-fpm dan nginx

[root@prayoga www]# /etc/init.d/php-fpm restart
[root@prayoga www]# /etc/init.d/nginx restart

testing :
buat file index.html pada /usr/share/nginx/html/alecsite.com/htdocs

[root@prayoga www]# nano /usr/share/nginx/html/alecsite.com/htdocs/index.html

isi dengan :

Selamat datang di webserver baruku :)

simpan dan akses dari browser.

=============================================================
Jika saat mengakses menemui error seperti berikut : error 403 Forbidden
Periksa permission direktori :

[root@prayoga www]# ls -la /usr/share/nginx/
total 20
drwxr-xr-x  5 root  root 4096 Mar 28 01:22 .
drwxr-xr-x 64 root  root 4096 Mar 28 01:04 ..
drwxr-xr-x  2 root  root 4096 Mar 28 20:17 html

direktori html dan direktori di dalam html harus 755 serta filenya harus 644

Install nginx sebagai webserver pada Centos 5.5 Final 64bit

nginx adalah salah satu webserver seperti Apache, Lighttpd, IIS dan lain-lain. Untuk keterangan lebih lanjut tentang Nginx bisa lihat di sini. Kelebihan singkat tentang nginx bisa cek pada catatan saya sebelumnya.

Sebelum install nginx pada mesin (Centos 5.5 64bit) , sata menambahkan repo rusia terlebih dahulu.

[root@prayoga ~]# nano /etc/yum.repos.d/rusia-repo.repo

tambahkan baris berikut :


[rusia-repo]
name=CentOS-$releasever . rusia packages for $basearch
#baseurl=file:///raid/RH/CentOS/$releasever/local/$basearch
baseurl=http://centos.alt.ru/pub/repository/centos/5/x86_64/
enabled=1
gpgcheck=0
protect=1


installasi nginx

[root@prayoga ~]# yum update
[root@prayoga ~]# yum install nginx-stable php-xcache php-fpm

catatan, untuk installasi module php bisa disesuaikan kebutuhan. Saya install 2 module di catatan ini, karena pada catatan http://www.idprayoga.com/2011/03/installasi-apache-mysql-dan-php-pada.html saya sudah menginstall beberapa module php.
Konfigurasi nginx

[root@prayoga ~]# nano /etc/nginx/nginx.conf

Add / Uncomment this line


# 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$fastcgi_script_name;
            include        fastcgi_params;
        }


start service php-fpm dan nginx

[root@prayoga ~]# /etc/init.d/php-fpm start
[root@prayoga ~]# /etc/init.d/nginx start

Cek port service :

[root@prayoga ~]# netstat -tlnup
Active Internet connections (only servers)


tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      930/php-cgi                
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      27143/nginx.conf 



Referensi: tox_penguin

Nginx sebagai Web Server

Nginx adalah webserver yang powerfull. beberapa situs-situs besar mulai menggunakan webserver ini. Webserver ini unggul dari sisi penggunaan memory dan request yang bisa dilayani.
Perbandingan jumlah request webserver apache, lighhttpd dan nginx
Dari grafik di atas, nampak bahwa nginx mampu melayani request lebih banyak dibandingkan dengan webserver lain.
Dari sisi penggunaan memory, nginx juga tidak kalah hebat dalam hal ini.


dikutip dari http://taujago.web.id