NGINX: อัปสตรีมหมดเวลา (110: หมดเวลาการเชื่อมต่อ) ขณะอ่านส่วนหัวการตอบกลับจากต้นน้ำ


130

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

อัปสตรีมหมดเวลา (110: หมดเวลาการเชื่อมต่อ) ขณะอ่านส่วนหัวการตอบสนองจากต้นน้ำ

หากฉันสอบถามต้นน้ำโดยตรงโดยไม่ใช้ nginx proxy ด้วยคำขอเดียวกันฉันจะได้รับข้อมูลที่ต้องการ

การหมดเวลาของ Nginx จะเกิดขึ้นเมื่อใส่พร็อกซี

**nginx.conf**

http {
    keepalive_timeout 10m;
    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    include /etc/nginx/sites-enabled/*.conf;
}

**virtual host conf**

upstream ss_api {
  server 127.0.0.1:3000 max_fails=0  fail_timeout=600;
}

server {
  listen 81;
  server_name xxxxx.com; # change to match your URL

  location / {
    # match the name of upstream directive which is defined above
    proxy_pass http://ss_api; 
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache cloud;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_cache_bypass $http_authorization;
    proxy_cache_bypass http://ss_api/account/;
    add_header X-Cache-Status $upstream_cache_status;
  }
}

Nginx มีคำสั่งการหมดเวลามากมาย ฉันไม่รู้ว่าฉันพลาดสิ่งสำคัญไปหรือเปล่า ความช่วยเหลือใด ๆ จะขอบคุณมาก ....


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

คำตอบ:


47

สิ่งนี้เกิดขึ้นเนื่องจากต้นน้ำของคุณใช้เวลามากเกินไปในการตอบคำขอและ NGINX คิดว่าต้นน้ำล้มเหลวในการประมวลผลคำขอแล้วดังนั้นจึงตอบสนองด้วยข้อผิดพลาด เพียงรวมและเพิ่ม proxy_read_timeout ในlocationconfig block สิ่งเดียวกันเกิดขึ้นกับฉันและฉันใช้การหมดเวลา 1 ชั่วโมงสำหรับแอปภายในที่ทำงาน:

proxy_read_timeout 3600;

ด้วยวิธีนี้ NGINX จะรอหนึ่งชั่วโมง (3600 วินาที) เพื่อให้ต้นน้ำส่งคืนบางสิ่ง


6
โปรดทราบว่าการมีproxy_read_timeoutในส่วนhttpอาจไม่ช่วยอะไร ฉันมีproxy_passคำสั่งในส่วนตำแหน่งและมีเพียงการproxy_read_timeoutตั้งค่าเท่านั้นที่สร้างความแตกต่าง (nginx
1.16.0

ดูเหมือนว่าจะทำงานใน http / เซิร์ฟเวอร์ / ตำแหน่งสำหรับฉัน ... อาจมีการเปลี่ยนแปลงบางอย่าง :)
rogerdpack

39

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

ฉันแก้ไขปัญหานี้ได้โดยการล้างแฟล็กการเชื่อมต่อที่ยังมีชีวิตอยู่และระบุเวอร์ชัน http ตามคำตอบที่นี่: https://stackoverflow.com/a/36589120/479632

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;

        # these two lines here
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://localhost:5000;
    }
}

น่าเสียดายที่ฉันไม่สามารถอธิบายได้ว่าเหตุใดจึงใช้งานได้และไม่สามารถถอดรหัสได้จากเอกสารที่กล่าวถึงในคำตอบที่เชื่อมโยงกันดังนั้นหากใครมีคำอธิบายฉันจะสนใจฟังมาก


1
เหตุใดคุณจึงไม่ปรับเปลี่ยนproxy_read_timeoutหากคุณทราบว่าพร็อกซี (แม้ว่าจะเป็น URL ที่เฉพาะเจาะจง) ต้องใช้เวลาในการประมวลผลมากขึ้น
Josh M.

Hi! ฉันจำปัญหาไม่ได้อีกต่อไป แต่ฉันคิดว่ามันไม่เกี่ยวข้องกับเวลาจริงสำหรับ url แต่เนื่องจากการหมดเวลาไม่ได้รับการประมวลผลอย่างถูกต้องหากไม่มีการตั้งค่าเหล่านี้
Almund

@magicbacon เมื่อหลายปีก่อนดังนั้นฉันแทบจะจำคดีนี้ไม่ได้อีกต่อไป แต่คุณเปลี่ยน$http_hostใช่มั้ย? ฉันเดาว่าคงไม่บินเพื่อ https อาจจำเป็นต้องมีการตั้งค่าเพิ่มเติมสำหรับคำขอพร็อกซี https ด้วย
Almund

+1 ... ดูเหมือนว่าเป็นการแฮ็กที่น่าอึดอัด แต่จริงๆแล้วนี่มาจากเอกสารอย่างเป็นทางการ :) nginx.org/en/docs/http/ngx_http_upstream_module.html#keepaliveฉันมีปัญหาที่แตกต่างกันเล็กน้อย "อัปสตรีมปิดการเชื่อมต่อก่อนกำหนดขณะอ่านคำตอบ ส่วนหัวจากต้นน้ำ "เมื่อฉันใช้คำสั่งต้นน้ำกับ keepalive และการใช้สองบรรทัดนี้ดูเหมือนจะแก้ไขได้
Karussell

1
@TimDavis ฉันเห็นอาจจะดีกว่านี้ ฉันเดาว่ามันอาจขึ้นอยู่กับปริมาณการใช้งานเช่นในโพสต์นี้บอกว่าจำเป็นสำหรับ WebSockets: serverlab.ca/tutorials/linux/web-servers-linux/…
Almund

26

ก่อนอื่นให้พิจารณาว่าอัปสตรีมใดที่ชะลอตัวโดยปรึกษาไฟล์บันทึกข้อผิดพลาด nginx และปรับเวลาอ่านให้เหมาะสมในกรณีของฉันมันเร็ว CGI

2017/09/27 13:34:03 [error] 16559#16559: *14381 upstream timed out (110: Connection timed out) while reading response header from upstream, client:xxxxxxxxxxxxxxxxxxxxxxxxx", upstream: "fastcgi://unix:/var/run/php/php5.6-fpm.sock", host: "xxxxxxxxxxxxxxx", referrer: "xxxxxxxxxxxxxxxxxxxx"

ดังนั้นฉันต้องปรับ fastcgi_read_timeout ในการกำหนดค่าเซิร์ฟเวอร์ของฉัน

 location ~ \.php$ {
     fastcgi_read_timeout 240;
     ...
 }

ดู: โพสต์ต้นฉบับ


ต่อไปนี้เป็นวิธีเพิ่มข้อมูลเวลาในการดูว่าคุณ "ต้องการ" เพิ่มมากแค่ไหนใน: stackoverflow.com/questions/18627469/… FWIW
rogerdpack

10

ในกรณีของคุณการเพิ่มประสิทธิภาพเล็กน้อยในพร็อกซีหรือคุณสามารถใช้ "# การตั้งค่าการหมดเวลา"

location / 
{        

  # time out settings
  proxy_connect_timeout 159s;
  proxy_send_timeout   600;
  proxy_read_timeout   600;
  proxy_buffer_size    64k;
  proxy_buffers     16 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_pass_header Set-Cookie;
  proxy_redirect     off;
  proxy_hide_header  Vary;
  proxy_set_header   Accept-Encoding '';
  proxy_ignore_headers Cache-Control Expires;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Host   $host;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

สำหรับฉันมันสร้างความแตกต่างเมื่อมีการตั้งค่าเหล่านี้ในส่วนตำแหน่ง การมีพวกเขาในส่วนhttpไม่ได้ช่วยอะไร (น่าจะเป็นเพราะฉันมีproxy_passในส่วนตำแหน่งด้วย
JonnyJD

คุณกำลังปรับให้เหมาะสมกับการประกาศเหล่านี้อย่างไร
Vlad

9

ฉันคิดว่าข้อผิดพลาดนี้อาจเกิดขึ้นได้จากหลายสาเหตุ แต่อาจเกิดขึ้นเฉพาะกับโมดูลที่คุณใช้ ตัวอย่างเช่นฉันเห็นสิ่งนี้โดยใช้โมดูล uwsgi จึงต้องตั้งค่า "uwsgi_read_timeout"


2
ฉันคิดว่า uwsgi_read_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; เหมาะกับฉัน
tyan

9

ฉันอยากจะแนะนำให้ดูerror_logsโดยเฉพาะที่ส่วนต้นน้ำซึ่งจะแสดงต้นน้ำเฉพาะที่หมดเวลา

จากนั้นก็ขึ้นอยู่กับว่าคุณสามารถปรับproxy_read_timeout, หรือfastcgi_read_timeoutuwsgi_read_timeout

ตรวจสอบให้แน่ใจว่าได้โหลด config ของคุณแล้ว

รายละเอียดเพิ่มเติมที่นี่Nginx upstream หมดเวลา (ทำไมและวิธีแก้ไข)


4

ดังที่คนอื่น ๆ กล่าวไว้ที่นี่การเพิ่มการตั้งค่าระยะหมดเวลาสำหรับ NGINX สามารถแก้ปัญหาของคุณได้

อย่างไรก็ตามการเพิ่มการตั้งค่าการหมดเวลาของคุณอาจไม่ตรงไปตรงมาอย่างที่หลาย ๆ คำตอบแนะนำ ตัวฉันเองประสบปัญหานี้และพยายามเปลี่ยนการตั้งค่าการหมดเวลาในไฟล์/etc/nginx/nginx.confตามที่เกือบทุกคนในหัวข้อเหล่านี้แนะนำ สิ่งนี้ไม่ได้ช่วยฉันเลยสักนิด ไม่มีการเปลี่ยนแปลงที่ชัดเจนในการตั้งค่าการหมดเวลาของ NGINX หลายชั่วโมงต่อมาในที่สุดฉันก็สามารถแก้ไขปัญหานี้ได้

วิธีแก้ปัญหาอยู่ในเธรดฟอรัมนี้และสิ่งที่กล่าวคือคุณควรตั้งค่าการหมดเวลาใน/etc/nginx/conf.d/timeout.conf (และหากไม่มีไฟล์นี้คุณควรสร้างขึ้นมา) ฉันใช้การตั้งค่าเดียวกับที่แนะนำในเธรด:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

1

ฉันมีปัญหาเดียวกันและพบว่ามีข้อผิดพลาด "ทุกวัน" ในตัวควบคุมราง ฉันไม่รู้ว่าทำไม แต่ในการผลิต puma เรียกใช้ข้อผิดพลาดซ้ำแล้วซ้ำอีกทำให้เกิดข้อความ:

อัปสตรีมหมดเวลา (110: หมดเวลาการเชื่อมต่อ) ขณะอ่านส่วนหัวการตอบสนองจากต้นน้ำ

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

ตรวจสอบไฟล์ log / puma.stderr.log ของคุณเพื่อดูว่าเป็นสถานการณ์หรือไม่


0

จากฝั่งเราใช้ spdy กับพร็อกซีแคช เมื่อแคชหมดอายุเราจะได้รับข้อผิดพลาดนี้จนกว่าแคชจะได้รับการอัปเดต


0

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


0

สำหรับการproxy_upstreamหมดเวลาฉันลองใช้การตั้งค่าข้างต้น แต่ไม่ได้ผล

การตั้งค่าresolver_timeoutใช้ได้ผลสำหรับฉันโดยทราบว่าต้องใช้เวลา 30 วินาทีในการสร้างข้อความการหมดเวลาต้นน้ำ เช่นme.atwibble.com ไม่สามารถแก้ไขได้ (110: การดำเนินการหมดเวลา)

http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver_timeout

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