使用nginx配置多个Nodejs项目,静态文件404错误,求大神支招解决Nodejs问题

使用nginx配置多个Nodejs项目,静态文件404错误,求大神支招解决Nodejs问题

nginx配置应该怎么写 location /xxx{ root /home/aaa/xxx; proxy_pass http://127.0.0.1:8001; }

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

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

比如 http://121.14.58.212/2014 这个站点, 后台跳转到了 http://121.14.58.212:8001/ http://121.14.58.212/2014 这个站点的 css文件404 错误了 。。

怎么办啊,急求解决


7 回复

针对您描述的问题,Nginx 配置需要确保正确地处理静态文件请求。以下是修正后的 Nginx 配置示例:

Nginx 配置示例

server {
    listen 80;
    server_name your_domain.com;

    location /xxx {
        # 指定静态文件根目录
        root /home/aaa/xxx;
        # 处理静态文件请求
        try_files $uri $uri/ @node_xxx;
    }

    location @node_xxx {
        proxy_pass http://127.0.0.1:8001;
    }

    location /yyy {
        root /home/aaa/yyy;
        try_files $uri $uri/ @node_yyy;
    }

    location @node_yyy {
        proxy_pass http://127.0.0.1:8002;
    }
}

解释

  1. try_files $uri $uri/ @node_xxx;:

    • 这行代码的作用是首先尝试直接提供静态文件。
    • $uri 表示当前请求的 URI 路径。
    • $uri/ 表示请求的是一个目录,并尝试返回该目录下的默认文件(如 index.html)。
    • 如果上述两个条件都不满足,则将请求转发到名为 @node_xxx 的内部位置。
  2. @node_xxx@node_yyy:

    • 这些是内部位置,用于将请求代理到 Node.js 应用程序。
    • proxy_pass 指令用于将请求传递给指定的后端服务器。

示例解释

假设 /home/aaa/xxx 目录下有一个 public 文件夹,其中包含 CSS 文件。Nginx 将首先尝试直接从 /home/aaa/xxx/public 提供这些文件。如果找不到相应的文件,它会将请求转发到 Node.js 应用程序。

Node.js 应用程序配置

确保您的 Node.js 应用程序正确处理了静态文件路径。例如,如果您使用 Express 框架,可以这样配置:

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

// 静态文件中间件
app.use('/xxx', express.static('/home/aaa/xxx/public'));

// 其他路由
app.get('/', (req, res) => {
    res.send('Hello World!');
});

app.listen(8001, () => {
    console.log('Server is running on port 8001');
});

通过以上配置,Nginx 和 Node.js 应用程序应该能够正确处理静态文件请求,并避免 404 错误。希望这能帮助您解决问题!


css路径不对 在浏览器中看的地址是 http://121.14.58.212/stylesheets/style.css 其实应该是这个 http://121.14.58.212/2014/stylesheets/style.css

/2014 这个 path 破坏了楼主的 css 文件绝对路径

这是nginx配置的问题, 无论你用node, 还是php, rails 都会遇到这个问题.

如果配置的 nginx 是以 /xxx 为前缀区分应用的, 那么在 应用的代码里面, 资源根目录也必须以 /xxx 代替, 而不是默认的 /

使用express框架的项目,访问路径都是 以 ‘/’ 开头, 导致所有静态资源的请求都是以’/’ 开头 怎么给项目加上前缀 /xxx ,如果能加上/xxx 这个问题就解决了。

问题解决了。 我使用的express框架, 查阅express API 发现, 加上这样一行代码 就搞定了。 app.enable(‘trust proxy’); trust proxy 默认为 disable的

代码中 这样请求 <link rel=‘stylesheet’ href=‘stylesheets/style.css’ /> 实际会转换为 2014/stylesheets/style.css

根据你的描述,你想要通过Nginx配置多个Node.js项目,并且确保静态文件(如CSS、JS等)能够正确访问。问题可能出在Nginx配置中root指令和location块的设置上。

Nginx配置示例

为了正确处理静态文件,你需要确保Nginx可以找到这些文件。以下是改进后的Nginx配置示例:

server {
    listen 80;
    server_name yourdomain.com;

    location /xxx {
        alias /home/aaa/xxx/public; # 注意使用alias而不是root
        try_files $uri $uri/ [@node_1](/user/node_1);
    }

    location /yyy {
        alias /home/aaa/yyy/public; # 注意使用alias而不是root
        try_files $uri $uri/ [@node_2](/user/node_2);
    }

    location [@node_1](/user/node_1) {
        proxy_pass http://127.0.0.1:8001;
    }

    location [@node_2](/user/node_2) {
        proxy_pass http://127.0.0.1:8002;
    }
}

解释

  • alias vs root: 当使用alias时,Nginx会将请求路径直接映射到指定目录下,这样可以确保静态文件被正确访问。
  • try_files: 使用try_files确保首先尝试直接访问文件或目录,如果找不到,则转向后端Node.js服务。
  • @node_1@node_2: 使用内部位置(@)来代理请求到对应的Node.js应用。

确保Node.js应用正确配置

确保你的Node.js应用能够处理所有未匹配到静态文件的请求。例如,如果你使用Express框架,你可以这样做:

app.use(express.static('public')); // 设置静态文件目录为public

// 处理其他路由
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname + '/public/index.html'));
});

通过以上配置,你应该能够解决静态文件的404错误。

回到顶部