配置 nginx 仅检查少数目录中的硬文件,

配置 nginx 仅检查少数目录中的硬文件,

对于我正在做的 node.js 项目,我有一棵像这样的树。

├── public
│   ├── components
│   ├── css
│   └── img
├── routes
└── views

本质上,我将根设置为public。我希望所有发往

/components/
/css/
/img/

检查磁盘上是否存在相应的目标。但是,我不希望对其他目录的请求甚至运行 IO 操作,

/foo/asdf
/bar
/baz/index.html

这些都不应该导致磁盘被触碰。

我有一个 stansa,它对 node.js 进行代理,

location @proxy {
  internal;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-NginX-Proxy true;
  proxy_pass http://localhost:3030;
  proxy_redirect off;
}

我只是想知道如何安排。如果try_files只接受一个参数,我的问题就很容易解决,但它总是需要一个文件。

location /components/ { try_files $uri @proxy }
location /css/ { try_files $uri @proxy }
location /img/ { try_files $uri @proxy }

然而,我找不到任何东西可以给我,

location / { try_files @proxy }

我怎样才能得到我想要的效果?

答案1

不要犹豫重复某些配置部分。这是 nginx 使配置变得简单和明显的方式。

server {
    listen 80;
    server_name example.com

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_redirect off;

    root /path/to/public;

    location /components/ { try_files $uri @proxy; }
    location /css/ { try_files $uri @proxy; }
    location /img/ { try_files $uri @proxy; }

    location / {
        proxy_pass http://localhost:3030;
    }

    location @proxy {
        proxy_pass http://localhost:3030;
    }
}

但将静态和动态内容分开会更好:

server {
    listen 80;
    server_name example.com

    root /path/to/public;

    location /components/static/ { }
    location /css/ { }
    location /img/ { }

    location / {
        proxy_pass http://localhost:3030;

        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        proxy_redirect off;
    }
}

答案2

我不能 100% 确定这是正确的,但这似乎有效

location /components/ { try_files $uri / }
location /css/ { try_files $uri / }
location /img/ { try_files $uri / }

location @proxy {
  internal;
  proxy_set_header Host $http_host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-NginX-Proxy true;
  proxy_pass http://localhost:3030;
  proxy_redirect off;
}

相关内容