หลังจากได้ลองศึกษาและเขียน Web Application ด้วย Ruby On Rails มาได้สักพัก ก็ได้เวลา เอา Web Application ที่ทำ ไปใช้งานจริง ซึ่งในช่วงแรก ผมอาศัยการก็อปปี้จากตัว Development ไปใช้งาน โดยเปลี่ยน config ให้รันในโหมด Production ทั้งนี้ผมรันทั้ง Development และ Production บนเครื่องตัวเองที่บ้านครับ เพราะต้องการศึกษา และทดสอบให้มั่นใจซะก่อน
และจากเดิมที่ใช้วิธีการก็อบปี้ ก็เปลี่ยนมาใช้ Subversion ช่วยซึ่งก็ทำให้สะดวกขึ้น และในที่สุดก็เลยมาลองใช้ Capistrano เพราะเห็นใครๆเขาก็ใช้กัน ^^ และพอได้มาลองใช้ดู ก็พบว่าวิธีการใช้งาน ที่มีคนเขียนไว้ตามเว็ปต่างๆนั้น ใช้แทบไม่ได้เลย - -” เพราะเวอร์ชั่น 2.0 นี้ต่างจากของเดิมเยอะพอสมควร ก็เลยต้องลองผิดลองถูก เดาๆเอาจากของเดิมที่มีคนเขียนอธิบายไว้ กับที่เว็ปของ Capistrano เขียนไว้ (น้อยจัง) พอทำสำเร็จเลยต้องมาเขียน Blog ไว้กันลืม ^^”
เริ่มต้นเลยใช้เช็คก่อนว่าเราได้ลง Capistrano 2.0 ไว้หรือยัง
gem list
ถ้ายังไม่ได้ลงก็จัดการลงเลยครับ
sudo gem install capistrano
จากนั้นก็ใน Project Root directory ซึ่งในกรณี้ของผมโปรเจคชื่อ inventory และอยู่ที่ Directory /home/my_local_username/aptana/workspace/inventory
cd ~/aptana/workspace/inventory
จากนั้นก็ทำการสร้างคอนฟิกไฟล์ของ Capistrano ใน Project ของเราด้วยคำสั่ง
capify .
จากนั้นถ้าจะดูว่าเราสามารถใช้คำสั่งอะไรได้บ้างให้ลองใช้คำสั่งนี้ดูครับ
cap -T
ทีนี้ให้เราไปเปิดไฟล์ config/deploy.rb เพื่อแก้ไขคอนฟิกให้ใช้งานได้ถูกต้องตามต้องการ ซึ่งปกติหน้าตาไฟล์คอนฟิกที่มันสร้างให้จะเป็นดังด้านล่างนี้
set :application, "set your application name here"
set :repository, "set your repository location here"
# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"
# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion
role :app, "your app-server here"
role :web, "your web-server here"
role :db, "your db-server here", :primary => true
ก็ให้แก้ตัวแปร
หลังจากแก้ไขไฟล์ config/deploy.rb เสร็จหน้าตาก็จะเป็นดังนี้
set :application, "inventory"
set :repository, "http://localhost/svn/inventory/trunk"
set :runner, 'my_remote_username'
# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"
set :deploy_to, "/home/my_remote_username/RailsProjects/#{application}"
# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion
role :app, "inventory.codesniper.org"
role :web, "inventory.codesniper.org"
role :db, "inventory.codesniper.org", :primary => true
task :after_setup do
run "mkdir -p #{shared_path}/media"
run "mkdir -p #{shared_path}/media/thumbnail"
end
task :after_symlink do
run "rm -rf current/public/media"
run "ln -s #{shared_path}/media #{current_path}/public/media"
end
แต่ทั้งนี้จะเห็นว่าผมใส่ Callbak Task ไว้ 2 Task คือ :after_setup ส่วนการทำงานเดี๋ยวผมจะ อธิบายทีหลัง ทีนี้หลังจากที่เราแก้ไขไฟล์ deploy.rb เสร็จแล้ว เราจะทำการเซ็ต ในส่วนที่เกี่ยวกับการ สั่งรัน Web Application บน Remote Server ซึ่งในที่นี้ผมจะรันด้วย Mongrel ดังนั้นเราต้องสร้างไฟล์ script/spin ขึ้นมา
nano -w script/spin
โดยในไฟล์ spin นี้ให้ใส่คำสั่งดังต่อไปนี้ (อย่าลืมแก้ไข Path ให้ถูกต้องด้วยนะครับ) ไฟล์นี้จะถูก Capistrono เรียกใช้โดยอัตโนมัติ
/home/my_remote_username/RailsProjects/inventory/current/script/process/spawner -p 5010 -i 2
โดยไฟล์นี้จะทำหน้านี้รัน Mongrel ในที่นี้ผมเซ็ตให้รัน 2 Process เพราะผมได้เซ็ต Apache/mod_proxy ไว้แล้ว และหลังจากนี้ ให้เราแก้ไขไฟล์ config/database.yml กันก่อน เนื่องจากผมใช้ sqlite3 เป็นฐานข้อมูล ดังนั้นเพื่อไม่ให้มีปัญหาตอน Deploy ผมเลยแก้ไขไฟล์ database.yml เป็นดังนี้
development:
adapter: sqlite3
database: db/development.sqlite3
test:
adapter: sqlite3
database: db/test.sqlite3
production:
adapter: sqlite3
database: /home/my_remote_username/RailsProjects/inventory/shared/production.sqlite3
ที่ต้องระบุ path ของ Production database ดังด้านบน ก็เพราะถ้าเราเก็บไฟล์ฐานข้อมูลไว้ใน Directory “db” ที่อยู่ใน Root Project เมื่อเราทำการแก้ไขโปรแกรมแล้วทำการ Deploy เพื่ออัพเดท Web App บน Remote Server ไฟล์ฐานข้อมุลก็จะหายไป
ทีนี้่ก่อนที่เราจะ Deploy ให้ทำการ commit ไฟล์ในโปรเจคก่อน
svn commit -m “Config Capistrano to Project”
จากนี้เราจะเริ่มทำการ Deploy Web Application กัน เริ่มด้วยคำสั่ง
cap deploy:setup
หลังจากเรียกคำสั่งนี้ใน Remote server จะมี Directory จำนวนนึงถูกสร้างขึ้นมา และที่เราได้เขียน Callback Task ไว้ใน deploy.rb
task :after_setup do
run "mkdir -p #{shared_path}/media"
run "mkdir -p #{shared_path}/media/thumbnail"
end
เมื่อลองเช็คดูใน Remote Server ใน Path ที่เราจะ Deploy จะมี Directory “current”, “releases”, “shared” และใน “shared” นั้นจะมี Directory “media” และ “media/thumbnail” ที่เราสั่งให้สร้างไว้
จากนั้นให้ส่ัง Deploy ด้วยคำส่ัง
cap deploy:cold
ซึ่งคำสั่งนี้ใช้ Deploy Web Application ในครั้งแรก ซึ่งจะมีการสั่งรัน db:migration สร้างฐานข้อมุลขึ้นมา และรัน Mongrel ให้เราโดยอัตโนมัติ ส่วน Web Application ของเราจะถูก Deploy ไปยัง Directory “Release”
$ pwd
/home/my_remote_username/RailsProjects/inventory
$ ls
current releases shared
$ls releases
20070802140742
$ls releases/20070802140742
app components db lib nohup.out Rakefile REVISION test vendor
Capfile config doc log public README script tmp
จะเห็นว่าบน Remote Server นั้น Web Application Root จะอยู่ใน 20070802140742 ซึ่ง Directory “current” จะลิ้งก์ไปที่ Directory “20070802140742″
และจากในช่วงแรกที่ผมได้เขียน Callback Task :after_symlink ไว้ใน deploy.rb
task :after_symlink do
run "rm -rf #{current_path}/public/media"
run "ln -s #{shared_path}/media #{current_path}/public/media"
end
ซึ่ง Callback Task นี้จะถูกรันในขั้นตอนนี้ ซึ่งจะทำการลบ Directory “media” ทิ้ง ที่ต้องลบทิ้งเพราะใน Directory นี้ที่ใช้เก็บรูปภาพ อาจมีรูปต่างๆที่เราอัพโหลดในช่วงพัฒนา ซึ่งเราไม่ได้เอาไปใช้จริง และหลังจากลบ Directory นี้แล้วก็เป็น คำสั่งสร้าง Symbolic link ไปยัง “shared/media” ส่วนทำไมต้องทำแบบนี้ เดี๋ยวจะอธิบายในช่วงต่อไปครับ ^^”
ส่วนตอนนี้เราสามารถ เปิดดูเว็ปเราได้แล้วนะครับ และต่อไป ถ้าเราทำการพัฒนาเพิ่มเติม หรือแก้ไขบน Local แล้วต้องการอัพเทดบน Remote เราก็สามารถทำได้โดยง่ายด้วยคำสั่ง
cap deploy
ซึ่งจะทำการ deploy Web Application ที่เราพัฒนาเพิ่มเติมเสร็จ ่ไปยัง Remote Server และทำการ Restart Mongrel แต่จะไม่มีการสร้างฐานข้อมูลใหม่ให้เรา เพราะเป็นการ Deploy เพื่ออัพเดท Web Application บน Remote Server ถ้าเราลองดูใน Directory “releases” จะเห็นว่ามี Directory ใหม่สร้างขึ้นมา ภายในนั้นก็คือ Web Application Root ชุดใหม่ที่เราเพิ่งสั่ง Deploy มา และ Directory Current ก็จะถูกเปลี่ยนมาชี้ที่นี่แทน
นั่นเป็นสาเหตุที่ผมได้แก้ไขไฟล์ database.yml ที่ระบุ sqlite database file ไว้ใน shared แทนก็เพราะถ้าไว้ภายใน Web Application Root เมื่อเรา Deploy เพื่ออัพเดท Directory “current” จะถูกเปลี่ยนให้ลิ้งก์ไปที่ Web Application Root อันใหม่ซึ่งจะไม่มีไฟล์ฐานข้อมูล
ตอนนี้น่าจะเริ่มเข้าใจแล้วนะครับว่า ที่ผมเขียน Callback Task ให้สร้าง Directory “media”, “media/thumbnail” ไว้ใน “shared” ก็ด้วยเหตุผลเดียวกัน เนื่องจาก Directory เหล่านี้ผมเอาไว้เก็บรูปภาพสินค้า เมื่อเราใช้งานบน Remote Server มีการอัพรูปสินค้าไปบ้างแล้ว ถ้าเราสั่ง deploy เพื่ออัพเดทเว็ป แล้วเราดันเก็บรูปไว้ใน Diretory ที่อยู่ภายใน Web Application Root มันก็จะเกิดปัญหาขึ้น เพราะ Directory “current” ถูกเปลี่ยนลิ้งก์ไปยัง Web Application Root ชุดใหม่แทน ทำให้รูปเดิมที่เคยอัพไปแล้วใช้ไม่ได้
สุดท้ายนี้ ผมไม่ได้เขียนเกี่ยวกับ การเซ็ต Apache - Subversion - Mongrel นะครับ ถ้าใครสนใจก็ ลองอ่านได้ที่นี่ครับ เพราะผมก็ไปอ่านจากที่นั่นแหล่ะ ![]()
ความจริงการใช้งาน Capistrano ยังมีอะไรให้ศึกษาอีกเยอะครับ มันสามารถเซ็ต และทำงานได้มากมาย กว่าที่ผมเขียนมาทั้งหมด เพียงแต่ผมพิ่งศึกษาและเพิ่งทดลองใช้งานได้แค่นี้ ไว้ถ้าได้อะไรมากกว่านี้ก็จะมาเขียนเพิ่มเติม
หมายเหตุ : ทั้งนี้ที่ผมทดสอบนั้น Local และ Remote Server จะอยู่บนเครื่องเดียวกัน อาจทำให้บางท่าน ที่อ่านแล้วนำไปใช้ อาจไม่ได้ผลอย่างที่ผมเขียน ก็ต้องขออภัยด้วยครับ
อ้างอิง : Capistrano
Tags: Capistrano, Ruby, Ruby on Rails
ความจริงผมเคยเขียนเกี่ยวกับ Add-on ตัวนี้ไปแล้วครั้งนึง ที่นี่ แต่นั่นเป็นเวอร์ชั่นเก่า ซึ่งตอนนั้นเจ้า Add-on ตัวนี้ยังใช้ Java ในการเซฟภาพหน้าเว็ปเพจ ซึ่งมี Bug อยู่พอสมควร รวมถึงค่อนข้างช้า แต่ในเวอร์ชั่นใหม่นี่ เราสามารถเลือกที่จะใช้ Java หรือ Gecko Canvas ในการ Capture ภาพหน้าเว็ปเพจ ซึ่งปกติมันจะเซ็ตใช้ Gecko Canvas มาให้อยู่แล้ว ซึ่งการใช้ Gecko Canvas ทำให้เราสามารถ Capture ภาพหน้าเว็ปเพจได้ง่ายและรวดเร็วขึ้น เท่าที่ผมลองใช้ดูยังไม่เจอ Bug อะไรเลย
นอกจากนี้ Feature ที่เพิ่มเข้ามาก็คือสามารถ เลือกที่เซฟภาพบางส่วน จากหน้าเว็ปเพจได้ด้วย ซึ่งยิ่งทำให้สะดวกเข้าไปอีก แทนที่จากเดิมเราเซฟภาพทั้งหน้าจอแล้วต้องมา Crop ภาพในโปรแกรมแก้ไขรูปภาพอย่าง Photoshop หรือ Gimp ก่อนที่จะนำไปใช้งาน เราก็สามารถใช้ Add-on ตัวนี้ของ FireFox จัดการเลือกเซฟภาพ บางส่วนของหน้าเว็ปเพจ ซึ่งทำให้เราสะดวกขึ้นมากทีเดียว ทั้่งนี้ Feature ใหม่ๆนี้เพิ่มมาตอนเวอร์ชั่นไหนผมก็ไม่แน่ใจ เพราะผมพึ่งกลับมา ใช้งานมันได้ไม่นานนี่เอง เนื่องจากเวอร์ชั่นแรกๆมี Bug อย่างที่ได้เคยบอกไป ทำให้ผมเลิกใช้ไปช่วงนึง
และเนื่องจากวันนี้ว่างๆเลย ทำ Clip การใช้งานเจ้า ScreenGrab นี่มาให้ดูด้วยเลย ^^
ใครสนใจและใช้งาน FireFox อยู่ก็ลองไปโหลดมาใช้งานได้ครับ ที่นี่
หลังจากได้ลองเช่าโฮสท์ของ Joyent/TextDrive มาได้ราวๆ 2 เดือน โดย Plan ที่ผมเช่าคือ Shared Host Startup Plan ซึ่งถ้าจ่ายรายเดือนก็เดือนล่ะ $15และไม่ว่าจะ Plan ไหนก็เสียค่าเซ็ตอัพ (Setup Fee) $25 เหมือนกันหมด - -* ซึ่งนับว่าแพงมาก เมื่อเทียบกับโฮสท์ทั่วๆไป

