แสดงบทความที่มีป้ายกำกับ Debian แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Debian แสดงบทความทั้งหมด

วันอังคารที่ 26 มิถุนายน พ.ศ. 2555

10 ซอฟต์แวร์เพื่อบริการ web site สำหรับทุกวันนี้


Cores แกนหลักๆ ซึ่งก็คือ LAMP นั่นเอง

  1. Linux ซึ่งปกติใช้ Debian ตอนนี้รุ่น stable คือ squeeze (6.0) บนสถาปัตยกรรม amd64 คงไม่มีใครใช้ 32 bit นะ
  2. Apache httpd โดยใช้ MPM แบบ worker แม้ว่าจะมีคู่แข่งอย่าง lighttpd หรือ nginx แต่ apache httpd มีฟีเจอร์มากมายและตั้งค่าได้ง่าย ในเรื่องความเร็วในการให้บริการเว็บแบบ dynamic content ด้วย PHP ไม่ได้ต่างกันมาก
  3. MySQL จริงๆ คือ database server สักตัว แต่ส่วนใหญ่ developer ยังถนัดจะใช้ mysql กันอยู่ ก็ตามนั้นไปก่อน ทางเลือกอื่นๆ ก็มี percona ซึ่งเป็น mysql clone, postgreSQL หรือจะ NoSQL ก็ mongodb, couchdb เป็นต้น
  4. PHP ตอนนี้ใช้รุ่น 5.3 อยู่ แต่รันแบบ fpm (php5-fpm) ตัวนี้ยังไม่มีบน squeeze แต่สามารถลงได้จาก repo ของ dotdeb.org เป็นตัวที่ รัน php5 ในโหมด fastcgi ซึ่งมีระบบบริหารจัดการโพรเซสด้วย ต่างจาก php5-cgi ที่แม้ว่าจะรันเป็น fastcgi ได้แต่ชอบมีปัญหา process ค้าง

Extensions ส่วนขยายที่ทำให้ระบบทำงานได้ดีขึ้น

  1. varnish ตัวนี้เป็น reverse proxy สำหรับรับ connection ที่ port 80 ก่อนจะส่งต่อให้ apache จุดเด่นคือ ทำ caching ได้, มี apache เป็น backend หลายๆ เครื่องได้ คือทำ load balance ได้นั่นเอง, เขียน script เพื่อจัดการกับภาระกิจบางอย่างได้ เช่น backend เรียกไปแล้ว error 503  กลับมา ก็สั่งให้เรียกไปใหม่ หรือให้แสดงหน้ารอ แล้ว refresh ใหม่ เป็นต้น (503 มักเกิดจาก backend ไม่พร้อมให้บริการในขณะนั้น ส่วนใหญ่รอสักพักแล้ว refresh ก็ใช้ได้ตามปกติ) ปัญหาหนึ่งของการใช้ varnish + apache คือข้อมูลล็อกของ apache จะเก็บ client IP เป็น IP ของ varnish เอง ไม่ใช่ของ client ที่แท้จริง แก้โดยใช้ libapache2-mod-rpaf
  2. couchbase ใช้ทำหน้าที่เป็น memcache โดยใช้สำหรับ 1. เก็บ php session data 2. ใช้เป็น memcache สำหรับเก็บข้อมูล cache ชั่วคราว โดยไม่ต้อง query จาก database บ่อยๆ (ต้องเขียนแอปให้รองรับการใช้ memcache ด้วย) เดิมใช้ memcached แต่ couchbase ดีกว่าตรงที่ สามารถทำงานแบบ cluster คือมีหลายๆ เครื่องช่วยกันทำงานได้ สามารถเก็บลงดิสก์ได้ มีหน้าเว็บสำหรับ monitor และตั้งค่าต่างๆ ได้
  3. ufw การกำหนดค่า firewall ด้วย iptables (netfilter) นั้นสำหรับผมเองถือว่ายุ่งยากมาก โดยเฉพาะเวลาที่ต้องกลับมาแก้หรือปรับบางค่าใหม่ พอมาลอง ufw แล้วสะดวกสบายขึ้นมาก

