Thursday, May 24, 2012

Deploying multiple Rails Application using Nginx and Unicorn on the same port, different host

Dalam tutorial ini Ya'kob akan menerangkan bagaimana untuk membuat nginx supaya melayan request dari port yang sama, tapi host yang berlainan untuk applikasi rails yang berlainan. Ya'kob tidak menerangkan kaedah instalasi rails environment disini, kerana Ya'kob telah membuatnya didalam tutorial sebelumnya. Kita andaikan directory rails anda adalah di /home/system/deploy/akeyu Kita mahu meng-install webserver nginx
sudo apt-get install nginx
dan hidupkan nginx dengan service
sudo service nginx start
sila layari host anda dan sepatutnya anda dapat melihat "Welcome to nginx!" file config nginx terletak di /etc/nginx/nginx.conf sila perhatikan file tersebut untuk mempelajari kaedah pengoperasian nginx, contohnya untuk pelajari dimana log filenya untuk tujuan troubleshoot pada masa hadapan. nota + : seperti yang ditunjuk dalam railscast, kita mahu menyimpan file config nginx didalam folder rails application dan meng-symlink-nya untuk tujuan kemudahan mobility app tersebut cth: dengan penggunaan repository untuk digunakan pada lain2 server. Pada pendapat Ya'kob, ianya tidak sesuai untuk multiple application kerana kita mahu meng-config rails app yang lain juga didalam file config yang sama. Maka kita tinggalkan struktur file config nginx seperti asal.

nginx + webrick proof of concept

tuliskan di /etc/nginx/sites-enabled/default :
server {
 listen 80 default;
 # server_name example.com;
 root /home/system/deploy/akeyu; 
 try_files $uri/index.html $uri @unicorn;
 location @unicorn {
   proxy_pass http://localhost:3000;
 }
}
dan restart nginx
sudo service nginx restart
kemudian run webrick server
bundle exec rails s
layari http://localhost:3000 dan sepatutnya anda dapat melihat "Welcome aboard You’re riding Ruby on Rails!"

Keganasan bermula..

instalasi unicorn
/Gemfile
gem 'unicorn'
/config/unicorn.rb
working_directory "/home/system/deploy/akeyu"
pid "/home/system/deploy/akeyu/tmp/pids/unicorn.pid"
stderr_path "/home/system/deploy/akeyu/unicorn/unicorn.log"
stdout_path "/home/system/deploy/akeyu/unicorn/unicorn.log"

listen "/tmp/unicorn.akeyu.sock"
worker_processes 2
timeout 30
berikut adalah contoh file /etc/nginx/sites-enabled/default Ya'kob.
upstream unicorn {
  server unix:/tmp/unicorn.akeyu.sock fail_timeout=0;
}

upstream place {
  server unix:/tmp/unicorn.place.sock fail_timeout=0;
}

server {
 listen 80;
 server_name akob.akeyu.com.my;
 root /home/system/deploy/place/public;
 try_files $uri/index.html $uri @place;
 location @place {
   proxy_pass http://place;
 }
 error_page 500 502 503 504 /500.html;
}

server {
 listen 80 default;
 server_name www.akeyu.com.my;
 root /home/system/deploy/akeyu/public;
 try_files $uri/index.html $uri @unicorn;
 location @unicorn {
   proxy_pass http://unicorn;
 }
 error_page 500 502 503 504 /500.html;
}
sila restart nginx supaya perubahan config mula berkesan.
sudo service nginx restart
perhatikan nginx listen kepada port yang sama untuk kedua-dua server, tetapi akan bertindak berlainan cara jika diakses dari host yang berlainan. root dan try_files pula adalah untuk tujuan melayan (serve) file static jika ada dan @unicorn atau @place pula adalah untuk serve dari rails application. location adalah dimana nginx dan unicorn dihubungkan. unicorn akan menghasilkan sock pada /tmp apabila di run. Oleh itu kita menulis sock yang dihasilkan oleh unicorn pada bahagian location ini. seperti app yang pertama Ya'kob membuat 1 lagi app bernama place, menggunakan unicorn dan mengedit file /config/unicorn.rb sama seperti app akeyu. tetapi Ya'kob gantikan semua akeyu dengan place. pastikan directory betul. PENTING !: seperti isu Ya'kob, Ya'kob perlu untuk
chmod +w tmp/pids/ unicorn/ 
dalam folder app kita. sila create jika tidak wujud. run unicorn pada root application folder anda contoh di /home/system/deploy/akeyu
bundle exec unicorn -c config/unicorn.rb -D
dan juga pada direktori applikasi yang 1 lagi. dalam kes Ya'kob place jika tiada error dipaparkan, bermakna ianya telah berjaya di-run unicorn pada default-nya ia menyediakan 2 worker instance dan 1 master untuk melayan 3 client pada 1 serentak. Ia juga berkemampuan bertindak sebagai load balancer tetapi yakob belum mempelajarinya lagi. dan sekarang jika anda melayari akeyu.com.my dan akob.akeyu.com.my anda telah mengakses 2 applikasi yang berbeza pada port yang sama. sebagai proof of concept, anda juga boleh menggunakan webrick pada salah satu applikasi. contoh config nginx
/etc/nginx/sites-enabled/default
server {
 listen 80;
 server_name akob.akeyu.com.my;
 root /home/system/deploy/place/public;
 try_files $uri/index.html $uri @place;
 location @place {
#   proxy_pass http://place;
    proxy_pass http://localhost:3000; #webrick perlu di-run pada port lain dari 80 untuk mengelakkan bind access port 80 error
 }
 error_page 500 502 503 504 /500.html;
}
dan run webrick anda pada port 80 dan -d detach / sbgai service
rails s -p80 -d
selamat mencuba! dan tolong beritahu apa penemuan yang anda alami/ kesalahan pada tutorial ini / kelemahan / ketidak fahaman dalam tutorial ini / sebarang ralat.

1 comment:

  1. Microsoft has verified that smaller sized Home windows 8 tablets will come windows 7 anytime upgrade key to current market while in the close to upcoming. These will fill a gap inside the Windows ecosystem and windows 7 home premium product key improve demand for Home windows eight by addressing key downsides into the early Floor tablets.

    ReplyDelete