Monday, January 17, 2011

มาลองใช้ lighttpd + php5 + mysql5 บน CentOS 5 กันครับ

ขั้นแรกเตรียม 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
server.modules              = (
#                               "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 หน่อย ...
โค๊ด: Select | Copy
$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 ด้วยครับ คราวนี้อย่างกับรถซิ่ง

0 comments:

Post a Comment

 
Design by GURU