Nodejs 用nginx带两个express怎么做?

Nodejs 用nginx带两个express怎么做?

nginx配置应该怎么写 我大概在http里面加了 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 }

怎么取不到public里面的css文件?


11 回复

要在Nginx中使用两个Express应用,并确保能够正确访问静态文件(如CSS),你需要对Nginx的配置进行一些调整。下面是一个详细的步骤说明和示例代码。

Nginx 配置

首先,确保你的Nginx配置文件(通常位于 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf)包含以下内容:

server {
    listen 80;
    server_name yourdomain.com;

    location /xxx {
        alias /home/aaa/xxx;
        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;

        # 如果你的Express应用监听的是4000端口
        proxy_pass http://127.0.0.1:4000;
    }

    location /yyy {
        alias /home/aaa/yyy;
        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;

        # 如果你的Express应用监听的是5000端口
        proxy_pass http://127.0.0.1:5000;
    }
}

Express 应用

确保每个Express应用都正确地设置了静态文件服务。例如:

应用1 (监听4000端口)

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

const app = express();

// 设置静态文件路径
app.use(express.static(path.join(__dirname, 'public')));

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'index.html'));
});

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

应用2 (监听5000端口)

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

const app = express();

// 设置静态文件路径
app.use(express.static(path.join(__dirname, 'public')));

app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'index.html'));
});

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

关键点解释

  1. alias vs root: 使用 alias 而不是 root 可以更好地处理路径映射。
  2. 静态文件服务: 确保每个Express应用都能正确地提供静态文件(如CSS、JS文件)。使用 express.static 方法来实现这一点。
  3. 代理设置: 在Nginx配置中使用 proxy_set_header 来传递必要的HTTP头信息,以便Express应用能正确识别客户端请求。

通过上述配置,你应该能够正确地将请求转发到相应的Express应用,并且能够访问到静态资源文件。


文件也用nginx代理吧…

参数和环境总要说清楚了才能知道是怎么回事吧?

这样就可以了, 很简单的

upstream nodejs.server {

    server 127.0.0.1:3200;
    server 127.0.0.1:3300;
    server 9.125.240.43:3200;
    server 9.125.240.43:3300;
    server 9.125.240.43:3400;
    server 127.0.0.1:3400 backup;
}

server { listen 80; server_name localhost;

#charset koi8-r;

#access_log  logs/host.access.log  main;

location / {
    proxy_pass http://nodejs.server;
    proxy_redirect off;
}

啊我现在是在NAT后方, 只有一个端口给我使用是3000, 所以我的nginx跑在3000上, 然后两个express, 一个跑在4000, 一个跑在5000; 想用nginx通过url来实现到不同的端口, 就跟我上面写的那个意思差不多。。 express在/home/aaa/下 一个是/home/aaa/xxx,另外一个是/home/aaa/yyy 然后这个要怎么配置呢? css文件那些拿不到。

谢谢啦, 可以用。。。

不行额, 我有两个应用额, 只有一个端口, 不能都跑到location /下 css那些静态文件还是加载不了

最終rewrite url搞定

怎么搞定的啊?能贴配置文件看看嘛,我现在也遇到这样问题了

怎么搞定的啊?能贴配置文件看看嘛,我现在也遇到这样问题了 求解释啊 啊 啊啊 啊

要在Nginx中配置两个Express应用,并确保静态资源能够正确访问,你需要正确设置Nginx的配置文件。以下是一个详细的示例,包括如何配置Nginx以代理到两个不同的Express应用,并确保静态文件能够被正确访问。

Nginx 配置

假设你有两个Express应用分别运行在端口4000和5000上,你想通过路径/xxx/yyy来访问它们,并且每个应用都有一个名为public的目录用于存放静态资源(如CSS文件)。

Nginx 配置文件示例

http {
    upstream app_4000 {
        server 127.0.0.1:4000;
    }

    upstream app_5000 {
        server 127.0.0.1:5000;
    }

    server {
        listen 80;
        server_name yourdomain.com;

        location /xxx {
            proxy_pass http://app_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 /xxx/public {
                alias /home/aaa/xxx/public;
                try_files $uri $uri/ =404;
            }
        }

        location /yyy {
            proxy_pass http://app_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;

            # 确保静态文件可以被正确访问
            location /yyy/public {
                alias /home/aaa/yyy/public;
                try_files $uri $uri/ =404;
            }
        }
    }
}

解释

  1. Upstream: 定义了后端服务器组,这样可以简化配置。
  2. Server: 定义了监听的端口和域名。
  3. Location /xxx 和 /yyy: 这些定义了如何处理不同的请求路径,并将它们代理到相应的Express应用。
  4. Alias: 用于指定静态文件的实际路径,确保静态文件(如CSS文件)可以被正确访问。

示例Express应用

为了确保你的Express应用能够正确地提供静态文件,你可以使用Express内置的中间件express.static

示例代码

// xxx应用
const express = require('express');
const path = require('path');

const app = express();

// 提供静态文件
app.use('/public', express.static(path.join(__dirname, 'public')));

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

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

// yyy应用
const app2 = express();

// 提供静态文件
app2.use('/public', express.static(path.join(__dirname, 'public')));

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

app2.listen(5000, () => {
    console.log('Application running on port 5000');
});

以上配置应该能帮助你在Nginx中代理两个Express应用,并确保静态文件能够被正确访问。

回到顶部