<![CDATA[

1. การปรับแต่งระบบเว็บเซิร์ฟเวอร์
    1.1   การปรับแต่งระบบฮาร์ดแวร์
        1.1.1   หน่วยประมวลผลกลาง
        1.1.2  หน่วยความจำ
        1.1.3  จานแม่เหล็ก
        1.1.4   ระบบเครือข่าย
    1.2   การปรับแต่งระบบซอฟท์แวร์
        1.2.1   โปรแกรมเว็บเซิร์ฟเวอร์
        1.2.2  TCP/IP
        1.2.3  File system
        1.2.4  CGI
        1.2.5   การออกแบบระบบเครือข่าย
        1.2.6  Proxy server
        1.2.7  เนื้อหา
        1.2.8  ภาพ
        1.2.9  Client-Side Image Maps

1. การปรับแต่งระบบเว็บเซิร์ฟเวอร์

     1.1 การปรับแต่งระบบฮาร์ดแวร์

1.1.1 หน่วยประมวลผลกลาง
        ระบบเว็บเซิร์ฟเวอร์ที่ไม่มีการใช้ CGI สามารถใช้หน่วยประมวลผล Pentium ใช้ระบบปฏิบัติการ Linux สามารถรองรับการทำงาน ที่ความเร็วของระบบเครือข่าย      1.5 Mb/s ได้อย่างสบาย แต่ถ้าหากระบบเครือข่ายมีความเร็วสูงมากขึ้น หรือเว็บเพจมีการใช้ CGI มากขึ้น ความเร็วของหน่วยประมวลผลกลางจำเป็นต้องเพิ่มขึ้นด้วย
ในกรณีที่เว็บเซิร์ฟเวอร์ใช้งาน CGI มาก ระบบจะทำงานช้าลง การแก้ปัญหาอาจใช้ CGI ที่เป็นโปรแกรมที่ผ่านการคอมไพล์แล้ว แทนที่จะใช้สคริปต์ ซึ่งโปรแกรมที่ผ่านการคอมไพล์จะทำงานได้เร็วกว่าโปรแกรมที่ใช้สคริปต์มาก

1.1.2 หน่วยความจำ
        เว็บเซิร์ฟเวอร์มีความต้องการใช้หน่วยความจำสูง ถ้ามีได้มากเท่าไรก็ยิ่งดี โดยเฉพาะในเครื่องที่ใช้หน่วยประมวลผลแบบ RISC มีความจำเป็นต้องใช้หน่วยความจำมากกว่าเครื่องที่ใช้หน่วยประมวลผลแบบ CISC ประมาณ 2 เท่า ในกรณีที่ระบบเครือข่ายมีความเร็วไม่สูงนัก เซิร์ฟเวอร์ที่มีหน่วยความจำเพียง 16 เมกกะไบต์ก็เพียงพอแล้ว แต่ทางที่ดีควรจะมีอย่างน้อย 32 เมกกะไบต์
        ในการคาดการณ์จำนวนหน่วยความจำที่ระบบต้องการ สามารถใช้คำสั่ง vmstat (หรือ vm_stat) ซึ่งจะแสดงจำนวนของหน่วยความจำที่ถูกย้ายไปเก็บไว้ในจานแม่เหล็ก (Virtual Memory) โดยเราจะดูที่ค่าของ pagein และ pageout ซึ่งสามารถบอกได้ว่ามีการใช้งาน Virtual Memory มากแค่ไหน หรือในกรณีที่ขาดแคลนหน่วยความจำมากๆ ระบบจะมีการอ่าน/เขียน จานแม่เหล็กบ่อยมากจนสามารถสังเกตได้
        อีกวิธีที่สามารถเพิ่มขนาดหน่วยความจำ คือการลดจำนวนโปรแกรมที่ทำงานอยู่บนเซิร์ฟเวอร์ เช่น DNS, NFS, NNTP, SMTP, shell account, FTP โดยเลือกเฉพาะโปรแกรมที่จำเป็น ในกรณีที่เซิร์ฟเวอร์ไม่ได้ใช้เป็นเซิร์ฟเวอร์ของระบบจดหมายอีเลคทรอนิคส์ เราควรใช้ sendmail ผ่านทาง inetd แทนเพื่อประหยัดหน่วยความจำ

1.1.3 จานแม่เหล็ก
        ปัญหาอันดับแรกสำหรับเว็บเซิร์ฟเวอร์ คือ ความเร็วของจานแม่เหล็ก โดยความเร็วของจานแม่เหล็ก ช้ากว่าความเร็วของหน่วยประมวลผลกลางมาก และจัดได้ว่าช้าที่สุดในระบบ และเว็บเซิร์ฟเวอร์มีการใช้งานจานแม่เหล็กสูง โดยเฉพาะอย่างยิ่งในการเข้าถึงข้อมูลแต่ละครั้ง จะเป็นข้อมูลที่มีขนาดไม่ใหญ่มาก แต่จะมีการเข้าถึงบ่อย หากหน่วยประมวลผลสามารถอ่านข้อมูล จากจานแม่เหล็ก และประมวลผลได้เร็วขึ้นเท่าใด ประสิทธิภาพโดยรวมก็จะเพิ่มขึ้นเท่านั้น
        ถึงแม้ว่าการซื้อจานแม่เหล็กที่มีความเร็วสูงขึ้นมาใช้ จะสามารถแก้ปัญหาได้ แต่การแก้ปัญหาโดยใช้จานแม่เหล็กอีกหนึ่งหรือสองตัวมาแยกเก็บเฉพาะ log file, swap file จะช่วยบรรเทาปัญหาลงได้เช่นกัน
แต่ในกรณีที่ระบบต้องการใช้จานแม่เหล็กอย่างมากจริงๆ การใช้จานแม่เหล็กเพียงตัวเดียว ไม่สามารถรองรับได้ จำเป็นต้องใช้ระบบ RAID (Redundant Array Inexpensive Disk) ซึ่งเป็นการนำเอาจานแม่เหล็กหลายๆ ตัวมาทำงานขนานกัน

1.1.3.1 RAID 0 : Non-Redundant Striped Array
        ข้อมูลจะถูกแบ่งกระจาย เก็บไว้ในจานแม่เหล็กทุกตัว ในการอ่าน/เขียน สามารถทำได้พร้อมกันหมด โดยข้อมูลที่อ่านได้ต้องนำมารวมกันก่อน หรือข้อมูลที่จะถูกเขียนต้องถูกแบ่งก่อน ในกรณีที่ข้อมูลมีขนาดเล็กสามารถเก็บลงในจานแม่เหล็กเพียงตัวเดียว แต่ถ้าใหญ่กว่าขนาดที่กำหนดจะถู
กแบ่งไปเก็บไว้ในจานแม่เหล็กทุกตัว
ประสิทธิภาพจะดีที่สุด เพราะในการอ่าน/เขียน ไม่มีการตรวจสอบความผิดพลาด (data-integrity)

1.1.3.2 RAID 1 : Mirrored Arrays
        ข้อมูลจะถูกเก็บไว้ในจานแม่เหล็กทั้ง 2 ตัว ในการเขียนจะต้องเขียนจานแม่เหล็กทั้งคู่ ทำให้ ประสิทธิภาพเท่ากับการใช้จานแม่เหล็กเพียงตัวเดียว แต่ในการอ่านสามารถทำได้พร้อมๆ กันทั้งสองตัว ประสิทธิภาพในการอ่านเพิ่มขึ้น 100%
        นิยมใช้ในระบบ multi-user เพราะการอ่านข้อมูลไม่ว่าจะเป็นข้อมูลที่มาก หรือน้อย สามารถทำได้บนจานแม่เหล็กตัวใดก็ได้ แต่ราคาของระบบนี้จะสูงกว่าแบบอื่นๆ เนื่องจากใช้จานแม่เหล็กมากกว่าปกติ 2 เท่า

1.1.3.3 RAID 2 : Parallel Array with Error-Correcting Code (ECC) Data Protection Disk
        คล้ายๆ กับ RAID 0 แต่ข้อมูลของ ECC (Error-Correcting Code) ซึ่งปกติจะเก็บไว้ตำแหน่ง ตอนท้ายของเซ็คเตอร์ จะถูกเก็บไว้บนจานแม่เหล็กอีกตัวแทน ในการอ่านข้อมูลความเร็วจะเท่ากับ RAID 0 แต่ในการเขียนข้อมูลจะช้ากว่าเพราะต้องคำนวณค่า ECC
ประสิทธิภาพเท่ากับระบบ RAID 3

1.1.3.4 RAID 3 : Parallel Array with Parity
        เหมือน RAID 2 การตรวจสอบความผิดพลาดขึ้นอยู่กับค่าของ ECC ที่เก็บไว้ในเซ็คเตอร์ในแต่ละจานแม่เหล็ก เมื่อพบข้อผิดพลาด ข้อมูลที่ถูกต้อง จะถูกคำนวณได้จากข้อมูลที่อยู่ในจานแม่เหล็กตัวอื่นๆ
ระบบนี้เหมาะสำหรับระบบที่มีผู้ใช้คนเดียว เพราะในการอ่าน/เขียนข้อมูลทำได้ทีละ transaction เท่านั้น

1.1.3.5 RAID 4 : Striped Array with Parity
        การติดตั้งเหมือน RAID 3 แต่ขนาดของข้อมูลที่แบ่งเก็บในแต่ละจานแม่เหล็กจะใหญ่กว่า          ทำให้สามารถอ่านข้อมูลในจานแม่เหล็กแต่ละตัว สำหรับแฟ้มข้อมูลต่างกันได้พร้อมกัน แต่ในการเขียนข้อมูลไม่สามารถทำได้เพราะต้องเขียน parity ในจานแม่เหล็กตัวเดียวกัน
ประสิทธิภาพเท่ากับระบบ RAID 5

1.1.3.6 RAID 5 : Rotating Parity Array
        แก้ปัญหาคอขวดในการเขียนข้อมูล parity ของ RAID 4 โดยการกระจาย parity ไปเก็บไว้ในทุก จานแม่เหล็ก โดยในการเขียนส่วนมาก จะเข้าถึงจานแม่เหล็กสำหรับข้อมูล และจานแม่เหล็กสำหรับเก็บ parity ข้อมูลอันนั้น ดังนั้นการเขียนข้อมูลสามารถทำพร้อมกันได้
        ระบบนี้เหมาะสำหรับระบบที่เป็น multi-user และต้องการเสถียรภาพในการทำงานสูง แต่เนื่องจากในการเขียนต้องคำนวณค่า parity สำหรับจานแม่เหล็กทุกตัว ทำให้ไม่เหมาะกับระบบที่มีการเขียนข้อมูลมากๆ แต่สำหรับระบบที่เน้นการอ่านข้อมูล เช่น เว็บเซิร์ฟเวอร์แล้ว RAID 5 จะเหมาะกว่า RAID 1 ทั้งในด้านของประสิทธิภาพ และความน่าเชื่อถือ

         1.1.4 ระบบเครือข่าย

        เป็นปัญหาที่พบเป็นอันดับสอง รองมาจากปัญหาของจานแม่เหล็ก เพราะหากว่าระบบจานแม่เหล็กไม่ใช่คอขวดแล้ว ระบบเครือข่ายจะเป็นปัญหาต่อมา เปรียบดังปั้มน้ำที่สามารถทำงานได้เต็มที่ แต่ติดที่ขนาดของท่อ

        การใช้ระบบ ISDN อาจจะเหมาะกับเว็บเซิร์ฟเวอร์ส่วนบุคคล แต่ในกรณีเว็บของบริษัทที่มีการใช้งานหนัก อย่างต่ำควรเป็น DS1 (1.5 Mbps) และถ้ากรณีที่เป็นบริษัทใหญ่มากควรเป็น DS3 (45 Mbps)

        ความเร็วในระบบ LAN ของเว็บเซิร์ฟเวอร์ เพราะในระบบอีเธอร์เน็ท (10 Mbps หรือ 100 Mbps) หากมีจำนวนเครื่องในวงเดียวกันมาก ความเร็วจะได้ไม่เต็มประสิทธิภาพ

        1. ทำงานในแบบ standalone จะดีกว่าเรียกผ่าน inetd

        2. าไม่มีความต้องการ log file การเอาออกจะทำให้ระบบทำงานได้รวดเร็วขึ้น หรือถ้าหากมีความต้องการจริงๆ ควรจะเลือกเฉพาะส่วนที่ต้องการในกรณีที่มีการ log ไม่ควรใช้ DNS lookup เพราะเป็นการเพิ่มภาระให้แก่เซิร์ฟเวอร์
        3. ถ้าเป็นไปได้ควรให้เขียน log file ลงในจานแม่เหล็กคนละตัวกับข้อมูลของเว็บเพจ เพื่อให้ระบบสามารถอ่าน/เขียนได้พร้อมๆ กัน เป็นการเพิ่มประสิทธิภาพของระบบโดยรวม
        4. ถ้าเป็นไปได้ไม่ควรใช้ SSI (Server Side Includes) เนื่องจากเพิ่มงานในการอ่านจานแม่เหล็กให้แก่เซิร์ฟเวอร์ เพราะหาก SSI มีการอ่านข้อมูลจากแฟ้มข้อมูลขนาดเล็ก หลายๆ แฟ้ม จะทำให้เซิร์ฟเวอร์ต้องอ่านข้อมูลจากจานแม่เหล็กมากขึ้นเป็นทวีคูณ โดยเฉพาะอย่างยิ่ง SSL ที่มีการเรียกใช้งาน CGI จะยิ่งทำให้เซิร์ฟเวอร์ทำงานหนักขึ้นโดยไม่จำเป็น ในกรณีที่ต้องการให้ HTML มีการเปลี่ยนแปลงตลอดควรใช้คำสั่ง cron ในการเปลี่ยนแปลงทุกช่วงเวลาที่ต้องการจะเป็นการดีกว่า
        5. การควบคุมการเข้าถึงไดเรคทอรี โดยการใส่แฟ้มข้อมูล .htaccess ในไดเรคทอรีที่ต้องการการควบคุม ทำให้ระบบต้องคอยตรวจสอบว่าไดเรคทอรีนั้นๆ หรือไดเรคทอรีก่อนหน้า มีแฟ้มข้อมูล .htaccess อยู่หรือไม่ เป็นการเพิ่มภาระให้แก่เซิร์ฟเวอร์โดยไม่จำเป็น ควรใช้การควบคุมการเข้าถึงจากแฟ้ม conf/access.conf แทนจะดีกว่า
        6. ไม่ควรให้โปรเซส httpd หมดอายุเร็วเกินไป ถึงแม้ว่าจะเป็นการประหยัดหน่วยความจำ แต่ไม่คุ้มค่าที่จะต้องสร้างโปรเซสขึ้นมาใหม่ เพื่อแลกกับหน่วยความจำนั้น โดยเฉพาะอย่างยิ่งเมื่อเว็บเซิร์ฟเวอร์ต้องรับภาระหนัก
        7. ในกรณีที่ต้องการใช้ความสามารถในการตรวจสอบผู้ใช้ ควรใช้โมดูลสำหรับการตรวจสอบผู้ใช้ที่เป็นระบบฐานข้อมูล จะดีกว่าการใช้แบบ .htpasswd โดยเฉพาะอย่างยิ่งเมื่อมีจำนวนผู้ใช้มากกว่า 30 คน เพราะการเข้าถึงข้อมูลในฐานข้อมูลจะทำได้เร็วกว่าการเข้าถึงข้อมูลในแฟ้มข้อมูลชนิดตัวอักษร (ที่มีขนาดใหญ่) มาก
        8. การให้เซิร์ฟเวอร์สร้างอินเดกซ์ของไดเรคทอรีขึ้นมาให้ เป็นการเพิ่มภาระให้แก่เซิร์ฟเวอร์ ควรใช้แฟ้มข้อมูล index.html แทน ในกรณีที่ต้องการระบบสร้างอินเดกซ์ให้อัตโนมัติ ควรใช้การเขียนโปรแกรมให้สร้างใหม่ทุกช่วงเวลา แทนที่จะให้เซิร์ฟเวอร์สร้างขึ้นเมื่อมีการร้องขอ
        9. ไม่ควรใช้ CGI ถ้าไม่จำเป็นจริงๆ ในกรณีที่ข้อมูลมีการเปลี่ยนแปลงนานๆ ครั้ง ควรพิจารณาแนวทางอื่นแทน เพราะจะสามารถส่งเว็บเพจกลับไปได้เร็วกว่า และเซิร์ฟเวอร์ทำงานน้อยลง
        10. ในกรณีที่ใช้ CGI ควรตรวจสอบการใช้งานหน่วยประมวลผลของ CGI นั้น โดยการสั่งงานโดยใช้คำสั่ง time โดยมากแล้ว CGI ที่เขียนด้วยภาษาสคริปต์ จะทำงานหนักกว่าภาษา C ที่ผ่านการคอมไพล์แล้ว
        11. ในกรณีที่มีการใช้งาน server-side image maps อย่าลืมใช้โมดูลที่มีอยู่แล้วของ Apache แทนที่จะใช้เป็น CGI ปกติ ทางที่ดีควรจะใช้ client-side image maps จะดีกว่า

                    1.2.2 TCP/IP

        ระบบปฏิบัติการสามารถปรับแต่ง TCP/IP ได้ เช่น จำนวนของการเชื่อมต่อ, อัตราการเชื่อมต่อ และปริมาณข้อมูลสูงสุดที่ระบบสามารถรับได้ โดยเราสามารถใช้คำสั่ง netstat เพื่อตรวจสอบว่าระบบมีปัญหา ณ. จุดใด

                    1.2.3 File System

        เนื่องจากเว็บเซิร์ฟเวอร์มีการใช้งานจานแม่เหล็กมาก ในระบบบางระบบสามารถทำ RAID โดยใช้ซอฟท์แวร์

        1.2.4 CGI

1.2.4.1 Compiled CGI

        การแปล
จากภาษาสคริปต์ มาเป็นภาษาที่ต้องคอมไพล์ก่อน ทำให้ประสิทธิภาพเพิ่มขึ้นมาก เพราะไม่ต้องมีการแปลภาษาก่อนการทำงานทุกครั้ง

                   1.2.4.2 FastCGI

        เป็นมาตราฐานเพิ่มเติมของ CGI โดยทำให้การทำงานของ CGI เร็วขึ้นโดยที่วิธีการเขียน CGI เหมือนเดิม เนื่องจาก FastCGI ทำให้โปรเซสของ CGI ไม่หายไปไหนเมื่อจบการทำงาน แต่จะยังอยู่เพื่อรอทำงานถัดไป และจะสิ้นสุดก็ต่อเมื่อผู้ดูแลระบบยกเลิก หรือเครื่องเซิร์ฟเวอร์ถูกปิด

        ประสิทธิภาพที่เพิ่มขึ้น สามารถสังเกตเห็นได้โดยเฉพาะอย่างยิ่ง CGI ที่มีการติดต่อกับฐานข้อมูล เพราะ FastCGI จะยังคงการเชื่อมต่อกับฐานข้อมูลเอาไว้ ทำให้ไม่ต้องมีการติดต่อกับฐานข้อมูลใหม่ทุกครั้ง

                   1.2.4.3 Distributed CGI Servers

        อีกวิธีหนึ่งในการลดภาระการทำงานของเว็บเซิร์ฟเวอร์ก็คือ แยกเซิร์ฟเวอร์สำหรับ CGI โดยเฉพาะออกมาต่างหาก ตัวอย่างเช่นเว็บไซต์ของเน็ทสเคปที่ใช้วิธีนี้

        FastCGI สามารถทำงานเป็นแบบนี้ได้เช่นกัน เพราะสนับสนุนการใช้งานผ่าน TCP/IP นั่นคือ ตัวเว็บเซิร์ฟเวอร์ จะเป็นคนละตัวกับ FastCGI เซิร์ฟเวอร์

        วิธีหนึ่งในการเพิ่มประสิทธิภาพ คือ การลดปริมาณข้อมูลที่วิ่งในระบบเครือข่ายของเครื่องเซิร์ฟเวอร์ โดยเฉพาะในกรณีที่เว็บเซิร์ฟเวอร์มีการทำงานหนักมาก จะมีผลให้ปริมาณข้อมูลในระบบเครือข่ายนั้น เพิ่มมากขึ้น และในกรณีที่มีเซิร์ฟเวอร์ตัวอื่นอยู่ในเครือข่ายเดียวกัน จะทำให้ประสิทธิภาพลดลงอีก

        การแก้ปัญหาสามารถทำได้โดยการแบ่ง subnet โดยใช้เราท์เตอร์ หรือบริดจ์ นอกจากนั้นการแบ่ง subnet ยังช่วยเพิ่มความปลอดภัยให้แก่เซิร์ฟเวอร์อีกด้วย และเป็นการกระจายการดูแลระบบเครือข่ายออกไป

           1.2.8 ภาพ

        ในการออกแบบภาพประกอบของเว็บเพจ ควรจะให้มีขนาดเล็กที่สุด และมีรายละเอียดที่ต้องการครบถ้วนที่สุด โดยมีเทคนิคในการลดได้หลายแบบ เช่น การลดจำนวนสีของภาพ, การลดขนาดของภาพ โดยถ้าขนาดของภาพ และเนื้อหาในเว็บเพจมีขนาดไม่เหมาะสมแล้ว ผู้ที่เข้าชมเว็บเพจ จะเกิดความรู้สึกว่าเว็บเพจทำงานได้ช้าไม่ทันใจ และอาจจะเปลี่ยนใจไม่เข้าชมก็ได้

                    1.2.9 Client-Side Image Maps

        ควรใช้ Client-Side Image Maps แทนที่จะใช้ Server-Side Image Maps ซึ่งจะช่วยลดการทำงานของเว็บเซิร์ฟเวอร์ลง เพราะแทนที่ทางไคลเอนท์จะส่งตำแหน่งของภาพมาให้เซิร์ฟเวอร์ แต่ทางไคลเอนท์จะจัดการทั้งหมดเอง เป็นการลดภาระของเว็บเซิร์ฟเวอร์ลงได้มาก

                    1.2.6 Proxy server

        เพื่อเป็นการลดปริมาณข้อมูลที่วิ่งในระบบเครือข่ายภายใน ควรจะมีการจัดตั้งเครื่องพรอกซีเซิร์ฟเวอร์ขึ้นมา โดยที่ตัวพรอกซีเซิร์ฟเวอร์จะทำหน้าที่เก็บข้อมูลที่เคยถูกเรียกมาไว้ เมื่อมีการเรียกมาอีกครั้ง ตัวพรอกซีเซิร์ฟเวอร์จะส่งข้อมูลที่มันเก็บไว้กลับไปให้ แทนที่จะติดต่อไปยังเซิร์ฟเวอร์ปลายทางอีกครั้ง เป็นการลดปริมาณข้อมูลที่ไม่จำเป็นลง เพื่อให้สายสัญญาณว่างขึ้นสำหรับเว็บเซิร์ฟเวอร์ขององค์กร

             &
nbsp;      1.2.7 เนื้อหา

        ถ้าขนาดของเนื้อหาน้อยเท่าใด ปริมาณข้อมูลที่วิ่งในระบบเครือข่ายก็น้อยลงเท่านั้น ดังนั้นการจัดการให้ข้อมูลมีขนาดเล็กลง หรือแบ่งขนาดเนื้อหาย่อยลงไป จะช่วยลดความคับคั่งลงได้มาก ตัวอย่างเช่น เรามีสายความเร็ว 1.5 Mbps (200 KB/s) และต้องการให้รองรับจำนวนผู้ชมเว็บสูงสุดที่ 50 คน/วินาที ดังนั้นแต่ละคนจะได้ปริมาณข้อมูลเท่ากับ 4 KB/s ดังนั้นข้อมูลตอบกลับเฉลี่ยแล้วควรมีขนาด 4 KB แต่ในความเป็นจริงแล้ว เราไม่สามารถกำหนดให้ทุกเนื้อหามีขนาดตายตัวได้ แต่จากตัวเลขเหล่านี้จะทำให้เราสามารถคำนวณได้โดยคร่าวๆ ว่าขนาดของเนื้อหาควรมีขนาดเท่าใด

                   1.2.5 การออกแบบระบบเครือข่าย

        1.2 การปรับแต่งระบบซอฟท์แวร์

                     1.2.1 การปรับแต่งโปรแกรม Apache Web Server

        ระบบ RAID มี 6 แบบ

]]>