Score:0

วานิชไม่เปิดการเชื่อมต่อส่วนหลัง

ธง us

ฉันจะเชื่อมต่อคอนเทนเนอร์วานิชกับคอนเทนเนอร์ PHP-FPM + NGINX ได้อย่างไร นักเทียบท่าเริ่มต้นอย่างถูกต้อง ไซต์ใช้งานได้ แต่บันทึกแบ็กเอนด์เปิดว่างเปล่า

แบ็กเอนด์ทำงานได้ดี (ส่งคืนสถานะ HTTP 200)

varnishlog -g ดิบ -i Backend_health

0 Backend_health - ค่าดีฟอลต์ยังคงปกติ 4---X-RH 7 5 10 0.048069 0.065633 "HTTP/1.1 200 ตกลง"

จากคอนเทนเนอร์ http (nginx) ฉันเห็นคำขอในบันทึกนักเทียบท่า

บันทึกนักเทียบท่า http

[10/ก.ย./2021:17:24:01 +0000] "GET /health_check.php HTTP/1.1" 200 5 "-" "-"

แต่การเชื่อมต่อแบ็กเอนด์ไม่เปิดการเชื่อมต่อ บันทึกว่างเปล่า ตรวจสอบผ่าน: varnishlog -i แบ็กเอนด์เปิด สั่งการ. ฉันได้ลองวิธีแก้ปัญหาจากไซต์นี้แล้ว แต่ไม่ได้ผล: Php+Nginx+วานิชบน docker-compose, ubuntu18.

นักเทียบท่า-compose.yml

http:
    สร้าง:
    บริบท: นักเทียบท่า/http
    ชื่อคอนเทนเนอร์: http
    พอร์ต:
       - 80:80
       - 443:443
    ขึ้นอยู่กับ:
       - php
    ปริมาณ:
        - ./project:/var/www/project

php:
    สร้าง:
        บริบท: นักเทียบท่า/php.ini
    ชื่อคอนเทนเนอร์: php.ini
    working_dir: /var/www/project
    ปริมาณ:
        - ./project:/var/www/project

    
วานิช:
    สร้าง:
    บริบท: นักเทียบท่า/วานิช
    container_name: วานิช
    พอร์ต:
       - 6081:6081
       - 6082:6082

การกำหนดค่า VCL:

vcl 4.0;

นำเข้ามาตรฐาน;

แบ็กเอนด์เริ่มต้น {
    .host = "http";
    .port = "80";
    .first_byte_timeout = 600s;
    .probe = {
        #.url = "/health_check.php";
        .request =
                    "รับ /health_check.php HTTP/1.1"
                    "โฮสต์: http"
                    "การเชื่อมต่อ: ปิด";
        .timeout = 2 วินาที;
        .interval = 5 วินาที;
        .window = 10;
        .threshold = 5;
   }
}

ล้าง acl {
    "http";
}

