reverse proxy ตามส่วนหัว http ใน Nginx ส่งคืน 502 Bad Gateway


0

สถานการณ์

ฉันมีโดเมนย่อย DDNS sub1.dom1.comกับ IP แบบคงที่ของ (ตัวละคร 99.88.77.66.55IP)

ฉันมีโดเมนdom2.comโฮสต์ปิดเว็บไซต์ที่มีการชี้รายการ DNS CNAME sub2.dom2.comและsub3.dom2.comไป IP เดียวกัน 99.88.77.66.55(อีกครั้งตัวละคร),

ที่99.88.77.66.55ฉันมี LAN นั่งอยู่หลังไฟร์วอลล์ของฉัน บน LAN นี้ฉันมีสามเซิร์ฟเวอร์:

  1. เว็บเซิร์ฟเวอร์ที่มี FQDN www.local.lanในตัวที่192.168.1.3:80
  2. แอปพลิเคชันเซิร์ฟเวอร์ที่มี FDQN app.local.lanในตัวเครื่องที่192.168.1.4:8069
  3. ไฟล์เซิร์ฟเวอร์ที่มี FQDN fs.local.lanในตัวที่ at192.168.1.5:2430

ดูแผนภาพด้านล่างสำหรับการชี้แจง เซิร์ฟเวอร์ทั้งสามกำลังทำงานเป็นเซิร์ฟเวอร์เสมือนภายในคุกบนระบบ freeBSD (freeNAS) เดียวกัน

แผนภาพเครือข่าย

สิ่งที่ฉันอยากทำ

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

การพิจารณา

  1. Standard Port Fordwarding:ขณะนี้ฉันเข้าถึงเซิร์ฟเวอร์เหล่านี้ผ่านการส่งต่อพอร์ตอย่างง่าย ๆ บนเราเตอร์ LAN โดยปกติจะเป็นวิธีการแก้ปัญหาที่ยอมรับได้ แต่เมื่อความต้องการเกิดปัญหาเครือข่ายจากระยะไกลมันจะกลายเป็นความท้าทายในการรักษาความสัมพันธ์ของพอร์ต WAN-to-LAN โดยตรง นอกจากนี้สำหรับผู้ใช้อื่นที่ไม่ใช่ตัวเองที่ต้องการเข้าถึงเซิร์ฟเวอร์เหล่านี้จะง่ายกว่าสำหรับพวกเขาที่ไม่ต้องจำหมายเลขพอร์ต
  2. แอปพลิเคชัน DD-WRT:เนื่องจากเราเตอร์ของฉันใช้เฟิร์มแวร์ DD-WRT ที่มีไดรฟ์ USB 4 GiB ติดตั้งอยู่ฉันจึงมองไปที่การติดตั้งและใช้งานพร็อกซีเซิร์ฟเวอร์ย้อนกลับบนเราเตอร์โดยใช้ Pound หรืออะไรทำนองนั้น ฉันได้ทำการค้นหาเว็บอย่างละเอียดเพื่อค้นหาวิธีการ ปัญหาที่ฉันพบคือคู่มือหรือแบบฝึกหัดส่วนใหญ่นั้นเก่าและมีลิงก์ที่เชื่อมโยงไปยังแหล่งข้อมูลที่ต้องการ
  3. Apache / Nginx:ทั้งสองอย่างนี้ดูเหมือนเป็นทางออกที่ปฏิบัติได้ อย่างไรก็ตามเช่นเดียวกับโซลูชัน DD-WRT ที่ฉันค้นคว้าคำแนะนำจำนวนมากไม่ว่าจะเป็นการเชื่อมโยงที่ขาดหรือไม่มีการเชื่อมโยงใด ๆ กับทรัพยากรที่ต้องการ สิ่งกีดขวางอื่น ๆ ต่อหน้าฉันด้วยตัวเลือก Apache หรือ Nginx คือคำแนะนำและแบบฝึกหัดส่วนใหญ่คิดว่าฉันรู้ทุกอย่างที่มีเกี่ยวกับ Apache หรือ Nginx แล้ว ฉันเริ่มต้นด้วยประสบการณ์ที่ไม่เคยมีมาก่อนในแพลตฟอร์มใดและยินดีที่จะเรียนรู้และทดลองเพื่อให้ได้สิ่งต่าง ๆ ที่ใช้งานได้ คู่มือและแบบฝึกหัดส่วนใหญ่จะแสดงเฉพาะserverส่วนของรหัสที่จำเป็นเท่านั้น นอกจากนี้ยังมีการตั้งสมมติฐานว่าคุณทราบถึงการพึ่งพาที่จำเป็นและวิธีการนำไปใช้

