เคลือบเงา "ข้อผิดพลาด FetchError ไม่มีการเชื่อมต่อส่วนหลัง"


11

Varnishlog:

    0 CLI          - Rd ping
    0 CLI          - Wr 200 19 PONG 1340829925 1.0
   12 SessionOpen  c 79.124.74.11 3063 :80
   12 SessionClose c EOF
   12 StatSess     c 79.124.74.11 3063 0 1 0 0 0 0 0 0
    0 CLI          - Rd ping
    0 CLI          - Wr 200 19 PONG 1340829928 1.0
    0 CLI          - Rd ping
    0 CLI          - Wr 200 19 PONG 1340829931 1.0
   12 SessionOpen  c 108.62.115.226 46211 :80
   12 ReqStart     c 108.62.115.226 46211 467185881
   12 RxRequest    c GET
   12 RxURL        c /
   12 RxProtocol   c HTTP/1.0
   12 RxHeader     c User-Agent: Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)
   12 RxHeader     c Host: www.mysite.com
   12 VCL_call     c recv lookup
   12 VCL_call     c hash
   12 Hash         c /
   12 Hash         c www.mysite.com
   12 VCL_return   c hash
   12 VCL_call     c miss fetch
   12 FetchError   c no backend connection
   12 VCL_call     c error deliver
   12 VCL_call     c deliver deliver
   12 TxProtocol   c HTTP/1.1
   12 TxStatus     c 503
   12 TxResponse   c Service Unavailable
   12 TxHeader     c Server: Varnish
   12 TxHeader     c Content-Type: text/html; charset=utf-8
   12 TxHeader     c Retry-After: 5
   12 TxHeader     c Content-Length: 418
   12 TxHeader     c Accept-Ranges: bytes
   12 TxHeader     c Date: Wed, 27 Jun 2012 20:45:31 GMT
   12 TxHeader     c X-Varnish: 467185881
   12 TxHeader     c Age: 1
   12 TxHeader     c Via: 1.1 varnish
   12 TxHeader     c Connection: close
   12 Length       c 418
   12 ReqEnd       c 467185881 1340829931.192433119 1340829931.891024113 0.000051022 0.698516846 0.000074035
   12 SessionClose c error
   12 StatSess     c 108.62.115.226 46211 1 1 1 0 0 0 256 418
    0 CLI          - Rd ping
    0 CLI          - Wr 200 19 PONG 1340829934 1.0
    0 CLI          - Rd ping
    0 CLI          - Wr 200 19 PONG 1340829937 1.0

netstat -tlnp
 Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      3086/nginx      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1915/varnishd   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1279/sshd       
tcp        0      0 127.0.0.2:25            0.0.0.0:*               LISTEN      3195/sendmail: MTA:
tcp        0      0 127.0.0.2:6082          0.0.0.0:*               LISTEN      1914/varnishd   
tcp        0      0 127.0.0.2:9000          0.0.0.0:*               LISTEN      1317/php-fpm.conf)
tcp        0      0 127.0.0.2:3306          0.0.0.0:*               LISTEN      1192/mysqld     
tcp        0      0 127.0.0.2:587           0.0.0.0:*               LISTEN      3195/sendmail: MTA:
tcp        0      0 127.0.0.2:11211         0.0.0.0:*               LISTEN      3072/memcached  
tcp6       0      0 :::8080                 :::*                    LISTEN      3086/nginx      
tcp6       0      0 :::80                   :::*                    LISTEN      1915/varnishd   
tcp6       0      0 :::22                   :::*                    LISTEN      1279/sshd  

/ etc / Nginx / เว็บไซต์ที่เปิดใช้งาน / เริ่มต้น

server {
    listen   8080; ## listen for ipv4; this line is default and implied
    listen   [::]:8080 default ipv6only=on; ## listen for ipv6

    root /usr/share/nginx/www;
    index index.html index.htm index.php;

    # Make site accessible from http://localhost/
    server_name localhost;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to index.html
        try_files $uri $uri/ /index.html;
    }

    location /doc {
        root /usr/share;
        autoindex on;
        allow 127.0.0.2;
        deny all;
    }

    location /images {
        root /usr/share;
        autoindex off;
    }

    #error_page 404 /404.html;

    # redirect server error pages to the static page /50x.html
    #
    #error_page 500 502 503 504 /50x.html;
    #location = /50x.html {
    #   root /usr/share/nginx/www;
    #}

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #   proxy_pass http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass 127.0.0.2:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #   deny all;
    #}
}

/etc/nginx/sites-enabled/www.mysite.com.vhost

server {
       listen 8080;
       server_name www.mysite.com mysite.com.net;
       root /var/www/www.mysite.com/web;
       if ($http_host != "www.mysite.com") {
                 rewrite ^ http://www.mysite.com$request_uri permanent;
       }
       index index.php index.html;
       location = /favicon.ico {
                log_not_found off;
                access_log off;
       }
       location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
       }
       # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
       location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
       }
       location / {
                try_files $uri $uri/ /index.php?$args;
       }
       # Add trailing slash to */wp-admin requests.
       rewrite /wp-admin$ $scheme://$host$uri/ permanent;
       location ~*  \.(jpg|jpeg|png|gif|css|js|ico)$ {
                expires max;
                log_not_found off;
       }
       location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass 127.0.0.2:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       }

