nginx的upstream模块实现超时自动切换服务
upstream testfail {
server 192.168.1.218 max_fails=1 fail_timeout=10s;
server 192.168.1.129 max_fails=1 fail_timeout=10s;
}
max_fails代表失败尝试次数,达到设置的次数则视为该服务不可用,
fail_timeout代表服务标为不可用后需等待fail_timeout的值对应时间后才会重新尝试连接该服务。
想要设置服务超时切换服务的关键在于proxy_read_timeout的配置,不仅仅分发服务的配置,而且还要看upstream下的服务(218和129)中配置的proxy_read_timeout,这里读取的超时是php-fpm的响应超时时间。
只有当分发服务的proxy_read_timeout < upstream下的服务的proxy_read_timeout,且upstream下的服务的proxy_read_timeout小于php执行的超时时间才能实现超时切换服务。
不然即便upstream的服务超时了返回结果是超时,但对于分发服务就是有响应,错误响应也是响应而不会视为超时。
分发服务:
server {
listen 8080;
server_name localhost;
error_log logs/error_8080.log;
location / {
proxy_pass http://testfail;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 non_idempotent;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
proxy_send_timeout 10s;
}
}
192.168.1.129服务:
location ~\.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_connect_timeout 10;
fastcgi_read_timeout 10;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFo $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
proxy_next_upstream后的参数代表哪些情况下会触发转发请求到下一个上游服务。
error
参数用于指定在与上游服务器建立连接、发送请求或读取响应头时发生网络错误的情况,例如网络不可达,网络故障等情况。
timeout适用于超时,基本依据的是proxy_connect_timeout, proxy_read_timeout,proxy_send_timeout这几个超时设置,而一般情况下连接超时和发送超时的情况很少触发,基本主要看proxy_read_timeout,可以视为上游服务的响应时间,超时即触发转发。
invalid_header应该是对应的是设置了无效的header
http_500 http_502 http_503 http_504则是对应http响应码,请求响应500、502、503、504时触发转发。
non_idempotent代表的是会转发非幂等请求(post、put、delete等),不添加时默认只处理转发幂等请求如get请求。