ใน Shared Host สิ่งที่เราได้มานอกจาก WebHosting แล้ว เราก็จะได้ Joyent Connector และ Strongspace มาใช้งานด้วย โดย Connector เจะเป็นชุดเว็ปซอฟท์แวร์ที่ ใช้ทำงงานร่วมกันเป็นทีมสามารถแชร์ Email, Calendar, Files, Bookmark ได้ ส่วน Strongspace ก็คือ Secure Filre Stroage & Sharing หรือก็คือเอาไว้เก็บและแชร์ไฟล์ ซึ่งทั้งหมดนี้ก็ดูเหมือนจะ คุ้มกับเงิน $15/เดือน และจากการใช้งานมา ผมจะรีวิวแยกกันในแต่ล่ะส่วน
Read the rest of this entry »
Tags: Hosting, Ruby on Rails
18 Jun
Posted by: AnnoMundi in: Linux :Howto & Tips
วิธีการสร้าง Self-Signed Certificate สำหรับเว็ปไซต์บนเครื่องที่ใช้ Ubuntu
Feisty Fawn สำหรับบทความนี้ผมขอไม่กล่าวถึงการลง Apache2, PHP5 และ
MySQL นะครับ จะกล่าวถึงเฉพาะการสร้าง Self-Signed Certificate เท่านั้น
sudo a2enmod ssl
$ sudo openssl genrsa -des3 -out server.key 1024
เมื่อโปรแกรมให้เราใส่ pass phrase ซึ่งเราจะใส่หรือไม่ใส่ก็ได้
$ sudo openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt
ซึ่งมันจะถาม Pass Phrase ที่เราตั้งไว้ในขึ้นตอนที่แล้วและให้เราใส่ชื่อโดเมนที่
เราต้องการจะใช้งาน SSL ตอนที่โปรแกรมให้เราใส่ Common Name ในที่นี้ผม
จะใส่เป็น *.mydomainname.com เผื่อไว้ใช้กับsubdomain ได้ด้วย
$ sudo mkdir /etc/apache2/ssl
$ sudo mv *.crt /etc/apache2/ssl
$ sudo mv *.key /etc/apache2/ssl
$ sudo chmod 400 /etc/apache2/ssl/*.key
#!/bin/bash
echo "password";
จากนั้นก็ให้แก้ไขไฟล์ /etc/apache2/mods-enabled/ssl.conf ให้มองหา
บรรทัดตามด้านล่างนี้
SSLPassPhraseDialog builtin
แล้วแก้เป็น
SSLPassPhraseDialog exec:/etc/apache2/ssl/password.sh
ที่ทำแบบนี้เพื่อแทนที่ apache จะรอถาม pass pharse ทุกครั้งที่ start/restart
ก็ให้มันไปรัน script ที่เราสร้างไว้แทน
Listen 80
Listen 443
แล้วจึงแก้ไขไฟล์คอนฟิกของเว็ปไซต์ในที่นี้ของผมจะอยู่รวมกันในไฟล์
/etc/apache2/sites-available/default ซึ่งบางคนอาจแยกคอนฟิกของแต่ล่ะ
เว็ปเป็นไฟลๆ์แยกกัน ก็ให้เปิดแก้ไขคอนฟิกเว็ปที่ต้องการใช้งาน SSL โดยแก้ไข
คอนฟิกดังนี้
<VirtualHost *:443>
...
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
...
</VirtualHost>
และในตอนต้นไฟล์ /etc/apache2/sites-available/default ต้องมีคำสั่งตาม
ด้านล่างด้วยนะครับ
NameVirtualHost *:80 NameVirtualHost *:443
จากนั้นก็สั่ง restart apache ได้เลย
sudo /etc/init.d/apache2 restart
เสร็จแล้ว เราก็จะสามารทดสอบและพัฒนาเว็ปซึ่งจำเป็นต้องมีส่วนที่ใช้งานผ่าน SSL ได้
เอกสารอ้างอิง : Creating Self-Signed Certs on Apache 2.2
Tags: apache, Linux, ssl, Ubuntu
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| « Aug | ||||||
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |