代理Nginx Express - 静态文件404错误

3
当我从我的服务器ip:port浏览站点时,expressjs应用程序的静态文件完美地工作,但当应用程序从nginx提供服务时,静态文件会出现404错误。以下是我的nginx配置:
upstream project {
  server localhost:6546;
}

server {
  listen 80;
  server_name example.com;
  access_log  /var/log/nginx/example.com_access.log;
  error_log   /var/log/nginx/example.com_error.log;

  location / {
    proxy_pass http://project/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
  }
  location ~* \.(css|js|gif|jpe?g|png)$ {
    expires 168h;

  }

以下是我用expressjs编写的静态文件代码:

app.enable('trust proxy');
app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(express.static(__dirname + '/public'));
app.set('view engine', 'ejs');
if (app.get('env') === 'production') {
    app.set('view cache', true);
}
1个回答

3

尽管express.js通过一些连接中间件内置了静态文件处理功能,但您不应该使用它。Nginx可以更好地处理静态文件,并防止非动态内容的请求阻塞节点进程。以下是一个示例:

http {
    ...
    server {
        ...
        location ~ ^/(images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
          root /home/ubuntu/expressapp/public;
          access_log off;
          expires max;
        }
        ...
    }
}

你能解释一下为什么我永远不应该使用它吗? - Dima Gimburg
1
当然,在短期内,使用Node来提供这些资源会消耗更多的机器资源,而不是从Nginx中提供,因此考虑到生产环境...这种方式解决问题会更好...你不觉得吗? - edsadr
我猜你是对的。无论如何,也许你也可以帮助我 :) 我正在使用你的位置正则表达式,但静态文件仍然返回404错误。我是否还需要在我的app.js中删除express.static模块?我将根目录设置为/var/www/html/test/public,我的css文件位于/stylesheets下。 谢谢! - Dima Gimburg
很难在没有看到您的配置文件的情况下提供帮助... 请提出一个问题。 - edsadr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接