in How-to

จำกัดจำนวนการเชื่อมต่อให้ Apache ด้วย mod_limitipconn

หลายท่านที่ใช้บริการดาวน์โหลดไฟล์ในโครงการ Suriyan, Chantra, ThaiOS และเอกสารใน pub.thaiopensource.org อาจสงสัยว่าทำไมดาวน์โหลดไฟล์ยากจัง? และดาวน์โหลดได้เพียงไม่กี่กิโลไบต์ สาเหตุมาจากการใช้งานที่ท่วมท้นของสมาชิกทำให้เน็ตเวิร์คภายใน SIPA เดี๊ยง ถึงเดี๊ยงที่สุด :P และทีมงาน Thai Open Source ก็โดนดุตามระเบียบ ก็เลยทำให้มีการแจ้งย้ายแหล่งดาวน์โหลดทั้งหมดไปไว้ที่ pub.thaiopensource.org และทำการ shape bandwidth ด้วย mod_cband เพื่อให้ Apache คุม bandwidth ของเว็บที่ให้ดาวน์โหลดไว้ ให้วิ่งไม่กี่กิโลไบต์ ทำให้ลดเรื่องการใช้ bandwidth เกินกำลัง แต่ปัญหาที่ตามมาคือ ไฟล์ iso ขนาด 1.5GB ใช้เวลาดาวน์โหลดประมาณ 9 วัน T_T ใช่ครับ 9 วัน ไร้สาระมากๆ และระยะเวลายิ่งนานผู้ใช้ก็ยิ่งซอยชิ้นของไฟล์ให้มากขึ้น และคิดว่ามันจะช่วยให้ดาวน์โหลดเร็วขึ้นซึ่งนั่นคิดผิดครับ :P ผมก็เลยตัดสินใจ กดเครื่องคิดเลขและเปลี่ยนมาจำกัดจำนวนการเชื่อมต่อของแต่ละ IP ให้ Apache แทน ซึ่งมีวิธีการดังนี้

เครื่องมือที่เรานำมาใช้จำกัดจำนวนการเชื่อมต่อของแต่ละ IP ชื่อ mod_limitipconn ซึ่งเจ้าตัวนี้สามารถกำหนดไดเรคทอรี และชนิดของไฟล์ที่เราต้องการจำกัดจำนวนการเชื่อมต่อได้ ยกตัวอย่างเช่น เว็บไซต์ http://pub.thaiopensource.org/suriyan-archive ในไดเรคทอรี suriyan-archive ทั้งหมดผมต้องการจำกัดการเชื่อมต่อเพื่อดาวน์โหลดไฟล์ iso ที่อยู่ในนั้น เราก็สามารถทำได้ มาดูของจริงกันครับ

ผมมีเว็บ pub.thaiopensource.org ซึ่งเป็น virtual host ของ Apache อยู่แล้วในเว็บนี้มีไฟล์ให้ดาวน์โหลดเยอะแยะ เราจะจำกัดการดาวน์โหลดไฟล์ ในหน้า http://pub.thaiopensource.org/suriyan-archive กันครับ วิธีการง่ายๆ มีดังนี้

ดาวน์โหลด mod_limitipconn มาก่อน

สำหรับ amd64 ใช้

wget http://elonen.iki.fi/code/unofficial-debs/mod-limitipconn/apache2-mod-limitipconn_0.22-2_amd64.deb

สำหรับ i386 ใช้

wget http://elonen.iki.fi/code/unofficial-debs/mod-limitipconn/apache2-mod-limitipconn_0.22-1_i386.deb

จากนั้นสั่งติดตั้งด้วยคำสั่ง

sudo dpkg -i apache2-mod-limitipconn_0.22-2_amd64.deb

หรือ

sudo dpkg -i apache2-mod-limitipconn_0.22-1_i386.deb

จากนั้นสั่งให้ Apache เรียกใช้ module นี้ด้วยคำสั่ง

sudo a2enmod limitipconn

ทีนี้เราก็ไปแก้ไขไฟล์ virualhost ได้แล้ว โดยใส่ข้อมูลไดเรคทอรีที่เราต้องการจะจำกัดจำนวนการเชื่อมต่อดังนี้

<Location /suriyan-archive >
    MaxConnPerIP 1
    # In this case, all MIME types other than application/x-iso9660-image
    # are exempt from the limit check
    OnlyIPLimit application/x-iso9660-image
</Location>

จาก config ข้างต้น เราจำกัดการเชื่อมต่อในไดเรคทอรี suriyan-archive ให้มีการเชื่อมต่อต่อ IP Address เพียง 1 การเชื่อมต่อ และจำกัดเฉพาะไฟล์ iso เท่านั้น เพียงเท่านี้คุณก็สามารถจำกัดการเชื่อมต่อให้ Apache ได้แล้ว อ้ออย่าลืม restart Apache นะครับ