ย่อย vcl_recv {
    ถ้า (req.restarts > 0) {
        ตั้ง req.hash_always_miss = จริง;
    }

    ถ้า (req.method == "PURGE") {
        ถ้า (client.ip !~ ล้าง) {
            กลับ (synth (405, "วิธีการที่ไม่ได้รับอนุญาต"));
        }
        # หากต้องการใช้ส่วนหัว X-Pool เพื่อล้างสารเคลือบเงาในระหว่างการปรับใช้อัตโนมัติ ตรวจสอบให้แน่ใจว่าส่วนหัวของ X-Pool
        # ถูกเพิ่มในการตอบกลับในการกำหนดค่าเซิร์ฟเวอร์ส่วนหลังของคุณ ตัวอย่างเช่นสิ่งนี้ใช้โดย the
        # capistrano-magento2 gem สำหรับการล้างเนื้อหาเก่าออกจากสารเคลือบเงาในระหว่างการปรับใช้รูทีน
        ถ้า (!req.http.X-Magento-Tags-Pattern && !req.http.X-Pool) {
            กลับ (synth (400, "X-Magento-Tags-Pattern หรือ X-Pool header ต้องการ"));
        }
        ถ้า (req.http.X-Magento-Tags-Pattern) {
          ห้าม ("obj.http.X-Magento-Tags ~" + req.http.X-Magento-Tags-Pattern);
        }
        ถ้า (req.http.X-Pool) {
          ห้าม ("obj.http.X-Pool ~" + req.http.X-Pool);
        }
        กลับ (synth (200, "Purged"));
    }

    ถ้า (req.method != "GET" &&
        req.method != "หัว" &&
        req.method != "ใส่" &&
        req.method != "โพสต์" &&
        req.method != "ติดตาม" &&
        req.method != "ตัวเลือก" &&
        req.method != "ลบ") {
          /* ไม่ใช่ RFC2616 หรือ CONNECT ซึ่งแปลก */
          กลับ (ท่อ);
    }

    # เราจัดการกับ GET และ HEAD ตามค่าเริ่มต้นเท่านั้น
    ถ้า (req.method != "GET" && req.method != "HEAD") {
        กลับ (ผ่าน);
    }

    # บายพาสตะกร้าสินค้าและชำระเงิน
    ถ้า (req.url ~ "/checkout") {
        กลับ (ผ่าน);
    }

    # ข้ามคำขอตรวจสุขภาพ
    ถ้า (req.url ~ "/pub/health_check.php") {
        กลับ (ผ่าน);
    }

    # ตั้งค่าสถานะการใช้งานระยะเวลาผ่อนผันเริ่มต้น
    กำหนด req.http.grace = "ไม่มี";

    # ทำให้ URL เป็นมาตรฐานในกรณีของโครงร่าง HTTP และโดเมนชั้นนำ
    ตั้ง req.url = regsub(req.url, "^http[s]?://", "");

    # รวบรวมคุกกี้ทั้งหมด
    std.collect (req.http.Cookie);

    #ตัวกรองการบีบอัด ดู https://www.varnish-cache.org/trac/wiki/FAQ/Compression
    ถ้า (req.http.Accept-Encoding) {
        ถ้า (req.url ~ "\.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf|flv)$") {
            #ไม่มีประเด็นในการบีบอัดสิ่งเหล่านี้
            unset req.http.Accept-Encoding;
        } elsif (req.http.Accept-Encoding ~ "gzip") {
            ตั้ง req.http.Accept-Encoding = "gzip";
        } elsif (req.http.Accept-Encoding ~ "deflate" && req.http.user-agent !~ "MSIE") {
            ตั้ง req.http.Accept-Encoding = "deflate";
        } อื่น {
            # อัลกอริทึมที่ไม่รู้จัก
            unset req.http.Accept-Encoding;
        }
    }

    # ลบพารามิเตอร์รับการตลาดทั้งหมดเพื่อลดวัตถุแคช
    if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=" ) {
        set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|fbclid|mc_[a-z]+|utm_[a-z]+|_bta_[a-z]+)=[- _A-z0-9+()%.]+&?", "");
        ตั้ง req.url = regsub(req.url, "[?|&]+$", "");
    }

    # แคชไฟล์คงที่
    ถ้า (req.url ~ "^/(pub/)?(สื่อ|คงที่)/") {
        # ไม่ควรแคชไฟล์สแตติกเป็นค่าเริ่มต้น
        กลับ (ผ่าน);

        # แต่ถ้าคุณใช้โลแคลไม่กี่แห่งและไม่ได้ใช้ CDN คุณสามารถเปิดใช้งานการแคชไฟล์แบบสแตติกได้โดยการแสดงความคิดเห็นในบรรทัดก่อนหน้า (#return (pass);) และยกเลิกการแสดงความคิดเห็นใน 3 บรรทัดถัดไป
        #unset req.http.Https;
        #unset req.http.X-Forwarded-Proto;
        #unset req.http.Cookie;
    }

    # คำขอ GraphQL ที่รับรองความถูกต้องไม่ควรถูกแคชโดยค่าเริ่มต้น
    ถ้า (req.url ~ "/graphql" && req.http.Authorization ~ "^Bearer") {
        กลับ (ผ่าน);
    }

    กลับ (แฮช);
}

ย่อย vcl_hash {
    ถ้า (req.http.cookie ~ "X-Magento-Vary=") {
        hash_data(regsub(req.http.cookie, "^.*?X-Magento-Vary=([^;]+);*.*$", "\1"));
    }

    # เพื่อให้แน่ใจว่าผู้ใช้ http ไม่เห็นคำเตือน ssl
    ถ้า (req.http.X-Forwarded-Proto) {
        hash_data (req.http.X-Forwarded-Proto);
    }
    

    ถ้า (req.url ~ "/graphql") {
        เรียก process_graphql_headers;
    }
}

กระบวนการย่อย_graphql_headers {
    ถ้า (req.http.Store) {
        hash_data (req.http.Store);
    }
    ถ้า (req.http.Content-Currency) {
        hash_data (req.http.Content-Currency);
    }
}

