9

我正在尝试创建一个几乎没有重复的 nginx conf 文件。我正在使用 nginx 来提供静态文件,并将 404 或 php 内容代理到命名位置 @varnish:

location @varnish {
    proxy_redirect off;
    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_pass_header Set-Cookie;
    proxy_pass http://localhost:6081;
    proxy_set_header Request-URI $request_uri;
}

对于 nginx 应该检查它是否有文件然后传递到后端的“标准”情况,以下工作正常:

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    access_log        off;
    add_header      Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    expires           max;
    open_file_cache_valid 120m;
    try_files $uri @varnish;
}

但是,对于 PHP,我什至不希望它尝试该文件,它应该立即将请求重定向到 @varnish:

location ~ \.php$ {
    rewrite . @varnish last;
}

但是,这似乎不起作用。有两个独立的几乎相同的块(一个用于@backend,一个用于php)都引用相同的代理似乎很痛苦,并且是人类可能忘记将某些东西放在一个而不是另一个的问题。

4

1 回答 1

12

如果您将代理设置放入服务器上下文并让位置继承它们,那么复制的内容并不多。您还可以设置一个上游块,以便在需要时更轻松地更改代理目标:

upstream _varnish {
  server localhost:6081;
}

server {
  proxy_redirect off;
  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 Request-URI $request_uri;
  proxy_pass_header Set-Cookie;

  location @varnish {
    proxy_pass http://_varnish;
  }

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    access_log off;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    expires max;
    open_file_cache_valid 120m;
    try_files $uri @varnish;
  }

  location ~ \.php$ {
    proxy_pass http://_varnish;
  }
}
于 2012-06-14T12:54:51.297 回答