ปรับ Directadmin เพิ่มความแรงให้ Server ด้วย Nginx

พี่โป้ง เทพเสมอ

ใช้ nginx แล้วโดนยิงไม่ร่วง แถมยังได้ log มากมาย ทำให้เรา block ได้อย่างง่ายได้

ตัวอย่างที่ได้จาก ไฟล์ error_log เนื่องจากถูกยิง

2011/05/28 07:34:24 [info] 18655#0: *24849027 client sent invalid method while reading client request line, client: 125.26.30.221, server: localhost, request: “^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@”

2011/05/28 07:34:24 [info] 18655#0: *24849028 client sent invalid method while reading client request line, client: 125.26.30.221, server: localhost, request: “^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@”

2011/05/28 07:34:22 [info] 18654#0: *24849020 client sent invalid method while reading client request line, client: 125.26.30.221, server: localhost, request: “^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@”

2011/05/28 07:34:22 [info] 18656#0: *24849021 client sent invalid method while reading client request line, client: 125.26.30.221, server: localhost, request: “^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@”

จะเห็นว่า log โตเร็วมาก เนื่องจากมันยิงเข้ามาที่ Port 80 จะสังเกตุได้ว่า มันมาด้วย IP ซ้ำๆ ประมาณ 100-200 IP แล้วก็จะเปลี่ยนไปเรื่อยๆ แต่ไม่มาก ถ้าไม่ถึง 1000 IP นี้ก็ยังโอเคอยู่สำหรับการ Block

**** หากทุกยิงด้วย SYN จะเป็นอีกแบบหนึ่ง จริงๆ แล้วการยิง port 80 นี้บางครั้งทำให้เราหาตัวมันได้อยากยิ่งเลยครับ พอมี nginx แล้วทำให้การ block ip ง่ายขึ้นมากเลยครับ

วิธีการดูว่าถูกยิงแน่หรือเปล่าให้

ls -al ดูไฟล์ error_log ว่ามีขนาดเพิ่มขึ้นเร็วหรือเปล่า

  1. เคลียค่า error_log ก่อนโดยใช้คำสั่ง “> error_log”

  2. ls -al ดูว่าขนาดไฟล์เพิ่มขึ้นอย่างร่วดเร็วหรือไม่ (ผมลองทิ้งไว้ 1 วันเครื่องที่โดนยิงจะมีขาดไฟลื error_log เพิ่มขึ้นถึง 2 GB แค่ 1 วันนะครับ มันโหดมากๆ เลย)

  3. ใช้คำสั่ง “cat error_log | awk ‘{print $16}’ | cut -d, -f1 | sort | uniq -c | sort -nr” ตัวอย่างของผม

อันนี้ตัวอย่างจากของจริง ใช้เวลาเก็บข้อมูลหลังจากเคลียไปแล้ว 1 นาที

2853 125.26.30.221

2406 113.53.154.232

2374 118.172.140.108

2321 125.24.35.187

2300 118.172.234.87

2109 118.172.132.213

872 118.173.116.165

679 125.26.180.20

504 125.26.38.227

407 182.53.106.223

216 118.172.255.55

210 125.27.181.39

จะเห็นว่าในเวลาแค่ 1 นาที มันจะมีการเรียกอะไรสักอย่างใน port 80 แต่ละ IP มากถึง 2800 ครั้ง ถามว่าเป็นไปได้มั้ยที่คนจะสามารถเข้ามาเรียกหน้าเว็บหรืออะไรก็ตามขนาดนี้ได้

  1. ทำการ block มันซ่ะด้วย iptables -A INPUT -s 125.26.30.221 -j DROP

และเพื่อให้มันทำงานอัตโนมัติ ลองเขียน Shell Script ดูนะครับ

ให้ดูอีก server อันนี้เพิ่งเปิดดูไม่เคลยเคลีย log โหดมั้ย

510505 58.8.57.90

14738 125.27.21.235

14403 125.27.24.200

12702 61.90.12.80

12666 118.173.234.168

ทำไมถึง Reload Nginx ไม่ได้ครับ ต้องแก้ยังไงครับ

