使用 NGINX 根据请求方法使用上游服务器

使用 NGINX 根据请求方法使用上游服务器

我正在使用 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”等等。

相关内容