วันจันทร์ที่ 20 ธันวาคม พ.ศ. 2553

Ruby on Rails ติดตั้ง ImageMagick สำหรับการ Resize รูปภาพ

บางครั้งเราก็ต้องการ Ruby on Rails เว็บไซต์ที่มี การย่อขยายรูปภาพ ดังนั้น ก็ต้องลงโปรแกรมเกี่ยวกับตัวจัดการรูปภาพซะหน่อย

เริ่มต้นด้วย ImageMagick ก่อน

ImageMagick: /usr/ports/graphics/ImageMagick
[root@nginx81 ~]# cd /usr/ports/graphics/ImageMagick/

ติดตั้ง ruby-rmagick (A Ruby binding for ImageMagick)
# cd /usr/ports/graphics/ruby-rmagick
# make install clean

จากนั้น ลง gem mini_magick เพื่อให้ Ruby on Rails สามารถ เรียกใช้งานต่อได้
# gem install mini_magick -v=เวอร์ชั่นที่อยากได้ (ผมใช้ Rails 2.3.5 ใช้ mini_magick ได้ 1.2.5 ถึง 1.3.3)

ให้ลงตามลำดับที่เขียนมานะครับ ไม่งั้น มันไม่ work ทดลองอยู๋หลายครั้งหล่ะ ไม่รู้ว่าเป็นเพราะสาเหตุอะไร (คาดว่า ตอนลง gem mini_magick มันมา build จาก lib ในเครื่องอีกที ดังนั้นถ้าลง lib magick ไม่ครบ มันก็จะไม่สมบูรณ์มั้ง)

วันอาทิตย์ที่ 19 ธันวาคม พ.ศ. 2553

การติดตั้ง Git Server

บทความนี้เป็น บทความพื้นฐานก่อนที่จะไปยังเรื่องอื่นๆครับ

บทความนี้เป็นการทำ git repository ผ่าน ssh ใน home ของเราเองนะ

ติดตั้ง git ผ่าน port
# whereis git
# cd /usr/ports/devel/git
# make install clean

หลังจากการติดตั้งเรียบร้อย ก็ล็อกอินปกติเข้า home ของตัวเอง โดยเราจะ ทดลองสร้าง ตัวเก็บ repos ให้กับ project1

# เครื่อง Git Server

$ mkdir git
$ cd git
$ mkdir project1.git
$ cd project1.git
$ git --bare init

# เครื่อง Notebook (Git development)
$ mkdir project1 # สร้างโปรเจคใหม่ อยู่ใน folder นี้
$ touch readme.txt # สมมุติไฟล์ ขึ้นมา 1 ไฟล์
$ git add README # เพิ่มไฟล์ เข้าสู่ระบบ git (ในเครื่องตัวเอง)
$ git commit -m 'first commit' # บันทึกการเปลี่ยนแปลง
$ git remote add origin ssh://username@venus.demotest.com:1822/~/git/project1.git
# ตั้งค่า git server ให้ โปรเจคนี้รู้จัก
$ git push origin master # อัพเดตสถานะ ไฟล์ที่มีการเปลี่ยนแปลง กับ git server ที่ตั้งค่าไว้

จะได้ผลลัพธ์ประมาณนี้

Counting objects: 3, done.
Writing objects: 100% (3/3), 209 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://nutjang@venus:2022/~/git/project1.git
* [new branch] master -> master


ไปที่เครื่อง Git Server
$ cd ~/git/project1.git
$ git log

Author: User
Date: Wed Dec 15 21:50:04 2010 +0700

first commit

นั่นเหละ แปลว่า เครื่อง notebook อัพเดต status ของ source code มาเก็ยไว้ที่ Git Server เรียบร้อยแล้ว

วันศุกร์ที่ 17 ธันวาคม พ.ศ. 2553

การใช้งาน Git ทั้งครั้งแรก และ ครั้งต่อๆ ไป

First commit:

on local laptop:

mkdir example
cd example
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin ssh://git@gate.example.org:22111/~/example.git
git push origin master

When programming:

# we need to clone the repository for one time:
git clone ssh://git@gate.example.org:22111/~/example.git

# ====
# then every time we want to edit some files:

cd example
git pull # pull the newest version from the repository

# after changing some files:

git commit -a -m 'msg' # commit the changes with a message msg
git push # push the changes to the repository

วันพุธที่ 15 ธันวาคม พ.ศ. 2553

การ ssh เข้าเครื่อง โดยไม่ถาม password (public, private key)

ขั้นตอนนี้ถือเป็น การเตรียม SSH ให้พร้อม สำหรับ capistrano ครับ

บทความนี้จะสอนตรง การ ssh เข้าเครื่อง โดยไม่ถาม password (public, private key)

