Feb29

Sudah beberapa bulan lamanya aku jatuh cinta kepada mongrel untuk menangani tugas-tugas harian web server terutama dalam lingkungan “development” Ruby on Rails, tadi siang aku menemukan bahwa ada solusi web server lain yang menarik untuk dicoba namanya adalah Thin, Pembuatnya Marc-Andre Cournoyer, mengklaim bahwa Thin lebih cepat dari mongrel

Thin ini sepenuhnya dibuat oleh Bahasa pemrograman Ruby dengan menggunakan beberapa library, diantaranya adalah Rack, EventMachines dan Ragel, versi terakhir dari thin adalah versi 0.7.0 dengan codename Spherical Cow, untuk menginstallnya cukup mudah, tinggal ketik perintah “sudo gem install thin” (tentu saja jika di windows sudonya dihilangkan)

adit@localhost Webappz]$ sudo gem install thin
Password:
Updating metadata for 57 gems from http://gems.rubyforge.org
…………………………………………………
complete
Building native extensions. This could take a while…
Building native extensions. This could take a while…
Successfully installed rack-0.3.0
Successfully installed eventmachine-0.10.0
Successfully installed thin-0.7.0
3 gems installed
Installing ri documentation for rack-0.3.0…
Installing ri documentation for eventmachine-0.10.0…
Installing RDoc documentation for rack-0.3.0…
Installing RDoc documentation for eventmachine-0.10.0…
[adit@localhost Webappz]$

Penulis sendiri merasa klaim di atas tidak terlalu berlebihan, yg baru penulis rasakan memang thin lebih cepat daripada mongrel (baru merasa duank, belum melakukan benchmark sendiri, abis ndak tau caranya gmn, kawans ada yg tau ? ^_^) , penggunaan di Rails sendiri sama mudahnya dengan menginstallnya, tinggal masuk ke directory RAILS_ROOT lalu melakukan eksekusi perintah, perintah yang sering digunakan oleh penulis adalah sebagai berikut :

thin start = menjalankan thin server di port 3000
thin restart = merestart thin
thin stop = mematikan thin (atau ctrl-C bila thin tidak berjalan dalam mode daemon)

thin start -p 9051 = menjalankan thin di port 9051
thin start -p 9051 -d = menjalankan thin di port 9051 dalam mode daemon (running secara background)
thin start -p 9052 -V = menjalankan thin di port 9051 dan menampilkan apa saja yang di-request oleh aplikasi


thin benchmark

atau kalau anda penasaran, di bawah ini penulis sertakan penjelasan perintah selengkapnya yang diambil dari helpnya thin

Usage: thin [options] start|stop|restart|config|install
	
Server options:
    -a, --address HOST               bind to HOST address (default: 0.0.0.0)
    -p, --port PORT                  use PORT (default: 3000)
    -S, --socket FILE                bind to unix domain socket
    -y, --swiftiply [KEY]            Run using swiftiply
    -e, --environment ENV            Rails environment (default: development)
    -c, --chdir DIR                  Change to dir before starting
    -r, --rackup FILE                Load a Rack config file instead of Rails adapter
        --prefix PATH                Mount the app under PATH (start with /)
        --stats PATH                 Mount the Stats adapter under PATH
	
Daemon options:
    -d, --daemonize                  Run daemonized in the background
    -l, --log FILE                   File to redirect output (default: log/thin.log)
    -P, --pid FILE                   File to store PID (default: tmp/pids/thin.pid)
    -u, --user NAME                  User to run daemon as (use with -g)
    -g, --group NAME                 Group to run daemon as (use with -u)
	
Cluster options:
    -s, --servers NUM                Number of servers to start
    -o, --only NUM                   Send command to only one server of the cluster
    -C, --config FILE                Load options from config file
        --all [DIR]                  Send command to each config files in DIR
	
Tuning options:
    -t, --timeout SEC                Request or command timeout in sec (default: 30)
        --max-conns NUM              Maximum number of connections (default: 1024)
                                     Might require sudo to set higher then 1024
        --max-persistent-conns NUM   Maximum number of persistent connections
                                     (default: 512)
	
Common options:
    -D, --debug                      Set debbuging on
    -V, --trace                      Set tracing on (log raw request/response)
    -h, --help                       Show this message
    -v, --version                    Show version

saya berharap di masa depan, performancenya bisa ditingkatkan lagi, dan mudah-mudahan bisa layak dijadikan production server, untuk sekarang sepertinya pengembangan thin masih dalam tahap EXPERIMENTAL, so menggunakan thin untuk Production Server tentunya masih beresiko, kecuali kalo hanya untuk Development, ya bolehlah secara performansinya juga lumayan, untuk aku pribad, pada saat ini aku kesampingkan dulu Mongrel dan beralih sepenuhnya ke Thin :D

