簡體   English   中英

Nginx使用重寫反向代理Node.js

[英]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.cssimages/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM