根据我对 nginx 文档的理解,位置不能嵌套(或者更确切地说,如果它们的效果不可继承)并且proxy_pass
不能属于该server {}
级别。所以我现在的配置是这样的,我知道我可以通过使用文件路径来缓解一些问题,但是让我们假设我在使用proxy_pass
.想必有一种更好的方法可以在不重复的情况下编写此内容:
server {
listen 80;
server_name salessystem.acmecorp.com;
location /extjs/ {
## proxy_buffers 128 256k;
proxy_pass http://localhost:5400/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header 'X-UA-Compatible' 'IE=Edge;chrome=1';
expires max;
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 7;
gzip_proxied any;
gzip_types text/html text/css text/pdf application/json application/x-javascript text/javascript;
access_log off;
break;
}
location / {
## proxy_buffers 128 256k;
proxy_pass http://localhost:5400/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header 'X-UA-Compatible' 'IE=Edge;chrome=1';
expires epoch;
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 7;
gzip_proxied any;
gzip_types text/html text/css text/pdf application/json application/x-javascript text/javascript;
access_log off;
break;
}
}
答え1
我认为您的 nginx 配置如下:
- 因为这只是两个不同位置的过期标头不同,尽管两者都将代理匹配到同一服务器。
- 尝试将两个位置放在一个块中
- 根据查询字符串(或位置匹配字符串)设置不同的过期标头
标签。
server {
listen 80;
server_name salessystem.acmecorp.com;
location ~* (/extjs/|/) {
## proxy_buffers 128 256k;
proxy_pass http://localhost:5400/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
add_header 'X-UA-Compatible' 'IE=Edge;chrome=1';
expires max;
if ($query_string ~ \/extjs\/) {
expires epoch;
}
gzip on;
gzip_http_version 1.1;
gzip_vary on;
gzip_comp_level 7;
gzip_proxied any;
gzip_types text/html text/css text/pdf application/json application/x-javascript text/javascript;
access_log off;
break;
}
}
但是,请根据您的需要进行测试,尤其是在正则表达式匹配location
和query_string
值匹配附近。
然而,尚不清楚为什么您希望 extjs
从代理服务器(似乎是动态应用程序服务器)中获得服务,因为如果我的假设是正确的,它们只是纯文本文件。相关请求extjs
不需要通过代理或应用程序逻辑系统,以防万一它们可以通过文件系统独立提供服务。我考虑将其保留在其单独的位置本身,并在其自己的位置块中拥有独特的 gzip/expires 指令,而其他常见指令可以保存在服务器块本身中。
例如:
server {
...
common gzip directives
common header setters
common expires setters
...
location / {
proxy to backend app server
settings unique to / location
..
}
location /extjs {
settings unique to /extjs location
expires header reset
...
}
}