note :

  1. benchmark image diambil dari Staying Alive with Thin
  2. kabarnya, selain Ruby on Rails, thin juga sudah bisa dijalankan di Framework lainnya seperti Nitro ataupun Merb
Feb27

pernah mengalami error yang seperti ini ?

ActiveRecord::RecordNotFound in UsersController#blah

Couldn’t find User with ID=900

ini adalah error ketika active record tidak menemukan kolom data yang id-nya 900, dalam kasus saya, error ini terjadi karena user mengakses url http://localhost:3000/users/blah/900

codenya ada di UsersController.rb sebagai berikut :

def blah
    @user=User.find(900)
end

dari sisi coding, tidak ada yang salah dengan kode saya, jadi tidak ada yang perlu diubah , ini terjadi karena users salah mengetik url atau memang sengaja menulis url demikian, http://localhost:3000/users/blah/900 (so blame the users. NOT programmer :D ), namun problemnya bila hal tersebut terjadi di production server, akan menjadi masalah yang cukup pelik bila users melihat exception berbaris-baris yang tidak dia mengerti, nah ada beberapa solusi untuk menghindari hal ini, salah satunya dengan menggunakan a.k.a meng-override method rescue_action_in_public di application.rb

ini adalah method khusus di controller yang menangkap semua exception yang terjadi pada Rails, defaultnya seperti yang saya jelaskan sebelumnya, itu akan menampilkan pesan exception yang berbelit-belit yang bagi users kebanyakan tidak akan dimengerti, dengan mengoverride method tersebut kita bisa menampilkan exception yang lebih users friendly dan lebih nyaman di mata users, contoh kodenya sebagai berikut

protected
def rescue_action_in_public(exception)
      case exception
      when  ActiveRecord::RecordNotFound
        @message = "Mohon maaf, tidak ditemukan data yang relevan"
      else
        @message =  "Mohon maaf, halaman yang anda maksud tidak tersedia di website kami"
      end
	
      render  :template => "layouts/exception"
 end

di dalam kode tersebut, rescue_action_in_public akan me-render template yang berada di app/views/layout/exception.rhtml, maka di file exception.rhtml tsb anda bisa membuat template rhtml sebagai berikut

<h1>Warning : ada kesalahan</h1>
<p><%= @message %></p>
<p>Klik di <%= link_to "sini",action=>"home" %> untuk kembali ke halaman utama</p>

so dengan begitu tidak ada lagi halaman aneh yang bisa membingungkan users, namun bagi programmer, exception sebenarnya tetap bisa terlihat, karena method tersebut hanya dipanggil jika request datang bukan dari localhost, so ini memudahkan programmer dalam melakukan pengkutuan debugging, akhir kata users senang, programmer pun senang :D

Apa itu webrick ?

Webrick adalah salah satu web server yang dibuat sepenuhnya menggunakan ruby dan termasuk standard library bagi ruby itu sendiri, webrick biasanya digunakan hanya untuk lingkungan development saja, bagi anda pengguna rails atau yang baru coba-coba dengan rails, mungkin masih ingat betapa mudahnya untuk menjalankan web server untuk rails tanpa perlu menginstall web server tambahan seperti apache atau web server lainnya, tinggal ketik “ruby script/server” di console maka webrick akan berjalan TANPA PERLU KONFIGURASI APAPUN

Nah di buku ruby manapun atau saran dari ruby evangelist siapapun, pasti akan berkata “Jangan pake webrick sebagai production server”, karena memang bakal tidak efisien dan webrick tidak dirancang untuk menangani request banyak dalam satu waktu, para Ruby Jedi Master (halah) biasanya akan merekomendasikan mongrel, nginx, lighttpd, apache atau litespeed sebagai solusi Production Server

Namun apa yang saya temukan barusan cukup membuat saya terheran-heran, ada sebuah situs yang menggunakan webrick sebagai production server, kalau situs kacangan sih masih mending kan kita bisa menduga “ah mungkin web masternya belum tau kalo webrick ndak cocok dibikin production server”, tapi ini adalah situs yang terkenal di kalangan rubyist, bagaimana tidak, saya berani bertaruh, para rubyist hampir dipastikan pernah mengunjungi situs ini paling tidak sekali selama hidupnya (halah), ya situs ini adalah http://www.ruby-doc.org/, surganya dokumentasi tentang ruby, silahkan cek kebenarannya di www.web-sniffer.net

jd penasaran, apa ya alasan mereka menggunakan Webrick ?, ya sapa tau bisa sy tiru :D

Note : apache mah linknya ndak usah dicantumkan yak, ^_^