include /var/www/www.mysite.com/web/nginx.conf;
       location ~ /nginx.conf {
                deny all;
                access_log off;
                log_not_found off;
       }

}

/etc/varnish/default.vcl

# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
# 
# Default backend definition.  Set this to point to your content
# server.
# 
backend default {
    .host = "127.0.0.2";
    .port = "8080";
    # .connect_timeout = 600s;
    #.first_byte_timeout = 600s;
    # .between_bytes_timeout = 600s;
    # .max_connections = 800;

หมายเหตุ: การไม่ใส่หมายเหตุตัวเลือกสี่ตัวเลือกสุดท้ายที่ default.vcl ไม่ได้สร้างความแตกต่าง


cat / etc / default / วานิช

# Configuration file for varnish
#
# /etc/init.d/varnish expects the variables $DAEMON_OPTS, $NFILES and $MEMLOCK
# to be set from this shell script fragment.
#

# Should we start varnishd at boot?  Set to "yes" to enable.
START=yes

# Maximum number of open files (for ulimit -n)
NFILES=131072

# Maximum locked memory size (for ulimit -l)
# Used for locking the shared memory log in memory.  If you increase log size,
# you need to increase this number as well
MEMLOCK=82000

# Default varnish instance name is the local nodename.  Can be overridden with
# the -n switch, to have more instances on a single server.
INSTANCE=$(uname -n)

# This file contains 4 alternatives, please use only one.

## Alternative 1, Minimal configuration, no VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# content server on localhost:8080.  Use a 1GB fixed-size cache file.
#
# DAEMON_OPTS="-a :6081 \
#              -T localhost:6082 \
#        -b localhost:8080 \
#        -u varnish -g varnish \
#            -S /etc/varnish/secret \
#        -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"


## Alternative 2, Configuration with VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request.  Use a 1GB
# fixed-size cache file.
#
DAEMON_OPTS="-a :80 \
             -T 127.0.0.2:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s file,/var/lib/varnish/$INSTANCE/varnish_storage.bin,1G"

หากคุณต้องการข้อมูลอื่น ๆ แจ้งให้เราทราบ ฉันหมดความคิดไปแล้วว่าปัญหาคืออะไร


ส่วนหัวของขดให้ฉันนี้:

curl -v -I -H "Testing: Test header so you see this works" http://www.mysite.com:8080
* About to connect() to www.mysite.com port 8080 (#0)
*   Trying 176.31.158.78... connected
* Connected to www.mysite.com (176.31.158.78) port 8080 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
> Host: www.mysite.com:8080
> Accept: */*
> Testing: Test header so you see this works
> 
< HTTP/1.1 301 Moved Permanently
HTTP/1.1 301 Moved Permanently
< Server: nginx/1.0.5
Server: nginx/1.0.5
< Date: Thu, 28 Jun 2012 11:01:23 GMT
Date: Thu, 28 Jun 2012 11:01:23 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 184
Content-Length: 184
< Connection: keep-alive
Connection: keep-alive
< Location: http://www.mysite.com/
Location: http://www.mysite.com/

< 
* Connection #0 to host www.mysite.com left intact
* Closing connection #0

2
ลองเปิดใช้งานการลงคะแนนแบ็กเอนด์ varnish-cache.org/trac/wiki/BackendPolling nginx ส่งคืนเนื้อหาของคุณหรือไม่หากคุณกดโดยตรงที่พอร์ต 8080 ด้วย curl หรือ wget
สันติภาพ

ครั้งสุดท้ายที่ฉันเห็นสิ่งนี้ปัญหาคือ SELinux echo 0 >/selinux/enforceเป็นแบบทดสอบที่พยายามที่จะปิด: หากคุณยืนยันว่าเป็นปัญหาคุณสามารถกำหนดข้อยกเว้นaudit2allowได้
cyberx86

มีบางอย่างใน nginx error_log? อาจจะเป็นข้อผิดพลาด 503? และใน mysite.com.vhost ให้ลองลบบรรทัดที่ 5, 6 และ 7 จากนั้นลองอีกครั้งเพื่อเข้าถึง
Skamasle

ใช้งานได้กับ malloc แทนที่จะเป็นไฟล์หรือไม่? คุณอาจต้องปิด} ในไฟล์ vcl ของคุณ
Grizly

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

คำตอบ:


1

ฉันมีปัญหาที่คล้ายกันเมื่อพยายามทดสอบวานิชเฉพาะที่ด้วยแบ็กเอนด์ที่แตกต่างกัน ใช้127.0.0.1:8080งานได้ดี แต่เปลี่ยนพอร์ตเพื่อ8081ให้ฉัน 503 แม้ว่าแบ็กเอนด์นั้นทำงานได้อย่างสมบูรณ์แบบสำหรับฉันนอกวานิช

ปัญหาเกิดจาก SELinux ไม่อนุญาตการเชื่อมต่อ ฉันพบว่าโดยการปรับแต่งบันทึกการตรวจสอบและกระตุ้น 503 จากวานิช:

$ sudo tail -f /var/log/audit/audit.log type=AVC msg=audit(1539253067.438:1379): avc: denied { name_connect } for pid=10154 comm="varnishd" dest=8081 scontext=system_u:system_r:varnishd_t:s0 tcontext=system_u:object_r:transproxy_port_t:s0 tclass=tcp_socket

หากต้องการดูพอร์ตที่อนุญาตโดย SELinux จากวานิชคุณสามารถใช้คำสั่งนี้:

$ sudo semanage port -l | grep http_cache_port_t http_cache_port_t tcp 8080, 8118, 8123, 10001-10010

ในการแก้ไขปัญหาคุณสามารถใช้พอร์ตอื่นเช่น8118หรือขอให้ SELinux อนุญาตการเชื่อมต่อ8081จากวานิช

คำสั่งเพื่อเพิ่มพอร์ตคือ - -aธงคือการเพิ่มพอร์ต:

semanage port -a -t http_cache_port_t -p tcp 8081

หากคุณได้รับข้อความแจ้งให้คุณทราบว่ามีการกำหนดพอร์ตไว้แล้วคุณต้องแก้ไขแทนที่จะเพิ่มพอร์ต:

ValueError: Port tcp/8081 already defined

คำสั่งสลับ-aแฟล็กสำหรับ-m- 'แก้ไข':

semanage port -m -t http_cache_port_t -p tcp 8081


0

คุณควรลองเข้าสู่ระบบด้วยผู้ใช้วานิชและทดสอบการเชื่อมต่อลงในแบ็กเอนด์ Nginx (127.0.0.2:8080) ด้วย curl หรือ wget เพื่อให้แน่ใจว่าทำงานได้อย่างที่คาดไว้

ดังที่ cyberx86 กล่าวไว้ในความคิดเห็นอาจเป็นปัญหา SELinux (หรือโมดูลความปลอดภัยอื่น ๆ เช่น apparmor, grsec, ฯลฯ ) ไม่อนุญาตการเชื่อมต่อระหว่างบริการและคุณควรตรวจสอบบันทึกการตรวจสอบเพื่อให้แน่ใจว่ามันไม่ได้เกิดขึ้นในเซิร์ฟเวอร์ของคุณ .

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


0

วานิชกำลังรับข้อมูลล่วงหน้าและควรฟังพอร์ต 80 ข้อมูลจากวานิชเป็นพร็อกซีไปยัง Nginx ซึ่งฟังพอร์ต 8080

กำหนดค่า Nginx

server {
    listen 800;
    server_name www.example.com
}

Varnish Config - sudo nano / etc / default / varnish

DAEMON_OPTS="-a :80 \               #note on port 80 here
         -T localhost:6082 \
         -f /etc/varnish/default.vcl \
         -S /etc/varnish/secret \
         -s malloc,256m"

จากนั้นนี่คือ Varnish proxy config ไปที่พอร์ต 8080 (Nginx) - sudo nano /etc/varnish/default.vcl

backend default {
.host = "127.0.0.1";
.port = "8080";
}

0

ผมเคยมีข้อผิดพลาดเดียวกันในการกำหนดค่าหลายเว็บไซต์และไม่ใช่ www เพื่อเปลี่ยนเส้นทางโดเมน www เป็นปัญหา นี่คือวิธีที่ฉันกำหนดค่า (ส่วนที่เกี่ยวข้อง)

ในของคุณ.vclเป็นsub vcl_recv

vcl 4.0;

sub vcl_recv {
    #THIS IS THE IMPORTANT POINT
    #redirect non www to www domains ip no subdomain defined
    if (req.http.host ~ "^([-0-9a-zA-Z]+)\.([a-zA-Z]+)$") {
       return (synth (750, ""));
    }

    # Normalize the header, remove the port
    set req.http.host = regsub(req.http.host, ":[0-9]+", "");

    #OFTEN SHIPS WITH THIS OTHER ONE, COMMENT IT OTHERWISE IT WILL FAIL
    #set req.http.Host = regsub(req.http.Host, "^www\.", "");

    # For the sake of example, a couple of custom backends, 
    # note www is specified in the req.http.host
    if (req.http.host ~ "foo.example.tld") {
         set req.backend_hint = example;
    }
     elseif (req.http.host ~ "www.other.com") {
         set req.backend_hint = other;
    }

จากนั้นsub vcl_synthให้เพิ่มสิ่งนี้:

sub vcl_synth {
    if (resp.status == 750) {
        #redirect non www to www
        set resp.status = 301;
        set resp.http.Location = "http://www." + req.http.host + req.url;
        return(deliver);
    }

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

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

#server {
#        listen 1.2.3.4:8080;
#        server_name example.tld;
#        return 301 http://www.example.tld;
#}

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