nginx ใช้ proxy proxy ถ้าแบ็กเอนด์ไม่ทำงาน


11

ฉันต้องการพร็อกซี nginx ใช้แคชหากเซิร์ฟเวอร์ด้านหลัง:

นี่คือการกำหนดค่าของฉัน แต่ดูเหมือนว่าจะใช้แคช nginx โดยไม่ตรวจสอบเซิร์ฟเวอร์ backend

http {

  # ...

  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_cache_path /tmp/nginx levels=1:2 keys_zone=tmpzone:10m inactive=60m;
  proxy_cache_key "$scheme$request_method$host$request_uri";


  server {
    server_name _;

    location / {
      proxy_connect_timeout 5s;
      proxy_read_timeout 5s;
      proxy_cache tmpzone;
      proxy_cache_valid      200 304 1d;
      proxy_cache_use_stale  error timeout invalid_header updating http_500 http_502 http_503 http_504;
      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $remote_addr;
      proxy_set_header Host 'www.example.com';
      proxy_pass http://www.example.com;
    }
  }
}

คำถามคือฉันจะข้ามพร็อกซีแคชได้อย่างไรถ้าเซิร์ฟเวอร์ด้านหลังหมด และเมื่อเซิร์ฟเวอร์ส่วนหลังอัพพร็อกซีเซิร์ฟเวอร์ของฉันไม่ใช้แคชเลย


คำถามคืออะไร?
เจนนี่ D

คำถามคือฉันจะข้ามพร็อกซีแคชได้อย่างไรถ้าเซิร์ฟเวอร์ด้านหลังหมด
sweb

หนึ่งของการแก้ปัญหากล่องอาจจะมี 2 "เซิร์ฟเวอร์" ทำงานเป็นหนึ่งเดียวกับแคช, หนึ่ง w / o แคชและใช้ต้นน้ำโมดูล nginx.org/en/docs/http/ngx_http_upstream_module.html ? ทางออกที่ดีที่สุดอาจจะสามารถใช้ proxy_cache_bypass ด้วยการตรวจสอบว่าแบ็กเอนด์อยู่ที่นั่นหรือไม่ ... แม้ว่าฉันจะไม่ทราบวิธีการใช้งาน ... กรณีที่น่าสนใจ
SvennD

การแก้ปัญหาตัวอย่างของปัญหา XY นี้สามารถพบได้ใน SO
Dayo

คำตอบ:


8

ดูเหมือนซ้ำกับสิ่งนี้:

/programming/16756271/how-to-configure-nginx-to-serve-cached-content-only-when-backend-is-down-5xx-re

ในระยะสั้นใช้proxy_cache_use_stale

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

Fedora 23 nginx 1.8.1 ได้รับการกำหนดค่าเป็น ssl terminator + cache + reverse proxy Apache 2.4.18 กำหนดค่าให้ฟังที่พอร์ต 80

ด้วย Apache ทำหน้าที่เป็น upstream ให้บริการเพียงไฟล์คงที่ฉันได้ทำการทดสอบนี้:

  1. Apache up, nginx up, ชี้เบราว์เซอร์ไปที่ URL พร็อกซีย้อนกลับที่ให้บริการโดย nginx ฉันเห็นเนื้อหาพร็อกซีจาก Apache ณ จุดนี้ nginx เก็บสิ่งนี้ไว้ในแคช
  2. หยุด Apache
  3. เชื่อมต่อกับ nginx ฉันเห็นไฟล์แคชที่ให้บริการมาก่อนโดย Apache

config nginx ที่ฉันใช้คือ (เฉพาะส่วนที่น่าสนใจ):

nginx.conf:

http {
[...]
location
    proxy_cache_path        /var/lib/nginx/tmp/proxy/ levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/local.conf:

upstream localhost {
    server 127.0.0.1:80;
[...]
}


server {
    listen       127.0.0.1:443 ssl;

[...]

    location /be/ {
        proxy_pass              http://localhost;
        proxy_cache             STATIC;
        proxy_cache_valid       200 1d;
        proxy_cache_use_stale   error;
}

ลองใช้งานไม่ได้เลย
sweb

ในกรณีที่คุณควรรายงานข้อผิดพลาดให้กับทีม nginx คุณลอง btw อะไร ในกรณีที่ฉันจะพยายามทำซ้ำ
Fredi

ตกลงฉันทำแบบทดสอบและทำงานได้ดี อัปเดตคำตอบของฉันพร้อมรายละเอียดการทดสอบ
Fredi

ดังนั้นการอ่านคำถามเดิมของ sweb ของฉันคือว่าในสภาวะของ Apache และ nginx ขึ้นการร้องขอทั้งหมดควรผ่านไปที่แบ็กเอนด์ Apache ควรให้บริการคำขอจากแคช NginX iff หาก Apache ไม่ทำงาน
abhishekmukherg

@abhishekmukherg คุณสามารถทำสิ่งที่คุณพูด แต่ทำไม? เมื่อทั้งคู่อัพและไฟล์เป็นแบบสแตติก (คิดว่า jpg / css / html) ทำไมจะไปที่แบ็กเอนด์โดยใช้ทรัพยากร network / cpu / ecc มากขึ้นเมื่อคุณมีส่วนหน้าจริง? BTW นี้เป็นเรื่องสำหรับคำถามอื่นว่า
Fredi

0

ใช้ proxy_intercept_errors และ proxy 500s ไปยังเซิร์ฟเวอร์ที่เปิดใช้งานการแคช

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