Ruby on Rails, Day 4 - Rails with Apache on Ubuntu

คราวที่แล้ว ผมติดตั้ง Ruby on Rails บน Ubuntu Dapper โดยใช้ WEBrick ซึ่งเป็นเว็บเซิร์ฟเวอร์ขนาดเล็กที่มีในแพกเกจ RoR อยู่แล้ว คราวนี้เรามาติดตั้งระบบสมบูรณ์ที่สามารถใช้ทำงานจริงได้ โดยเปลี่ยน WEBrick เป็น Apache แทน

ปรากฎว่าเจอบทความที่มีคนเขียนไว้แล้ว ใช้อันนี้อ้างอิงละกัน จะได้ไม่ต้องเขียนใหม่ Ruby, Rails, Apache2, and Ubuntu Breezy (5.10) ลองบน Dapper ก็ประสบความสำเร็จดี

ติดตั้งเซิร์ฟเวอร์

เนื่องจาก Ubuntu ไม่ได้เป็นลินุกซ์สำหรับเซิร์ฟเวอร์ ดังนั้นเราจึงต้องลงทุกอย่างเอง แต่ด้วยความสามารถของ apt-get ก็ไม่ต้องใช้หัวอะไรเลย แพกเกจที่สำคัญมีดังนี้

  • Apache2 - เว็บเซิร์ฟเวอร์
  • MySQL server - ฐานข้อมูล
  • mod_fcgid ของ Apache - สำหรับใช้ FastCGI ในการรัน RoR
  • และตัว Rails เอง

apt-get จะจัดการกับ dependencies ให้อัตโนมัติ ชื่อแพกเกจที่ต้องใช้ทั้งหมด ดูตามลิงก์ที่ว่าครับ

การติดตั้งควรมีพื้นฐานการดูแลเซิร์ฟเวอร์มาบ้าง ถ้ามีปัญหาลองอ่านตามลิงก์พวกนี้ เผื่อจะเข้ากรณีกัน

phpMyAdmin

ส่วนที่ผมแนะนำเพิ่มเติม คือติดตั้ง phpMyAdmin เวลาสร้างตารางจะได้สะดวกๆ การติดตั้งก็ง่ายมากเช่นเดียวกัน

sudo apt-get install phpmyadmin

โดยมันจะไปอยู่ที่ /var/www/phpmyadmin

แต่ phpmyadmin ดูจะมีปัญหากับ MySQL บน Dapper นิดหน่อย ลองหาสาเหตุดูก็พบว่าไดเรคทอรีของ mysqld ไม่กำหนดสิทธิ์ให้เข้าได้ ต้องแก้ไขนิดหน่อย

sudo chmod +x /var/run/mysqld

และไม่ควรปล่อย password ของ MySQL ว่างไว้เฉยๆ แบบผม (ค่าดีฟอลต์เป็น root/ว่าง) เพื่อความปลอดภัยถ้าจะเอาไปรันจริง

โปรเจคต์ Recipe

ในตัวอย่างอันบนสุด เค้าลองแค่รัน Hello ง่ายๆ ให้ดูแบบคราวที่แล้ว เรามาลองสร้างโปรแกรมจริงๆ ที่ต่อกับ MySQL ผมใช้ตัวอย่าง Recipe ของ Rolling with Ruby on Rails เช่นเดิม ส่วนตัว RoR ใช้ testapp ของคราวก่อน