Luxuries ไม่ได้ทำให้ระบบทำงานดีขึ้น แต่ช่วยสนับสนุนในการติดตามเฝ้าดูระบบ

  1. munin เอาไว้เก็บข้อมูลการทำงานของระบบไว้ตรวจสอบ โดยมันจะสร้างเป็นชุดของแผนภูมิให้ดูง่ายๆ และสวยงามเลยทีเดียว สามารถใช้เก็บข้อมูลจากหลายๆ เครื่องได้โดยติดตั้งเฉพาะแพกเกจชื่อ munin-node แล้วให้ munin ตัวหลักไปเรียกเอาข้อมูลมาประมวลเป็นแผนภูมิ
  2. monit เอาไว้คอย monitor ระบบและจัดการแจ้งเตือน หรือรันคำสั่งที่ตั้งไว้ เมื่อตรวจพบเหตุบางอย่าง เช่นเปิดหน้าเว็บที่กำหนดไว้ไม่ได้ ดิสก์เหลือน้อย พบแพทเทิร์นล็อกที่กำหนดไว้ เป็นต้น
  3. webalizer เอาไว้วิเคราะห์ล็อกของ web server แสดงเป็นรูปแผนภูมิสวยงาม ดูง่าย และน่าจะคุ้นเคยกันดี

วันพฤหัสบดีที่ 7 มิถุนายน พ.ศ. 2555

การเซ็ต IPv6 แบบ 6to4 ให้ server

รับกระแส World IPv6 Launch Day ที่เพิ่งมีไปเมื่อวาน (6/6/2012) ซึ่งแปลว่าต่อจากนี้จะเริ่มมีการให้บริการ IPv6 ขนานไปกับ IPv4 มากขึ้น ผู้ที่ต้องตื่นตัวก่อนคือผู้ให้บริการต่างๆ บน Internet นั่นเอง ที่ต้องเตรียมพร้อมรับมือกับมัน (อย่างน้อยก็แสดงให้เห็นว่าเราไม่ตกยุค) ส่วนรายละเอียดว่าทำไมเราต้องเปลี่ยนจาก IPv4 มาเป็น IPv6 ขอให้อ่านจาก http://www.blognone.com/topics/ipv6 นะครับ ในที่นี้ขอพูดถึงประเด็นเดียวคือ เมื่อเรามี server ที่ให้บริการบนเครือข่าย IPv4 อยู่ จะทำอย่างไรให้สามารถบริการ IPv6 ได้
ถ้าเป็นก่อนนี้จะวุ่นวายน่าดูเพราะต้องทำ tunnel ไปยัง IPv6 broker ต่างๆ แต่ตอนนี้มีเทคนิคที่เรียกว่า 6to4 โดยให้ IPv6 encapsulate ไปกับ IPv4 เลย โดยใช้ protocol 41 ซึ่งการตั้งค่าจะเป็นแบบอัตโนมัติ คือไม่ต้องไปหา tunnel ให้วุ่นวาย โดยเมื่อเรามี IPv4 แล้ว เราจะได้รับการจอง subnet ของ IPv6 ไว้ช่วงหนึ่งโดยอัตโนมัติ

สิ่งที่ต้องเตรียม

  • server ที่มี IP จริง (global IP) IP แบบ private ใช้ไม่ได้ อ่อ dynamic IP ก็ไม่ได้นะครับ
  • โปรแกรม ipv6calc (ติดตั้งบน debian ได้โดยสั่ง apt-get install ipv6calc)