ในทีสุดก็ทำได้จนได้. หลังจากทำแล้วพังมา 4 รอบ. ต้องขอขอบคุณ อ.ทุกท่านในกระทู้นี้ โดยเฉพาะ คุณ ems, น้องมีน, และเซียนอุ้ย. ลองแล้วลองอีกกว่าจะได้สุ่มเทสกับเว็บบน server ซึ่งส่วนมากเป็น joomla ใช้ได้ทั้ apache mod_rewrite และ rewrite ด้วย mod_php (นำหน้าด้วย index.php/sefurl) นี่อาจเป็นข้อดีที่พอจะมีของการ build php แบบ cli ก็ได้ผมไม่ต้องแก้อะไรให้ลูกค้าเลยใช้งานได้ตามปกติทันทีตั้งแต่สั่ง FW port ไป 85 ตอนแรกนึกว่าจะต้องมีอะไรจุกจิกให้แก้แต่ไม่มีเลย.

แต่ server ผมไม่ค่อยมีเว็บที่ใช้ static files หนัก ๆ เลยยังไม่เห็นความแตกต่างหลังจากใช้ nginx เท่าไหร่. process บน top ส่วนใหญ่เป็น httpd ตัว nginx ยังไม่มาก

เพิ่มเติมครับ

  1. ผมยังไม่ค่อยเข้าใจกับวัตถุประสงค์ของคำสั่ง crontab ตรง
crontab -e

* * * * * /usr/local/directadmin/scripts/nginx_task.sh

วานช่วยอธิบายหน่อยเพราะลองไม่ใส่ก็ทำงานได้ปกตินะครับ

  1. ใช้ xcache ก็ใช้งานได้ปกตินะครับ. รวมถึง suhosin patch & suhosin extension ก็ใช้ร่วมได้ไม่มีปัญหาใด ๆ

  2. ใครใช้ csf ก่อนสั่ง fw port ควร stop csf ก่อนนะครับ. ผมพังเพราะเรื่องนี้มา 4 รอบ. ทุกครั้งต้อง hard reboot หมด. พอสั่ง fw port แล้วค่อย start ขึ้นมาใหม่. และอย่าลืมเพิ่ม port 85 ใน tcp_in และ tcp_out ด้วยนะครับ.

ขอบคุณครับ

เออ พบปัญหาอย่างหนึ่งครับคือไม่สามารถเข้าหน้า server-status ของ apache ได้ (ขึ้น Forbidden). ดูได้แต่ nginx-status

ต้องแก่หรือเพิ่มค่าใน config ยังไงครับ

เอ่ ลองเปลี่ยน path server-status ใน httpd conf ดูครับ

ผมไม่มีปัญหานะ

ลองดูใหม่ครับ ผมก็เข้าได้บ้าง ไม่ได้บ้าง

nginx

50x Internal Server Error

สำหรับใช้ nginx กับ php / fastcgi นะครับ

และ

proxy_read_timeout 120;

proxy_connect_timeout 120;

เอาแปะไว้ครับ ^^

ขออนุญาติเอามาแปะไว้ครับ

ข้อความ เบิ้ล…

ไม่ให้มันเก็บข้อมูล access.log ทำยังไงครับ ผมลบบรรทัด access_log /var/log/nginx/access.log main; ออกจาก nginx.conf และ restart nginx แล้วมันก็ยังเก็บอยู่

#access_log /var/log/nginx/access.log main;

ใส่ # ไว้ข้างหน้าแล้วครับ restart nginx 1 รอบแล้วมาดูไฟล์ reffresh ดูเรื่อย ๆ มันก็ยังเก็บอยู่นะครับ.

access_log  off;

ขอบคุณครับ สำเร็จแล้ว

ขอบคุณค่ะ กำลังหาวิธีอยู่พอดีเลยค่ะ

สุดยอดครับ แต่ลงไม่เป็น 555+

ขอบคุณมากครับ ว่าแต่ มันเร็วขึ้นเห็นได้ชัดเลยหรอครับ

มีท่านใด เคยเจออาการ โหลดรูป ต่อเพ็จเยอะๆ หลายรูปต่อหน้า

แล้ว connection wait บางรูปโหลดนานไหมครับ


ปรับ keepalive_timeout 0;

หรือ 5-10

Thx@icez

มีท่านใดพอจะเคยเจออาการ iptables forward port nginx

ชอบหาย หรือ ยกเลิกเอง กลับมา port 80 ที่ apache บ้างไหมครับ

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 85

ตอนผมสั่ง ก็ลองสั่ง iptables save แล้ว

และเขียนลงไฟล์ rule ก็แล้ว

ลองสั่ง service restart ก็แล้ว

พอใช้ไปได้ระยะ ก็กลับมาที่ port 80 เหมือนเดิม

เหมือน rule ยกเลิกไปเอง

มีท่านใดเคยเจอบ้างไหมครับ

ขอบคุณครับ