ในที่นี้จะสมมุติ เครื่องมา 2 เครื่องคือ
1. เครื่อง development (Notebook) อยู่ที่บ้าน ต่อเน็ตบ้าง ไม่ต่อเน็ตบ้าง
2. เครื่อง production (Server) วางไว้ที่ IDC เชื่อมต่ออินเตอร์เน็ตตลอดเวลา

กรณีนี้ ผมอยู่หน้าเครื่อง Notebook และ ต้องการจะเข้าเครื่อง production แบบไม่ต้องใส่ password ให้ทำตามขั้นตอนดังนี้ครับ

เครื่อง development
$ ssh-keygen -t rsa
Enter file in which to save the key (/home/xxxxxxx/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): enter
Enter same passphrase again: enter
Your identification has been saved in /home/xxxxxxx/.ssh/id_rsa.
Your public key has been saved in /home/xxxxxxx/.ssh/id_rsa.pub.
The key fingerprint is:
27:fa:3c:E7:2b:32:4d:75:08:89:0f:29:a2:33:d3:9d xxxxxxx@demo
The key's randomart image is:

+--[ RSA 2048]----+
| o. |
| .B..o |
| ..+.+ . |
| +..o E |
| o... S . |
| . . o |
| . . . |
| . +... |
| =o |
+-----------------+

เอาไฟล์ id_rsa.pub ไป ใส่ไว้ที่ .ssh ของเครื่อง production

$ scp ~/.ssh/id_rsa.pub xxxxxxxx@58.xxx.xxx.xx:.ssh/authorized_keys

เป็นอันเรียบร้อยคราวนี้ ที่เครื่อง development ควรจะ ssh username@เครื่อง production ควรจะ ไม่ถาม password

$ ssh xxxxxx@58.xxx.xxx.xx

>> ได้ prompt $ ของเครื่อง production

วันอังคารที่ 14 ธันวาคม พ.ศ. 2553

สั่งให้ nginx บีบอัด ไฟล์ ต่างๆ (เพื่อให้หน้าเว็บโหลดเร็วขึ้น)

สั่งให้ nginx บีบอัด ไฟล์ ต่างๆ (เพื่อให้หน้าเว็บโหลดเร็วขึ้น)

เพิ่ม config พวกนี้เข้าไปใน nginx.conf จากนั้น

#gzip
gzip on;
gzip_buffers 16 8k;
gzip_http_version 1.0;
gzip_comp_level 9;
gzip_proxied any;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/css;

แล้ว จะเห็นว่า header ของ ก่อนเปลี่ยนและหลังเปลี่ยน จะแตกต่างกันดังรูป และเมื่อลองดูขนาดของไฟล์ที่ ต้องโหลดระหว่าง บีบอัด กับ ไม่บีบอัด จะมีแตกกันอย่างชัดเจน จาก 7k เหลือ 2.1k



วันพุธที่ 8 ธันวาคม พ.ศ. 2553

การตั้งค่าใช้งาน Ruby on Rails ผ่าน Passenger + Nginx

สมมุติว่าเราเขียน Ruby on Rails มาได้ระดับหนึ่งแล้ว อยากจะเอาเว็บไซต์ที่เขียนขึ้นไปไว้บนอินเตอร์เน็ต นั่นก็หมายความว่าเราต้องทำเครื่อง server สำหรับ production ใช่ไหม ?

ทางเลือกที่ทำได้จะมีประมาณนี้ (จะใช้คู่กับ Apache หรือ Nginx ก็จะคอนเซปเดียวกัน ต่างกันเพียง ไฟล์คอนฟิก เท่านั้น)
1. Mongrel ธรรมดา (ข้อดี ง่ายสุด, ข้อเสีย ไม่ scale)
2. Mongrel cluster (ข้อดี ง่าย, scale)
3. Passenger (ข้อดี scale, ข้อเสีย ตั้งค่าในครั้งแรกยาก)

