ExpressJS中的静态文件无法通过Nginx加载

时间:2017-11-13 14:26:50

标签: node.js express nginx

简而言之,Nginx和Node JS都运行在同一台服务器10.0.0.120上。我可以通过http://10.0.0.120:3000访问节点应用,所有样式表都已正确加载。

我想通过10.0.0.120/abc/访问Node应用程序,所以我在/etc/nginx/sites-available/default

中设置了以下Nginx
location /abc/ {
  proxy_pass http://localhost:3000/;        
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

现在10.0.0.120/abc/可以访问Node应用程序但返回没有加载样式表,因为相对路径映射到10.0.0.120/stylesheets,显然不存在。

在NodeJS方面,我只使用了Express模板,其中public文件夹用于提供静态文件。

app.use(express.static(path.join(__dirname, 'public')));

Node目录树如下所示

Node App
|
|── public
|   ├── images
|   ├── javascripts
│   │   ├── bootstrap.js
│   │   ├── bootstrap.min.js
│   │   └── jquery.min.js
│   └── stylesheets
│       ├── animate.css
│       ├── bootstrap.css
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js

如何更改Nginx设置以解决问题?

3 个答案:

答案 0 :(得分:0)

  1. 从您的代码中排除app.use(express.static(path.join(__dirname, 'public')));
  2. 配置下面的nginx代理(conf/nginx.conf文件)。

    http {
    ...
      server {
        listen 2000;
        server_name localhost;
        root YOUR-APP-PATH/public;
    
        location / {
          try_files $uri @backend;
        }
    
        location @backend {
          proxy_pass http://localhost:3000;
        }
        ...
    
  3. 2000端口上运行应用程序。使用静态文件的应用程序将在3000上启用。

  4. P.S。我不是nginx专家,但它为我工作。

答案 1 :(得分:0)

尝试使用 app.use(express.static('public'))。 Express应该在没有path.join的情况下识别。我希望这有帮助

答案 2 :(得分:0)

最好通过nginx直接提供静态文件,效率更高,你可以轻松管理那里的缓存

server {

       listen YOUR_APP_PORT;
       server_name YOUR_SERVER_NAME;

       location /abc/ {
          YOUR_STANDARD_ROUTING_CONFIGURATION
       }

       location ~^\/(images|stylesheets|fonts|javascripts) {
           expires 1M;
           access_log off;
           add_header Cache-Control "public";
           add_header Access-Control-Allow-Origin *;
           add_header Access-Control-Allow-Methods GET;
           add_header Access-Control-Allow-Headers X-Requested-With,content-type;
           add_header Access-Control-Allow-Credentials true;
           root YOUR_APPLICATION_PATH/public;
       }   

}