我在上游遇到问题。 Web应用程序有一个位置块,如下所示。 我正在做ABtesting。
location / { include backend.conf; }
backend.conf
proxy_buffering on; proxy_set_header RIP $remote_addr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; set $session_id_included 'false'; if ($request_uri ~ ';jsessionid=') { set $session_id_included 'true'; } if ($query_string ~ ';jsessionid=') { set $session_id_included 'true'; } proxy_set_header SESSION_ID_INCLUDED $session_id_included; proxy_pass_header Set-Cookie; proxy_intercept_errors on; proxy_connect_timeout 30; proxy_read_timeout 30; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404 ; proxy_set_header Host 'example.com';; proxy_pass http://backend;
这个位置块正在看:
upstream backend { ip_hash; server backend_server_1 max_fails = 0 weight = 80; # old web application server backend_server_2 max_fails = 0 weight = 20; # new web application }
其实,一切正常。 但是,当我使用ip_hash连接到backend_server_1时,来自backend_server_2的404错误响应。
如何从我login的后端服务器获取404错误响应?
如果用户使用ip_hash连接到backend_server_1服务器,则404错误必须来自backend_server_1服务器。
如果用户使用ip_hash连接到backend_server_2服务器,则404错误必须来自backend_server_2服务器。
谢谢
如果指令proxy_next_upstream包含http_404 ,则从一个上游服务器返回的404错误将使得nginx将该请求传递给下一个上游服务器。
删除非默认条目http_404将使nginx仅服务于用户连接到的服务器的404个答案。
请注意,在这种情况下, max_fails参数意义不大,因为(引用nginx代理模块手册 ):
该指令还定义了与服务器的通信尝试失败。 [..] http_403和http_404的情况永远不会被视为不成功的尝试。
这意味着您可以使用通过max_fails进行尝试记帐 ,以更好地处理AB-Test故障的一个方面。 如果404的担心是禁用它的原因,现在重新考虑一下。