2012-12-26 160 views
13

我有幾個應用程序運行在Nginx反向代理的後面,其中一個是使用Express.js的節點服務器。我使用這個Nginx的配置進行代理domain.com/demo/app/<path>localhost:7003/<path>Nginx反向代理重寫Node.js

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

     ... 
    } 
} 

這個偉大的工程和app就好像是在/紮根接收請求。問題是app處理它自己的靜態文件,並可能請求路由,如css/app.cssimages/image.jpg。但是由於反向代理,這些實際上分別存在於/demo/app/css/app.css/demo/app/images/image.jpg

我已經解決了這個問題,讓Nginx向Node傳遞一個自定義標題,指明根節點,Node節點服務器向所有後續請求的URL預先指定。但是現在我的代碼充斥着這些根路徑字符串。例如,我的部分後端模板:

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

什麼是更優雅的方式來處理這個問題?沒有辦法讓Nginx識別來自上游服務器的請求,並自動將它們轉發給該服務器?

回答

9

我已經nginx的靜態文件,甚至沒有通過(其中包括在nginx.conf)這些請求中加入位置指令到應用程序的nginx的配置文件到節點:

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

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

如果請求到達/ img或/ js目錄nginx分別從/ public/img或/ public/js目錄提供文件。所有其他請求都被代理到節點。如果你需要的話,你可以添加更多的目錄(比如/ css或/ views,如果你想在節點和瀏覽器中使用模板,並且在這些目錄中有任何目錄結構),nginx只是在/公開給他們,並從那裏獲取文件,甚至不知道你的節點應用程序。

+0

你如何處理AJAX請求?我不想在JavaScript中用'/ demo/app'預先加入AJAX URL –

+0

通過上面的配置,所有請求(除/ img/...和/ js/...之外)都會被代理node.js假設它監聽端口3000.'''location /''匹配所有未被前一個location指令匹配的請求。 – esp

+0

如果你需要讓你的應用程序處理請求,就好像他們來到'/'你仍然可以按照你的方式重寫請求...我寧願在應用程序內部有這種路由,但這是我個人的偏好...我我不確定自己能夠正確理解你想實現的目標,但是在鏈接中不包含{basepath}的唯一方法是按照我的方式重寫請求。它也允許不在節點中處理靜態文件,但如果你願意,你仍然可以代理它們... – esp