Friday, October 24th, 2008

บันทึกเตือนความจำอีกแล้ว จริงๆเคยเขียนไปแล้วแต่คราวที่แล้วใช้ Trac ซึ่งอายุมันไม่ค่อยยืนหายไปบ่อยๆ เลยเอามาเขียนลงบล๊อกนี่แหละ ปลอดภัยดี(หรือป่าว - -”) ยังมีหลายๆ เรื่องที่เคยเขียนไปแล้วหายไป เช่น วิธีทำให้ SVN/Trac Authenticate กับ Unix password อะไรทำนองนี้อีกหลายเรื่อง ไว้นึกได้แล้วจะค่อยๆ เขียนเก็บไว้ละกัน
Munin เป็นโปรแกรมที่ใช้สร้างกราฟรายงานสถานะของเซิร์ฟเวอร์ว่าใช้อะไรไปเท่าไหร่แล้วบ้าง และก็สามารถแสดงสถานะของบริการต่างๆ ที่เซิร์ฟเวอร์เปิดไว้อยู่ด้วย เช่น Apache และ MySQL ถ้ายังนึกไม่ออกไปดูที่ monitor.nytes.net ละกันมีอยู่สามเซิร์ฟเวอร์สามารถดูเป็นรายวันพร้อมกันได้ด้วย สำหรับเหตุผลว่าทำไมเลือกใช้ Munin ทั้งๆ ที่มีอย่างอื่นที่น่าจะดีกว่าเยอะแยะ เช่น zabbix หรืออื่นๆ อีกมากมายดูได้ที่ wiki เพราะว่ามันติดตั้งง่ายและก็ไม่ต้องตั้งค่าไรมาก(ของเพื่อนไม่ต้องตั้งไรเลย ลงจาก port อย่างเดียว) แล้วกราฟก็หน้าตาใช้ได้ไม่ได้หน้าเกลียดอะไร เรียกว่าสวยงามใช้ได้ทีเดียวด้วยซ้ำ
ตัว Munin จริงๆ แล้วประกอบด้วยสองส่วนคือ munin-node และ munin-main ปัจจุบันที่อยู่ใน port เป็นรุ่น 1.2.4 อยู่ที่ sysutils สำหรับ Linux บอกตามตรงคือไม่รู้ ^^! เพราะตอนนี้ใช้แต่ FreeBSD เป็นส่วนใหญ่ในฝั่งเซิร์ฟเวอร์ ก็ใครเคยทำก็ลองเขียนแนะนำมาดูละกันนะ วิธีติดตั้งก็แสนง่าย เริ่มจาก

  1. ติดตั้ง munin-node ก่อน โดยเข้าไปที่ /path/to/ports/sysutils/munin-node
  2. สั่ง make install clean รอมันจนติดตั้งเสร็จเป็นอันเสร็จพิธี 
  3. ออกมาติดตั้ง munin-main โดยเข้าไปที่ /path/to/ports/sysutils/munin-main
  4. สั่ง make install clean อีกตามเคย
  5. แก้ไฟล์ /etc/rc.conf เพิ่ม
    munin_node_enable="YES"
    เพื่อให้ munin-node ทำงานทุกครั้งหลังจากเปิดปิดเครื่องใหม่
  6. สั่ง munin-node ให้เริ่มทำงานด้วยคำสั่ง 
    /usr/local/etc/rc.d/munin-node.sh start
  7. เปลี่ยนเป็น user munin
    su munin
    จากนั้นตั้งเวลาว่าจะให้มันสร้างกราฟทุกๆ กี่นาทีด้วยคำสั่ง
    crontab -e
    เพื่อแก้ไข cron config เพิ่มไปว่า
    */5 * * * * /usr/local/bin/munin-cron

    จริงๆ อาจไม่ต้องเพิ่มเองก็ได้ ถ้ามีอยู่แล้ว
อ่ะ ต่อไปถ้าอยากให้มันแสดงสถานะของ Apache ด้วยก็ต้องทำให้ Apache มันมี mod_status ก่อน ซึ่งก็ติดจาก ports อีกเช่นเคยอยู่ใต้ /path/to/ports/www/apache22 (มันมากับ apache เลยอ่ะนะ ถ้าใครติดไปแล้วอาจต้อง deinstall แล้ว install ใหม่) จากนั้นก็ config apache เพื่อให้มันสามารถดูสถานะผ่านเว็บได้
<Location /server-status>
  SetHandler server-status
  #Don't allow anyone to access this path directly
  Order deny,allow
  Deny from all 
  #Specify munin-node host 
  Allow from localhost
</Location>

ไปที่ directory /usr/local/etc/munin/plugins แล้วสร้าง link ไปที่ apache plugin

