ข้อผิดพลาด nginx“ recv () ล้มเหลว (104: การเชื่อมต่อรีเซ็ตโดยเพียร์) ในขณะที่อ่านหัวข้อการตอบสนองจากต้นน้ำ”


44

ฉันมีเซิร์ฟเวอร์ที่ใช้งานได้จนถึงวันที่ 3 ตุลาคม 2556 เวลา 10:50 น. เมื่อมันเริ่มส่งคืนข้อผิดพลาด "502 Bad Gateway" เป็นระยะ ๆ ให้กับลูกค้า

การร้องขอเบราว์เซอร์ประมาณ 4 จาก 5 ประสบความสำเร็จ แต่ประมาณ 1 ใน 5 ล้มเหลวด้วย 502

บันทึกข้อผิดพลาด nginx มีข้อผิดพลาดหลายร้อยรายการ

2013/10/05 06:28:17 [error] 3111#0: *54528 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 66.249.66.75, server: www.bec-components.co.uk  request: ""GET /?_n=Fridgefreezer/Hotpoint/8591P;_i=x8078 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.bec-components.co.uk"

อย่างไรก็ตามบันทึกข้อผิดพลาด PHP ไม่มีข้อผิดพลาดที่ตรงกัน

มีวิธีรับ PHP เพื่อให้ข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่รีเซ็ตการเชื่อมต่อหรือไม่

นี่คือnginx.conf;

user              www-data;
worker_processes  4;
error_log         /var/log/nginx/error.log;
pid               /var/run/nginx.pid;

events {
   worker_connections  1024;
}