วิธีการ

  • แปลงที่อยู่ IPv4 เป็น IPv6 ด้วย ipv6calc โดยสมมติว่า IPv4 คือ 202.183.164.17
    # ipv6calc --quiet --action conv6to4 202.183.164.17
    2002:cab7:a411::
  • แก้ไขไฟล์ /etc/network/interfaces โดยเพิ่มเนื้อหาตามนี้เข้าไป
    auto tun6to4
    iface tun6to4 inet6 v4tunnel
            address 2002:cab7:a411::1
            netmask 16
            gateway ::192.88.99.1
            endpoint any
            local 202.183.164.17
    ตรง 2002:cab7:a411::1 มาจาก ipv6calc โดยเพิ่มเลข 1 ต่อท้ายเข้าไป ส่วน local 202.183.164.17 ก็คือ IPv4 ปกติของ server เรา และ gateway ::192.88.99.1 ไม่ต้องแก้นะครับ จะเป็น anycast address สำหรับรับส่ง packet กับ 6to4 relay router ที่ใกล้ที่สุดซึ่งจะมีกระจายอยู่ทั่วโลก
  • เริ่มใช้งานโดยสั่ง
    # ifup tun6to4
  • ทดสอบโดยสั่ง
    # ping6 google.com
  • ถ้าใช้ไม่ได้อาจจะเกิดจาก firewall ในเครื่องเราเองที่ปกติจะไม่รับ protocol 41 ให้แก้โดยสั่ง
    # iptables -I INPUT -p 41 -j ACCEPT
    # iptables -I OUTPUT -p 41 -j ACCEPT
    แล้วลองทดสอบใหม่ ถ้าใช้ได้ก็เอาไปเพิ่มใน firewall script ของเรา เช่นผมใช้ ufw ก็เพิ่ม -I INPUT -p 41 -j ACCEPT และ -I OUTPUT -p 41 -j ACCEPT ไว้ที่ /etc/ufw/before.rules ก่อนหน้าบรรทัด COMMIT
  • แต่ถ้าใช้ไม่ได้เพราะ firewall ของ NOC ไม่ forward protocol 41 มาให้ ก็ต้องคุยกับผู้ให้บริการให้เปิดรับ protocol 41 ด้วย ปกติไม่เคยเจอปัญหานี้ที่ผู้ให้บริการทั่วไป แต่ถ้าภายในองค์กรอาจจะมีปัญหานี้ได้
  • ทดสอบการใช้บริการต่างๆ ผ่าน IPv6 ในที่นี้เราต้องใช้ IPv6 จากเครื่อง client ได้ก่อน
    เช่น เปิด browser ไปยัง url http://[2002:cab7:a411::1] หรือ ssh 2002:cab7:a411::1
  • ตรวจสอบบริการต่างๆ ให้รองรับ IPv6 ตรวจสอบการตั้งค่า firewall ให้รองรับ IPv6
  • ถ้ามั่นใจแล้วก็เพิ่ม record AAAA 2002:cab7:a411::1 ไปที่ DNS ของเราได้เลย เพื่อให้ผู้ใช้ที่ใช้ IPv6 ได้ สามารถติดต่อกับ site ของเราผ่าน IPv6 ได้โดยตรง
 ดูเพิ่มเติม : http://wiki.debian.org/DebianIPv6

วันจันทร์ที่ 29 สิงหาคม พ.ศ. 2554

การ downgrade php เป็นรุ่น 5.2.x ใน Debian 6.0 (Squeeze)