สำหรับตอนนี้จะสอน การตั้งค่าใช้งาน Ruby on Rails ผ่าน Passenger + Nginx
เข้าไปที่ gem passenger (จะ install ผ่าน # gem install passenger ก็ได้นะ แต่ผนคิดว่า ถ้าติดตั้งผ่าน port มันจะมีการตรวจสอบเรื่อง module ที่เกี่ยวข้องไว้ครบมากกว่า)

# cd /usr/ports/www/rubygem-passenger

ถ้ามีการติดตั้ง passenger เสร็จ จะได้ ที่อยู่ของโปรแกรมประมาณนี้
# whereis passenger
passenger: /usr/local/bin/passenger

[nutjang@nginx81 ~]$ /usr/local/bin/passenger --version
Phusion Passenger version 3.0.0

"Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.

[root@nginx81 /usr/local/etc/nginx]# passenger-config --root
/usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.0

[root@nginx81 /usr/local/etc/nginx]# whereis ruby
ruby: /usr/local/bin/ruby /usr/local/man/man1/ruby.1.gz
[root@nginx81 /usr/local/etc/nginx]#

หลังจากตรวจสอบการติดตั้งเรียบร้อยแล้ว ให้เข้าไปแก้ไข nginx.conf เพื่อเริ่มเปิดใช้งาน passenger

http {

...

passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.0;
passenger_ruby /usr/local/bin/ruby;

...


}

กรณี เครื่อง Server นี้ มี 1 เครื่อง 1 โดเมน (พูดง่ายๆ ก็คือ ไม่ทำ virtual host) ก็แก้ตรง server ใน ไฟล์ nginx.conf ได้เลย โดยใส่ parameter ตามข้างล่างนี้ (สังเกตุ ตรง root dir จะชี้ไปที่ rails_app/public นะ)

server {
listen 80;
server_name www.nutjang1.com;
root /home/nutjang/rails/2.3.5/test1/public;
passenger_enabled on;
rails_env development;
}

แก้ไขเรียบร้อย ลอง restart nginx ซักที จากนั้นเปิด browser ดูผล

# /usr/local/etc/rc.d/nginx restart




(ในกรณีของผม ผมแก้ ไฟล์ hosts ในเครื่องไว้แล้ว จ้ะ)
c:/windows/system32/drivers/etc/hosts

สำหรับเครื่อง เซิฟเวอร์ที่จะทำ Virtual host ด้วยก็รอตอนหน้าจ้ะ (แต่คิดว่า น่าจะทำกันเองได้ปแล้วนะ เพราะ concept เดียวกันเลย)

วันอังคารที่ 7 ธันวาคม พ.ศ. 2553

รัน Ruby on Rails App ไม่ขึ้น Error ประมาณนี้

/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- iconv (LoadError)
from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'


- ถ้ามีการลงเครื่อง Server ใหม่แล้ว รัน Ruby on Rails App ไม่ขึ้น Error ประมาณนี้ น่าจะเป็นปัญหาจาก Iconv ที่ยังไม่ได้มีการติดตั้งนั่นเอง
- หรือ บางที่อาจจะเป็น แค่ ruby-iconv ยังไม่ได้ติดตั้ง
- ดังนั้น ถ้าแก้ปัญหาบน FreeBSD ด้วย ports ก็ง่ายมากเพราะ มัน list software ที่ depend ให้หมดแล้ว


ruby-iconv: /usr/ports/converters/ruby-iconv
[root@nginx81 ~]# cd /usr/ports/converters/ruby-iconv/
[root@nginx81 /usr/ports/converters/ruby-iconv]# make install clean

วันเสาร์ที่ 4 ธันวาคม พ.ศ. 2553

การคอนฟิก DNS ให้รองรับการใช้งานที่เพิ่มมากขึ้น

# cat /var/log/message

Dec 2 22:30:20 web9 named[10761]: client 117.47.1.181#24101: no more recursive clients: quota reached
Dec 2 22:30:21 web9 named[10761]: client 27.130.63.253#26931: no more recursive clients: quota reached
Dec 2 22:30:22 web9 named[10761]: client 117.47.237.124#28708: no more recursive clients: quota reached

- เหมือนเดิม ถ้าเจออะไรหน้าตาประมาณนี้ แสดงว่า มีการเรียกใช้งาน DNS ที่มี concurrent มากกว่า 1000 query dns เรียบร้อยแล้ว
- แน่นอน ก็ต้องปรับขยาย ไม่ต้องไป เพืือเยอะ ไปแก้ named.conf เลย เพิ่ม recursive-clients เข้าไป ในที่นี้ แก้เพิ่มไป 10เท่าตัว จึงใส่ค่า 10000 <- ไม่ต้องใส่ตามผมเยอะขนาดนี้ก็ได้ เพราะมันจะเปลือง Ram

options {
...
recursive-clients 10000;
};

วันพฤหัสบดีที่ 2 ธันวาคม พ.ศ. 2553

ว่าด้วยเรื่อง ipfw ของเครื่อง DNS

# cat /var/log/message
Dec 2 22:33:56 web9 named[51075]: client 183.88.249.90#64256: error sending response: permission denied
Dec 2 22:33:56 web9 named[51075]: client 183.89.190.3#21126: error sending response: permission denied
Dec 2 22:33:56 web9 named[51075]: client 223.207.191.243#15863: error sending response: permission denied

Error ประมาณนี้ ลองไปถามพี่ google มาแล้ว มันตอบประมาณว่า เป็นเรื่องของ Firewall ที่ block port สำหรับการตอบกับ bind9.x ขึ้นไปจะมีการ random port เพื่อตอบกลับ

ก็ไม่รู้ว่าจริงหรือ ไม่จริงไม่รู้ก็ลองไปเพิ่ม rules เข้าไปใน firewall ดู โดยอนุญาติ ให้ใช้ udp ขาออก
หน้าตาจะออกมาประมาณนี้

# Add by nutjang
# Allow upd to use reply query.
# must insert in DNS server with bind 9.x+
$cmd 65 allow udp from any to any out