ติดตั้ง Ruby Application บน cPanel ด้วย Setup Ruby App

cPanel รองรับ Ruby ผ่าน Passenger WSGI บน Shared Hosting ไม่ต้องใช้ SSH ตั้งค่าผ่าน GUI ได้เลย

ติดตั้ง Ruby App บน cPanel cPanel

cPanel Setup Ruby App คืออะไร

Setup Ruby App เป็นฟีเจอร์ที่มาพร้อมกับ cPanel เวอร์ชันใหม่ ช่วยให้ผู้ใช้ Shared Hosting สามารถรัน Ruby Application ได้โดยไม่ต้องเข้าถึง Server ผ่าน SSH หรือมีสิทธิ์ Root บน Server ฟีเจอร์นี้ทำงานร่วมกับ Passenger ซึ่งเป็น Application Server ที่รองรับหลายภาษา เช่น Ruby, Python และ Node.js

Passenger ทำหน้าที่เป็นตัวกลางระหว่าง Web Server (Apache หรือ Nginx) กับ Ruby Application ของคุณ เมื่อมี Request เข้ามา Passenger จะส่งต่อไปยัง Ruby App และส่ง Response กลับไปยังผู้ใช้งาน ทำให้คุณสามารถรัน Ruby on Rails, Sinatra หรือ Rack-based Application อื่น ๆ ได้บน Shared Hosting ทั่วไป

ข้อดีของการใช้ Setup Ruby App ผ่าน cPanel คือสามารถตั้งค่าทุกอย่างผ่าน GUI ไม่ว่าจะเป็นการเลือก Ruby Version, กำหนด Application Directory, ตั้งค่า Environment Variable และจัดการ Gems ทุกอย่างทำได้จากหน้าเว็บโดยไม่ต้องพิมพ์คำสั่ง

ตรวจสอบว่า Ruby รองรับบน Hosting

ก่อนจะเริ่มสร้าง Ruby Application บน cPanel ให้ตรวจสอบก่อนว่า Hosting Provider ของคุณเปิดใช้งานฟีเจอร์ Setup Ruby App ไว้หรือไม่ เนื่องจากไม่ใช่ทุก Hosting Plan จะรองรับ Ruby ผ่าน Passenger โดยเฉพาะ Plan ราคาถูกมากอาจจะไม่มีฟีเจอร์นี้

วิธีตรวจสอบง่ายที่สุดคือเข้า cPanel แล้วค้นหาคำว่า "Ruby" ในช่อง Search ที่หน้าหลัก ถ้ามีไอคอน Setup Ruby App ปรากฏขึ้นมาแสดงว่า Hosting ของคุณรองรับ แต่ถ้าไม่พบไอคอนนี้เลย ให้ติดต่อ Support ของ Hosting เพื่อสอบถามว่าสามารถเปิดใช้งานได้หรือไม่

นอกจากนี้ควรตรวจสอบว่า Hosting Plan มี Resource เพียงพอสำหรับการรัน Ruby App เพราะ Passenger จะสร้าง Process แยกต่างหากในระบบ ซึ่งใช้ RAM มากกว่า PHP Application ทั่วไป โดยทั่วไปแนะนำให้มี RAM อย่างน้อย 256MB ต่อ Application

สิ่งที่ต้องตรวจสอบ วิธีตรวจสอบ สถานะที่ต้องการ
Setup Ruby App Icon ค้นหาใน cPanel Search Bar ต้องพบ
Passenger Support ถาม Hosting Support ต้องรองรับ
Ruby Version ที่ต้องการ ดูใน Dropdown ของ Setup Ruby App ขึ้นอยู่กับ Provider
RAM ที่มีใน Plan ดูจาก Resource Usage ใน cPanel แนะนำ 256MB+
Disk Space ดูจาก cPanel File Manager ต้องมีพื้นที่เพียงพอ

สร้าง Ruby Application ใหม่

เมื่อตรวจสอบแล้วว่า Hosting รองรับ Ruby ให้เข้า cPanel และคลิกที่ Setup Ruby App ซึ่งมักอยู่ในหมวด Software หรือ Programming จากนั้นคลิกปุ่ม Create Application เพื่อเริ่มตั้งค่า

ฟอร์มสร้าง Application จะให้กรอกข้อมูลหลัก 4 อย่าง ได้แก่ Ruby Version ที่ต้องการใช้, Application Root (โฟลเดอร์ที่เก็บโค้ด), Application URL (URL ที่จะเข้าถึง App), และ Application Startup File ซึ่งเป็นไฟล์หลักที่ Passenger จะโหลดตอนเริ่มต้น

