我正在使用 nginx 的上游指令进行一些负载平衡。但我想由我的主服务器处理 POST 请求和 /upload 目录的请求。
我如何告诉 nginx“如果请求方法是 POST 或者 url 包含 /admin 或 /upload,则不要代理通过”?
我当前的上游如下所示:
upstream appcluster {
ip_hash;
server 10.200.0.194:9000;
}
upstream admincluster {
ip_hash;
server unix:/tmp/php5-fpm.sock;
}
和我的sites-enabled/default
location ~ \.php(.*)$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/tmp/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param APPLICATION_ENV production;
include fastcgi_params;
fastcgi_pass appcluster;
}
答案1
您应该能够在其他位置块前面添加类似这样的内容:
location /upload {
break;
}
location /admin {
break;
}
if ($request_method = POST ) {
break;
}
更新:
nginx 首先搜索由文字字符串给出的最具体位置,而不考虑列出的顺序。在上面的配置中,唯一的文字位置是“/”,由于它与任何请求匹配,因此它将被用作最后的手段。然后 nginx 按照配置文件中列出的顺序检查由正则表达式给出的位置。第一个匹配的表达式将停止搜索,nginx 将使用此位置。如果没有正则表达式与请求匹配,则 nginx 将使用先前找到的最具体的文字位置。
因此,/upload 和 /admin 位置块是文字,并在您用于代理的正则表达式之后进行处理。
尝试“location ~^/admin”等等。