เมื่อติดตั้ง Debian 6.0 จะได้ php5 เป็นรุ่น 5.3.x ซึ่งมีคุณสมบัติบางประการต่างไปจากรุ่นเดิมคือ 5.2.x (อ่านเพิ่มเติมที่ http://php.net/manual/en/migration53.php) ซึ่งในบางครั้งเรายังจำเป็นต้องใช้รุ่นเดิมอยู่ เช่นยังใช้ drupal 5.x ซึ่งยังใช้ไม่ได้กับ php 5.3 (ต้องเป็น drupal รุ่น 6.x ตัวหลังๆ หรือ drupal 7.x) สามารถเลือกติดตั้ง php5 จาก oldstable หรือ Debian 5.0 (lenny) โดยทำได้ดังนี้

เพิ่ม repository ของ lenny เช่น จากเดิมใน /etc/apt/sources.list มี


deb http://ftp.th.debian.org/debian squeeze main non-free contrib
deb http://ftp.th.debian.org/debian-security squeeze/updates main non-free contrib

ให้เพิ่ม ของ lenny เข้าไปด้วย เป็น

deb http://ftp.th.debian.org/debian squeeze main non-free contrib
deb http://ftp.th.debian.org/debian-security squeeze/updates main non-free contrib
deb http://ftp.th.debian.org/debian lenny main
deb http://ftp.th.debian.org/debian-security lenny/updates main

แก้ไข (หรือสร้างไฟล์ใหม่) /etc/apt/preferences ใส่คอนฟิกดังนี้ลงไป

Package: php-* php5 php5-* libapache2-mod-php5 php-pear
Pin: release a=oldstable
Pin-Priority: 999

จากนั้นสั่ง

# apt-get update
# apt-get -f install

ระบบจะ downgrade แพกเกจ PHP ที่ติดตั้งไปแล้ว ที่อยู่ในรายการที่เรากำหนด ให้เป็นรุ่นที่อยู่ใน oldstable ตามต้องการ ถ้ายังไม่ติดตั้ง ก็ติดตั้งตามปกติ

และเมื่อไหร่ที่พร้อมที่จะอัพเกรด php เป็นรุ่น 5.3 ก็แก้ไฟล์ /etc/apt/preferences เอาคอนฟิกที่เพิ่มเข้าไป 3 บรรทัดนั้นออก แล้วสั่ง upgrade ตามปกติได้เลย

วันพฤหัสบดีที่ 25 สิงหาคม พ.ศ. 2554

ขอคืนพื้นที่ /var/log โดยการ compress log ด้วย xz

xz คล้ายๆ gzip แต่ compress ด้วยอัลกอริทึ่ม lzma2 มีใน squeeze ขึ้นมา หรือใน lenny-backports ดูเพิ่มเติมที่ http://tukaani.org/xz/


ทำไมต้องใช้ xz แทน gzip
  • บีบได้เยอะกว่ามาก พอเอามาใช้บีบ log เก่าที่ถูก rotate ทำให้ใช้พื้นที่น้อยลงมาก
  • ตอน decompress ทำได้ค่อนข้างเร็ว ช้ากว่า gunzip บ้าง แต่เร็วกว่า bunzip2 มาก
ข้อเสีย?
  • ใช้เวลา compress นานกว่ามาก เพราะใช้กำลังในการประมวลผลเยอะ (+ram เยอะๆ) แต่มันทำครั้งเดียว และก็ cpu กับ ram ไม่น่าเป็นปัญหากับ server ในปัจจุบันนัก ส่วนการอ่าน/นำไปใช้ก็มี xzcat, xzless ให้ เร็วใกล้เคียงกับ zcat, zless เลยทีเดียว
ติดตั้ง
# apt-get install xz-utils
# apt-get install xz-lzma   

เทียบคำสั่ง
gzip : xz
gunzip : unxz
zcat : xzcat
zless : xzless
zmore : xzmore
zgrep : xzgrep
zdiff : xzdiff
zcmp : xzcmp
zegrep : xzegrep

การประยุกต์ใช้กับ logrotate เพื่อขอคืนพื้นที่ใน /var/log
เพิ่มบรรทัดต่อไปนี้เข้าไปใน /etc/logrotate.conf
#---------------------------------
compresscmd /usr/bin/xz
uncompresscmd /usr/bin/unxz
compressext .xz
compressoptions -9
#---------------------------------

การแปลงจาก log เก่าที่เป็น .gz มาเป็น .xz
แปลงไฟล์เดียว
# gunzip access.log.2.gz
# xz -9 access.log.2

แปลงหลายๆ ไฟล์
# cd /var/log
# find . -name "*.gz" | sed 's/.gz$//' | xargs -I '{}' -n 1 -P 2 sh -c "gunzip '{}'.gz ; xz -9 '{}'"

* หมายเหตุ ตรง -P 2 นั่นคือทำพร้อมๆ กัน 2 process ถ้า cpu มีหลายๆ core ก็เพิ่มมากกว่านี้ได้ตามความเหมาะสม จะทำให้แปลงได้ไวขึ้น

ปล. คัดลอกมาจาก note เก่าใน Facebook ของผมเอง

วันพุธที่ 2 กรกฎาคม พ.ศ. 2551

Installing Debian Etch with 256MB USB Memory Stick

มีครั้งหนึ่งผมได้รับโจทย์ให้ติดตั้ง server โดยที่ server ที่จะซื้อใหม่นั้นไม่มี cd-rom มาด้วย เข้าใจว่าเป็นเหตุผลด้านราคา ซึ่งในทางปฏิบัติก็คิดว่า server ทุกตัว คงได้ใช้ cd-rom เฉพาะตอนติดตั้ง และตอนอัพเกรด หรือแก้ไขปัญหาต่าง ๆ เท่านั้น นอกนั้นก็ไม่ได้ใช้เลย จึงไม่จำเป็นแล้วที่ server จะมี cd-rom ทีนี้ปัญหาจึงเป็นว่า จะติดตั้ง Debian โดยไม่ใช้ cd-rom ได้อย่างไร คิดแบบเร็ว ๆ ก็คือใช้ USB memory stick ไงล่ะ

แล้วจะทำได้อย่างไร ? ถาม Google จึงพบกับวิธีการในคู่มือของ Debian เองเลย ถึงได้รู้ว่า Debian เค้าเตรียมเรื่องแบบนี้ไว้อยู่แล้วแฮะ ขอสรุปสั้น ๆ เป็นวิธีการที่ผมทำตามขั้นตอนในเว็บดังกล่าวดังต่อไปนี้
คำเตือน: บางขั้นตอนต่อไปนี้เป็นคำสั่งที่ต้องใช้สิทธิของ root ซึ่งหลายคำสั่งเป็นอันตรายหากสั่งอย่างไม่ถูกต้อง ดังนั้นโปรดอ่านให้เข้าใจและทำตามอย่างระมัดระวัง

  1. แน่นอนต้องมี USB memory stick ก่อน ส่วนความจุนั้น ขึ้นอยู่กับว่าเราอยากใส่ระบบติดตั้งแบบไหน ผมกะว่าจะติดตั้งแค่แบบ netinst ซึ่งตัว iso มันแค่ 150 MB เอง ดังนั้น USB memory stick ตัวเก่า ๆ 256MB ของผม น่าจะได้ใช้ประโยชน์ก็คราวนี้แหละ และก็ถ้ามีข้อมูลที่ต้องการใช้อยู่ ก็คัดลอกออกจาก USB memory stick เสียให้เรียบร้อย จากนั้นก็ลองเช็คนิดนึงว่า USB memory stick ของเราเสียบที่ช่อง usb แล้วจะเห็นเป็น device อะไร ปกติจะเห็นเป็น /dev/sda แต่หลัง ๆ ก็ไม่แน่ เพราะถ้าฮาร์ดดิสก์ใช้ SCSI (คงน้อย) หรือ S-ATA มันจะใช้ sda ไปแล้ว ซึ่งคงจะเห็น USB เป็น sdb หรือ sdc หรืออื่น ๆ แทน ดังนั้น ในขั้นตอนต่อ ๆ ไปผมจะใช้ /dev/sdX แทนนะครับ ให้เปลี่ยน X เป็นตัวที่ถูกต้องต่อไป

  2. แบ่งพาร์ทิชันใหม่ เนื่องจากเดิมนั้น เจ้า USB memory stick ของผมเป็นแบบ partitionless คือไม่มีการแบ่งพาร์ทิชัน แล้วใช้ทั้งตัวเป็นที่เก็บข้อมูลเลย เวลาใช้บนลินุกซ์ก็จะเมานท์ /dev/sdX มาใช้เลย ไม่ได้เป็น sdX1
    โดยการแบ่งจะใช้คำสั่ง dd เพื่อล้าง sector แรกก่อน และใช้ fdisk เพื่อสร้างพาร์ทิชัน โดย
    # dd if=/dev/zero of=/dev/sdX bs=512 count=1
    # fdisk /dev/sdX

    กด n (สร้าง partition)
    กด p (เลือก primary partition)
    กด 1 (เลือก partition ที่ 1)
    กด enter เฉย ๆ เพื่อเริ่มจาก cylinder แรก
    กด enter เฉย ๆ เพื่อสิ้นสุดที่ cylinder สุดท้าย
    กด a เพื่อกำหนดให้ partition บูตได้
    กด 1 กำหนดให้บูตจาก partition 1
    กด w เพื่อบันทึกและออกจาก fdisk

  3. สร้าง file system
    # mkdosfs /dev/sdX1

    คำสั่ง mkdosfs ถ้าไม่มี ให้ติดตั้ง dosfstools ก่อนโดย apt-get install dosfstools (ปกติคิดว่ามีอยู่แล้วนะ)

  4. ติดตั้ง syslinux สำหรับทำหน้าที่เป็น boot loader
    # apt-get install mtools syslinux
    # syslinux /dev/sdX1
  5. เมานท์ USB memory stick ไปที่ตำแหน่งชั่วคราวซักที่หนึ่งก่อน
    # mkdir /mnt/tmp
    # mount /dev/sdX1 /mnt/tmp

    จะเห็นแฟ้ม ldlinux.sys อยู่ในนี้แล้ว ไม่ต้องลบหรือทำอะไรกับมันนะครับ ตัวนี้เป็นส่วนหนึ่งของ boot loader

  6. ดาวน์โหลดไฟล์ vmlinuz และ initrd.gz จาก http://mirror.in.th/debian/dists/Debian4.0r3/main/installer-amd64/current/images/hd-media/ ไปเก็บใน /mnt/tmp (รุ่นอื่น ๆ ก็เลือกเอาตามความเหมาะสมนะครับ ณ ปัจจุบันรุ่นที่ stable คือ 4.0r3 และผมก็เลือกติดตั้งเป็นแบบ 64bit ซึ่ง processor ของ server ใหม่ ๆ ในปัจจุบันก็สนับสนุนหมดแล้ว ยกเว้นจะเก่า ๆ จริง ๆ ก็ใช้ i386 แทน)

  7. สร้างแฟ้ม syslinux.cfg ใน /mnt/tmp โดยมีเนื้อหาดังนี้
    default vmlinuz
    append initrd=initrd.gz
  8. ดาวน์โหลดไฟล์ ISO image ตัวติดตั้ง debian จาก http://mirror.in.th/debian_iso/4.0_r3/amd64/iso-cd/ ผมเลือกแบบ netinst ด้วยเหตุผลเรื่องขนาด ดังนั้นจึงเลือกไฟล์ debian-40r3-amd64-netinst.iso แล้วนำไปใส่ไว้ที่ /mnt/tmp เช่นกัน ถ้า USB memory stick ใหญ่กว่านี้เป็น 1GB ก็ดาวน์โหลดแผ่นติดตั้งแผ่นแรกมาลงก็ได้ หรือถ้าน้อยกว่านี้ เช่น 64MB ก็เลือกแบบ businesscard ก็ได้

  9. unmount แล้วนำไปทดลองบูตดูได้เลย
    # umount /mnt/tmp

วันพฤหัสบดีที่ 13 กันยายน พ.ศ. 2550

drupal+debian กับปัญหาตาราง sessions โตขึ้นเรื่อยๆ

ที่เว็บไซต์ opentle.org ใช้ drupal กับ community ขนาดใหญ่พอสมควร ส่วน OS เปลี่ยนจากเดิมใช้ FreeBSD 6.2 มาเป็น debian 4.0 (etch) ได้สัก 9 เดือนเศษละ มีข้อสังเกตว่า ตั้งแต่เปลี่ยนเป็น debian ตาราง sessions ใหญ่ขึ้นเรื่อยๆ จนเป็นนับล้านเรคอร์ดในเวลาไม่กี่เดือน ทั้งๆ ที่ session.gc_maxlifetime ก็ตั้งไว้ราวๆ 24 วัน ต้องคอยล้างทิ้งเป็นระยะๆ ทีแรกนึกไม่ออกว่าเกิดจากอะไร ดูที่เว็บไซต์อื่นๆ ก็มีทั้งเป็นบ้าง ไม่เป็นบ้าง แต่ส่วนใหญ่ไม่รู้ว่ามีปัญหานี้ เพราะ session มีน้อย จนไม่รู้สึกอะไร ขณะที่ opentle นั้น แค่เดือนเดียวก็เห็นได้ชัดว่าตารางมันใหญ่ขึ้น

เดิมที่ไล่แกะดูการทำงานของตารางนี้คือ ปกติ php จะจัดการ session ด้วยตัวเอง ซึ่งจะสร้างเป็นแฟ้ม session ไว้ใน /var/lib/php5/ แต่ใน drupal จะจัดการ session ด้วยฐานข้อมูล คือเก็บลงตาราง sessions แล้วเขียน function มา handle ซึ่งดูรายละเอียดฟังก์ชันเหล่านี้ได้จาก includes/session.inc และกำหนดให้ใช้ฟังก์ชันเหล่านี้ในการจัดการ session ใน includes/bootstrap.inc ซึ่งก็ดูปกติดี โดยเฉพาะตรงฟังก์ชัน sess_gc() ซึ่งมีไว้เคลียร์ session ที่อายุเกิน maxlifetime ทิ้ง โดยการลบ record ทิ้งด้วยเงื่อนไข ก็ดูเรียบร้อยดี

วันนี้อยากเคลียร์ปัญหานี้ให้จบเลยแกะดูการทำงานต่อ เริ่มจากตรวจล็อกของ mysql พบว่า ไม่เคยมีคำสั่ง "DELETE FROM sessions ...." ถูกรันเลย แปลว่า sess_gc() ไม่เคยถูกเรียกใช้จาก php เลย คำถามจึงมีอยู่ว่า เมื่อไหร่ที่ php จะเรียกใช้ sess_gc() ทำให้ต้องย้อนไปแกะดูใหม่

เปิดดู php.ini อีกครั้ง (ก่อนนี้ก็เคยแกะดูแล้ว แต่ไม่พบอะไรผิดปกติ) คราวนี้เน้นไปที่เรื่อง gc ก็พบตรงนี้เข้า

; Define the probability that the 'garbage collection' process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.

; This is disabled in the Debian packages, due to the strict permissions
; on /var/lib/php5. Instead of setting this here, see the cronjob at
; /etc/cron.d/php5, which uses the session.gc_maxlifetime setting below
;session.gc_probability = 0
session.gc_divisor = 100

นั่นคือ ปกติ session.gc_probability = 1 จะทำให้ทุกครั้งที่ php ทำงาน จะมีโอกาส 1/100 ที่ gc ทำงาน หรือพอจะตีความว่า รัน php 100 ครั้ง gc จะถูกเรียก 1 ครั้งก็พอได้ แต่ใน debian ไม่ใช่อย่างนั้น debian จะ comment ค่านี้ไว้ ทำให้มีค่าเป็น 0 เสมอ gc จะไม่ถูกเรียกใช้งาน แต่จะมี cron สำหรับลบ session ที่หมดอายุแทน เหตุผลก็อธิบายไว้ใน comment แล้ว

ตรงนี้แหละคือปัญหา เพราะนั่นเท่ากับว่า sess_gc() ที่ drupal เตรียมไว้ให้ php เรียกใช้ จะไม่ถูกเรียกใช้เลย นั่นคือสาเหตุที่ opentle.org มีปัญหาดังกล่าว

การแก้ปัญหา


การแก้ไฟล์ php.ini ไม่ใช่ทางออกที่ดี ควรแก้ใน drupal ในไฟล์ sites/default/settings.php แทน โดยเพิ่ม

ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);

