[英]Nginx Reverse Proxying to Node.js with Rewrite
我在Nginx反向代理后面運行了幾個應用程序,其中一個是帶有Express.js的節點服務器。 我使用此Nginx配置將domain.com/demo/app/<path>
代理到localhost:7003/<path>
:
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.css
或images/image.jpg
這樣的路徑發出請求。 但由於反向代理,它們實際上分別存在於/demo/app/css/app.css
和/demo/app/images/image.jpg
。
我已經通過讓Nginx向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識別來自上游服務器的請求並自動將它們轉發到該服務器嗎?
我已經使nginx服務靜態文件,甚至沒有將這些請求傳遞給節點,方法是將app指令添加到應用程序的nginx配置文件(包含在nginx.conf中):
location ~ /(img|js)/ {
rewrite ^(.*)$ /public/$1 break;
}
location / {
proxy_pass http://localhost:3000/;
...
}
如果請求到/ img或/ js目錄,nginx分別從/ public / img或/ public / js目錄提供文件。 所有其他請求都代理到節點。
如果需要,可以添加更多目錄(比如/ css或/ views,如果你在那里存儲你想在節點和瀏覽器中使用的模板),並且在這些目錄中有任何目錄結構,nginx只是prepends / public到它們和從那里獲取文件,而您的節點應用程序甚至不知道它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.