ฉันจะดีบัก nginx มากกว่าบันทึกข้อผิดพลาดได้อย่างไร


34

ขณะนี้ฉันได้รับ HTTP ที่มีขนาดใหญ่พอสมควรในขณะนี้และทำให้ nginx reverse proxy ของฉันสร้างเกตเวย์ Bad 502

ฉันมีเซิร์ฟเวอร์ส่วนหน้าใช้ nginx เป็นพร็อกซีเซิร์ฟเวอร์ backend ของฉัน แต่มันเพิ่งได้รับconnect() failed (110: Connection timed out) while connecting to upstreamข้อผิดพลาดมากมาย ตันของพวกเขา ถ้าฉันข้ามพร็อกซีเซิร์ฟเวอร์เพื่อเชื่อมต่อกับแบ็กเอนด์ฉันสามารถเรียกใช้ไซต์ได้ดีดังนั้นฉันรู้ว่ามันอยู่ในพร็อกซีย้อนกลับที่อื่น อย่างไรก็ตามฉันไม่รู้ว่าจะระบุได้อย่างไรว่าทำไมถึงกำหนดเวลา

ความช่วยเหลือใด ๆ

ใช้งาน nginx 1.2.3 บน CentOS 6.2


คุณสามารถเริ่มต้นด้วยการอัพเดต Nginx เป็นเวอร์ชั่นล่าสุด ถึงแม้ว่าฉันไม่ได้ตระหนักถึงข้อผิดพลาดดังกล่าวใน 1.2.3
Ben Lessani - Sonassi

2
.... แล้วดูสิ่งใดก็ตามที่อ้างอิงการเชื่อมต่อจาก
NGINX

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

คุณกำลังเชื่อมต่อผ่านเครือข่ายส่วนตัว / สาธารณะกับแบ็กเอนด์หรือไม่? IP ของพร็อกซีมีรายการที่อนุญาตในไฟร์วอลล์ใด ๆ ddos ​​หรือเครื่องมือประเภท ip / จำกัด อัตราอื่น ๆ หรือไม่ netstat บนเซิร์ฟเวอร์ส่วนหลังมีลักษณะอย่างไร จำนวนการเชื่อมต่อเปิด MaxClients บนแบ็กเอนด์คืออะไร? คุณเหนื่อยเหรอ?
jeffatrackaid

คำตอบ:


19

ฉันสมมติว่าคุณได้แจ็คระดับการบันทึกข้อผิดพลาด Nginx ของคุณเพื่อแก้ไขข้อบกพร่องแล้ว ถ้าไม่เริ่มต้นที่นั่น

ทางออกที่ดีที่สุดของคุณอาจจะใช้straceเพื่อดูการเรียกระบบที่กำลังทำโดย Nginx โดยเฉพาะอย่างยิ่งคุณจะต้องใส่ใจกับการconnect()โทรและจับตาดูรหัสส่งคืนสินค้าเหล่านี้ ( man 2 connectสามารถเป็นเพื่อนของคุณได้ที่นี่)

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


37

มันไม่ได้มีความเชื่องช้ามากไปกว่านี้นอกจากคุณต้องการใส่โพรบ dtrace:

  1. ตั้งค่าระดับการบันทึกการดีบัก: /etc/nginx/nginx.conf:

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. ติดตั้ง tcpdump ในหน้าต่างอื่น:

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. ตรวจสอบไฟล์บันทึกในหน้าต่างอื่น:

    tail -f /var/log/nginx/*
    
  4. การเริ่มต้น nginx โต้ตอบกับ strace:

    # top of /etc/nginx/nginx.conf:
    
    daemon off; # todo testing remove me not for production use
    

    และจากนั้น

     $ strace nginx 
    

แก้จุดบกพร่องเพิ่มเติมสามารถมีกับ Nginx --with-debugรวบรวมกับ ตรวจสอบโดยใช้:

    nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug

โมดูลที่ดีอีกไม่ได้รวบรวมโดยเริ่มต้นคือ: HttpStubStatusModule ในทุกโอกาสการติดตั้งที่เหมาะสมจะต้องมีการรวบรวม nginx ที่กำหนดเอง (บรรจุภัณฑ์ที่แนะนำอย่างสูงโดยใช้เครื่องมือบรรจุภัณฑ์ของ distro)

สิ่งเหล่านี้ส่วนใหญ่ไม่เหมาะสมสำหรับการใช้งานจริงดูที่การคอมไพล์ nginx กับ gperf หากคุณต้องการสถิติเพิ่มเติม


ในขั้นตอนที่ 2 การทำงานต่อไปนี้สำหรับฉัน: tcpdump -i ใด ๆ ที่ไม่ใช่พอร์ต 22 -vvv -s0 -q -XXX
ccppjava

5

ดูเหมือนว่าคุณกำลังดีบักไซต์ปริมาณการใช้งานสูง

ใช้debugกับdebug_connectionคำสั่งเพื่อบันทึกข้อผิดพลาด nginx จะแสดงบันทึกการดีบักจาก IP ของคุณเท่านั้น

เมื่อคุณเริ่มเห็นบันทึกข้อผิดพลาดที่มีประโยชน์แทนที่จะเปิดใช้งานตัวเลือกการดีบักสำหรับการกำหนดค่า nginx ทั้งหมดให้เพิ่มerror_log /path/to/some/file/ debug;คำสั่งแยกต่างหากในlocation {..}บล็อกที่รับผิดชอบการเชื่อมต่อย้อนกลับ

วิธีนี้คุณจะสามารถแยกบันทึกข้อผิดพลาดการดีบักจาก IP ของคุณเท่านั้น

พยายามเชื่อมโยงกับคำขอที่คุณทำ (จากเบราว์เซอร์ของคุณ)

ตัวอย่างเช่นโปรดตรวจสอบ: https://easyengine.io/tutorials/nginx/debugging/

อีกระดับหนึ่งคุณสามารถใช้HttpEchoModuleของ Nginx ได้


2

ฉันไม่เคยพบว่า Nginx เป็นคอขวดในกรณีส่วนใหญ่มันมีความสามารถมากกว่าปลายด้านหลัง แต่ถ้าคุณทดสอบโดยไม่ใช้ Nginx และไม่พบข้อผิดพลาดมันจะเป็นอย่างใดอย่างหนึ่ง (หรือทั้งสองอย่าง):

  1. ปัญหาการกำหนดค่า Nginx
    1. ค่าการหมดเวลาอัปสตรีมผิด
    2. URL โพรบไม่ถูกต้องในอัปสตรีม
    3. คนงานน้อยเกินไป
    4. เป็นต้น
  2. คอขวด TCP / IP ระบบปฏิบัติการ
    1. อาจเป็นไปได้ว่าตัวพร็อกซีเองนั้นก่อให้เกิดการซ้ำซ้อนของพอร์ตและสถานะเปิด ไม่ว่าจะเป็นไฟล์อธิบายพอร์ตการเชื่อมต่อ TCP

หากไม่เห็นการกำหนดค่า Nginx ของคุณจะไม่มีใครสามารถแสดงความคิดเห็นกับอดีตได้ และหากไม่มีเอาต์พุตที่เหมาะสมจากระบบปฏิบัติการจะไม่มีใครสามารถแสดงความคิดเห็นได้ในภายหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.