เชื่อมต่อ () ล้มเหลว (111: การเชื่อมต่อถูกปฏิเสธ) ขณะเชื่อมต่อกับอัปสตรีม


85

ฉันพบ502 Gatewayข้อผิดพลาดเมื่อเข้าถึงไฟล์ PHP ในไดเรกทอรี ( http://example.com/dev/index.php) บันทึกนั้นบอกว่า:

2011/09/30 23:47:54 [error] 31160#0: *35 connect() failed (111: Connection refused) while connecting to upstream, client: xx.xx.xx.xx, server: domain.com, request: "GET /dev/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "domain.com"

ฉันไม่เคยมีประสบการณ์แบบนี้มาก่อน วิธีการแก้ไข502 Gatewayข้อผิดพลาดประเภทนี้คืออะไร?

นี่คือnginx.conf:

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

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

1
'การเชื่อมต่อถูกปฏิเสธ' หมายความว่าแบ็กเอนด์ไม่ฟังพอร์ต 9000 หรือคิวเต็ม ปัญหานี้เกี่ยวข้องกับแบ็กเอนด์ itsef คุณสามารถ telnet localhost 9000 ได้หรือไม่ คุณควรตรวจสอบแบ็กเอนด์และไฟล์บันทึก php ของคุณด้วย
Andrew

อัปเดตโพสต์ของฉัน ฉันไม่สามารถ telnet ไปยัง localhost 9000
MacMac

ข้อผิดพลาดเดียวกันที่ฉันกำลังเผชิญกับคุณนี่คือคำอธิบายลิงก์ที่นี่สามารถช่วยคุณได้
Tripathi29

คำตอบ:


43

ดูเหมือนว่าคุณยังไม่ได้เริ่มและกำหนดค่าแบ็กเอนด์สำหรับ Nginx เริ่มphp-fpmและเพิ่มสิ่งต่อไปนี้nginx.confในhttpบริบท:

server {
    listen 127.0.0.1;
    server_name localhost;

    error_log /var/log/nginx/localhost.error_log info;

    root /var/www/localhost/htdocs;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

        fastcgi_intercept_errors        on;
        error_page 404 /error/404.php;
    }
}

3
ขอบคุณผู้ชายมันใช้งานได้ฉันไม่ได้php-fpmติดตั้ง ไชโย
MacMac

6
คุณเป็นอัจฉริยะบริสุทธิ์ ฉันไม่อยากจะเชื่อเลยว่ามีผู้แนะนำ 1,0000,000 ล้านคนที่ฉันอ่านเกี่ยวกับเรื่องนี้ไม่มีใครกล่าวถึงว่าคุณจะต้องใส่ "Listen 127.0.0.1" เพื่อเปิดใช้งานแบ็กเอนด์ คุณช่วยฉันจากฝันร้าย !!!

