Httpd-accelerator สำหรับเว็บที่คนเข้าเยอะๆ

เมื่อสองสามวันก่อน ได้มีโอกาสไปเล่นกับเครื่องที่คนเข้าหน้าเว็บเยอะเอามากๆ เว็บนึง หลังจากพยายามจูนเต็มที่ port 80 ก็ยังเข้ายาก อาการก็ประมาณกระทู้นี้

http://www.thaihosttalk.com/th1/index.php?topic=2606.0

ก็เลยถือโอกาสเล่นอะไรกะเครื่องนิดหน่อย ด้วยการทดสอบ httpd-accelerator ซะเลย อ่านมาหลายรอบแล้วว่าจะทำไม่ได้ทำซักที

ข้อมูลจาก google: http://www.google.co.th/search?hl=th&q=squ…celerator&meta=

อธิบายง่ายๆ ก็เป็นการใช้ squid ให้ทำงานใน mode httpd-accelerator คือช่วยลด load ของ apache แล้วให้มาที่ squid แทน

ก่อนอื่นก็ต้องติดตั้ง squid ก่อน ในที่นี้ผมใช้ rpm ก็เลยพิมพ์ไปว่า
# apt-get install squid

หลังจากติดตั้งเสร็จ ก็มาตั้งค่ามัน แต่ก่อนอื่นต้อง stop ไปก่อน เผื่อคนแอบใช้ อันที่จริงมันไม่ได้ auto start หรอก ^^’
[b]# service squid stop

vi /etc/squid/squid.conf[/b]

http_port 9085
icp_port 0
acl QUERY urlpath_regex cgi-bin ?
no_cache deny QUERY
cache_mem 1024 MB
cache_dir ufs /var/spool/squid 1024 16 256
emulate_httpd_log on
redirect_rewrites_host_header off
acl all src 0.0.0.0/0.0.0.0
http_access allow all
cache_mgr icez@icez.net
cache_effective_user squid
cache_effective_group squid
httpd_accel_host virtual
httpd_accel_port 80
log_icp_queries off
cachemgr_passwd changethisforsecurityreason
buffered_logs on
visible_hostname accelerator.icez.net
httpd_accel_with_proxy off
httpd_accel_uses_host_header on
httpd_accel_single_host off

จุดที่ต้องดูมี

  • http_port 9085 << ตรงนี้จะเป็น port ที่ต้องการให้ squid เปิดรับ connection
  • cache_mem 1024 MB << เป็นขนาดพื้นที่ cache ของ squid ครับ
  • cache_dir ufs /var/spool/squid 1024 16 256 << อันแรกเป็นที่อยู่ cache ของ squid, อันหลังเป็นขนาดพื้นที่ (รายละเอียด อ่าน config squid เอา)
    cache_mgr icez@icez.net << info เฉยๆ
    cachemgr_passwd changethisforsecurityreason << เรื่องการตรวจสอบข้อมูลน่ะครับ ไว้ดูอะไรได้หลายอย่าง เพราะฉะนั้น เปลี่ยนซะ
    visible_hostname accelerator.icez.net << ชื่อของ proxy ครับ

นอกนั้นก็ไม่ต้องเปลี่ยนมัน แต่ถ้าอยากทำอะไรกะมันอีกก็ add เพิ่มก็ได้ครับ

หลังจากนั้น ต้องเซตให้ squid auto start แล้วก็ initialize cache ของ squid แล้วก็ start squid
[b]# chkconfig --level 345 squid on

squid -z

service squid start[/b]

เสร็จแล้วก็มาแก้ firewall กัน ผมใช้ iptables นะครับ
[b]# iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.1/32 --dport 9085 -j DROP

iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.1/32 --dport 80 -j REDIRECT --to-ports 9085

service iptables save[/b]

  • แก้ตัวแดงๆ เป็น ip และ port ของ squid นะครับ

อันแรกไว้ block connection เข้า squid โดยตรง
อันหลังไว้ redirect http request เข้า squid ก่อนแล้ว squid จะทำหน้าที่จัดการอีกรอบ

เสร็จแล้วครับ

ผลที่ได้หลังการทดลอง

เดิม
load avg อยู่ที่ราวๆ 30-35
cpu ~ 80%

ใหม่
load avg อยู่ที่ราวๆ 6-15 (peak ไม่เกิน 20)
cpu ~ 90%

แถมด้วยการ load หน้าเว็บเร็วขึ้นอย่างเห็นได้ชัด

กลไกของ reverse proxy นี่เองครับ :slight_smile:

เป็นรายละเอียดที่ดีมาก ขอย้ายไปหมวดบทความพิเศษและปักหมุด รอคุณ Standhost มาเกลาอีกรอบครับ

แล้วบน FreeBSD นี่ทำได้มั้ยครับ

iptables -A PREROUTING …
ต้องเป็น
iptables -t nat -A PREROUTING …

หรือปล่าว?

จะให้ดีนะครับ ก็เพิ่มในส่วนของ Cache Memory option ต่างๆ เช่น Object size maximum object size ttl time ให้พอเหมาะ กับระบบแล้วก็ปรับ Cache Replacement Policy จาก default ที่เป็น least หรือ LRU อะไรเนี่ยละจำไม่ค่อยได้ เป็น GDSF heap ดีกว่าเพราะว่าจะเป็น replacement policy ที่เหมาะกับ file ขนาดเล็กๆ เพราะว่าถ้าใช้กับการ reverse proxy แบบ dynamic web page จะมีการทำ session file เล็กๆเยอะมากถ้าใช้แบบ GDSF จะได้ประสิทธิภาพดีกว่า แต่ว่าขึ้นอยู่กับการปรับค่าของ time ของการ expire object จาก memory ด้วยนะครับ รวมถึง ration ที่จะใช้ในการเปรียบเทียบความแตกต่างระหว่าง source website กับใน cache ที่ sqiud เก็บอยู่ด้วย แล้วถ้าจะให้ดียิ่งๆขึ้นก็ให้ squid มัน fork process ออกมาเยอะๆครับ จะรับ conncurrent ได้มากขึ้นด้วย