เข้าไป เท่านี้ก็เรียบร้อย ทิ้งไว้สักพัก session ก็ถูกจัดการได้ถูกต้องตามปกติแล้ว

วันจันทร์ที่ 27 สิงหาคม พ.ศ. 2550

ตามหา Virtual Host Control Panel แบบ Open Source

ช่วงนี้ ยามว่างๆ จะตามหา control panel เจ๋งๆ อยู่ ก็พวก panel สำหรับให้บริการเว็บโฮสติ้งแบบ virtual host นั่นแหละ ทำนองเดียวกับพวก cPanel แต่เน้นที่เป็น open source และใช้บน debian gnu/linux (โดยเฉพาะ etch) ได้ และต้องใช้กับโฮสต์ที่บริการ PHP5 ได้ด้วย

เคยลอง gnupanel ไปทีนึง ไม่ค่อยประทับใจ โดยเฉพาะโค้ดแกะยากมาก ตั้งชื่อไฟล์เป็นภาษา spain อ่านไม่เข้าใจ comment ก็ภาษา spain อีก สุดท้ายก็เลิกใช้ เปลี่ยนไปใช้ ispconfig ก็ดูดีนะ แต่ยังไม่ถูกใจผู้ใช้ บอกว่าใช้ยากไป ไม่เหมือน panel อื่นๆ