ขั้นตอนที่ฉันทำไปแล้ว

Nginx: ตัวอย่างจากไฟล์ nginx.conf ของฉัน มันเป็นเพียงส่วนหนึ่ง มีserverส่วนอื่น ๆสำหรับเซิร์ฟเวอร์อื่นที่มีการเปลี่ยนแปลงรายละเอียดที่เกี่ยวข้อง

#nginx.conf

events {
  worker_connections 1024;
}

http {
  server {
    listen 80;
    server_name sub1.dom1.com #I've also tried www.lan.lan, here.
    access_log off;
    error_log off;
    location / {
      proxy_pass http://192.168.1.3:80/;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_ass_x_forwarded_for;
      proxy_max_temp_file_size 0;
      client_max_body_size 10m;
      client_body_buffer_size 128k;
      proxy_connect_timeout 90;
      proxy_send_timeout 90;
      proxy_ready_timeout 90;
      proxy_buffer_size 4k;
      proxy_buffers 4 32k;
      proxy_busy_buffers_size 64k;
      proxy_temp_file_write_size 64k;
    }
  }
}

อย่างไรก็ตามเรื่องนี้; ส่งกลับข้อผิดพลาด 502 - Bad Gateway เมื่อพยายามเชื่อมต่อ

Apache: สิ่งสำคัญที่ควรทราบว่าฉันได้ลองใช้ Apache22 ไฟล์ httpd.conf ล่าสุดของฉันมีลักษณะดังนี้:

LoadFile /usr/local/bin/libxml2.so
LoadModule proxy_html_module libexec/apache22/mod_proxy_html.so
LoadModule xml2enc_module libexec/apache22/mod_xl2enc.so

<VirtualHost *:80>
  ServerName sub1.dom1.com
  ServerAlias sub1.dom.com
  ProxyPass / http://192.168.1.3:80/
  ProxyPassReverse / http://192.168.1.3:80
</VirtualHost>

<VirtualHost *:80>
  ServerName sub2.dom2.com
  ServerAlias sub2.dom2.com
  ProxyPass / http://192.168.1.4:8069/
  ProxyPassReverse / http://192.168.1.4:8069
</VirtualHost>

<VirtualHost *:80>
  ServerName sub3.dom2.com
  ServerAlias sub3.dom2.com
  ProxyPass / http://192.168.1.5:2430/
  ProxyPass / http://192.168.1.5:2430
</VirtualHost

เมื่อฉันพยายามเริ่ม Apache22 ให้ใช้:

service apache22 start

ฉันได้รับต่อไปนี้:

Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration

หลังจากการวิจัยมากมายฉันรู้ว่านี่เป็นสาเหตุที่มากเกินความจริงที่ว่าฉันมีเพียงหนึ่งในหลาย ๆmod_proxyโมดูลที่ต้องการโหลดmod_proxy_htmlโมดูล เหตุผลก็คือหลังจากค้นหาอย่างละเอียดฉันสามารถค้นหาลิงก์ที่ใช้งานได้สำหรับโมดูลเฉพาะนี้เท่านั้น

ปอนด์: ฉันพบปัญหาเมื่อพยายามติดตั้ง ipkg บน DD-WRT อาจเป็นเพราะสถาปัตยกรรม atheos ของเราเตอร์เฉพาะของฉัน ฉันวิ่งเข้าไปในลิงก์ที่ใช้งานไม่ได้หลายอย่าง

คุณช่วยได้อย่างไร

ตกลงด้วยคำอธิบายที่ยืดยาวออกไปให้พ้นนี่คือสิ่งที่ฉันกำลังมองหาจากชุมชน

เนื่องจากฉันได้ใช้ Nginx ที่ใกล้เคียงที่สุดฉันจะตั้งค่าnginx.confไฟล์ของฉันอย่างถูกต้องเพื่อทำสิ่งที่ฉันพยายามทำอย่างไร อะไรเป็นสาเหตุของข้อผิดพลาด 502 และฉันจะแก้ไขได้อย่างไร

คำตอบ:


0

สำหรับโซลูชัน nginx:

server_name ควรเป็นชื่อโฮสต์ที่ร้องขอเสมอ (ในส่วนหัว http)

  • คุณสามารถใส่*ที่นี่เพื่อทำให้เนื้อหาพร้อมใช้งานบนโดเมน / โฮสต์ใด ๆ

proxy_passไม่ควรลงท้ายด้วย a /ยกเว้นจำเป็นอย่างยิ่ง

ฉันเห็น502 Bad gatewayบ่อยที่สุดเมื่อ nginx ไม่สามารถเชื่อมต่อกับ upsteam ( proxy_pass)

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