พอดีไปเห็นเว็บหนึ่ง เปิดใหม่ ขายพวก บอร์ด arduino เห็นว่าถูกดี ก็เลยลองซื้อดูมา
พอซื้อมาปุ๋บ (จริงๆแล้วก็พอมีพื้นฐาน Micro Controller อยู่บ้างอยู่แล้ว) พบว่า บอร์ด และ sersor ทั้งหลาย สามารถ เซ็ตอัพ และ ทดสอบการใช้งาน sensor ทั้งหลายได้หมดเลยภายใน 2 ชั่วโมง ใช้งานง่ายมากๆ
โอววแม่เจ้า ทำไมมันง่ายขนาดนี้ เพราะมันมีทั้ง IDE , compiler, ตัวอย่างโปรแกรม พร้อมเลย
สมัยนี้มันง่ายจริงเลย บอร์ด 500 บาท เสียบสาย USB แล้วก็เรียนรู้ Microcontroller ได้เลย อย่างนี้นะ ไม่ต้องรอให้ อยู่ มหาลัยฯ ปี 3 แล้วค่อยเรียน Micro ก็ได้ เด็ก ป. 4 ก็น่าจะทดลองทำได้แล้วครับ
ปล.ซื้อมากะทำ Monitor Alert สงสัยคงต้อง เสียตังเพิ่มอีกหน่อย ซื้อ ส่วน GSM มาให้มัน SMS มาหาเราด้วยดีกว่า
เล่าเรื่องการทำเว็บไซต์ด้วย Ruby on Rails จ้า พร้อมวิธีการปรับแต่ง Server จำพวก FreeBSD, debian จากประสบการณ์ในการทำงาน Admin
วันเสาร์ที่ 29 กันยายน พ.ศ. 2555
วันอังคารที่ 25 กันยายน พ.ศ. 2555
Install FreeBSD src ด้วย cvsup
พอดี ตอนแรกที่ลง FreeBSD 9.0 นั่นลงแบบ minimum พอทำงานไปเรื่อยๆ อ้าว! ต้อง compile freebsd kernel เพื่อ optimze ด้วย
วิธีการที่ง่ายที่สุดก็คือ การ ใช้ src จาก แผ่นติดตั้ง ไม่งั้นก็โหลดเลย ด้วยคำสั่งดังต่อไปนี้
cvpup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/stable-supfile
ถ้าจะเอาเฉพาะส่วน ก็ comment src-all ออกก่อน เท่านี้เราก็จะได้ freebsd source kernel มาไว้ในเครื่องโดยไม่ต้องเอาจากแผ่นติดตั้งด้วย
วิธีการที่ง่ายที่สุดก็คือ การ ใช้ src จาก แผ่นติดตั้ง ไม่งั้นก็โหลดเลย ด้วยคำสั่งดังต่อไปนี้
cvpup -g -L 2 -h cvsup.tw.freebsd.org /usr/share/examples/cvsup/stable-supfile
ถ้าจะเอาเฉพาะส่วน ก็ comment src-all ออกก่อน เท่านี้เราก็จะได้ freebsd source kernel มาไว้ในเครื่องโดยไม่ต้องเอาจากแผ่นติดตั้งด้วย
วันจันทร์ที่ 24 กันยายน พ.ศ. 2555
Ruby 1.9 กับ Ruby-gem
อ้างอิง FreeBSD ที่ FreeBSD 9.0
สมมุติว่าเราลง ruby19 ก่อนแล้วทีนี้ เราจะลง ruby-gem มันจะย้อนกลับไปให้เราลง ruby18 อีกที ทำไมถึงเป็นอย่างนั้น
สาเหตุก็เพราะว่า ตอนนี้ FreeBSD ยัง default ruby version ไว้ที่ 1.8 นั่นเอง
วิธีแก้ปัญหา ไฟล์ /etc/make.conf ให้เพิ่ม บรรทัดนี้เข้าไปก็เป็นอันเรียบร้อย
RUBY_DEFAULT_VER=1.9
สมมุติว่าเราลง ruby19 ก่อนแล้วทีนี้ เราจะลง ruby-gem มันจะย้อนกลับไปให้เราลง ruby18 อีกที ทำไมถึงเป็นอย่างนั้น
สาเหตุก็เพราะว่า ตอนนี้ FreeBSD ยัง default ruby version ไว้ที่ 1.8 นั่นเอง
วิธีแก้ปัญหา ไฟล์ /etc/make.conf ให้เพิ่ม บรรทัดนี้เข้าไปก็เป็นอันเรียบร้อย
RUBY_DEFAULT_VER=1.9
วันจันทร์ที่ 2 เมษายน พ.ศ. 2555
ค้นหา Serial ที่ซ้ำในตาราง และสร้าง index
ค้นหา Serial ที่ซ้ำกันในตาราง
mysql> SELECT serial, COUNT(serial) AS NumOccurrences FROM users GROUP BY serial HAVING ( COUNT(serial) > 1 ); +-------------------+----------------+ | serial | NumOccurrences | +-------------------+----------------+ | WS011001-00007933 | 2 | | WS011001-00008710 | 2 | | WS011001-00008711 | 3 | | WS011001-00008712 | 2 | | WS011001-00008734 | 2 | | WS041002-00000308 | 2 | | WS051105-Rapeepor | 2 | | WS051108-teeservi | 2 | | WS051112-watchara | 3 | | WS051203-12345678 | 2 | +-------------------+----------------+ 10 rows in set (58.78 sec)เมื่อเตรียม ตารางเรียบร้อยแล้ว ก็ถึงเวลา เพิ่ม index เข้าไป เพื่อให้ ประสิทธิในการ query ด้วย field serial ดีขึ้น
create unique index serial_index on users (serial);
วันพุธที่ 22 มิถุนายน พ.ศ. 2554
Ruby + Gmail ทำให้งานเราสบายขึ้น
ด้วยความขี้เกียจที่จะต้องมานั่งทำรายงาน ทุกเช้า เช่น ตรวจสถานะ CPU, แรม, เนื้อที่ Harddisk สถานะ บลา บลา กว่าจะเสร็จก็ปาไปร่วมชั่วโมง ก็เลยหาวิธี ให้มัน สรุปรายงานในเครื่องแล้วส่งเข้าอีเมล์ไปเลย
เพื่อให้คง concept ไว้ก็เลยเลือกใช้งาน Ruby ส่งผ่าน gmail Account ไปเลย (ลองทดสอบใช้กับ Google Apps ก็ได้นะ)
ขั้นตอนการเตรียมพร้อม ติดตั้ง Gems ให้เรียบร้อยก่อน
# gem install tmail
# gem install mime
# gem install ruby-gmail
จากนั้น ทดลองเขียนโปรแกรมง่ายๆ เพื่อส่งข้อความ
จะได้ผลลัพธ์ประมาณนี้
[nutjang@dhcppc7 ~/ruby/gmail]$ ./test.rb
-> "220 mx.google.com ESMTP d2sm930264qcs.21\r\n"
<- "EHLO xxxxxxxxxxxxxxxx\r\n"
-> "250-mx.google.com at your service, [124.121.44.166]\r\n"
-> "250-SIZE 35882577\r\n"
-> "250-8BITMIME\r\n"
-> "250-STARTTLS\r\n"
-> "250 ENHANCEDSTATUSCODES\r\n"
<- "STARTTLS\r\n"
-> "220 2.0.0 Ready to start TLS\r\n"
บลา บลา บลา ....ย้าว ยาว
wrote 353 bytes
-> "250 2.0.0 OK 1308800894 d2sm930264qcs.21\r\n"
<- "QUIT\r\n"
-> "221 2.0.0 closing connection d2sm930264qcs.21\r\n"
[nutjang@dhcppc7 ~/ruby/gmail]$
จากนั้นก็ลองไปตรวจสอบ Inbox ปลายทางดู ก็จะเห็นอีเมล์ส่งมาจ้า
สรุปว่า Happy ทั้งคนทำงาน ไม่ต้องนั่งทำรายงานแล้ว , เจ้านาย ก็มีรายงานทุกเช้า เย้!
เพื่อให้คง concept ไว้ก็เลยเลือกใช้งาน Ruby ส่งผ่าน gmail Account ไปเลย (ลองทดสอบใช้กับ Google Apps ก็ได้นะ)
ขั้นตอนการเตรียมพร้อม ติดตั้ง Gems ให้เรียบร้อยก่อน
# gem install tmail
# gem install mime
# gem install ruby-gmail
จากนั้น ทดลองเขียนโปรแกรมง่ายๆ เพื่อส่งข้อความ
#!/usr/local/bin/ruby
require 'rubygems'
#require 'mime-types'
require 'gmail'
gmail = Gmail.new('xxxx@gmail.com', 'your_password')
# send commands
# or generate message and send it later
email = gmail.generate_message do
from "xxxxx@gmail.com"
to "xxxxxx_receive@gmail.com"
subject "Not feeling well"
body "I won't be coming in today. So you will eating lunch alone."
end
email.deliver!
gmail.logout
# logged out
จะได้ผลลัพธ์ประมาณนี้
[nutjang@dhcppc7 ~/ruby/gmail]$ ./test.rb
-> "220 mx.google.com ESMTP d2sm930264qcs.21\r\n"
<- "EHLO xxxxxxxxxxxxxxxx\r\n"
-> "250-mx.google.com at your service, [124.121.44.166]\r\n"
-> "250-SIZE 35882577\r\n"
-> "250-8BITMIME\r\n"
-> "250-STARTTLS\r\n"
-> "250 ENHANCEDSTATUSCODES\r\n"
<- "STARTTLS\r\n"
-> "220 2.0.0 Ready to start TLS\r\n"
บลา บลา บลา ....ย้าว ยาว
wrote 353 bytes
-> "250 2.0.0 OK 1308800894 d2sm930264qcs.21\r\n"
<- "QUIT\r\n"
-> "221 2.0.0 closing connection d2sm930264qcs.21\r\n"
[nutjang@dhcppc7 ~/ruby/gmail]$
จากนั้นก็ลองไปตรวจสอบ Inbox ปลายทางดู ก็จะเห็นอีเมล์ส่งมาจ้า
สรุปว่า Happy ทั้งคนทำงาน ไม่ต้องนั่งทำรายงานแล้ว , เจ้านาย ก็มีรายงานทุกเช้า เย้!
วันอาทิตย์ที่ 15 พฤษภาคม พ.ศ. 2554
Nginx Web Cluster (ตอนที่ 2)
ต่อจากตอนแรก ยังคงมีปัญหาค้างอยู่คือ เครื่องที่ทำหน้าที่ Load Balance นั้น มีแค่เครื่องเดียว ซึ่งเป็น Single point of failure อยู่
จำเป็นที่จะต้องทำให้ Load Balance นี้ มีตัวตายตัวแทน
วิธีแก้ปัญหา -> ใช้ Common Address Redundancy Protocol (CARP)
1. ที่เครื่อง Load Balance ทั้ง 2 เครื่อง ต้อง compile Kernel FreeBSD ใหม่
โดยเพิ่ม device carp เข้าไป
# cd /usr/src/sys/amd64/conf
# cp GENERIC GENERIC.carp
เพิ่ม device carp เข้าไป แล้วเซฟ
# config GENERIC.carp
# cd ../compile/GENERIC.carp
# make depend
# make
# make install
restart เครื่อง 1 รอบ
ทำอย่างนี้ที่ เครื่อง Loadbalance1 และ Loadbalance2
cloned_interfaces="carpXX"
ifconfig_carpXX="vhid advskew pass "
ตัวอย่างเครื่องที่ 1
/etc/rc.conf
ifconfig_bge1="inet 192.168.10.2 netmask 255.255.255.0"
cloned_interfaces="carp1"
ifconfig_carp1="vhid 10 advskew 50 pass password 192.168.10.1"
ตัวอย่างเครื่องที่ 2
/etc/rc.conf
ifconfig_bge1="inet 192.168.10.3 netmask 255.255.255.0"
cloned_interfaces="carp1"
ifconfig_carp1="vhid 10 advskew 80 pass password 192.168.10.1"
ขั้นตอนสุดท้าย แก้ไขไฟล์ /etc/sysctl.conf โดยเพิ่มบรรทัดต่อไปนี้เข้าไป
net.inet.carp.preempt=1
Restart แล้ว ทดลอง ดู ifconfig ที่เครื่องแรกดู จะเป็น interface carp up และมี IP เป็น 192.168.10.1
อ้างอิง
cloned_interfaces="carpXX"
Add an ifconfig variable for each CARP interface that was created.
ifconfig_carpXX="vhid advskew pass "
The is an identifier that groups the CARP interface with it's counterpart interface on the other hosts. The common IP address is shared with all interfaces that have the same . The may be anything but must match on all the hosts.
The should be different on each host. The value on the master host should be less than the backup hosts.
is a string used to validate the CARP exchanges between the hosts. This can be any string you want but must be the same on all hosts that share a common .
The is the virtual IP address that the CARP interface will have. This IP address must be in the network block assigned to one of the physical interfaces. CARP uses this IP address to figure out what physical interface to assign the CARP interface too.
จำเป็นที่จะต้องทำให้ Load Balance นี้ มีตัวตายตัวแทน
วิธีแก้ปัญหา -> ใช้ Common Address Redundancy Protocol (CARP)
1. ที่เครื่อง Load Balance ทั้ง 2 เครื่อง ต้อง compile Kernel FreeBSD ใหม่
โดยเพิ่ม device carp เข้าไป
# cd /usr/src/sys/amd64/conf
# cp GENERIC GENERIC.carp
เพิ่ม device carp เข้าไป แล้วเซฟ
# config GENERIC.carp
# cd ../compile/GENERIC.carp
# make depend
# make
# make install
restart เครื่อง 1 รอบ
ทำอย่างนี้ที่ เครื่อง Loadbalance1 และ Loadbalance2
cloned_interfaces="carpXX"
ifconfig_carpXX="vhid
ตัวอย่างเครื่องที่ 1
/etc/rc.conf
ifconfig_bge1="inet 192.168.10.2 netmask 255.255.255.0"
cloned_interfaces="carp1"
ifconfig_carp1="vhid 10 advskew 50 pass password 192.168.10.1"
ตัวอย่างเครื่องที่ 2
/etc/rc.conf
ifconfig_bge1="inet 192.168.10.3 netmask 255.255.255.0"
cloned_interfaces="carp1"
ifconfig_carp1="vhid 10 advskew 80 pass password 192.168.10.1"
ขั้นตอนสุดท้าย แก้ไขไฟล์ /etc/sysctl.conf โดยเพิ่มบรรทัดต่อไปนี้เข้าไป
net.inet.carp.preempt=1
Restart แล้ว ทดลอง ดู ifconfig ที่เครื่องแรกดู จะเป็น interface carp up และมี IP เป็น 192.168.10.1
อ้างอิง
cloned_interfaces="carpXX"
Add an ifconfig variable for each CARP interface that was created.
ifconfig_carpXX="vhid
The
The
The
วันพุธที่ 11 พฤษภาคม พ.ศ. 2554
Nginx Web Cluster (ตอนที่ 1)
ตอนนี้อยู่ในช่วงขาขึ้นของระบบทำงาน คนเข้าเว็บไซต์เพิ่มขึ้นกว่าแต่ก่อนมาก ดังนั้น เพื่อให้รองรับ ปริมาณการใช้งานที่เพิ่มขึ้น จำเป็นต้องมีการปรับปรุงระบบใหม่ ดังต่อไปนี้
1. ระบบจะต้อง รองรับการทำงานที่หนักขึ้น ซึ่ง เครื่องเดียวอาจจะรับ Load ทั้งหมดไม่ได้ ต้องกระจายระบบ ออกไป
2. สำหรับระบบใหม่นี้ จะต้องไม่มี Single point of failure.
เพื่อคง Concept จะยังคงใช้ FreeBSD อยู่เหมือนเดิม
ทางเลือกของเราคือ ใช้ Nginx ทำหน้าที่เป็น Load Balance ข้างหน้า 2 ตัว ส่วน Backend Server Cluster จะเป็น Apache หรือ Nginx ก็ได้
ในตอนนี้จะอธิบายในส่วนของการทำ Backend Server Clusterก่อน
- ในส่วน nginx.conf ให้เพิ่ม config ในลักษณะนี้เข้าไป จาก config จะเห็นว่า เรามี backend อยู่ 4 ตัว และ กำหนดให้ตัวที่ 1 ทำงานเป็น 3 เท่าของตัวอื่นๆ (weight 3)
- ในส่วนของการ config server ก็ ใช้ proxy_pass ไปยัง cluster ของเรา
- ในส่วนของ Backend Cluster ก็คือ เครื่องที่เป็น Web Server ปกติ นั่นเอง
- ลอง Restart nginx แล้ว ทดสอบการทำงานดูได้เลย
- การสลับการทำงาน ของ แต่ละ server จะเป็น แบบ Round Robin อยู่
1. ระบบจะต้อง รองรับการทำงานที่หนักขึ้น ซึ่ง เครื่องเดียวอาจจะรับ Load ทั้งหมดไม่ได้ ต้องกระจายระบบ ออกไป
2. สำหรับระบบใหม่นี้ จะต้องไม่มี Single point of failure.
เพื่อคง Concept จะยังคงใช้ FreeBSD อยู่เหมือนเดิม
ทางเลือกของเราคือ ใช้ Nginx ทำหน้าที่เป็น Load Balance ข้างหน้า 2 ตัว ส่วน Backend Server Cluster จะเป็น Apache หรือ Nginx ก็ได้
ในตอนนี้จะอธิบายในส่วนของการทำ Backend Server Clusterก่อน
- ในส่วน nginx.conf ให้เพิ่ม config ในลักษณะนี้เข้าไป จาก config จะเห็นว่า เรามี backend อยู่ 4 ตัว และ กำหนดให้ตัวที่ 1 ทำงานเป็น 3 เท่าของตัวอื่นๆ (weight 3)
- ในส่วนของการ config server ก็ ใช้ proxy_pass ไปยัง cluster ของเรา
http {
upstream backend_cluster {
server 192.168.1.10:80 weight=3;
server 192.168.1.11:80;
server 192.168.1.12:80;
server 192.168.1.13:80;
}
server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://backend_cluster;
}
}
}
- ในส่วนของ Backend Cluster ก็คือ เครื่องที่เป็น Web Server ปกติ นั่นเอง
- ลอง Restart nginx แล้ว ทดสอบการทำงานดูได้เลย
- การสลับการทำงาน ของ แต่ละ server จะเป็น แบบ Round Robin อยู่
วันศุกร์ที่ 6 พฤษภาคม พ.ศ. 2554
อยากรู้ว่า ตอนนี้ Servier FreeBSD Interface ใช้ Bandwidth เท่าไร
ให้ใช้คำสั่งนี้
# systat -ifstat 1
หรือ
# netstat -I interface_name seconds
# netstat -I re0 1
ตัวอย่างผลลัพธ์
systat -ifstat 1
# systat -ifstat 1
หรือ
# netstat -I interface_name seconds
# netstat -I re0 1
ตัวอย่างผลลัพธ์
systat -ifstat 1
/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10
Load Average |
Interface Traffic Peak Total
lo0 in 2.083 KB/s 2.085 KB/s 2.405 GB
out 2.083 KB/s 2.085 KB/s 2.405 GB
igb0 in 157.649 KB/s 184.839 KB/s 532.378 GB
out 843.810 KB/s 865.344 KB/s 2.802 TB
[nutjang@3bb-www ~]$ netstat -I igb0 1
input (igb0) output
packets errs idrops bytes packets errs bytes colls
1368 0 0 151671 1058 0 922696 0
1436 0 0 176304 1143 0 1098265 0
1293 0 0 152111 1069 0 720428 0
1544 0 0 190381 1244 0 954721 0
1556 0 0 186997 1228 0 912025 0
1598 0 0 187766 1196 0 883343 0
1447 0 0 169208 1135 0 840569 0
1592 0 0 190451 1196 0 864030 0
1727 0 0 193916 1349 0 1044825 0
1498 0 0 195785 1171 0 860164 0
วันพุธที่ 30 มีนาคม พ.ศ. 2554
ใช้ MySQL cluster เมื่อ ต้องการระบบ ขยาย
โอ้ว ตอนนี้ งานที่ทำงาน ดันลูกค้าเข้าเยอะมาก ทำให้คนดูแลเซิฟเวอร์อย่างเราต้อง นอนหลับไม่สนิทเลย เวลา SMS เข้า.
สาเหตุก็มาจาก ความตกใจเกินเหตุ อะไรๆ ก็ alert เข้า SMS หมด.
ดังนั้น เมื่อระบบขยาย ใครๆก็ไม่อยากให้ Server down ดังนั้น ก็ทำให้มัน เพิ่มความเสถียรซะหน่อยเป็นไง
MySQL ก็มีฟังก์ชั่น สำหรับการทำ cluster อยู่แล้วนะครับ เพียงแต่ว่า จะเปิดออกมาใช้งานหรือเปล่าแค่นั้นเอง
ตอนนี้กำลังนั่งออกแบบระบบ cluster ให้กับที่ทำงานอยู่ ไม่รู้ว่าจะใช้งบเท่าไรดี แต่ที่แน่ๆ งานนี้ไม่ต่ำกว่า 7 หลัก แน่ๆอิอิ.
ปล. ออกไปรับจ้าง ทำระบบ database cluster ขนาดย่อม ดีไหมนี่
สาเหตุก็มาจาก ความตกใจเกินเหตุ อะไรๆ ก็ alert เข้า SMS หมด.
ดังนั้น เมื่อระบบขยาย ใครๆก็ไม่อยากให้ Server down ดังนั้น ก็ทำให้มัน เพิ่มความเสถียรซะหน่อยเป็นไง
MySQL ก็มีฟังก์ชั่น สำหรับการทำ cluster อยู่แล้วนะครับ เพียงแต่ว่า จะเปิดออกมาใช้งานหรือเปล่าแค่นั้นเอง
ตอนนี้กำลังนั่งออกแบบระบบ cluster ให้กับที่ทำงานอยู่ ไม่รู้ว่าจะใช้งบเท่าไรดี แต่ที่แน่ๆ งานนี้ไม่ต่ำกว่า 7 หลัก แน่ๆอิอิ.
ปล. ออกไปรับจ้าง ทำระบบ database cluster ขนาดย่อม ดีไหมนี่
วันพฤหัสบดีที่ 3 กุมภาพันธ์ พ.ศ. 2554
ถ้าเกิดตาราง ใน mysql พัง
ชื่อตาราง marked as crashed and should be repaired
นี่เป็นวิธีแก้ไขอย่างง่าย ด้วยคำสั่งดังต่อไปนี้
#myisamchk -r -q tbl_name
อย่างกรณีของจะได้ผลลัพธืดังต่อไปนี้
- check record delete-chain
- recovering (with sort) MyISAM-table 'hb_log'
Data records: 808714
- Fixing index 1
จากนั้นลองมาตรวจสอบดู พบว่า ถ้าพบว่าข้อมูลในตารางมาครบ ก็เป็นอันจบเรียบร้อย
นี่เป็นวิธีแก้ไขอย่างง่าย ด้วยคำสั่งดังต่อไปนี้
#myisamchk -r -q tbl_name
อย่างกรณีของจะได้ผลลัพธืดังต่อไปนี้
- check record delete-chain
- recovering (with sort) MyISAM-table 'hb_log'
Data records: 808714
- Fixing index 1
จากนั้นลองมาตรวจสอบดู พบว่า ถ้าพบว่าข้อมูลในตารางมาครบ ก็เป็นอันจบเรียบร้อย
วันอาทิตย์ที่ 26 ธันวาคม พ.ศ. 2553
ฮองอินโบ ชูซากุ
ตอน 1 : http://www.youtube.com/watch?v=DPxT6_jLM_E
ตอน 2 : http://www.youtube.com/watch?v=9tISwwB7Z3U
ตอน 3 : http://www.youtube.com/watch?v=hnfJ4YUmV6A
ตอน 4 : http://www.youtube.com/watch?v=qnal7pyAZRM
ตอน 5 : http://www.youtube.com/watch?v=a4xYlDRKrqU
ตอน 6 : http://www.youtube.com/watch?v=4ma_ExsfOTw
ตอน 7 : http://www.youtube.com/watch?v=Cr6R1VQgqpY
ตอน 8 : http://www.youtube.com/watch?v=ONYR4I5LFPo
ตอน 9 : http://www.youtube.com/watch?v=qi7sShHOa5M
ตอน 10 : http://www.youtube.com/watch?v=OziBnbG2A3k
ตอน 11 : http://www.youtube.com/watch?v=hZnmpyclIjQ
ตอน 2 : http://www.youtube.com/watch?v=9tISwwB7Z3U
ตอน 3 : http://www.youtube.com/watch?v=hnfJ4YUmV6A
ตอน 4 : http://www.youtube.com/watch?v=qnal7pyAZRM
ตอน 5 : http://www.youtube.com/watch?v=a4xYlDRKrqU
ตอน 6 : http://www.youtube.com/watch?v=4ma_ExsfOTw
ตอน 7 : http://www.youtube.com/watch?v=Cr6R1VQgqpY
ตอน 8 : http://www.youtube.com/watch?v=ONYR4I5LFPo
ตอน 9 : http://www.youtube.com/watch?v=qi7sShHOa5M
ตอน 10 : http://www.youtube.com/watch?v=OziBnbG2A3k
ตอน 11 : http://www.youtube.com/watch?v=hZnmpyclIjQ
วันจันทร์ที่ 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 ไม่ครบ มันก็จะไม่สมบูรณ์มั้ง)
เริ่มต้นด้วย 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 เรียบร้อยแล้ว
บทความนี้เป็นการทำ 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
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
บทความนี้จะสอนตรง การ 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

เพิ่ม 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 เดียวกันเลย)
ทางเลือกที่ทำได้จะมีประมาณนี้ (จะใช้คู่กับ 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
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;
};
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
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
สมัครสมาชิก:
บทความ (Atom)