nginx7层负载均衡
nginx补充
master进程: 加载配置文件,管理worker进程,平滑升级
worker进程:基于BSD(kevent),linux(epoll)来实现并发机制
磁盘高级特性: sendfile,AID,mmap(内存映射)
正向代理
代理客户端的IP和PORT。正向代理,基于某种特定的协议代理,不能全部代理。比如http协议只能代理http请求
反向代理
proxy_pass
location /admin/ {
proxy_pass http://10.0.0.12/;
}
[root@mysql ~]# curl http://10.0.0.11/admin/index.html
shou ye 10.0.0.12
# 在10.0.0.12后面加/,意味着前端代理/admin/路径替换为10.0.0.12的跟路径
curl http://10.0.0.11/admin ==> curl http://10.0.0.12/
当location 后面的路径是一个url,会替换为 proxy_pass的url
--------------------------------------------------------------------------------------------------------------
location /admin/ {
proxy_pass http://10.0.0.12;
}
[root@mysql ~]# curl http://10.0.0.11/admin/index.html
10.0.0.12
# 在 192.168.10.62后面不加/,意味着前端代理/admin到后端10.0.0.11 依然admin访问
curl http://10.0.0.11/admin ---------------------> curl http://10.0.0.12/admin
--------------------------------------------------------------------------------------------------------------------------
location ~* /admin/ {
proxy_pass http://10.0.0.12/;
}
[root@mysql ~]# nginx -t
nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/nginx.conf:47
nginx: configuration file /etc/nginx/nginx.conf test failed
如果location中定义了匹配url中使用了正则表达式,或在if语句,或者在limit_except 中
使用 proxy_pass指令,则proxy_pass 不能使用 / 路径
proxy_set_header
修改反向代理到服务端的header内容
proxy_set_header HOST $host; 修改反向代理后端服务器的header的host 主机信息
proxy_set_header X-Forward-For $proxy_x_forward_for 增加请求头的客户端IP信息
$proxy_x_forward_for 在日志后面附加IP,如果是多级代理。会附加多个代理IP
$remote_addr 在日志中只能增加客户端IP
proxy_cache
image.pnghttp{
proxy_cache_path /nginx/cache levels=1:1:1 keys_zone=pcache:10m max_size=2g;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
proxy_cache pcache;
proxy_cache_key $request_uri;
proxy_cache_methods GET HEAD;
proxy_cache_min_uses 2;
proxy_cache_valid 200 302 10m;
proxy_cache_use_stale http_502;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location /admin/ {
proxy_pass http://10.0.0.12;
}
}
proxy_cache_path 定义了缓存,定了缓存的路径 levels:采用几级目录来存放缓存值。1:1:1代表3级目录,且每级目录最多16个子目录。最多定义3 及每级子目录有256个目录 keys_zone:定义了缓存的名字,10m这是缓存值元数据,在内存中占多大空间 max_size=2g则是缓存磁盘的文件最大占多少
proxy_cache 决定使用哪个缓存,可以在server,location,http中定义。不同的标签定义,不同的适用范围
proxy_cache_key ;把什么当做键,作为缓存命中
proxy_cache_methods 什么方法可以用于获得缓存
proxy_cache_min_uses 在interactive_time的时间内,命中几次就可以不用清除。interactive_time也为一个参数,默认参数的值就可以
proxy_cache_valid;定义各种不同的内容缓存的时间
proxy_cache_use_stale 定义了当后端服务器出现什么情况的可以走缓存
--------------------------------------------------------------------------------------------------------------------------------
proxy_connect_timeout time;后端服务器与代理服务器端连接的超时时间,默认60秒,最大不超过75秒
proxy_read_timeout time;后端服务器读取代理服务器请求的超时时间,即响应的超时时间。两次响应的时间间隔的时间
proxy_send_timeout time;代理服务器向后端服务器,发送请求的超时时间
客户端连接代理服务器的超时时间 keepalive_timeout
fastcgi代理
image.pngphp对fastcgi的并发处理能力不是很好,可采用Apache+php加载php模块来使用,使用apache prework模型来处理。静态由nginx处理
location ~* \.php$ {
fastcgi_pass 10.0.0.12:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/nginx$fastcgi_script_name;
include fastcgi_params;
}
10.0.0.12
yum -y install php-fpm php-cli
vim /etc/php-fpm.d/www.conf
listen = 0.0.0.0:9000
listen.allowed_clients = 10.0.0.12,10.0.0.11,127.0.0.1
user nginx
group nginx
-------------------------------------------------------------------------------------------------------------------------
fastcgi_pass 和proxy_pass 一样此处使用的是fastcgi协议
fastcgi_param 要修改的参数 因为fastcgi没有root定义,所以用户访问的根路径,fastcgi不会知道,此处定义php文件的跟路径/data/nginx $fastcgi_script_name fastcgi脚本的名字,即访问的php的路径uri
include fastcgi_params;fastcgi_params 中定义了一些用户变量要传递给php-fpm,以确保每个用户访问的内容,都是自己的内容。这个文件中也可以$fastcgi_script_name fastcgi 这个脚本的路径,不过在配置文件中改
fastcgi_cache_path 一些fastcgi代理缓存的内容,与proxy一致。
upstream模块
http{
upstream websrv {
server 10.0.0.12:80;
server 10.0.0.15:80;
}
server {
location / {
proxy_pass http://websrv;
}
}
}
---------------------------------------------------------------------------------------------------------------------------
Syntax: server address [parameters];
Default: —
Context: upstream
#parameters说明
least_conn: 最少连接 ==> LVS LC
wegiht 权重
max_conns=number 定义服务器的并发最大连接数
max_fails=number 健康检查状态 0代表不检查,失败重试的次数
faile_timeout = second 健康检查状态,超时多长时间失效
backup 备用主机,server全挂了它才会响应,可以作为灰度发布
down 人为把sever down了
# 调度算法
ip_hash:不支持backup,相当于sh,基于IP地址,做粘性session
hash key; hash把什么就把什么当键调度,key为cookie就基于cookie调度(商业版支持cookie绑定)
hash key [consisten]
hash $request_uri 基于LVS的DH,所有请求连接都在同一台服务器上,提高缓存命中率
(根据hash 表保存对应的记录,传统方式)
取模法
对key进行hash算法,然后对后端服务器权重总和进行取模,假设A(2),B(1),权重为3.取模为0,1,2.0分配到A,1分配到A,2分配到B。根据取模的余数,分配连接到服务器
问题:当后端服务器权重出现改变,或者后端服务器节点出现变化时。会导致连接全部打乱,导致雪崩效应
一致性哈希算法
会解决取模算法弊端,伯克利大学的教授发明对key的hash进行232次方取模,得到余数范围0-232-1,并将0-232-1的所有数平均分配到一个圆上,对后台服务器的IP进行232次方取模,
image.png 。假设3台服务器平均落到圆上的3个位置,对key进行取模。3台服务器平均分配到圆上的3个位置。依据对连接url取模的位置落点,到圆上的三个位置的长短进行分配连接,假设A宕了,只影响AB这一段
问题: image.png
3台服务器没有分配到圆上,为了解决这一问题,采用虚拟服务器方法。对各个服务器各加50台虚拟服务器,对虚拟服务器进行取模。真实服务器,承担虚拟服务器的连接数。这样就可以平均分配服务器的连接数
hash key [consisten]
hash key 取模法
hash key [consisten] 一致性哈希算法(消耗更多的性能,计算量更大)
keepalive connections;
保持连接的个数,默认没有。客户端30000个请求,反向代理也需开启30000个socket连接后端服务器。则所有请求后端某一台server的都保持连接,不用开启新的socket和不用三次握手。由于前端访问量具大,所以需要定义多少个连接是长连接。此处长连接是针对worker进程
upstream websrv {
server 10.0.0.12:80;
server 10.0.0.15:80;
keepalive 32;
}
stream 模块
无法解析某个具体服务,所以每个server中一定有个proxy_pass,可以为后端某个协议的具体主机,其余高级功能与http模块的反向代理一样
stream {
server {
listen 2099;
proxy_pass 10.0.0.12:22;
}
}