สำหรับ Ruby on Rails ให้ใส่ Application Root เป็นโฟลเดอร์ของ Rails App เช่น myapp และ Startup File เป็น config.ru ซึ่งเป็น Rack Configuration File มาตรฐานของ Rails สำหรับ Sinatra ให้ใส่ชื่อไฟล์หลักของแอปแทน เช่น app.rb

  1. เข้า cPanel และคลิก Setup Ruby App
  2. คลิกปุ่ม Create Application สีเขียว
  3. เลือก Ruby Version ที่ต้องการ (แนะนำ 3.x สำหรับโปรเจกต์ใหม่)
  4. กรอก Application Root เป็นชื่อโฟลเดอร์ที่จะเก็บโค้ด เช่น myrubyapp
  5. กรอก Application URL เป็น Path ที่ต้องการ เช่น /app หรือเว้นว่างไว้ถ้าจะใช้ Root Domain
  6. กรอก Application Startup File เช่น config.ru สำหรับ Rails
  7. คลิก Create เพื่อสร้าง Application

ติดตั้ง Gems ผ่าน Bundler ใน cPanel

หลังจากสร้าง Application แล้ว ขั้นตอนต่อไปคือการติดตั้ง Gems ที่โปรเจกต์ต้องการ cPanel Setup Ruby App มีอินเทอร์เฟซสำหรับรัน Bundler โดยเฉพาะ ซึ่งจะอ่าน Gemfile จาก Application Root แล้วติดตั้ง Gems ทั้งหมดให้อัตโนมัติ

วิธีใช้งานคือกลับไปที่หน้า Setup Ruby App แล้วคลิกที่ชื่อ Application ที่เพิ่งสร้าง จากนั้นในส่วน Installed Modules จะมีช่องให้ค้นหา Gem ที่ต้องการ พิมพ์ชื่อ Gem แล้วคลิก Add หรือถ้าต้องการติดตั้งจาก Gemfile ทั้งหมดให้คลิกปุ่ม Run Bundler

ถ้าโปรเจกต์มี Gemfile อยู่แล้ว ให้อัพโหลดไฟล์ Gemfile และ Gemfile.lock ขึ้นไปยัง Application Root ก่อน แล้วค่อยกด Run Bundler ระบบจะติดตั้ง Gems ตาม Version ที่ระบุใน Gemfile.lock ซึ่งช่วยให้ได้ Environment เหมือนกับที่ใช้พัฒนาในเครื่อง

ตั้งค่า Startup File และ Environment Variables

Startup File คือจุดเริ่มต้นที่ Passenger จะโหลด Application ของคุณ สำหรับ Ruby Application มาตรฐานที่ใช้ Rack Interface จะต้องเป็นไฟล์ที่ Export ตัวแปรชื่อ app หรือ application ซึ่งเป็น Rack App Object โดยทั่วไปจะชื่อ config.ru

สำหรับ Rails Application ค่า Default ของ config.ru ที่ Rails สร้างให้จะใช้งานได้กับ Passenger โดยตรง ไม่ต้องแก้ไขอะไรเพิ่มเติม แต่ถ้าเป็น Sinatra หรือ App ที่เขียนเอง ให้ตรวจสอบว่าไฟล์นั้น Export Rack Object ออกมาถูกต้องตามรูปแบบ

Environment Variables เป็นส่วนสำคัญที่ใช้เก็บข้อมูล Config ที่ไม่ควรอยู่ในโค้ด เช่น Database Password, API Key หรือ Secret Key Base ของ Rails ใน cPanel สามารถเพิ่ม Environment Variable ได้ในส่วน Environment Variables ของหน้า Application โดยใส่ชื่อ Variable และค่าแล้วกด Add

หลังจากเพิ่มหรือแก้ไข Environment Variable แล้ว ต้อง Restart Application เสมอ เพราะ Passenger จะอ่านค่า Environment Variable ตอน Start เท่านั้น ถ้าไม่ Restart Application จะยังใช้ค่าเดิมอยู่

Restart และ Debug Ruby Application

เมื่อตั้งค่าทุกอย่างครบแล้ว ให้คลิกปุ่ม Restart ในหน้า Setup Ruby App เพื่อให้ Passenger โหลด Application ใหม่ สถานะของ Application จะแสดงเป็น Running (สีเขียว) เมื่อ Start สำเร็จ หรือ Stopped (สีแดง) ถ้าเกิดข้อผิดพลาด

ถ้า Application ไม่ Start หรือแสดง Error ให้ดู Log ใน Application Log File ที่อยู่ใน Application Root ของคุณ โดย Passenger จะสร้างไฟล์ Log ชื่อ log/passenger.log หรือ app_log โดยอัตโนมัติ ข้อความ Error ที่พบบ่อยมักเกี่ยวกับ Gem ที่ขาด, Path ผิด หรือ Syntax Error ในโค้ด

