有3台服务器
运行nginx和两个后端服务器(server1,server2)的“ server3”。
在server3上获得以下配置:
server {
listen 80;
location @onerror {
return 302 http://server2.com$request_uri;
}
location / {
proxy_connect_timeout 1s;
proxy_pass http://server1.com/;
error_page 400 401 402 403 404 405 500 501 502 503 504 @onerror
}
}
我的目标是,请求到达server3并尝试server1,如果无法连接或出现其他错误,它将重定向到server2。
这很好,但不能完全“优化”,因为如果server1正常运行,则所有流量都通过server3,这并不是真正需要的,因为302重定向将完成工作,并且客户端将重定向到server1。
如果server1已启动并且正在运行,则所有客户端都需要使用负载平衡,但只有当它关闭时,客户端才需要使用server2。
现在我的问题,
以任何方式我可以将nginx配置为“尝试”连接到server1,如果它可以正常工作,请不要使用proxy_pass而是使用302 redirect?
谢谢。
答案 0 :(得分:0)
似乎我找到了一种解决方案,而不是完美的解决方案,但是可以解决问题。
首先我尝试过:
server {
listen 80;
location @server_up {
return 302 http://server1.com$request_uri;
}
location @onerror {
return 302 http://server2.com$request_uri;
}
location / {
proxy_connect_timeout 1s;
proxy_pass http://server1.com/;
proxy_intercept_errors on;
error_page 200 @server_up;
error_page 400 401 402 403 404 405 500 501 502 503 504 @onerror
}
}
这意味着如果我们从服务器上获得200个状态代码,则意味着它已启动并在@server_up上对其进行处理。
从nginx遇到以下错误:
nginx [emerg] value "200" must be between 300 and 599
我们不能将200个代码用作“错误”,而且似乎没有办法允许这样做,因此我在这篇文章中找到了一个技巧/黑客:
How to change the status code of a proxied server response in nginx?
所以我将配置更改为此:
server {
listen 80;
location @server_up {
return 302 http://server1.com$request_uri;
}
location @onerror {
return 302 http://server2.com$request_uri;
}
location / {
proxy_connect_timeout 1s;
#proxy pass to non existing url so we can intercept the 404 error and we know server is up
proxy_pass http://server1.com/hgfkdjhgfdkjhgdfkhgkfdjh;
proxy_intercept_errors on;
error_page 404 @server_up;
error_page 400 401 402 403 405 500 501 502 503 504 @onerror
}
}
我们请求服务器上不存在的URL,如果无法连接,则会触发@onerror,但如果服务器启动,则会触发@server_up,并且我们可以重定向到server1.com。