使用Nginx反向代理隐藏一个域上的Node应用程序端口号

时间:2018-08-08 22:09:57

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

我还是nginx的初学者,希望对我正在从事的工作有所帮助和澄清。

假设我有2个Node应用程序, app1 app2

我有一个生产服务器,但是我想先在本地进行测试。

当前 app1 监听端口8000,而 app2 监听端口8001。

因此,当前,它们分别位于localhost:8000localhost:8001处,并且将在生产服务器中以production.example.com:8000production.server.com:8001的身份进行访问。

我的问题是,如何隐藏端口号并将其分配给特定的URL?

我希望可以从生产服务器中的localhost/app1localhost/app2以及production.example.com/app1production.server.com/app2访问结果。

我不知道自己在nginx.conf中出了什么问题,因此希望有人可以在这个问题上为我提供帮助。这些应用程序均具有HTML表单,因此我需要将它们发布到production.example.com/app1或类似production.example.com/app2/download的地方。由于它们仅位于/public/css.css中,而不位于app2/public/css.css中,因此它们的CSS也由于每个应用程序中公用文件夹的位置而中断。

我可以通过分别在Node应用程序中添加/app1/app2来更改所有表单动作和路由器获取/发布以及样式表引用,但是感觉就像我在做出现了问题,因为我不应该更改任何路由器信息。

这是我的nginx.conf文件:

编辑:所以这就是我现在所拥有的:

server {
        # ...

        location /app1 {
                rewrite ^/app1$ / break;
                rewrite ^/app1/(.*) /$1 break;
                proxy_pass      http://127.0.0.1:8000;
        }

        location /app2 {
                rewrite ^/app2$ / break;
                rewrite ^/app2/(.*) /$1 break;
                proxy_pass      http://127.0.0.1:8001;
        }
}

我仍然遇到相同的问题,即节点应用程序本身未使用其上下文。

1 个答案:

答案 0 :(得分:0)

因此,我具有与4-5个微服务相同的配置。这是我使用的配置。

server {

    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;
    location /ifttt {
        rewrite ^/ifttt$ / break;
        rewrite ^/ifttt/(.*) /$1 break;
        proxy_pass http://127.0.0.1:8080;
    }
    location /actions {
        rewrite ^/actions$ / break;
        rewrite ^/actions/(.*) /$1 break;
        proxy_pass http://127.0.0.1:5000;
    }
    location /events {
        rewrite ^/events$ / break;
        rewrite ^/events/(.*) /$1 break;
        proxy_pass http://127.0.0.1:5050;
    }
    location / {
        proxy_pass http://127.0.0.1:8081;
    }
}

希望它可以作为建设性参考。我们拿一个,

location /actions {
    rewrite ^/actions$ / break;
    rewrite ^/actions/(.*) /$1 break;
    proxy_pass http://127.0.0.1:5000;
}

因此,第一次重写仅匹配localhost/actions并将其转发到http://127.0.0.1:5000 第二个匹配localhost/actions/<anything>并将其转发到http://127.0.0.1:5000/<anything>

我认为您在正则表达式匹配之前缺少斜杠(/)。

修改:

使用您的评论作为参考

索引位于/app1/index
页面位于/app1/index/flashfireblast
并且导航栏标题需要引用/app1/stylesheets/css.css

因此,要处理/app1/stylesheets/css.css中的/app1/index/flashfireblast,您需要添加../stylesheets/css.css作为样式表href。

供参考:
如果当前目录为/var/www
1) /:表示根。 /
2) ./:表示当前目录。 /var/www
3) ../:表示上一个目录。 /var/