ย่อย vcl_backend_response {

    ตั้ง beresp.grace = 3d;

    ถ้า (beresp.http.content-type ~ "ข้อความ") {
        ตั้ง beresp.do_esi = จริง;
    }

    ถ้า (bereq.url ~ "\.js$" || beresp.http.content-type ~ "ข้อความ") {
        ตั้ง beresp.do_gzip = จริง;
    }

    ถ้า (beresp.http.X-Magento-Debug) {
        ตั้ง beresp.http.X-Magento-Cache-Control = beresp.http.Cache-Control;
    }

    # แคชตอบสนองสำเร็จและ 404 เท่านั้น
    ถ้า (beresp.status != 200 && beresp.status != 404) {
        ตั้ง beresp.ttl = 0s;
        ตั้ง beresp.uncacheable = จริง;
        ส่งคืน (ส่งมอบ);
    } elsif (beresp.http.Cache-Control ~ "ส่วนตัว") {
        ตั้ง beresp.uncacheable = จริง;
        ตั้ง beresp.ttl = 86400s;
        ส่งคืน (ส่งมอบ);
    }

    # ตรวจสอบว่าเราจำเป็นต้องแคชและป้องกันไม่ให้ตั้งค่าคุกกี้
    ถ้า (beresp.ttl > 0 วินาที && (bereq.method == "GET" || bereq.method == "HEAD")) {
        ยกเลิกการตั้งค่า beresp.http.set-cookie;
    }

   # หากเพจไม่สามารถแคชได้ ให้ข้ามการเคลือบเงาเป็นเวลา 2 นาทีเป็น Hit-For-Pass
   ถ้า (beresp.ttl <= 0s ||
       beresp.http.Surrogate-control ~ "ไม่มีร้านค้า" ||
       (!beresp.http.Surrogate-ควบคุม &&
       beresp.http.Cache-Control ~ "ไม่มีแคช|ไม่มีที่เก็บ") ||
       beresp.http.Vary == "*") {
        # ทำเครื่องหมายเป็น Hit-For-Pass ในอีก 2 นาทีข้างหน้า
        ตั้ง beresp.ttl = 120s;
        ตั้ง beresp.uncacheable = จริง;
    }

    ส่งคืน (ส่งมอบ);
}

ย่อย vcl_deliver {
    ถ้า (resp.http.X-Magento-Debug) {
        ถ้า (resp.http.x-วานิช ~ " ") {
            ตั้งค่า resp.http.X-Magento-Cache-Debug = "HIT";
            ตั้ง resp.http.Grace = req.http.grace;
        } อื่น {
            ตั้งค่า resp.http.X-Magento-Cache-Debug = "MISS";
        }
    } อื่น {
        ยกเลิกการตั้งค่า resp.http.Age;
    }

    # ไม่ให้เบราว์เซอร์แคชไฟล์ที่ไม่คงที่
    ถ้า (resp.http.Cache-Control !~ "private" && req.url !~ "^/(pub/)?(media|static)/") {
        ตั้ง resp.http.Pragma = "ไม่มีแคช";
        ตั้ง resp.http.Expires = "-1";
        ตั้งค่า resp.http.Cache-Control = "ไม่มีที่เก็บ, ไม่มีแคช, ต้องตรวจสอบความถูกต้องใหม่, max-age=0";
    }

    ยกเลิกการตั้งค่า resp.http.X-Magento-Debug;
    ยกเลิกการตั้งค่า resp.http.X-Magento-Tags;
    ยกเลิกการตั้งค่า resp.http.X-Powered-By;
    ยกเลิกการตั้งค่า resp.http.Server;
    unset resp.http.X-วานิช;
    unset resp.http.Via;
    ยกเลิกการตั้งค่า resp.http.Link;
}

ย่อย vcl_hit {
    ถ้า (obj.ttl >= 0 วินาที) {
        # เข้าชมภายในระยะเวลา TTL
        ส่งคืน (ส่งมอบ);
    }
    ถ้า (std.healthy(req.backend_hint)) {
        ถ้า (obj.ttl + 300s > 0s) {
            # เข้าชมหลังจาก TTL หมดอายุ แต่อยู่ในระยะเวลาผ่อนผัน
            ตั้ง req.http.grace = "ปกติ (เซิร์ฟเวอร์ปกติ)";
            ส่งคืน (ส่งมอบ);
        } อื่น {
            # เข้าชมหลังจาก TTL และวันหมดอายุ
            กลับ (รีสตาร์ท);
        }
    } อื่น {
        # เซิร์ฟเวอร์ไม่แข็งแรง เรียกคืนจากแคช
        กำหนด req.http.grace = "ไม่จำกัด (เซิร์ฟเวอร์ไม่แข็งแรง)";
        ส่งคืน (ส่งมอบ);
    }
}

