Ters Proxy - Alt Dizini Kaldır


27

Yakın gelecekte 3 nginx sunucum olacak. Biri, diğeri için SSL için ters bir proxy'dir. Yani, örneğin, ben gidiyorum:

https://www.mysitename.com/site1

Bu örnekteki diğer iki sunucu site1 ve site2'dir. Proxy'ye SSL sertifikası yükledim ve ters proxy kullanmak istiyorum (3'ü dahili bir ağda bulunduğundan SSL gerekli değildir.) site1 için bir ray uygulaması olan 8081 numaralı bağlantı noktası ve site2 için 8082 numaralı bağlantı noktası.

Bu bende var...

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://;
    }
}

Bu yüzden, www.mysitename.com/site1 adresini ziyaret ettiğimde, normalde localhost'tan gelecek olanı geri döndürmek istiyorum: 8081 (veya daha sonra başka bir sunucu için dahili bir IP hattı).

Localhost çağrısından "site1" i çıkarmanın bir yolu var mı? Yaptığı gibi localhost kullanıyor: 8081 / site1. Site1 ve site2 siteleri "/ login / index" veya "/ whatever / list", vb. Türlerinde "site1" içermez.

Site denetleyicilerinde (redirect_to kullanarak) / login / index / / whatever / list gibi şeylerden geçen yönlendirmeler de vardır.

Site1 kullanmak için sitenin URL’lerini yeniden tasarlamak zorunda mı kalacağım? Yoksa NGINX proxy bunu çözebilir mi?

Teşekkürler.


Socket.io için bunu deneyin, sadece yeniden yazın /(.*) /socket.io/ break; serverfault.com/questions/444532/…
user956584

Yanıtlar:


53

Alıntı yapmak http://nginx.org/r/proxy_pass :

Proxy_pass, URI ile belirtilirse, bir isteği sunucuya iletirken, konumu eşleşen normalleştirilmiş bir istek URI'sının bir parçası, yönergede belirtilen bir URI ile değiştirilir:

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

Yani, proxy_passböyle kullanmak zorundasın :

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

Sondaki Not /içinde proxy_passdirektifi - bu yani konumu ile eşleşti orijinal URI parçası yerini alacak /site1/.


2
Tüm bu sorunu çözmek için son bir eğik çizgi oldu! Bunun için teşekkürler. Şimdi redirect_to ile nasıl başa çıkacağımı bulmak için - ama bu bir sunucu sorusu değil, bu yüzden başka bir yerde bulacağım.
Chromag

unutmayın, proxy_pass URL'sinde de eğik çizgi gerekir!
Daniel Hill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.