Score:2

ข้อผิดพลาด Nginx - 110: การเชื่อมต่อหมดเวลาขณะเชื่อมต่อกับอัปสตรีม (django-python)

ธง ae

ข้อผิดพลาดคือ

2021/08/18 8:57:28 [ข้อผิดพลาด] 19915#19915: *36133 อัปสตรีมหมดเวลา (110: การเชื่อมต่อหมดเวลา) ขณะเชื่อมต่อกับอัปสตรีม ไคลเอนต์: 10.11.12.1(proxy-ip) เซิร์ฟเวอร์: example.com คำขอ: "GET /static/css/bootstrap.min.css HTTP/1.1", อัปสตรีม: "http://127.0.0.1:8000/static/css/bootstrap.min.css", โฮสต์: "www.example .com"

คำอธิบายสั้น ๆ ของข้อผิดพลาด

เว็บไซต์ทำงานได้ดีเสมอ แต่บางครั้งมีข้อผิดพลาดข้างต้นซึ่งฉันคิดว่าเกิดจากการเข้าชมเว็บไซต์สูง เมื่อเว็บไซต์ล่ม เว็บไซต์จะไม่ปรากฏขึ้นทันทีหลังจากรีสตาร์ท nginx และหัวหน้างานก็เช่นกัน

บางครั้งจะใช้เวลา 5 ถึง 6 ชั่วโมงกว่าที่ไซต์จะขึ้นมา

เซิร์ฟเวอร์ - Ubuntu-18.04 LTS

การกำหนดค่าเว็บเซิร์ฟเวอร์ดังต่อไปนี้

