nginx实现负载均衡
一、nginx负载均衡
负载均衡的作用
负载均衡的作用是为了解决单个节点压力过大,造成Web服务响应过慢的问题。
以轮询为例,如下是nginx.conf完整代码
worker_processes 1;
events {
worker_connections 1024;
}
http {
upstream server {
server localhost:10001;
server localhost:10002;
}
server {
listen 10000;
server_name localhost;
location / {
proxy_pass http://server;
proxy_redirect default;
}
}
}
负载均衡策略
-
轮询:
轮询方式是Nginx负载默认的方式,顾名思义,所有请求都按照时间顺序分配到不同的服务上,如果服务Down掉,可以自动剔除,如下配置后轮训10001服务和10002服务。
upstream server { server localhost:10001; server localhost:10002; }
-
iphash
每个请求都根据访问ip的hash结果分配,经过这样的处理,每个访客固定访问一个后端服务,如下配置(ip_hash可以和weight配合使用)。
upstream server { ip_hash; server localhost:10001 weight=1; server localhost:10002 weight=2; }
-
最小连接数
将请求分配到连接数最少的服务上。
upstream server { least_conn; server localhost:10001 weight=1; server localhost:10002 weight=2; }
-
最小相应时间
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream server { fair; server localhost:10001 weight=1; server localhost:10002 weight=2; }
-
url_hash
使用url_hash,可以使得同一个url到达同一台服务器。
upstream server { hash $request_uri; server localhost:10001; server localhost:10002; }
备注:最小相应时间和rul_hash策略属于第三方策略,需要第三方模块的支持。
upstream 参数
参数 | 描述 |
---|---|
service | 反向服务地址+端口 |
weight | 权重 |
max_fails | 失败多少次 认为主机已挂掉则,踢出 |
fail_timeout | 踢出后重新探测时间 |
backup | 备用服务 |
max_conns | 允许最大连接数 |
slow_start | 当节点恢复,不立即加入 |
down | 停掉当前服务 |
-
weight (权重)
指定每个服务的权重比例,weight和访问比率成正比,通常用于后端服务机器性能不统一,将性能好的分配权重高来发挥服务器最大性能,如下配置后10002服务的访问比率会是10001服务的二倍。
upstream server { server localhost:10001 weight=1; server localhost:10002 weight=2; }
-
max_conns
可以根据服务的好坏来设置最大连接数,防止挂掉,比如1000,我们可以设置800。
upstream server { server localhost:10001 max_conns=800; server localhost:10002 max_conns=1000; }
-
max_fails、 fail_timeout
max_fails:失败多少次 认为主机已挂掉则踢出。
max_fails=3 fail_timeout=30s代表在30秒内请求某一应用失败3次,认为该应用宕机,后等待30秒,这期间内不会再把新请求发送到宕机应用,而是直接发到正常的那一台,时间到后再有请求进来继续尝试连接宕机应用且仅尝试1次,如果还是失败,则继续等待30秒…以此循环,直到恢复。
upstream server { server localhost:10001 max_fails=1 fail_timeout=30; server localhost:10002; }
-
**backup、down **
backup:当配置的所有服务挂掉后,备份服务开始工作。
down:停掉当前服务
upstream server { server localhost:10001 down; server localhost:10002 backup; }
-
slow_start
设置服务器权重从0恢复到表中值的时间
upstream server { server localhost:10001 weight=6 slow_start=60s; server localhost:10002; }
二、nginx负载均衡 + ssl证书
如果nginx使用https访问需要提前安装ssl模块。
查看是否安装ssl模块
/usr/local/nginx/sbin/nginx -V
出现configure arguments: --with-http_ssl_module表示已经安装。
如果安装的时候没有编译ssl模块,可以补装ssl模块。
-
在解压目录下重新添加ssl模块 ./configure --with-http_ssl_module
-
执行make命令,命令执行完成后可以在解压目录下objs文件夹中,看到一个nginx的文件,这个新版本的nginx。
-
先备份nginx ,之后将新版本的nginx覆盖之前的即可。
# 备份nginx cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak # 覆盖nginx cp objs/nginx /usr/local/nginx/sbin/nginx
申请ssl证书,将ssl证书中的1_www.xxxxx.com_bundle.crt文件和 2_www.xxxxx.com.key文件复制到 /etc/nginx/cert/ 文件夹下。
upstream server {
server localhost:10001;
server localhost:10002;
}
# https
server {
listen 11000;
server_name www.xxxxx.com;
# 开启ssl
ssl on;
# 指定crt文件所在路径
ssl_certificate "/etc/nginx/cert/1_www.xxxxx.com_bundle.crt";
# 指定key文件所在路径
ssl_certificate_key "/etc/nginx/cert/2_www.xxxxx.com.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://server;
index index.html index.htm;
}
}
# http
server {
listen 10000;
server_name localhost;
location / {
proxy_pass http://server;
proxy_redirect default;
}
}
三、nginx负载均衡 + webstock
如果nginx负载均衡支持webstock需要在location中单独的配置。
upstream server {
server localhost:10001;
server localhost:10002;
}
# 支持webstock
server {
listen 10000;
server_name localhost;
location / {
proxy_pass http://server;
#webstock配置。
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # 升级协议头
proxy_set_header Connection upgrade;
proxy_read_timeout 6000s; #超时时间 10分钟
}
}