หลายคนแนะนำ VHCS เข้าไปดูเว็บเค้าละ แต่ห่วงว่าจะใช้กับ PHP5 ได้หรือไม่ และอีกอย่างที่ห่วงคือ ซอฟต์แวร์ตัวนี้ไม่มีอัพเดทมาปีครึ่งแล้ว ไม่แน่ใจว่าอนาคตยังดีอยู่หรือไม่ และก็พึ่งไปพบตัวที่เป็น fork ของ VHCS อีก 2 ตัว คือ VHCP และ ISPCP แต่ยังไม่ออกตัวจริงทั้งคู่ แล้วก็อื่นๆ ก็มี WEB-CP กับ SysCP ตัวหลังนี่หน้าตาธรรมดา แต่มีคนใช้เยอะดีเหมือนกัน ดูค่อนข้าง stable ดี

เดี๋ยวขอไปลองให้หมดก่อน ค่อยมาตัดสินใจอีกที

วันพฤหัสบดีที่ 9 สิงหาคม พ.ศ. 2550

Setting up apache2-mpm-worker, mod-fcgid, php5-cgi on Debian Etch

เคยเจอปัญหาเว็บเซิร์ฟเวอร์เมื่อมีคนเข้าใช้เยอะๆ แล้วช้าลงมากๆ ไหม ทั้งๆ ที่ซีพียูก็แรง แรมก็มีไม่น้อย ปัญหามักจะเกิดขึ้นเมื่อเว็บเซิร์ฟเวอร์นั้นมี mod-php และบางครั้งมีไฟล์ static ใหญ่ๆ เช่นภาพถ่าย วิดีโอ ไฟล์พรีเซนต์ ไฟล์ดาวน์โหลดต่างๆ ให้ดาวน์โหลดผ่าน http

