ขั้นแรกเตรียม CentOS 5 ของคุณให้สามารถใช้ Extra RPM จาก rpmforge ให้พร้อมก่อนครับ
ถ้ายังไม่รู้จะทำยังไง ดูตามนี้ครับ
ขั้นที่ 1
ติดตั้ง package ที่เราต้องการครับ
yum install lighttpd lighttpd-fastcgi php-cli mysql mysql-server
ขั้นที่ 2
เพิ่มบรรทัดนี้เข้าไปใน /etc/php.ini
เอาไว้ล่างสุดเลยก็ได้ครับ
[color==#ff1dff]cgi.fix_pathinfo = 1[/color]
อ้างถึง
nano /etc/php.ini
ถ้าถนัด vi ก็ตามสะดวกนะครับ
หรือจะใช้แบบข้างล่างนี่ก็ได้ครับ เร็วดี
echo "cgi.fix_pathinfo = 1" >> /etc/php.ini
ขั้นที่ 3
แก้ไขไฟล์ /etc/lighttpd/lighttpd.conf
nano /etc/lighttpd/lighttpd.conf
# "mod_rewrite",
# "mod_redirect",
# "mod_alias",
"mod_access",
# "mod_cml",
# "mod_trigger_b4_dl",
# "mod_auth",
# "mod_status",
# "mod_setenv",
"mod_fastcgi",
# "mod_proxy",
# "mod_simple_vhost",
# "mod_evhost",
# "mod_userdir",
# "mod_cgi",
# "mod_compress",
# "mod_ssi",
# "mod_usertrack",
# "mod_expire",
# "mod_secdownload",
# "mod_rrdtool",
"mod_accesslog")
สังเกตนิดนึงครับ ปกติมันจะ comment ไว้เกือบหมด ยกเว้น mod_access กับ mod_accesslog
เราก็ uncomment เพิ่มอีกอันคือ mod_fastcgi สรุปที่ uncomment มีแค่นี้คือ mod_access, mod_fastcgi, mod_accesslog ครับ
ยังอยู่ที่ไฟล์เดิมนะครับ ให้ uncomment ส่วนต่อไปนี้ครับ
fastcgi.server = ( ".php" =>
( "localhost" =>
(
"socket" => "/var/run/lighttpd/php-fastcgi.socket",
"bin-path" => "/usr/bin/php-cgi"
)
)
)
ขั้นที่ 4
mkdir /var/run/lighttpd chmod 777 /var/run/lighttpd
ขั้นที่ 5
chkconfig lighttpd on chkconfig mysqld on /etc/init.d/mysqld start /etc/init.d/lighttpd start
ลอง restart อีกทีเพื่อความชัวร์
/etc/init.d/mysqld restart /etc/init.d/lighttpd restart
จริง ๆ จบแค่นั้นแหล่ะครับ
สำหรับการทดสอบ ลองสร้างไฟล์ index.php กันซักนิด
nano /srv/www/lighttpd/index.php
phpinfo();
?>
แล้วลองเรียกดูผ่าน browser
http://server.ip.or.name/index.php หรือ http://server.ip.or.name ก็คงได้เหมือนกันครับ
อิอิ แล้วก็อย่าถามอะไรมากครับ เพราะปกติใช้แต่ Apache
พอดีเจออันนี้
[root@nus ~]# telnet www.thaiadmin.org 80 Trying 202.57.191.86... Connected to www.thaiadmin.org (202.57.191.86). Escape character is '^]'. HEAD / HTTP/1.0 HTTP/1.0 302 Found Connection: close X-Powered-By: PHP/5.2.4 Location: board/tamain.php Content-type: text/html Content-Length: 0 Date: Wed, 31 Oct 2007 14:18:24 GMT Server: lighttpd/1.4.18 Connection closed by foreign host.
ด้วยขนาดที่เล็กกว่า Apache มากทำให้ Lighttpd คือเว็บเซิร์ฟเวอร์ที่เร็วมากที่สุดในขณะนี้ โดยเหมาะสำหรับงานที่มีไฟล์ขนาดเล็กและเป็น static html ซึ่งจะเร็วกว่าอย่างเห็นได้ชัดเจน แต่ถ้าเป็นงานด้าน PHP ก็จะเป็นรองเพียงเล็กน้อยเท่านั้น แต่ ความสามารถโดยรวมอาจจะสู้ Apache ไม่ได้
เท่าที่อ่านมา (security, speed, compliance, and flexibility) lighttpd เป็น web server ที่ตัวเล็ก ทำงานรวดเร็ว มีระบบ secure ที่ดี ผมฟันธงว่า ดีกว่า apache เพราะ apache เป็นที่นิยม อย่างแพร่หลาย ใช้งานได้หลากหลาย ผ่านร้อนผ่านหนาวมาอย่างยาวนาน > web server หนักๆ จำเป็นต้องปรับแต่งให้เครื่องใช้ ทรัพยากรที่น้อยลงครับ ทำให้รับ โหลดได้เพิ่มขึ้น หรือ ในทางกลับกัน คือทำให้โหลด มันน้อยลง เว็บหนักๆ พวก upload หรือ www.2bbit.com ก็ใช้ lighttpd เนื่องจาก โหลดหนักมากจน apache down แทบทุกวัน
====================================================
เข้ามาช่วย ยืนยัน นอนยัน Lighttpd ใช้แรมน้อยมากครับ ดังนั้นจึงสามารถรองรับคนได้เยอะมากๆๆๆ เปิดเครื่องเฉยๆ Lighttpd : 22 MB Apache: 48 MB เห็นความต่างแล้วใช่ไหมครับ แต่ก็มีข้อเสียตรงหลายอย่าง เช่น ไฟร์ .hta ในส่วนของ rewrite มันต้องเขียนใหม่ ใช้ของ apache ไม่ได้ คนที่ใช้แล้วพีเอชพีแสดงผลไม่ถูกต้อง คุณต้องไปปรับเองให้ถูกต้องกับโปรแกรมของคุณน่ะครับ มันไม่ปรับให้ แล้วจะแสดงผม error
จริง ๆ ผมมี production server ที่ใช้ lighttpd ใหญ่ ๆ อยู่สามสี่ที่ ขอดีนะครับ 1. เร็ว โดยเฉพาะกับไฟล์ static เล็ก ๆ หรือแม้แต่ใหญ่ ๆ ก็ตาม เพราะ lighttpd มี backend เกี่ยวกับ static file หลายแบบเลือกได้ตามความเหมาะสม 2. ควบคุมการใช้ memory ได้ เพราะใช้ fastcgi .... สำหรับ php ในการใช้ fastcgi ถ้าปรับ config นิดนึงจะสามารถ tune จำนวน fastcgi server process และ worker process ของมันได้ โดยเฉพาะทำแยก site ได้ด้วย ทำให้กำหนด load ของแต่ละ site ได้ 3. ใช้ X-Sendfile ได้... อันนี้ลองไปศึกษาดูครับ มีประโยชน์มากถ้าทำพวกเวบ upload รูปหรือ video ผมทดลองแล้ว รับ request ได้แบบมหาศาลโดยไม่ต้องไป load php process เพื่อพ่นไฟล์ รูปออกไป และยังเก็บ stat ได้ด้วยจาก php 4. รับ load หนัก ๆ ได้ดีกว่า โดยเฉพาะการใช้ fastcgi ข้อเสีย 1. lighttpd ไม่มี .htaccess ทำให้ทำ config แบบ runtime ในแต่ละ directory ไม่ได้ 2. กำหนด config ของ php แบบ mod_php โดยใช้ .htaccess ไม่ได้ (เนื่องมาจากข้อ 1) ต้องใช้ php.ini ร่วมกัน หรือตั้ง php fastcgi แบบ แยกsite เพื่อกำหนด PHPRC ไปหา php.ini หลาย ๆ ตัวแทน ... สำหรับ apache ก็เหมือนกันถ้าใช้ fastcgi ก็จะกำหนด php config ใน .htaccess ไม่ได้เช่นกัน 2. ไม่มี graceful restart, reload config ไม่ได้ต้อง restart ไปเลย เพิ่มเติม ดูเรื่องการกำหนด worker process ของ php fastcgi ใน lighttpd หน่อย ...
$HTTP["host"] == "aaa.bbb.com" { fastcgi.server = ( ".php" => ( ( "socket" => "/tmp/php-aaa.sock", "broken-scriptfilename" => "enable" "bin-path" => "/usr/bin/php-cgi", "max-procs" => 4, "bin-environment" => ( "PHP_FCGI_CHILDREN" => "25", "PHP_FCGI_MAX_REQUESTS" => "100000", ) ) ) ) } $HTTP["host"] == "xxx.yyy.com" { fastcgi.server = ( ".php" => ( ( "socket" => "/tmp/php-xxx.sock", "bin-path" => "/usr/bin/php-cgi", "broken-scriptfilename" => "enable" "max-procs" => 2, "bin-environment" => ( "PHP_FCGI_CHILDREN" => "10", "PHP_FCGI_MAX_REQUESTS" => "100000", ) ) ) ) }
ผม แยก aaa.bbb.com ให้ใช้ fast cgi ของ php 4 worker process ... แต่ผมกำหนดให้ php มันอีกว่า ให้แต่ละ worker มีจำนวน child process เท่าไหร่ ผมใช้เยอะหน่อยคือ 25 เพราะว่า ผมมีใช้พวก eaccelerator ด้วย cache ที่มันเก็บจะ share ระหว่าง worker ไม่ได้เลยต้องเยอะ ... อันนี้ก็รวมคือ aaa.bbb.com จะมี process 100 พอดี ... รับ client ที่เรียก php ได้ราว ๆ 100 client พร้อมกัน จากเวบนี้ และถ้าแต่ละ process กินเฉลี่ย 10M จะเท่ากับ 1G พอดี และผมกำหนด max requests ไว้ด้วย เพราะว่าแต่ระ process จะทำงานแล้วไม่ตาย (คล้าย ๆ apache) แต่ละ process รับ client ได้เรื่อย ๆ จนกว่าจะครบจำนวน max requests ที่ตั้ง แต่ต้อง limit ไว้กัน memory leak ... โดยทั่วไป 1000 - 10000 น่าจะ ok
อีกอันก็คล้ายกัน ผมกำหนดให้ มี worker แค่ 2 และ child 10 เพราะอาจจะ load น้อยกว่า กินแรมก็น้อยกว่า ..
ไหน ๆ แล้วผมจะอธิบายรายละเอียดว่า fastcgi ใน lighttpd กับ fastcgi apache ต่างกันแล้วจะ tune ยังไง (ถ้าอ่านรู้เรื่องก็ ดีครับ แต่คงมีคนไม่รู้เรื่องเยอะ)
lighttpd ทำงานแบบ single thread ครับ หมายความว่าจะมี process หลักตัวเดียว (จริง ๆ หลายตัวก็ได้) ... การมี thread เดียวหรือ process เดียวทำให้การเข้าถึง worker ทำโดย process ตัวเดียว ... ทำให้การใช้ max_procs จำนวนน้อยนั้นดีกว่า เพราะอย่างที่ว่า cache ของ พวก accelerator ของ php ทั้งหลาย (eaccelerator, zend, ฯลฯ) จะ share กันได้ระหว่าง child process ของ fastcgi worker เดียวกันเท่านั้น ดันนั้นการใช้จำนวนน้อยจะ ลดการใช้หน่วยความจำสำหรับ cache ได้ .... แต่ถ้า child ต่อ worker น้อยไปก็ไม่ดี ... เพราะถ้าเกิด memory leak ใน php จะทำให้ process ใหญ่โตเร็วจนมีปัญหา และถ้า child process ตัวใดตัวหนึ่ง crash มันจะทำให้ ตัวอื่นใน worker crash ทั้งหมด ...
มา ดู apache mpm_prefork บ้าง เหมือนหนังคนละม้วน เพราะ apache prefork ทำงานแบบ multi process (ไม่ใช่ multi thread นะ) ถ้ากำหนดให้มี max clients สัก 100 ก็มีได้มากสุด 100 process เลย ... การที่แต่ละ process จะสื่อสารกับแต่ละ worker ของ php มันต้องทำทีละ process ... เหมือนการ lock file ก่อนจะอ่านเขียนนั่นแหละ ... ดังนั้น ถ้า worker น้อยไป process ของ apache แต่ละตัวจะต้องแย่งกันสื่อสารกับ worker และรอกันมากขึ้น ทำให้แทนที่จะเร็ว กลับช้า ... ดังนั้นมันควรจะมี worker มากพอ ที่จะทำให้รอกันน้อยหน่อย โดยทั่วไปประมาณ maxclients / 10 ก็น่าจะ ok ... อันนี้ทำให้ child process ของ php ที่เรากำหนดต้องลดลงตามไปด้วย ...
ค่าที่เหมาะสม ผมบอกไม่ได้ ต้องทดลองเอาครับ ตรงไหนดีลองแล้วเร็ว ไม่ติดขัดก็ ตรงนั้นแหละ
apache mpm_worker อันนี้ ก็คล้าย ๆ prefork แต่ดีที่สุดคือกำหนดจำนวน worker = จำนวน thread หรือ thread + 1 จะดีที่สุด รายละเอียดก็เหมือน mpm_prefork ยกเว้นว่าคราวนี้ 1 process มีหลาย thread รับได้หลาย client .. ทำให้มีจำนวน process น้อยกว่า prefork หลายเท่า (จำนวน thread = maxclients / threadsperchild)
-------
สรุปเลย ถ้าทั้ง server มี site จำนวนน้อย และ load หนัก ๆ ล่ะก็ .... Go Lighttpd + FASTCGI เถอะ ...
เรื่อง เสถียร ไม่ต้องพูดถึงครับ .... นิ่งจนลืม upgrade php เวลามี security advisory มาเลยแหละ ...
มี server ตัวนึงผมไม่เคย restart lighttpd มาแล้ว สองสามเดือนได้มั้ง (เคยเกินกว่านั้นด้วย) รันได้ปกติ .... กะว่าตายเมื่อไหร่จะ upgrade php จนบัดนี้มันไม่ยอมเดี้ยงซะทีอ่ะ
================================================
มาายืน ยันอีกคนครับ web bit ผมก็ใช้ lighttpd ครับผม สวนตัวตอนนี้ดูแล web bit + upload รูปอยู่ ส่วนลอง bit ก็ใช้ lighttpd + fastcgi + xcache ใช้งานได้ค่อนข้ามีมากๆ ส่วนเว็บ upload รูป ผมใช้วิธี gen เป้น html แล้วใช้ SSI Include top, botton แทนครับ อันนี้ก็เร็วใช้ได้เลย
ตัวอย่างที่อีกก็ rcweb.net ทีแรกใช้ apache20 รันไปเจอโหลดหนักๆ เครื่องอืดมากๆ หลังมาเปลี่ยนใช้ lighttpd + fastcgi + xcache + ลบ php extention ที่ไม่ได้ใช้ออก ถือว่า ok ขึ้นมากเลยครับ
xcache อันนี้ลองเอาไปใช้ดูครับ ตัว xcache เองจะทำการ cache php ที่ compile แล้ว ทำให้เครื่องเราไม่จำเป้นต้องแปลง php script ไปเป้นภาษาเครื่องทุกๆครั้ง ทำให้เครื่องใช้ time + cpu น้อยลงครับ
ถ้าใช้ PHP ลง Zend Optimizer ด้วยครับ คราวนี้อย่างกับรถซิ่งตัวอย่างที่อีกก็ rcweb.net ทีแรกใช้ apache20 รันไปเจอโหลดหนักๆ เครื่องอืดมากๆ หลังมาเปลี่ยนใช้ lighttpd + fastcgi + xcache + ลบ php extention ที่ไม่ได้ใช้ออก ถือว่า ok ขึ้นมากเลยครับ
xcache อันนี้ลองเอาไปใช้ดูครับ ตัว xcache เองจะทำการ cache php ที่ compile แล้ว ทำให้เครื่องเราไม่จำเป้นต้องแปลง php script ไปเป้นภาษาเครื่องทุกๆครั้ง ทำให้เครื่องใช้ time + cpu น้อยลงครับ
0 comments:
Post a Comment