ln -s /usr/local/share/munin/plugins/apache_accesses
ln -s /usr/local/share/munin/plugins/apache_processes
ln -s /usr/local/share/munin/plugins/apache_volume

จากนั้นสั่ง
/usr/local/etc/rc.d/munin-node.sh restart
เพื่อให้มันใช้ plugins ใหม่ที่เพิ่มเข้ามาแล้วก็รอๆ ให้ munin-main ไปเรียก munin-node เพื่อเอาข้อมูลมาสร้างกราฟใหม่

Thursday, August 28th, 2008

ทำไว้เมื่อสองหรือสามอาทิตย์ก่อนไม่แน่ใจแต่ไม่ได้จดไว้ เดี๊ยวลืมวันนี้ว่างๆ เลยจดไว้ซะหน่อย(ว่างจริงหรอฟะ) สำหรับปัญหาที่ทำให้ต้องติดก็คือ เวลามีคนมาโหลดไฟล์ใหญ่ๆ จากเซิร์ฟเวอร์มากๆ เนี๊ยะเว็บเซิร์ฟเวอร์ที่แสนดีอย่าง Apache มันก็จะอืดลงไปทันตาเห็น คือเข้าเว็บที่เป็น php ธรรมดากว่าจะประมวลผลแล้วส่งกลับมาต้องรอเป็นนาที ไม่รู้มันทำอะไรของมัน แต่จะทิ้งไว้ก็ใช่ที่ ฉะนั้นอย่ารอช้าเลย เอาพวกไฟล์ใหญ่ๆ เหล่านี้ย้ายไปให้ lighttpd ทำแทนดีกว่า มันตายไปตัวหลักก็ยังรอดด้วย(แต่เท่าที่เห็น มันไม่เคยตายเลยแฮะ ทนกว่า Apache อีก -_-”)

อ้อสำหรับใครที่ยังไม่รู้ว่าผมทำอะไร ทำไมมันถึงมีไฟล์ขนาดใหญ่ จริงๆ แล้วเซิร์ฟเวอร์นี้มีโดเมนย่อยอยู่อันนึงไว้เป็นที่ดาวโหลดลินุกซ์(และอื่นๆ อีกมากมายสำหรับเขียนโปรแกรม) เก็บไว้อยู่ด้วย ใครอยากดูหรืออยากโหลดก็เข้าไปที่ http://mirror.nytes.net ได้หรืออยากให้เพิ่มอะไรที่ไม่เถื่อนก็บอกมาละกัน ถ้าพื้นที่ยังเพียงพอก็จะพยายามยัดเข้าไปให้

อ่าวบ่นเยอะและเขียนวิธีทำบ้างดีกว่า

  1. เริ่มจากติด lighttpd ก่อนโดยไปที่ /usr/port/www/lighttpd แล้วก็​ make install ธรรมดาอันนี้ไม่มีอะไรพิเศษ
  2. ไปที่ /usr/port/www/apache22 แล้ว make config จากนั้นเลือก mod_proxy, mod_proxy_connect และ mod_proxy_http เพิ่มแล้วก็เลือก ok ออกไป
  3. สั่ง make deinstall install -DFORCE_PKG_REGISTER เพื่อขืนใจให้มันลงใหม่ให้ จริงๆเกิดจากเปลี่ยน mpm ด้วยแต่ก่อนใช้ prefork ตอนนี้เปลี่ยนเป็น worker มันเลยไม่ยอมเชื่อฟังจนถึงบัดนี้เลยแฮะ
  4. แก้ไฟล์ httpd.conf โดยเพิ่มบรรทัดด้านล่างลงไป
    LoadModule proxy_module libexec/apache22/mod_proxy.so
    LoadModule proxy_connect_module libexec/apache22/mod_proxy_connect.so
    LoadModule proxy_http_module libexec/apache22/mod_proxy_http.so
    
  5. จากนั้นไปแก้ไฟล์ที่เก็บข้อมูล virtual host ต่างๆ ให้บอกว่า path ไหนจะส่งไปที่ไหนแทน อย่างที่ใช้อยู่นี่จะให้ใครก็ตามที่เรียกมาที่ mirror.nytes.net จะส่งไปที่ lighttpd แทนไม่ให้ apache ทำงานก็เลยไปแก้ vhost ของ domain nytes.net โดยเพิ่มบรรทัดด้านล่างไป
    
      ServerName mirror.nytes.net
      ProxyRequests Off
      ProxyPreserveHost On
      ProxyPass / http://localhost:81/
    
    
  6. reload apache รอบนึงแล้วรอดูผลงาน
Tuesday, July 1st, 2008