ปัญหามักเกิดจาก เมื่อเราใช้ mod-php ก็ต้องใช้ apache ที่ใช้ mpm-prefork ด้วย นั่นคือเมื่อมี connection เข้ามา apache ต้อง fork process เพื่อให้บริการ connection นั้นเป็นรายๆ ไป ปัญหาคือว่า mod-php ทำให้แต่ละ process มีขนาดใหญ่มาก ยิ่งเว็บแอ็พที่ใช้มีขนาดใหญ่ ยิ่งทำให้แต่ละ process ใหญ่เข้าไปอีก ปัญหาจะหนักขึ้น เมื่อต้องให้บริการดาวน์โหลดไฟล์ หรือมีรูปภาพจำนวนมากบนเว็บไซต์ด้วย เพราะแม้ว่าพวกนี้จะไม่ต้องการซีพียูในการประมวลผลมากนัก แต่การที่ apache ต้อง fork process มาเพื่อให้บริการไฟล์พวกนี้ ก็ทำให้ต้องเสีย memory มากขึ้นไปอีก ยิ่งเน็ตเวิร์คของไคลเอนต์ช้า ยิ่งทำให้ต้องใช้เวลาดาวน์โหลดนาน จะพบว่า จำนวน connection มีมากขึ้นเรื่อยๆ