สำหรับ Rails Application ให้ตรวจสอบไฟล์ log/production.log ด้วย เพราะ Rails จะ Log Error ทุกอย่างไว้ที่นั่น รวมถึง Database Connection Error หรือ Exception ที่เกิดขึ้นขณะรัน Application คุณสามารถเปิดไฟล์ Log เหล่านี้ได้ผ่าน File Manager ใน cPanel โดยตรง

ตรวจสอบว่า Ruby App ทำงานถูกต้อง

หลังจาก Restart Application แล้ว ให้ทดสอบเปิด URL ของ Application ในเบราว์เซอร์เพื่อดูว่าทำงานถูกต้องหรือไม่ ถ้าเห็นหน้าของ Ruby App แสดงว่าตั้งค่าสำเร็จ แต่ถ้าเห็น Error Page หรือ Blank Page ให้ตรวจสอบ Log ก่อน

ตัวอย่างโค้ดและคำสั่งที่ใช้บ่อยในการตรวจสอบ Ruby App บน cPanel มีดังนี้ โดยถ้า Hosting รองรับ SSH สามารถรันคำสั่งเหล่านี้ได้โดยตรง แต่ถ้าไม่มี SSH ให้ใช้ cPanel Terminal หรือดูผลผ่านไฟล์ Log แทน

# ตรวจสอบ Ruby Version ที่ใช้งาน
ruby -v
# ตัวอย่างผลลัพธ์: ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-linux]

# ตรวจสอบ Gems ที่ติดตั้งแล้ว
bundle list
# หรือดูเฉพาะ Gem ที่สนใจ
bundle show rails

# ตรวจสอบ config.ru ว่า Export Rack App ถูกต้อง
# ตัวอย่าง config.ru สำหรับ Sinatra App
require 'sinatra'
require_relative './app'
run Sinatra::Application

# ทดสอบ Rack App โดยตรงก่อน Deploy
rackup config.ru -p 3000

# ดู Environment Variables ที่ตั้งค่าไว้
printenv RAILS_ENV
printenv SECRET_KEY_BASE
Tip: เปิดหน้า Setup Ruby App ใน cPanel ดูสถานะ Running/Stopped ของ Application และ Log ใน app_log เพื่อดูว่ามี Error หรือไม่ ถ้า Log ยาวมากให้ดูที่ท้ายไฟล์ก่อน เพราะ Error ล่าสุดจะอยู่ที่นั่น สามารถใช้ File Manager ใน cPanel เปิดดูไฟล์ Log ได้โดยตรงโดยไม่ต้องใช้ SSH

แก้ปัญหาที่พบบ่อย

การรัน Ruby Application บน Shared Hosting ผ่าน cPanel อาจพบปัญหาต่าง ๆ โดยเฉพาะสำหรับผู้ที่เพิ่งเริ่มต้น ปัญหาส่วนใหญ่มักมาจากการตั้งค่าผิด Path หรือการที่ Passenger ยังไม่ได้รับการ Configure อย่างถูกต้อง ต่อไปนี้คือปัญหาที่พบบ่อยและวิธีแก้ไข

Ruby App แสดง 503 Service Unavailable — Passenger ยังไม่ Start

Error นี้หมายความว่า Web Server ไม่สามารถเชื่อมต่อกับ Passenger ได้ สาเหตุที่พบบ่อยที่สุดคือ Application ยังไม่ได้ Start หรือ Crash ไปแล้ว ให้เข้า Setup Ruby App แล้วตรวจสอบสถานะของ Application ถ้าแสดง Stopped ให้คลิก Start เพื่อเริ่มใหม่

ถ้า Start แล้วยังเจอ 503 อยู่ ให้ดู Passenger Log เพราะ Passenger อาจ Start ไม่สำเร็จเนื่องจาก Gem ขาดหายหรือ Syntax Error ในโค้ด นอกจากนี้อาจเกิดจาก RAM เต็มซึ่งทำให้ Passenger ไม่สามารถสร้าง Process ใหม่ได้ ลองติดต่อ Hosting Support เพื่อตรวจสอบ Resource

Gem ติดตั้งไม่ได้ — Permission ผิดหรือ Gem Server เข้าไม่ได้

ถ้ากด Run Bundler แล้วเจอ Error เกี่ยวกับ Permission ให้ตรวจสอบว่าโฟลเดอร์ Application Root มี Permission ถูกต้อง (755 สำหรับโฟลเดอร์ และ 644 สำหรับไฟล์) สามารถแก้ได้ผ่าน File Manager ใน cPanel

ถ้า Error บอกว่าเชื่อมต่อ RubyGems.org ไม่ได้ อาจเป็นเพราะ Hosting มี Firewall Block การเชื่อมต่อออกไปภายนอก ให้ติดต่อ Support เพื่อขอให้ Whitelist IP ของ RubyGems.org หรือถ้า Gem บางตัวต้องการ Native Extension เช่น nokogiri หรือ mysql2 อาจต้องให้ Support ติดตั้ง System Library ที่จำเป็นก่อน