ฉันมีพร็อกซีเซิร์ฟเวอร์และแอปพลิเคชันเซิร์ฟเวอร์

  1. พร็อกซีเซิร์ฟเวอร์ - nginx

  2. แอปพลิเคชันเซิร์ฟเวอร์ - เรียกใช้ nginx & (หัวหน้างาน - แอปพลิเคชัน django)

  3. พร็อกซีเซิร์ฟเวอร์ -nginx-config.php

     เซิร์ฟเวอร์ {
    
         ฟัง 443 ssl http2;
         ssl_certificate /etc/nginx/ssl/bundle.crt;
         ssl_certificate_key /etc/nginx/ssl/start.example.com.key;
         server_name example.com www.example.com ;
         สถานที่ = /basic_status {
         stub_status;
         access_log off;
         อนุญาต 1.2.3.4;
         ปฏิเสธทั้งหมด
         }
         ที่ตั้ง /{
    
         proxy_connect_timeout 300;
         proxy_send_timeout 300;
         proxy_read_timeout 300;
         send_timeout 300;
         proxy_pass http://10.11.12.2; #proxy ไปยังเซิร์ฟเวอร์แอปพลิเคชัน
         proxy_http_version 1.1;
         การเชื่อมต่อ proxy_set_header "";
         add_header Access-Control-Allow-Origin .example.com;
         add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" เสมอ;
         add_header X-XSS-การป้องกัน "1; mode=block";
         add_header "Pragma" "ไม่มีแคช"; 
         proxy_set_header โฮสต์ $http_host;
         proxy_set_header อัพเกรด $http_upgrade;
         proxy_set_header การเชื่อมต่อ "อัพเกรด";
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
         proxy_set_header X-Scheme $scheme;
    
         #add_header เนื้อหา-ความปลอดภัย-นโยบาย "default-src 'unsafe-inline' 'self'; script-src 'unsafe-inline' 'self' ";
         error_page 404 /404.html;
         สถานที่ = /404.html {
         รูท /var/www/error;
         ภายใน;
         }
         error_page 500 502 503 504 /500.html;
         ตำแหน่ง = /500.html {
         รูท /usr/share/nginx/html;
         ภายใน;
         }
    
     }
    
  4. เซิร์ฟเวอร์แอปพลิเคชัน - nginx

    เซิร์ฟเวอร์ {
             ฟัง 80 default_server;
             ฟัง [::]:80 default_server;
             server_name example.com www.example.com;
    
             ที่ตั้ง /{
    
                 proxy_pass http://127.0.0.1:8000;
                 proxy_read_timeout 180;
    
             }                                                                                                                    
      }
    
  5. แอปพลิเคชันเซิร์ฟเวอร์ - หัวหน้างาน

     [โปรแกรม:พอร์ทัล]
     command =/root/portal_env/bin/gunicorn portal.wsgi:application -b 0.0.0.0:8000 --timeout 180 --workers=3 ;
     ผู้ใช้ = รูท ; ผู้ใช้ที่จะเรียกใช้เป็น
     ไดเรกทอรี = /root/portal_env/portal
     stdout_logfile = /root/portal_env/logs/portal.log ; ตำแหน่งที่จะเขียนข้อความบันทึก
     redirect_stderr = จริง ; บันทึก stderr ในบันทึกเดียวกัน
     เริ่มอัตโนมัติ = จริง
     รีสตาร์ทอัตโนมัติ = จริง
     สภาพแวดล้อม = LANG = en_US.UTF-8,LC_ALL = en_US.UTF-8 ; ตั้งค่า UTF-8 เป็นการเข้ารหัสเริ่มต้น
    
Michael Hampton avatar
cz flag
ตรวจสอบบันทึกการสมัครของคุณ
Score:0
ธง us

ก่อนอื่น ฉันจะมาพร้อมกับคำติชมสำหรับการตั้งค่าของคุณ

เมื่อคุณสร้างแอปพลิเคชัน Python ไม่แนะนำให้ใช้ gunicorn เป็นเซิร์ฟเวอร์โฮสต์ สร้างขึ้นสำหรับการพัฒนา คุณปิดใช้ uWSGI สำหรับแอปพลิเคชัน Python ของคุณ

ต่อไป เมื่อคุณใช้พร็อกซีใน NGINX ฉันจะแนะนำให้คุณปิดใช้งานการบัฟเฟอร์สำหรับพร็อกซีของคุณ

ปิด proxy_buffering;

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

หลังจากข้อเสนอแนะของฉันดูเหมือนว่าคุณมีบางอย่างในรหัสของคุณเพียงแค่วนซ้ำและไม่หยุดหรือคุณมีการเชื่อมต่อ / เคียวรี SQL lonnnnnnnng ซึ่งใช้เวลามากกว่า 3 นาทีในการดำเนินการ

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

Python ปกติใช้เวลาไม่ถึง 3 นาทีในการรันพื้นที่สคริปต์/โค้ด ดังนั้นมันจึงดูเหมือนบริการภายนอก เช่น ฐานข้อมูล, API หรือบางอย่างในกรณีนี้

เมื่อคุณเปิดใช้งานการบันทึกที่ช้าสำหรับฐานข้อมูลของคุณ กรณีที่สองจะสร้างบันทึกอย่างง่ายสำหรับสคริปต์ของคุณด้วย "เวลาเริ่มต้น" + "เวลาสิ้นสุด" และดัมพ์ด้วยเมธอด/หน้า/url ที่มีการกดปุ่มบริเวณนี้และดัมพ์ เป็นไฟล์เพื่อให้คุณสามารถเปิดได้ง่าย จะทำงานล่าช้าใน 5-6 ชั่วโมงในขณะที่คุณพูดถึงหรือนานกว่านั้นเพื่อตรวจจับข้อผิดพลาดของคุณ

ฉันคิดว่ามันเป็นวิธีที่ดีที่สุด ปัญหาแรกคือการหาสาเหตุที่โค้ดของคุณใช้เวลา 3 นาทีในการดำเนินการ

chjp avatar
ae flag
สวัสดี Paris ค้นพบโค้ดได้อย่างไรโดยใช้เวลา 3 นาทีในการดำเนินการ ฉันใส่ไทม์เอาต์ 180 เพื่อแก้ปัญหาแบ็คเอนด์ไทม์เอาต์
ParisNakitaKejser avatar
us flag
มันขึ้นอยู่กับว่าโค้ดของคุณเป็นอย่างไร คุณต้องวิเคราะห์โค้ดของคุณว่ามันทำอะไรและคุณมีการเชื่อมต่อภายนอกแบบใด ฟังดูเหมือนสต็อกในการเชื่อมต่อ ฉันเดาว่าเป็นการเชื่อมต่อ MySQL สำหรับสิ่งนี้ คุณต้องเพิ่มการเข้าสู่ระบบช้าในไฟล์ my.cnf ของคุณ คุณสามารถอ่านเพิ่มเติมในเอกสาร mysql เกี่ยวกับเรื่องนี้หากวิธีนี้ไม่ได้ผล คุณสามารถแนะนำให้เปิดใช้งานการบันทึกสำหรับ django projcet ของคุณและพิมพ์ไปยังเทอร์มินัลด้วยเวลา "เริ่มต้น / สิ้นสุด" สำหรับทุกคำขอ
chjp avatar
ae flag
สวัสดีปารีส ขอบคุณสำหรับความช่วยเหลือ ใช่ มีการเชื่อมต่อ mysql db กับรหัส django และเกี่ยวกับบันทึกเพื่อค้นหาเวลาเริ่มต้นและสิ้นสุดของคำขอทุกรายการคือรหัสนี้ที่คุณหมายถึงเวลานำเข้า start_time = time.time() หลัก() พิมพ์ ("--- %s วินาที ---" % (time.time() - start_time))
ParisNakitaKejser avatar
us flag
จากนั้นก็อยู่ต่อจนกว่าคุณจะเจอปัญหาอีกครั้งและดูว่าเกิดอะไรขึ้น :) ฉันรู้เมื่อคุณมีข้อมูลเพิ่มเติม

โพสต์คำตอบ

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