เนื่องจากกำลังทำโฮสท์เพื่อให้คนอื่นเข้ามาใช้ ruby on rails อยู่ก็เลยต้องลองเล่น mod ต่างๆ กับหาทางให้ apache นิ่งสำหรับ mod ตัวแรกที่เจอคือ mod_ruby แต่อันนั้นเวลาจะใช้มันใช้กับไฟล์ .rb คือเอาไฟล์มาวางเสร็จแล้วทำให้เหมือนกับ .php เลยเป็น script แล้วแสดงผลพวก print ขึ้นหน้าจอทันที มันก็เหมือนจะดีนะ แต่โปรแกรมที่เขียนด้วย ruby ส่วนใหญ่จะใช้กับ rail นี่สิ ก็เลยต้องหาใหม่ แล้วก็มีคนแนะนำผ่าน twitter มาว่าใช้ mod_rails สิ ก็ลองๆ แต่ไม่ได้หาโปรแกรมมาใส่ซักทีแล้วก็ทิ้งไปเสียนาน
สำหรับ Redmine นี่คือตัวเลือกก่อนที่คิดจะทำ Control panel เพราะนอกจากจะทำโฮสท์ให้ลองเล่น ruby แล้วยังคิดที่จะทำให้เพื่อใช้เป็นที่ฝากไฟล์ หรือทำงานร่วมกันอีกด้วย โดยหลักๆ แล้วก็คือให้บริการพวก svn นั่นแหละ แต่จะมี svn อย่างเดียวก็ยังไงอยู่ เพราะจะให้เข้ามาแก้ไขไฟล์เลย ท่าทางคนทำโครงการต่างๆ คงจะส่ายหน้าหนี(อย่างน้อยก็คงเป็นเพื่อนผมหละ) ก็เลยหาทางออกที่แสนง่ายด้วยโปรแกรมอย่าง Redmine หรือ Trac ตอนนี้ก็ใช้ Trac ไปก่อนแล้วหละ เพราะมันตอบโจทย์ผมหลายอย่าง เช่น สามารถตรวจสอบ user ที่เดียวกับ svn และ ssh ได้ มีตัวเสริมมากมาย แต่สิ่งหนึ่งที่ Trac ไม่มีคือมันไม่สามารถสร้างโครงการหลายๆ โครงการในตัวมันได้ รวมถึงพวก version control ต่างๆ ด้วย แต่ตัว redmine กลับมีอะไรเหล่านี้อยู่ แต่ว่าการ deploy ต่างๆ กลับลำบากพอควรเวลาจะใช้กับ mod_ruby (เอ๊ะ หรือว่าจริงๆ แล้วไม่เคยทำเองหว่า เลยบอกว่าลำบาก ;p)
โอ่ย เขียนมายาว สรุปถึงวิธีทำสั้นๆ ดีกว่าสำหรับ mod_rails หรือ mod_passenger วิธีติดบน FreeBSD จะต่างจาก mod อื่นๆ หน่อยที่สามารถหาได้ใน port แต่ก็ไม่ยากเท่าไหร่ เพราะว่าสามารถติดจาก gem ได้แหะๆ แค่สองบรรทัดเท่านั้นคือ

#gem install passenger
#passenger-install-apache2-module

แต่ๆ สำหรับคนที่ใช้ php ด้วยอาจเจอปัญหา เลยต้องเพิ่มไปอีกบรรทัดให้มันไม่บอกว่า Directory นี้ใช้ rail อยู่

RailsAutoDetect off

เวลาจะใช้ rail เลยต้องลำบากหน่อย คือแก้ไฟล์ .htaccess เอา โดยเพิ่มบรรทัดนี้เข้าไป

RailsBaseURI /path/to/rail/application

สำหรับ redmine หลังจากดาวโหลดมาขยายไฟล์ซักที่แล้ว ก็แก้ไข database นิดหน่อยก่อน โดย copy ไฟล์ config/database.yml.sample เป็น config/database.yml แล้วแก้ด้านล่างให้ตรงกับฐานข้อมูลที่เรามี

production:
adapter: mysql
database: redmine
host: localhost
username:
password:

จากนั้นสั่ง

$rake db:migrate RAILS_ENV="production"

เพื่อให้มันเข้าไปสร้างฐานข้อมูล (rake นี่คุ้นๆ เหมือน make มะ ;p) จากนั้นโหลดข้อมูลเริ่มต้นเข้าไป

$rake redmine:load_default_data RAILS_ENV="production"

แก้ไข DocumentRoot และ RailsBaseURI ให้ชี้ไปที่ตำแหน่งของ redmine เช่น ขยาย redmine ไว้ที่ /path/to/redmine ก็ตั้ง DocumentRoot และ RailsBaseURI เป็น

DocumentRoot /path/to/redmine/public
RailsBaseURI /

reload apache 1 รอบ ก็เป็นอันเรียบร้อย