2012-12-26 12 views
13

Mam kilka aplikacji działających za odwrotnym proxy Nginx, z których jednym jest serwer Node z Express.js. Ja buforowania domain.com/demo/app/<path> do localhost:7003/<path> użyciu tego Nginx config:Nginx Reverse Proxying to Node.js z Rewrite

http { 

    ... 

    server { 

     listen 80; 
     server_name domain.com; 

     ... 

     location /demo/app { 

      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_set_header X-Scheme $scheme; 

      rewrite ^/demo/app/?(.*) /$1 break; 
      proxy_pass http://localhost:7003; 
     } 

     ... 
    } 
} 

Działa to doskonale i app odbiera żądania, jakby to było zakorzenione w /. Problem polega na tym, że app obsługuje własne pliki statyczne i może wysyłać żądania dotyczące tras, takich jak css/app.css lub images/image.jpg. Ale z powodu odwrotnego proxy, istnieją one odpowiednio w /demo/app/css/app.css i /demo/app/images/image.jpg.

Rozwiązałem to, pobierając Nginx, aby przekazał do węzła niestandardowy nagłówek wskazujący ścieżkę główną, którą serwer węzła przedkłada pod adresy URL wszystkich kolejnych żądań. Ale teraz mój kod jest zaśmiecony tymi ciągami ścieżki głównej. Na przykład część moich szablonów back-end:

link(rel='stylesheet', href="#{basePath}/css/base.css") 
link(rel='stylesheet', href="#{basePath}/css/skeleton.css") 
link(rel='stylesheet', href="#{basePath}/css/layout.css") 

Co jest bardziej eleganckiego sposobu poradzenia sobie z tym? Czy nie ma sposobu, aby Nginx rozpoznał żądania przychodzące z serwera nadrzędnego i automatycznie przekazał je na ten serwer?

Odpowiedz

9

Podjąłem nginx służyć pliki statyczne nawet bez przechodzenia te wnioski do węzła dyrektywy poprzez dodanie do pliku konfiguracyjnego w lokalizacji nginx o aplikacji (co jest wliczone w nginx.conf):

location ~ /(img|js)/ { 
    rewrite ^(.*)$ /public/$1 break; 
} 

location/{ 
    proxy_pass http://localhost:3000/; 
    ... 
} 

w przypadku żądania przychodzi/img lub/js katalog nginx służy odpowiednio do plików z katalogu/public/img lub/public/js. Wszystkie pozostałe żądania są kierowane do węzła.

Możesz dodać więcej katalogów, jeśli potrzebujesz (np./Css lub/views, jeśli przechowujesz szablony, które chcesz używać zarówno w węźle, jak iw przeglądarce) i mają dowolną strukturę katalogów wewnątrz tych katalogów, nginx po prostu dodaje/publiczne dla nich i pobiera pliki stamtąd bez Twojej aplikacji węzła nawet o tym wiedząc.

+0

Jak radzisz sobie z żądaniami AJAX? Nie chcę wstawiać adresów URL AJAX w kodzie JavaScript z '/ demo/app' –

+0

W konfiguracji powyżej wszystkie żądania (inne niż do/img/... i/js/...) będą node.js zakładając, że nasłuchuje na porcie 3000. '' 'location /' '' dopasowuje wszystkie żądania, które nie zostały dopasowane przez poprzednią dyrektywę lokalizacji. – esp

+0

Jeśli chcesz, aby Twoje żądania dotyczące procesu aplikacji wyglądały tak, jakby przychodziły do ​​'/' nadal możesz przepisać żądania w taki sposób, w jaki zrobiłeś to ... Wolałbym mieć to routing wewnątrz aplikacji, ale to jest moja osobista preferencja ... nie jestem pewien, czy poprawnie zrozumiałem, co chcesz osiągnąć, ale jedynym sposobem na to, aby nie włączać {basepath} w linkach, jest przepisywanie żądań w taki sposób, jak ja. Pozwala również nie przetwarzać plików statycznych w węźle, ale jeśli chcesz, możesz nadal je również proxy ... – esp

Powiązane problemy