Nodejs nginx如何配置两个express应用分别在不同的二级目录下

Nodejs nginx如何配置两个express应用分别在不同的二级目录下

想实现的方法大概如下所示,有两个express应用分别在4000和5000端口,想在外网只通过80端口访问,通过不同的二级目录访问,比如 http://Domain/xxx
http://Domain/yyy

分别转发到4000和5000的应用上。 nginx的大概配置如下,可是目前通过这样访问expressjs会提示cannot get / 请问如何处理?

location /xxx{ root /home/aaa/xxx; proxy_pass http://127.0.0.1:4000; }

location /yyy{ root /home/aaa/yyy; proxy_pass http://127.0.0.1:5000 }


5 回复

要配置 Nginx 以通过不同的二级目录(例如 /xxx/yyy)将请求转发到运行在不同端口上的两个 Express 应用,你需要正确设置 Nginx 的 location 块。你当前的配置有一些小问题,主要是因为 root 指令不需要在这里使用。以下是正确的配置示例:

Nginx 配置

server {
    listen 80;

    location /xxx {
        proxy_pass http://127.0.0.1:4000/;
        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-Forwarded-Proto $scheme;
    }

    location /yyy {
        proxy_pass http://127.0.0.1:5000/;
        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-Forwarded-Proto $scheme;
    }
}

解释

  1. listen 80; - 监听 80 端口,这是 HTTP 默认端口。
  2. location /xxx { … } - 匹配所有以 /xxx 开头的请求。
  3. proxy_pass http://127.0.0.1:4000/; - 将请求转发到本地的 4000 端口。
  4. proxy_set_header - 设置一些 HTTP 头信息,以便后端应用能够获取客户端的真实 IP 地址等信息。

Express 应用示例

确保你的 Express 应用正确配置了路由,以便能够处理根路径 / 的请求。以下是一个简单的 Express 应用示例:

4000 端口的 Express 应用

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('Hello from /xxx');
});

app.listen(4000, () => {
    console.log('App listening on port 4000');
});

5000 端口的 Express 应用

const express = require('express');
const app = express();

app.get('/', (req, res) => {
    res.send('Hello from /yyy');
});

app.listen(5000, () => {
    console.log('App listening on port 5000');
});

测试

完成上述配置后,重启 Nginx 并启动你的 Express 应用。然后你可以通过以下 URL 访问:

  • http://Domain/xxx 应该显示 “Hello from /xxx”
  • http://Domain/yyy 应该显示 “Hello from /yyy”

这样就实现了通过 Nginx 在同一个域名下通过不同的二级目录访问两个不同的 Express 应用。


目前只有一个80端口对外暴漏,

搞定 location /app { rewrite /app/(.*) /$1 break; proxy_pass http://localhost:3000; proxy_redirect off; proxy_set_header Host $proxy_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }

楼主 我遇到相同的问题,也按照这种方式配置了。

location /app { rewrite /app/(.*) /$1 break; proxy_pass http://localhost:3000; … }

的确我访问 http://121.14.58.212/app 时跳转到我的主页了。 但是我主页需要的静态文件,全部404了。 我期望的应该是访问 http://121.14.58.212/app/style.css, 实际请求的地址为http://121.14.58.212/style.css

跪求告诉怎么解决

为了通过 Nginx 将两个 Express 应用分别部署在不同的二级目录下(如 /xxx/yyy),你需要正确配置 Nginx 的 location 块,并确保代理设置正确。当前配置中的问题在于 root 指令的使用是不必要的,因为 proxy_pass 已经指定了后端服务的位置。

以下是正确的 Nginx 配置示例:

server {
    listen 80;

    location /xxx {
        proxy_pass http://127.0.0.1:4000/;
        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-Forwarded-Proto $scheme;
    }

    location /yyy {
        proxy_pass http://127.0.0.1:5000/;
        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-Forwarded-Proto $scheme;
    }
}

解释

  1. 监听 80 端口:Nginx 监听 80 端口,这意味着所有通过域名访问的请求都会被 Nginx 处理。

  2. location /xxxlocation /yyy:这两个配置块分别处理以 /xxx/yyy 开头的请求。

  3. proxy_pass:将请求转发到对应的 Express 应用,注意在 URL 后面添加 / 以确保路径正确拼接。

  4. 代理头设置:设置必要的 HTTP 头信息,以便后端应用可以获取客户端的真实信息。

通过上述配置,当用户访问 http://domain/xxx 时,请求会被转发到本地的 http://127.0.0.1:4000;同样,访问 http://domain/yyy 时,请求会被转发到 http://127.0.0.1:5000

回到顶部