http {
  include          /etc/nginx/mime.types;
  access_log       /var/log/nginx/access.log;

  sendfile               on;
  keepalive_timeout      30;
  tcp_nodelay            on;
  client_max_body_size   100m;

  gzip         on;
  gzip_types   text/plain application/xml text/javascript application/x-javascript text/css;
  gzip_disable "MSIE [1-6]\.(?!.*SV1)";

  include /gvol/sites/*/nginx.conf;

}

และนี่คือ.confสำหรับเว็บไซต์นี้

server {

  server_name   www.bec-components.co.uk bec3.uk.to bec4.uk.to bec.home;
  root          /gvol/sites/bec/www/;
  index         index.php index.html;

  location ~ \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires        2592000;   # 30 days
    log_not_found  off;
  }

  ## Trigger client to download instead of display '.xml' files.
  location ~ \.xml$ {
    add_header Content-disposition "attachment; filename=$1";
  }

   location ~ \.php$ {
      fastcgi_read_timeout  3600;
      include               /etc/nginx/fastcgi_params;
      keepalive_timeout     0;
      fastcgi_param         SCRIPT_FILENAME  $document_root$fastcgi_script_name;
      fastcgi_pass          127.0.0.1:9000;
      fastcgi_index         index.php;
   }
}

## bec-components.co.uk ##
server {
   server_name   bec-components.co.uk;
   rewrite       ^/(.*) http://www.bec-components.co.uk$1 permanent;
}

ในวันนั้นมีอะไรเปลี่ยนแปลง อัปเดตแอปพลิเคชันหรือ PHP ของคุณหรือไม่ แอปพลิเคชันของคุณคืออะไร คุณเปิดใช้งานการดีบักใน php-fpm หรือไม่
Pothi Kalimuthu

ไม่มีอะไรเปลี่ยนแปลงในวันนั้น การกำหนดค่าเซิร์ฟเวอร์ไม่เปลี่ยนแปลงและไม่มีสคริปต์ PHP ใด ๆ มันไม่ได้ออกจากพื้นที่ดิสก์ แอปพลิเคชันของฉันเป็นเพียงชุดPHPสคริปต์ ฉันไม่ได้ใช้php-fpmฉันแค่php-fastcgiทำphp-cgi -b 127.0.0.1:9000ตาม มันใช้งานได้โดยไม่มีข้อผิดพลาดเป็นเวลา 3 ปี ฉันไม่สามารถอธิบายได้ว่าทำไมมันถึงพัฒนาปัญหานี้
Nigel Alderton

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

บริการอัปสตรีมของคุณ ( php-cgi -b 127.0.0.1:9000) ไม่ทำงานเป็นระยะอาจเป็นผลมาจากปริมาณการใช้งานที่เพิ่มขึ้นและการขาดทรัพยากร
LinuxDevOps

คำตอบ:


22

ฉันมักจะเชื่อใจถ้าเว็บเซิร์ฟเวอร์ของฉันกำลังบอกฉัน: 502 Bad Gateway

  • เวลาในการทำงานของ fastcgi / nginx ของคุณคืออะไร?
  • คุณตรวจสอบการเชื่อมต่อเครือข่ายหรือไม่
  • คุณสามารถยืนยัน / ปฏิเสธการเปลี่ยนแปลงของผู้เข้าชม - นับรอบวันนั้นได้หรือไม่?

มันหมายความว่าอะไร:

  • คุณ fastcgi กระบวนการไม่สามารถเข้าถึงได้โดย nginx; ช้าหรือไม่สอดคล้องเลย เกตเวย์ที่ไม่ดีหมายถึง: nginx ไม่สามารถ fastcgi_pass ไปยัง ressource ที่กำหนดไว้ 127.0.0.1:9000; ที่ว่าช่วงเวลาที่เฉพาะเจาะจงมาก

  • บันทึกข้อผิดพลาด inital ของคุณบอกได้ทั้งหมด:

.

recv() failed 
    -> nginx failed

(104: Connection reset by peer) while reading response header from upstream, 
    -> no complete answer, or no answer at all
upstream: "fastcgi://127.0.0.1:9000", 
    -> who is he, who failed???

จาก pov จำกัด ของฉันฉันขอแนะนำ:

  • รีสตาร์ท fastcgi_process / เซิร์ฟเวอร์ของคุณ
  • ตรวจสอบบันทึกการเข้าถึงของคุณ
  • เปิดใช้งานการดีบัก - บันทึก

ตกลง. เว็บเซิร์ฟเวอร์ของฉันบอกอะไรฉัน
ไนเจลอัลเดอ

ดูการแก้ไขของฉัน (มันหมายความว่าอย่างไร)
ชายคนนั้นจากที่นั่น

2
ฉันเห็นแล้วดังนั้นGatewayในกรณีนี้คือเซิร์ฟเวอร์ PHP ขอขอบคุณ.
Nigel Alderton

restart your fastcgi_process / serverเป็นสิ่งที่ช่วยฉันได้
realtebo

11

ฉันรู้ว่าหัวข้อนี้เก่า แต่ก็ยังคงปรากฏขึ้นเป็นครั้งคราวดังนั้นเพื่อค้นหาคำตอบบนเว็บฉันมาด้วยความเป็นไปได้สามประการต่อไปนี้:

  1. ข้อผิดพลาดในการเขียนโปรแกรมบางครั้ง segfaulting php-fpm ซึ่งหมายความว่าการเชื่อมต่อกับ nginx จะถูกตัด โดยปกติจะทำให้มีการบันทึกอย่างน้อยและ / หรือการทิ้งขยะหลักซึ่งสามารถวิเคราะห์เพิ่มเติมได้
  2. ด้วยเหตุผลบางอย่าง, PHP ไม่ได้เป็นความสามารถในการเขียนไฟล์เซสชั่น (ตามปกติsession.save_path = "/var/lib/php/sessions") นี่อาจเป็นสิทธิ์ที่ไม่ถูกต้องความเป็นเจ้าของที่ไม่ดีผู้ใช้ / กลุ่มที่ไม่ดีหรือปัญหาที่ลึกลับ / ไม่ชัดเจนเช่นหมด inodes ในไดเรกทอรีนั้น (หรือแม้แต่ดิสก์เต็ม!) โดยทั่วไปจะไม่ปล่อยให้มีการทิ้งแกนหลักไว้มากมายและอาจไม่มีอะไรเกิดขึ้นในบันทึกข้อผิดพลาดของ PHP
  3. ยิ่งยากต่อการแก้ไขปัญหา: ส่วนขยายทำงานผิดปกติ (บางครั้งอาจมีข้อ จำกัด ภายในหรือข้อผิดพลาดที่ไม่ได้เปิดตลอดเวลา) แยกกันและทำกระบวนการ php-fpm ด้วย - ดังนั้นจึงปิดการเชื่อมต่อกับ nginx . ผู้ร้ายตามปกติคือ APC, memcache / d ฯลฯ (ในกรณีของฉันคือส่วนขยายของที่ระลึกใหม่) ดังนั้นความคิดที่นี่คือการปิดส่วนขยายแต่ละรายการจนกว่าข้อผิดพลาดจะหายไป

+1 ในกรณีของฉันมันเป็น # 1 - ข้อผิดพลาดในการเขียนโปรแกรม
Nimbuz

เราพบข้อผิดพลาดนี้และปิดใช้งานส่วนขยาย PHP ใหม่ Relic APM พบข้อผิดพลาดเฉพาะเพิ่มเติมที่อนุญาตให้เราติดตามปัญหา: [29-Jan-2018 16:47:48 UTC] ข้อผิดพลาดร้ายแรงของ PHP: ขนาดหน่วยความจำที่อนุญาต 805306368 ไบต์ หมดแล้ว (พยายามจัดสรร 262144 ไบต์) ในผู้ขาย / magento / module-configurable- ผลิตภัณฑ์ / การกำหนดราคา / ราคา / ConfigurableRegularPrice.php ในบรรทัด 142 [29-Jan-2018 16:47:48 UTC] PHP ข้อผิดพลาดร้ายแรง: อนุญาตขนาดหน่วยความจำของ 805306368 ไบต์หมดไป (พยายามจัดสรร 323584 ไบต์) ใน Unknown on line 0 ฉันเดาว่า New Relic สำลักในเส้นทาง "ไม่ทราบ"
Erik Hansen

7

เก็บไว้รับนี้เช่นกัน แก้ไขได้โดยเพิ่มopcacheขีด จำกัด หน่วยความจำหากคุณใช้ (เปลี่ยนเป็น APC) ดูเหมือนว่า PHP-FPM จะตัดการเชื่อมต่อเมื่อใดก็ตามที่แคชเต็มเกินไป นี่เป็นเหตุผลที่คำตอบของ shgnInc แก้ไขได้ในเวลาอันสั้น

ดังนั้นค้นหาไฟล์/etc/php5/fpm/php.ini(หรือเทียบเท่าในการกระจายของคุณ) และเพิ่มmemory_consumptionระดับให้กับไซต์ของคุณที่ต้องการ การปิดใช้งานopcacheอาจทำงานได้เช่นกัน

[opcache]
opcache.memory_consumption = 196 

2

คุณอาจต้องการพิจารณาคอมไพล์นี้ใน github: https://gist.github.com/amichaelgrant/90d99d7d5d48bf8fd209

ฉันพบสถานการณ์ที่คล้ายกันเมื่อฉันตรวจสอบบันทึกข้อผิดพลาดสำหรับเซิร์ฟเวอร์อัปสตรีมของฉันพวกเขารายงานข้อผิดพลาด ulimit ดังนั้นฉันจึงเพิ่มเป็น 1000000 (ทั้งในกล่อง upstream และ nginx) และทุกอย่างทำงานได้ดี


2

ในกรณีที่มีปัญหาเดียวกันฉันเพิ่งเริ่มphp-fpmบริการใหม่เพื่อแก้ไข

sudo service php5-fpm restart

หรือบางครั้งปัญหานี้เกิดขึ้นเนื่องจากคำขอจำนวนมาก โดยค่าเริ่มต้นpm.max_requestsใน php5-fpm อาจเป็น 100 หรือต่ำกว่า

เพื่อแก้ปัญหาเพิ่มมูลค่าขึ้นอยู่กับคำขอของเว็บไซต์ของคุณเช่น 500

และหลังจากที่คุณต้องรีสตาร์ทบริการ


2

ในกรณีของฉันการปิดใช้งานส่วนขยายxdebugช่วยได้


เหมือนกัน, ในกรณีของฉันฉันตั้งเงื่อนไขสำหรับเบรกพอยต์และในขณะนั้นฉันปิดใช้งาน breackpoint ข้อผิดพลาดได้หายไป
roman204

1

ฉันเพิ่งมีปัญหาที่คล้ายกัน:

คุณเชื่อมต่อกับ php-fpm บนพอร์ต 9000 (fastcgi: //127.0.0.1: 9000)

การกำหนดค่ามาตรฐานบน Ubuntu บนเซิร์ฟเวอร์ของฉันคือ:

/etc/php/7.0/fpm/pool.d/www.conf:

listen = /run/php/php7.0-fpm.sock

คุณต้องเปลี่ยนสิ่งนี้เป็น:

listen = 0.0.0.0:9000

ในกรณีของฉันฉันอัปเดตเซิร์ฟเวอร์ของฉัน 1 1/2 เดือนที่ผ่านมาเขียนทับการกำหนดค่า costom ของฉันด้วยค่าเริ่มต้น ตอนนี้มีการรีสตาร์ท php-fpm ข้อผิดพลาดนี้จะมีผลกับความล่าช้า


1

สำหรับฉันมันเป็นเซิร์ฟเวอร์ที่ไม่มีหน่วยความจำและ php-fpm ถูกฆ่าโดย OOM killer วิธีแก้ไขคือเพิ่มปริมาณหน่วยความจำเซิร์ฟเวอร์


1

สำหรับฉันมันเป็นเพราะ php-fpm นั้นมาถึงmax_childrenขีด จำกัด บันทึก php-fpm สำหรับกลุ่มที่มีปัญหาชี้ให้ฉันไปในทิศทางที่ถูกต้อง


0

ปัญหานี้อาจเกิดขึ้นหากกระบวนการ PHP-FPM เกินขีด จำกัด หน่วยความจำที่จัดสรร เมื่อเกิดเหตุการณ์นี้เชื่อมต่อระหว่าง NGINX และ PHP-FPM ถูกตัดขาดและ NGINX 502 Bad Gatewayส่งกลับ memory_limitตัวแปรจำกัด หน่วยความจำกระบวนการ PHP-FPM ถูกควบคุมโดยตัวแปร สามารถตั้งค่าได้php_admin_value[memory_limit]ในไฟล์กำหนดค่า PHP-FPM

มันเป็นสิ่งสำคัญที่จะทราบว่าขีด จำกัด ของหน่วยความจำที่มีผลบังคับใช้ในต่อสคริปต์พื้นฐาน ด้วยnกระบวนการ PHP-FPM memory_limit * nการใช้งานหน่วยความจำทั้งหมดจะขึ้นอยู่กับ ตรวจสอบให้แน่ใจว่าเครื่องของคุณมีหน่วยความจำเพียงพอ

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