แต่อย่าลืมนะครับกรณีที่ผมว่าควรแยกเครื่อง squid กะ web ออกจากกันเพราะไม่งั้นก็ร่วงทั้งคู่ squid เนี่ยเวลามันทำงานเข้าข่ายสูบ resource เหมือนปล้นนะคร้าบบบบ และที่สำคัญที่สุดจะช่วยได้มากขนาดไหนก็ขึ้นอยู่ปัยขนาดของ object ที่จะ cache ด้วยว่า size มันขนาดไหนจะได้ optimize bject size ของ squid ให้เข้ากันที่สุดจึงจะเห็นผลที่ดีขึ้นครับ

เท่านี้ละครับจากเท่าที่เคยลองทดสอบเล่นโดยใช้ webbench test ดูก็เห็นผลชัดเจนแต่ยังไม่เคยลองสนามจริงครับแฮะๆๆ :rolleyes:

อ้อออ อีกอย่างจะให้กรหึ่มกันเข้าไปอีกก็เล่นในส่วนของ iptable พวก tos parameter หรือจะใช้ tc ช่วยก็ได้ครับแต่กรณีนี้วุ่นอีกหน่อยเพราะต้องได้รับความร่วมมือกับการ set switch และ router ด้วยครับ แล้วอย่าลืม nice process squid/apache ด้วยจะช่วยเรื่อง utilize local process queue ให้ดีขึ้นเพราะพวก dynamic นี่ก็เข้าข่ายสูบ resource เป็นช่วงๆเหมือนกัน

ขอบคุณพี่ Icez มากครับที่ช่วย

ทำให้เว็บผมเร็วขึ้นที่ เมื่อวานวันอาทิตย์พี่ทำให้นะครับ

^^ เร็วปรื้ดๆเลย

ว้าว :slight_smile:

คราวนี้มาลองบน FreeBSD บ้างครับ

os: FreeBSD 6.0
squid: 2.5STABLE13

ขั้นตอนการ compile squid

[b]# cd /usr/local/src

fetch http://www.squid-cache.org/Versions/v2/2.5…STABLE13.tar.gz

tar zxf squid-2.5.STABLE13.tar.gz

cd squid-2.5.STABLE13

./configure --prefix=/usr/local/squid

make all

make install[/b]

จากนั้นก็แก้ config เหมือนกะของด้านบนน่ะแหละครับ
# vi /usr/local/squid/etc/squid.conf
ดูจากด้านบนเลยครับ เหมือนกัน

ตัวโปรแกรม squid จะอยู่ใน /usr/local/squid/sbin/squid นะครับ

กำลังหาวิธีเซต firewall อยู่

ฮี่ๆๆ ยอดเยี่ยมเลยท่าน
ผมเพิ่งเปลี่ยนจาก FreeBSD เป็น CentOS อะท่าน
จะลองบ้าง :angryfire:

CentOS น่าจะเหมือน FC น่ะครับผมว่า :smiley:

add ลูกค้ากลับเครื่องก่อนแล้วจะลองบ้าง
ตอนนี้ลองก็ไม่เห็นผล อิอิ

จากที่ลงมาสี่เครื่องนะครับ

CPU ส่วนมากจะพุ่งสูงกระฉูดเนื่องจาก squid
Load AVG ถ้าเดิมเกิน 20 จะลดลงมานิดหน่อย แต่ถ้าไม่เกิน 10 มันจะพุ่งขึ้นมาเยอะเอาการ ทำให้ดูเหมือน load หนัก

ครับ เท่าที่เคยเจอมา เอา squid มาอยู่หน้า apache จะเป็นแบบนี้

สำหรับเครื่องที่ลง httpd accelerator แล้วมีปัญหาเรื่องการจับ IP ของ php
เอา script มาให้ครับ

<?php
$refip = explode(",", $_SERVER["HTTP_X_FORWARDED_FOR"]);

$_SERVER["REMOTE_ADDR"] = trim($refip[count($refip) - 1]);
$_SERVER["HTTP_X_FORWARDED_FOR"] = "";
for ($i=0; $i<count($refip) - 1; $i++) {
$_SERVER["HTTP_X_FORWARDED_FOR"] .= ", ".trim($refip[$i]);
}
if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
$_SERVER["HTTP_X_FORWARDED_FOR"] = substr($_SERVER["HTTP_X_FORWARDED_FOR"], 2);
else
unset($_SERVER["HTTP_X_FORWARDED_FOR"]);
?>

แล้วไปตั้งค่า php.ini ตรงส่วนของ auto_prepend_file ไว้เลยครับ

  • สำหรับ plesk ให้เซฟที่ /tmp นะครับ จะได้ include ได้ ส่วน cp อื่นลองดูว่า ตัวร่วม open_basedir อยู่ที่ folder ไหนก็เซฟไว้ที่นั่นแหละครับ

แก้ไข code เพิ่มเติม ลืมใส่ trim

การันตีว่า ช่วยได้มากครับผม

40k ต่อวันรึเปล่าครับ ถ้าเยอะขนาดนี้ น่าจะติดอันดับต้นๆ truehits ได้เลย

ถ้าได้วิธีเซ็ท firewall บน FreeBSD ก็คงดี