Reverse Proxy - ลบไดเรกทอรีย่อย


27

ในอนาคตอันใกล้ฉันจะมีเซิร์ฟเวอร์ 3 nginx หนึ่งคือ reverse proxy สำหรับ SSL สำหรับอีกสองรายการ ตัวอย่างเช่นฉันไปที่:

https://www.mysitename.com/site1

เซิร์ฟเวอร์อื่นสองตัวในตัวอย่างนี้คือ site1 และ site2 ฉันติดตั้งใบรับรอง SSL บนพร็อกซีและฉันต้องการใช้ reverse proxy (ไม่จำเป็นต้องใช้ SSL เนื่องจากทั้ง 3 อยู่ในเครือข่ายภายใน) สำหรับการทดสอบฉันมี nginx ที่ฟัง 443 สำหรับ SSL / reverse-proxy ฟัง พอร์ต 8081 ซึ่งเป็นแอพพลิเคชั่นรางสำหรับไซต์ 1 และ 8082 สำหรับไซต์ 2

ฉันมีสิ่งนี้ ...

server {
    listen                  443;
    server_name             mysitename.com;

    ssl                     on;
    ssl_certificate         ssl/mysitename.com.crt;
    ssl_certificate_key     ssl/mysitename.com.key;
    keepalive_timeout       60;

    location /site1 {
        proxy_pass http://localhost:8081;
        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_redirect http:// https://;
    }

    location /site2 {
        proxy_pass http://localhost:8082;
        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_redirect http:// https://;
    }
}

ดังนั้นเมื่อฉันไปที่ www.mysitename.com/site1 ฉันต้องการให้มันคืนสิ่งที่ตามปกติจะมาจาก localhost: 8081 (หรือหลังจากนั้นก็เป็น IP ภายในสำหรับเซิร์ฟเวอร์อื่น)

มีวิธีให้แถบ "site1" จากการโทร localhost หรือไม่ สิ่งที่ดูเหมือนจะทำคือการใช้ localhost: 8081 / site1 ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์ไซต์มีลักษณะ "/ ล็อกอิน / ดัชนี" หรือ "/ ก็ตาม / รายการ", ฯลฯ โดยไม่มี "ไซต์ 1"

นอกจากนี้ยังมีการเปลี่ยนเส้นทางในตัวควบคุมไซต์ (โดยใช้ redirect_to) ที่เปลี่ยนจากสิ่งต่าง ๆ เช่น / login / index ไปยัง / what / list

ฉันจะต้องออกแบบ URL ของเว็บไซต์ใหม่เพื่อใช้ site1 หรือไม่ หรือพร็อกซี NGINX สามารถหาได้หรือไม่

ขอบคุณ


สำหรับ Socket.io ลองแค่เพิ่ม rewrite /(.*) /socket.io/ break; serverfault.com/questions/444532/…
user956584

คำตอบ:


53

การอ้างอิงhttp://nginx.org/r/proxy_pass :

หาก proxy_pass ถูกระบุด้วย URI เมื่อผ่านการร้องขอไปยังเซิร์ฟเวอร์ส่วนหนึ่งของ URI คำขอที่ได้รับการทำให้เป็นมาตรฐานที่ตรงกับตำแหน่งจะถูกแทนที่ด้วย URI ที่ระบุในคำสั่ง:

location /name/ {
    proxy_pass http://127.0.0.1/remote/;
}

นั่นคือคุณต้องใช้proxy_passสิ่งนี้:

location /site1/ {
    proxy_pass http://localhost:8081/;
    ...
}

หมายเหตุต่อท้าย/ในproxy_passคำสั่ง - มันจะเข้ามาแทนที่ส่วนหนึ่งของ URI /site1/เดิมจับคู่โดยสถานที่คือ


2
สิ่งที่ต้องทำคือการใช้เครื่องหมายสแลชเพื่อแก้ไขปัญหา! ขอบคุณสำหรับสิ่งนั้น ทีนี้มาดูกันว่าฉันจะจัดการกับ redirect_to ได้อย่างไร - แต่นั่นไม่ใช่คำถามเซิร์ฟเวอร์ดังนั้นฉันจะหาทางอื่น
Chromag

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