Score:0
ธง in

ลองวิ่ง varnishlog -g คำขอ -q "ReqUrl eq '/'" เพื่อดูว่าเกิดอะไรขึ้นเมื่อขอหน้าแรก

หากคุณใช้คำสั่งนี้เมื่อแคชว่างเปล่า เราควรเห็นความพยายามของวานิชในการเชื่อมต่อกับแบ็กเอนด์

โปรดแบ่งปันเอาต์พุต VSL ที่นี่ แล้วฉันจะช่วย

อัปเดต

ฉันสังเกตเห็นในตัวคุณ นักเทียบท่า-compose.yml ไฟล์ที่คุณ http คอนเทนเนอร์ได้รับการกำหนดค่าให้รองรับทราฟฟิกบนพอร์ต 80 & 443.

ปัญหา

เดอะ วานิช คอนเทนเนอร์กำลังฟังพอร์ต 6081 & 6082. เว้นแต่ว่าคุณกำลังกำหนดเส้นทางทราฟฟิกไปยังพอร์ตโดยตรง 6081 เห็นได้ชัดว่าวานิชไม่ได้รับคำขอใดๆ

การแก้ไขปัญหา

โปรดตรวจสอบให้แน่ใจว่าคอนเทนเนอร์วานิชของคุณรับฟังทราฟฟิกขาเข้าที่พอร์ตด้วย 80. ใน VCL ของคุณ คุณสามารถชี้ไปที่พอร์ต 80 บน http คอนเทนเนอร์.

แต่เท่าที่เปิดเผยของพอร์ต คุณอาจต้องการส่งต่อของคุณ http พอร์ตของคอนเทนเนอร์ 80 ถึง 8080. สิ่งนี้จะหลีกเลี่ยงการปะทะกับวานิชที่อยู่ในพอร์ต 80 เช่นกัน.

คุณยังสามารถเรียกใช้ทางการได้โดยตรง ภาพวานิช แทนที่จะสร้างเอง

นี่คือบทช่วยสอนเกี่ยวกับวิธีเรียกใช้และกำหนดค่าอิมเมจ Docker อย่างเป็นทางการ: https://www.varnish-software.com/developers/tutorials/running-varnish-docker/

การยกเลิก TLS

ปัจจุบันท่าเรือ 443 เชื่อมโยงกับของคุณ http คอนเทนเนอร์. หากคุณสามารถจัดการการยุติ TLS ที่นั่นและคำขอ HTTPS ของพร็อกซีไปยังวานิชได้ ก็ไม่เป็นไร

ถ้าไม่คุณสามารถเรียกใช้ คอนเทนเนอร์ Hitch ที่ดำเนินการยกเลิก TLS ให้คุณ

Major Kuprich avatar
us flag
บันทึกที่ยังว่างเปล่า: https://i.imgur.com/GFcDXEo.png ฉันได้ลองอัปเดตส่วน .probe เป็น: ก) ลบส่วน .request และยกเลิกการแสดงความคิดเห็น .url b) อัปเดตโฮสต์ในส่วน .request เพื่อแมปในเครื่องของฉันจากไฟล์ /etc/hosts (IP, ชื่อโฮสต์) แต่ไม่ประสบความสำเร็จ :( ป.ล. โปรดทราบว่าฉันใช้ Magento2 CMS ภายในคอนเทนเนอร์เหล่านี้
Major Kuprich avatar
us flag
พยายามอัปเดต docker-compose.yml เพื่อส่งต่อพอร์ต 80 ถึง 8080 ในคอนเทนเนอร์ http เปลี่ยนพอร์ตสำหรับวานิชเป็น 80 สุขภาพแบ็กเอนด์ป่วย: ไม่พบ 404 แบ็กเอนด์เปิดไม่ได้ บันทึกใด ๆ ไม่ทำงาน :( ตรวจสอบการกำหนดค่าใหม่ โปรด: https://pastebin.com/BYi1cHgM
Thijs Feryn avatar
in flag
@MajorKuprich ฉันเกรงว่าคุณจะส่งต่อพอร์ตผิดลำดับ คุณทำ `6081:80` แต่ต้องเป็น `80:6081` เช่นเดียวกับ `80:8080` ซึ่งควรเป็น `8080:80` หวังว่าจะช่วยได้ หากคุณสามารถเข้าถึงคอนเทนเนอร์ `http` ผ่านพอร์ต `8080` และคุณสามารถจำลองข้อผิดพลาด 404 ได้ คุณอาจสามารถแก้ไขและทำให้ทุกอย่างทำงานได้

โพสต์คำตอบ

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