Friday, September 30, 2005

Config fastcgi ให้กับ rails

ช่วงนี้จะใช้ Snippets Application ที่เขียนขึ้นเองแล้ว
ก็เลยจะ deploy ให้เหมือนกันสถานการณ์การทำงานจริง



ปกติใน rails เราสามารถ run application ได้ 3 แบบหลักๆ คือ
  • ผ่านทาง WebBrick
    เจ้า WebBrick เป็น web server ที่เขียนด้วย Ruby
    เป็นสภาพแวดล้อมที่เหมาะสมอย่างยิ่งกับการ debug
  • ผ่านทาง Apache CGI
    อันนี้จะช้าหน่อย แต่เหมาะแก่การ test deploy ครั้งแรก
    เพราะจะได้ check พวก configuration, permission
    ให้ถูกต้องก่อน
  • ผ่านทาง Apache + mod_fastcgi


ที่เราจะทดลองก็คือ ใช้ FastCGI

เริ่มแรก ก็ต้อง install mod_fastcgi ก่อน
ขั้นนี้ไม่ยุ่งยากอะไร ก็แค่ download source code มา แล้วก็ build

จากนั้นก็ install fcgi developer kit
(ruby fcgi ต้องการใช้)

สุดท้ายก็ install ruby-fcgi

ส่วนการ deploy rails application
ถ้าอย่างง่าย ก็เพียงแต่ทำ link จาก htdocs
ไปยัง directory project/public

จากนั้นก็ config Directory ที่เราทำ link ไว้
โดย enable ให้สามารถ run cgi ได้
<Directory "/Library/WebServer/Documents/snn">
Options +ExecCGI FollowSymLinks
AllowOverride all
Allow from all
Order allow,deny
</Directory>


จากนั้นก็เข้าไปแก้ไข file .htaccess ที่อยู่ใน directory project/public
(file นี้ rails generate ให้เราอัตโนมัติ)
แก้ไข ส่วน rewrite rule จากของเดิมที่ใช้ dispatch.cgi
ไปเป็น dispatch.fcgi แทน

ปรับส่วน rewrite rule ให้เหมาะสมกับ structure ใหม่ของเราด้วย
(ขั้นนี้แหล่ะที่ค่อนข้างมั่ว เพราะเจ้า apache rewrite มันช่าง
เข้าใจยากจริงๆ)

เข้าไปแก้ไข projectdir/public/dispatch.fcgi
ระบุ directory ของ log file ที่ต้องการ
RailsFCGIHandler.process! '/tmp/snippet_fcgi_crash.log'


เมื่อเราเรียกใช้ครั้งแรกสุด apache จะ start process dispatch.fcgi ให้อัตโนมัติ
แต่บางทีเราต้องการให้ start process ขึ้นมารอเลย
(เพื่อไม่ให้เกิดอาการ lag เมื่อ user เริ่มเข้ามาใช้)
ในกรณีนี้ ก็ให้เพิ่ม directive นี้เข้าไปใน httpd.conf
<IfModule mod_fastcgi.c>
FastCgiIpcDir /tmp/fcgi_ipc
FastCgiServer /Library/WebServer/Documents/snn/dispatch.fcgi \
-initial-env RAILS_ENV=production -processes 15 -idle-timeout 60
</IfModule>

Related link from Roti

No comments: