我使用 Nginx 做负载均衡,有时候可能某一台服务器可能会临时出问题,无法访问。这个时候就需要检测服务器是否有问题,这里的检测方式有两种:
1、被动健康检测
就是会判断请求在规定时间内是否报错,如果连续报错多少次,就暂停访问这台服务器多少秒,之后在循环前面的操作。
2、主动健康检测
就是 Nginx主动向其他服务器不间断的发送请求,判断健康检查请求是否得到正确响应。但是这个需要安装第三方的模块。
我今天这里只讲被动健康检查,只需要配置一下 Nginx 的配置文件就可以了,非常简单。完整的配置如下:
重点代码下面来详细讲解一下
upstream detayun_server {
server 127.0.0.1:8000 max_fails=1 fail_timeout=140s;
server 192.168.31.217:80 max_fails=1 fail_timeout=140s;
}
这里就是配置不同的服务器,
max_fails 参数就是最大失败次数,如果连续失败次数超过设置的值,就会把这台标记为不可用。
fail_timeout是标记失败的时间,max_fails触发了,就把这台服务器标记为不可用的时间。
所以整体的意思是,如果某台服务器有一次请求触发失败,就会把这台服务器140秒内标记为不可用,所有的请求都不会在140秒内发送给这个服务器。所以 max_fails 和 fail_timeout 两个参数是需要配合一起使用的。
proxy_connect_timeout 3s;
proxy_read_timeout 3s;
proxy_connect_timeout 指令用于设置 Nginx 与后端服务器建立连接的超时时间。这个超时时间是从 Nginx 发起连接到服务器开始,到服务器响应连接请求为止的时间。如果在这个时间内没有建立连接,Nginx 将关闭连接并返回一个错误。
proxy_read_timeout 指令用于设置 Nginx 从后端服务器读取响应的超时时间。这个超时时间是从 Nginx 收到后端服务器的第一个字节开始,到接收完整个响应为止的时间。如果在这个时间内没有接收到完整的响应,Nginx 将关闭连接并返回一个错误。
设置这两个参数,可以让 Nginx 更快的判断某台服务器是否不可用。默认可能会判断20秒,之后就只需要6秒就可以判断完毕。
完整配置如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
proxy_connect_timeout 3s;
proxy_read_timeout 3s;
#上传文件的大小限制 默认1MB
client_max_body_size 50m;
upstream detayun_server {
server 127.0.0.1:8000 max_fails=1 fail_timeout=140s;
server 192.168.31.217:80 max_fails=1 fail_timeout=140s;
}
server {
listen 80;
server_name detayun.cn;
root E:\Python\lixin_project\lixin;
location / {
proxy_set_header Host $http_host; # 设置代理服务器的HTTP_HOST头部
proxy_pass http://detayun_server;
root html;
index index.html index.htm;
}
location /static {
try_files $uri /static/img/detayun_logo1.png;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# HTTPS server
server {
listen 443 ssl;
server_name detayun.cn;
root E:\Python\lixin_project\lixin;
ssl_certificate detayun.pem;
ssl_certificate_key detayun.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $http_host; # 设置代理服务器的HTTP_HOST头部
proxy_pass http://detayun_server;
root html;
index index.html index.htm;
}
location /static {
#alias /root/test;
try_files $uri /static/img/detayun_logo1.png;
}
}