Application.rb ไม่พบ — Startup File Path ผิด ต้องตรวจเส้นทาง

Error นี้เกิดเมื่อ Passenger หา Startup File ตาม Path ที่ระบุไว้ไม่เจอ ให้เข้า Setup Ruby App แล้วตรวจสอบค่า Application Startup File ให้ตรงกับชื่อไฟล์จริงที่อยู่ใน Application Root

ข้อผิดพลาดที่พบบ่อยคือใส่ Path แบบ Full เช่น /home/user/myapp/config.ru แทนที่จะใส่แค่ชื่อไฟล์ config.ru หรือ Relative Path จาก Application Root ให้ใส่เฉพาะชื่อไฟล์หรือ Path สัมพัทธ์จาก Application Root เท่านั้น นอกจากนี้ตรวจสอบตัวพิมพ์ใหญ่-เล็กด้วย เพราะ Linux Server ถือว่า Config.ru กับ config.ru ต่างกัน

Environment Variable ไม่มีผล — ต้อง Restart App หลังแก้ไข

Passenger อ่านค่า Environment Variable ครั้งเดียวตอน Start เท่านั้น ดังนั้นถ้าเพิ่มหรือแก้ไข Environment Variable ใหม่แล้ว App ยังไม่เห็นค่าใหม่ ให้กลับไปที่ Setup Ruby App แล้วคลิก Restart เพื่อให้ Passenger โหลดค่าใหม่

อีกสาเหตุหนึ่งคือชื่อ Variable พิมพ์ผิด เช่น RAILS_ENV พิมพ์เป็น Rails_Env ซึ่ง Linux เป็น Case-Sensitive ทำให้ App ไม่รู้จัก Variable นั้น ให้ตรวจสอบชื่อ Variable ให้ตรงกับที่ใช้ในโค้ดทุกตัวอักษร

คำถามที่พบบ่อย

Ruby บน Shared Hosting ต่างจาก Ruby บน VPS อย่างไร?
บน Shared Hosting คุณไม่มีสิทธิ์ Root และต้องใช้ Ruby Version ที่ Hosting Provider ติดตั้งไว้ให้เท่านั้น ไม่สามารถติดตั้ง Ruby เวอร์ชันอื่นหรือ System Library เพิ่มเองได้ Application ทำงานผ่าน Passenger ซึ่งถูกจำกัด Resource โดย Hosting ในขณะที่บน VPS คุณมีสิทธิ์เต็มใน Server สามารถติดตั้ง Ruby ด้วย rbenv หรือ rvm, กำหนด Resource เองได้, และใช้ Puma, Unicorn หรือ Puma เป็น Application Server แทน Passenger ได้ VPS เหมาะกับ Production App ที่ต้องการ Performance และ Customization สูง ส่วน Shared Hosting เหมาะกับ App ขนาดเล็กหรือการทดสอบที่ไม่ต้องการ Traffic สูง
ใช้ Rails บน cPanel Shared Hosting ได้ไหม?
ใช้ได้ถ้า Hosting Provider เปิดใช้ Setup Ruby App และรองรับ Ruby Version ที่ Rails ต้องการ อย่างไรก็ตาม Rails เป็น Framework ที่ใช้ Memory ค่อนข้างมากโดยเฉพาะตอน Boot ซึ่งอาจเกิน Limit ของบาง Shared Hosting Plan ถ้าต้องการรัน Rails จริงจัง แนะนำให้ใช้ Hosting Plan ที่มี RAM อย่างน้อย 512MB หรือพิจารณาย้ายไปใช้ VPS แทน สำหรับ Rails App ขนาดเล็กหรือ Demo นั้นรันบน Shared Hosting ได้ไม่มีปัญหา
Passenger คืออะไรและทำไม cPanel ถึงใช้แทน Puma/Unicorn?
Passenger (หรือชื่อเต็มว่า Phusion Passenger) เป็น Application Server ที่ออกแบบมาเพื่อทำงานร่วมกับ Apache และ Nginx ได้โดยตรงโดยไม่ต้องตั้งค่า Reverse Proxy เพิ่มเติม cPanel ใช้ Passenger เพราะ Integrate กับ Apache ได้ง่าย ไม่ต้องแก้ไข Virtual Host Config เอง และรองรับหลายภาษาในตัวเดียว (Ruby, Python, Node.js) ส่วน Puma และ Unicorn เป็น Standalone Server ที่ต้องตั้งค่า Nginx/Apache เป็น Reverse Proxy ด้านหน้าเอง ซึ่งทำได้ยากบน Shared Hosting ที่ไม่มีสิทธิ์แก้ Config ของ Web Server ดังนั้น Passenger จึงเหมาะที่สุดสำหรับสภาพแวดล้อม Shared Hosting