ขั้นตอนมีดังนี้

  1. เปิดเบราว์เซอร์ไปที่ http://localhost/phpmyadmin ถ้าไม่ทำอะไรผิดก็ควรเจอ phpMyAdmin ขึ้นมาทำงาน
  2. สร้างฐานข้อมูลชื่อ testapp
  3. สร้างตารางชื่อ recipes จำนวน 3 ฟิลด์ ดังนี้
    • ฟิลด์แรกชื่อ id ชนิด int กำหนดเป็น auto_incremental และ primary key (รูปกุญแจ)
    • ฟิลด์ถัดมาชื่อ title ชนิด varchar (255)
    • สุดท้ายชื่อ instruction ชนิด text
  4. ผมถือว่าสร้าง testapp ไว้แล้วนะครับ ออกมาที่ไดเรคทอรี testapp สั่งดังนี้ (ถ้าเก็บไว้ที่ /var/www อาจต้องสั่ง sudo ก่อน)
    testapp$ vi config/database.yml

    แก้ไขชื่อฐานข้อมูล testapp_ ต่างๆ ให้เป็น testapp เฉยๆ ให้หมด

  5. จากนั้นเริ่มสร้างโปรเจคต์ Recipe
    testapp $ ruby script/generator model Recipe
    testapp $ ruby script/generator controller Recipe

  6. แก้ไขไฟล์ testapp/app/controllers/recipe_controller.rb ดังนี้
    class RecipeController < ApplicationController
      scaffold :recipe
    end

    จะเห็นว่ามีโค้ดส่วน scaffold บรรทัดเดียวที่เราเขียนเพิ่ม

  7. เปิดเบราว์เซอร์ไปที่ http://localhost/testapp/recipe/new จะเห็นหน้าตาโปรเจคต์ Recipe ด้วยโค้ดบรรทัดเดียว!!

แพกเกจเพิ่มเติมที่แนะนำให้ลง (สำหรับ Ubuntu ที่ยังไม่ได้ลงอะไรเพิ่ม) คือ sshd สำหรับการล็อกอินเข้ามาแก้โค้ดจากเครื่องอื่น

มาถึงขั้นนี้เราก็พร้อมจะพัฒนาโปรแกรมด้วย Rails อย่างเป็นเรื่องเป็นราวแล้ว

Submitted byrevolutionon Mon, 02/27/2006 - 17:52

ปัจจุบันใช้ debian+apache2+mod_ruby+mysql อยู่ใช้งานได้ดีครับผม

อ่านใน mailing list เขาบอกว่า fcgi เร็วกว่า mod_ruby ไม่รู้จริงเท็จประการใด แต่ส่วนตัวชอบ eruby มาเลยเหมือนเอา ruby ใส่ลง html เหมือน php เลย

Submitted byKerberoson Tue, 02/28/2006 - 16:38

ทำไมไม่มีใครทำสำหรับภาษา perl บ้างหว่า
PoR "perl on rails" ฮึๆ
คนเขียน ruby ก็ได้แรงบันดาลใจของ syntax บางส่วนมาจาก perl หนิ (ถึงได้มี predefined var. ตรึม)
สงสัยต้องลองทำดูซะแล้ว สนุกแน่ๆ

Submitted bySirnon Wed, 03/01/2006 - 02:41

FastCGI เร็วกว่า mod_ruby (เยอะ)มากๆ ครับ
ฝั่งผมทำงานกับ Lighttpd + fcgi + RoR + MySQL อยู่ มีวิธี Install อยู่ที่ [url=http://hivelogic.com/articles/2005/12/01/ruby_rails_lighttpd_mysql_tiger]Hivelogic[/url]

แต่ Rails มันยอดจริงๆ ครับ :P ติดใจ ไม่ได้กลับไปแตะ PHP มาหลายเดือนแล้ว...

Submitted bywdon Wed, 03/01/2006 - 17:24

รบกวนช่วยดูที่นี่ให้หน่อยซิครับ
http://discuss.joelonsoftware.com/default.asp?joel.3.309321.3
อยากขอความเห็นเฉย ๆ น่ะครับ (จริง ๆ แล้ว คือขี้เกียจศึกษา ruby อีกน่ะครับ )

Submitted bymarkpeakneton Thu, 03/02/2006 - 00:18

อันนั้นก็อ่านซักพักนึงแล้วเหมือนกัน คิดว่าความรู้และประสบการณ์ที่มีกับ RoR ยังไม่สามารถบอกได้ว่ามีข้อดีข้อด้อยยังไง ข้้อจำกัดอะไรครับ