คุณควรพิจารณาใช้ซ็อกเก็ตยูนิกซ์ ดูด้วยnetstat -lและดู/var/run/php5-fpm.sock(การกำหนดค่านี้โดยปกติจะอยู่ใน /etc/php5/fpm/pool.d/www.conf. fastcgi_pass unix:<socket>
JohannesM

2
คุณจะต้องอยู่ภายในlisten = /var/run/php5-fpm.sock /etc/php5/fpm/pool.d/www.confแต่คุณจะต้องการและlisten = 9000 ;listen = /var/run/php5-fpm.sockถ้าคุณเป็นเหมือนฉัน (หรืออีกวิธีหนึ่งคุณสามารถฟังคำใบ้ที่ชาญฉลาดโดย JohannesM ซึ่งฉันคิดว่าจะทำให้คุณมีบางอย่างที่เหมือนfastcgi_pass unix:/var/run/php5-fpm.sock;อยู่ในคุณnginx.conf)
n611x007

มีปัญหาเดียวกันกับ php 7.2 คุณหมายถึงอะไรโดยการเพิ่มไฟล์ในบริบท httpd นี่จะเป็นไฟล์ conf เพิ่มเติมใน / etc / nginx / sites-available / folder หรือไม่
PeterKA

47

คำตอบนี้มีไว้สำหรับผู้ที่ได้รับข้อผิดพลาดเช่นนี้เท่านั้น:

เชื่อมต่อ () ล้มเหลว (111: การเชื่อมต่อถูกปฏิเสธ) ขณะเชื่อมต่อกับอัปสตรีมไคลเอ็นต์ .... fastcgi: // [:: 1]: 9000

เขียนค่า nginx ของคุณเพื่อใช้ ip ไม่ใช่ dns ตัวอย่างเช่น127.0.0.1แทนที่จะเป็นlocalhostหรือลบ alias ของ ipv6 ออกจาก / etc / hosts


3
คุณชี้ของฉันไปในทิศทางที่ถูกต้อง! ฉันใช้เพียงแค่listen 80ก็ดี (และมีตัวอย่างมากมายที่มี) แต่ฉันไม่คิดว่าโดยนัยที่อยู่ทั้ง IPv4 ( 127.0.0.1) และ IPv6 ( [::1])
glarrain

5
ผมต้องเปลี่ยนจากการlisten 80 default_server listen 0.0.0.0:80
givanse

คุณช่วยชี้ให้เห็นว่าทำไมสิ่งนี้ถึงช่วยได้?
ไกเซอร์

1
เป็นส่วนใหญ่การแจกแจงลินุกซ์มีการเปิดใช้งาน ipv6 ในระบบเครือข่าย แต่ไม่ได้แพ็คเก็ตทั้งหมดที่กำหนดค่าสำหรับการใช้งาน ipv6 ในความเห็นของฉันเมื่อ nginx เริ่มต้นการเชื่อมต่อกับ upstream ตัวแก้ไขระบบจะส่งคืนที่อยู่ ipv6 ก่อน Php-fpm (centos 7.x) ไม่มีการตั้งค่าดังกล่าวจากกล่อง และไกด์ส่วนใหญ่อธิบายทั้งหมดในเวอร์ชัน ipv4 โดยลืมเกี่ยวกับฟิวเจอร์สของ ipv6 ที่ควรปิดการใช้งานหรือใช้งาน
Quake1TF

Whooah ดังนั้น [:: 1] เป็นที่อยู่ localhost IPv6! :) ขอบคุณ!
lechup

4

มีข้อผิดพลาดเช่นนี้เช่นกัน ปัญหาคือแบ็กเอนด์ที่เป็นนามธรรมของฉันอ้างอิงเซิร์ฟเวอร์สองเครื่อง php-fpmเป็นรายการเฉพาะในซ็อกเก็ต ...

# Upstream to abstract backend connection(s) for php
upstream php {
        server unix:/var/run/php5-fpm.sock;
        #server 127.0.0.1:9000;
} 

server {
    [...]

    location ~ \.php$ {
            # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

            # With php5-fpm:
            fastcgi_pass php;
            fastcgi_index index.php;
            fastcgi_intercept_errors on;
            include fastcgi_params;
    }
}

1

มีปัญหาเดียวกันกับคำขอพร็อกซีไปยังเซิร์ฟเวอร์โหนดที่รับฟังพอร์ต 5000 การร้องขอจะส่งผลด้วย200 OKแต่บางครั้งก็502 Bad Gatewayสุ่ม NGINX พบข้อผิดพลาด:

connect() failed (111: Connection refused) while connecting to upstream, client: ..., server: ...

ทางออกของฉัน:

  1. ตั้งค่าเซิร์ฟเวอร์ HTTP ของโหนดเพื่อฟังอย่างเคร่งครัดสำหรับ ipv4 โดยรวม localhost เป็นโฮสต์:server.listen(5000, 'localhost');
  2. ลบคำสั่ง ipv6 Listen ใด ๆ ( listen [::]:80;หรือlisten [::]:443 ssl default_server;)
  3. เปลี่ยนตำแหน่งบล็อก proxy_pass เพื่อใช้ IP: proxy_pass http://127.0.0.1:5000(ไม่proxy_pass http://localhost:5000)

หวังว่านี่จะช่วยใครซักคน


0

ในกรณีของฉันข้อผิดพลาดเป็นตำแหน่งที่ไม่ดีสำหรับไฟล์ error_log สำหรับบริการ php5.6-fpm และบริการphp-fpm ไม่สามารถเริ่มต้นได้และnginx ไม่สามารถเชื่อมต่อกับมันได้ คุณสามารถค้นหาได้ใน/etc/php/5.6/fpm/php.ini(คุณสามารถแทนที่ 5.6 ด้วยรุ่นที่คุณใช้งานอยู่)


-1

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


-4

ฉันมีปัญหาเดียวกันและเพิ่มคำสั่งฟัง

listen 127.0.0.1;

ทำงานให้ฉัน

น่าสนใจพอฉันมีบล็อกเซิร์ฟเวอร์อื่น ๆ ที่ทำงานค่อนข้างมีความสุขหากไม่มีสิ่งนี้!


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