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

时间:2012-12-26 02:34:51

标签: javascript node.js nginx express reverse-proxy

我在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识别来自上游服务器的请求并自动将它们转发到该服务器?

1 个答案:

答案 0 :(得分:9)

我已经使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对他们来说,从那里获取文件,而你的节点应用程序甚至不知道它。