Score:1

เคลือบเงาด้วยการตรวจสอบสิทธิ์ขั้นพื้นฐานส่งคืน 401

ธง us

ฉันได้พยายามกำหนดค่าวานิชบนเซิร์ฟเวอร์ที่มีการรับรองความถูกต้องเบื้องต้นโดยใช้วิธีแก้ไขปัญหาเหล่านี้:

แต่มันไม่ได้ช่วย บันทึกการเคลือบเงายังคงแสดงข้อผิดพลาด 401:

varnishlog -g ดิบ -i Backend_health

         0 Backend_health - mag2.default ยังคงป่วย 4--X-R- 0 5 10 0.001574 0.000000 HTTP/1.1 401 ไม่ได้รับอนุญาต

My Varnish config (เวอร์ชัน 4.0):

vcl 4.0;

นำเข้ามาตรฐาน;
# เวอร์ชันวานิชขั้นต่ำคือ 4.0
# สำหรับการถ่าย SSL ให้ส่งส่วนหัวต่อไปนี้ในพร็อกซีเซิร์ฟเวอร์หรือโหลดบาลานซ์ของคุณ: 'X-Forwarded-Proto: https'

แบ็กเอนด์เริ่มต้น {
    .host = "127.0.0.1";
    .port = "8080";
    .first_byte_timeout = 600s;
    .probe = {
        .url = "/health_check.php";
        .timeout = 2 วินาที;
        .interval = 5 วินาที;
        .window = 10;
        .threshold = 5;
   }
}

ล้าง acl {
    "โลคอลโฮสต์";
}

ย่อย vcl_recv {
    ถ้า (! req.http.Authorization ~ "พื้นฐาน ZGV2OmRldg = ") {
    กลับ (สังเคราะห์ (401, "ถูก จำกัด "));
    }

    ถ้า (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") {
        กลับ (ผ่าน);
    }

unset req.http.Authorization;
    กลับ (แฮช);
}

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

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

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

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

ย่อย vcl_backend_fetch {
    # รับรองความถูกต้องกับผู้ดูแลระบบ:ผู้ดูแลระบบ
    ตั้ง bereq.http.Authorization = "พื้นฐาน ZGV2OmRldg==";
}

ย่อย 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 = "ไม่จำกัด (เซิร์ฟเวอร์ไม่แข็งแรง)";
        ส่งคืน (ส่งมอบ);
    }
}

ย่อย vcl_synth {
  ถ้า (resp.status == 401) {
    ตั้ง resp.status = 401;
    ตั้ง resp.http.WWW-Authenticate = "พื้นฐาน";
    ส่งคืน (ส่งมอบ);
  }
}
Score:1
ธง in

ปัญหาที่คุณกำลังเผชิญคือแบ็กเอนด์ของคุณต้องการเช่นกัน การรับรองความถูกต้องขั้นพื้นฐาน. เมื่อโพรบตรวจสุขภาพของคุณทำการสำรวจแบ็คเอนด์ มันจะส่งคืน a HTTP/1.1 401 ไม่ได้รับอนุญาต เนื่องจากคุณไม่ได้ให้ส่วนหัวการให้สิทธิ์

เราสามารถแก้ไขปัญหานี้ได้โดยส่งส่วนหัวคำขอที่กำหนดเองในโพรบแบ็กเอนด์ของคุณ

นี่คือรหัส VCL:

แบ็กเอนด์เริ่มต้น {
    .host = "127.0.0.1";
    .port = "8080";
    .first_byte_timeout = 600s;
    .probe = {
        .request =
            "HEAD /health_check.php HTTP/1.1"
            "การอนุญาต: Basic ZGV2OmRldg="
            "โฮสต์: localhost"
            "การเชื่อมต่อ: ปิด"
            "ตัวแทนผู้ใช้: โพรบสุขภาพวานิช";
        .timeout = 2 วินาที;
        .interval = 5 วินาที;
        .window = 10;
        .threshold = 5;
   }
}

อย่างที่คุณเห็น เรากำลังส่งคำขอ HTTP ต่อไปนี้ไปยังแบ็กเอนด์ของคุณ:

หัว /health_check.php HTTP/1.1
การอนุญาต: พื้นฐาน ZGV2OmRldg=
โฮสต์: localhost
การเชื่อมต่อ: ปิด
ตัวแทนผู้ใช้: โพรบสุขภาพวานิช

เรากำลังดำเนินการ ศีรษะ โทรมากกว่า รับเนื่องจากเราไม่สนใจเพย์โหลด เราสนใจเฉพาะรหัสสถานะเท่านั้น

ฉันยังสันนิษฐาน ZGV2OmRldg พื้นฐาน= เป็นค่าการให้สิทธิ์ที่ถูกต้องซึ่งแบ็คเอนด์ของคุณต้องการ

สมมติฐานสุดท้ายที่ฉันทำคือแบ็คเอนด์ของคุณจะตอบสนองต่อคำขอที่มี โฮสต์: localhost หัวข้อ.

ดู https://www.varnish-software.com/developers/tutorials/vcl-backend-probe-basic-authentication/ สำหรับบทช่วยสอนที่ตรงกับกรณีการใช้งานของคุณ

Major Kuprich avatar
us flag
ขอบคุณมากสำหรับคำอธิบายที่สมบูรณ์ ตอนนี้วานิชได้รับการกำหนดค่าอย่างถูกต้องด้วย BasicAuth :)

โพสต์คำตอบ

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