nginx反向代理模块配置详解_【Nginx配置教程】upstream与
proxy_pas。。。
⼀、Nginx的反向代理与负载均衡
Nginx除了实现基本的Web Server功能之外还可以作为正向代理与反向代理。正向代理与反向代理的区别在于代理的对象不⼀样。正向代理的对象是客户端,反向代理的对象是服务端。做正向代理时,当客户端发起请求其访问⽬标应该是后端真实服务器;做反向代理时,客户端发起请求其⽬标应该是代理服务器本⾝,由代理服务器把后端真实服务器上的数据发给了客户端。反向代理通常是作为负载均衡来分发流量给后端的应⽤程序服务器,以此来提⾼性能。⽐如前端是⼀台Nginx作为负载均衡的分发器,后端是多台Apache搭建的Web Server,当访问流量很⼤时,就让Nginx分发请求给后端多台服务器,让它们分⼯响应。
⼆、Nginx负载均衡模块——ngx_http_upstream_module
要实现Nginx负载均衡需要⽤到ngx_http_upstream_module模块和proxy_pass模块。其中ngx_http_upstream_module模块只能定义在f的http字段中,该模块定义了需要反向代理的服务器池,然后进⾏负载均衡,最终再由proxy_pass模块进⾏反向代理。代理⽅式⽀持fastcgi_pass、memcached_pass、uwsgi等。
1、ngx_http_upstream_module中upstream常⽤参数
server:负载均衡后端服务器的IP或域名,不写端⼝的话默认是80。⾼并发场景⽤域名,再通过DNS进⾏负载均衡
weight:后端服务器权重,默认为1,权重越⼤接收的请求越多。例:weight=5
max_fails:检查节点的健康状态并允许请求失败的次数,达到该次数就将节点下线。默认为1,0表⽰禁⽌失败尝试。例:max_fails=2
fail_timeout:max_fails失败次数达到限制后暂停该节点服务的时间,默认是10秒。例:fail_timeout=10s
backup:热备配置,当服务池中所有服务器均出现问题后会⾃动上线backup服务器
down:标志服务器不可⽤,不参与负载均衡。这个参数通常配合IP_HASH使⽤
max_conns:限制最⼤连接数,通常对后端服务器硬件不⼀致的情况进⾏配置
keepalive:限制空闲长连接的最⼤数量
keepalive_timeout:空闲长连接的最长保持时间
keepalive_requests:每个长连接最多可以处理的请求数
2、upstream配置⽰例
upstream linuxe_backend {
server 192.168.1.110 down; #该节点不可⽤
server 192.168.1.120 backup; #其他节点挂了后该节点⾃动上线
server 192.168.1.130 max_failes=1 fail_timeout=10s weight-5;
server backend1.linuxe 8080 weight=3
keepalive 32; #最多允许32个长连接
keepalive_timeout 30s; #每个长连接保持30秒
keepalive_requests 100; #每个长连接允许100个请求
}
3、upstream负载均衡的算法
轮询算法(默认算法):每个请求会依次分配给后端不同的应⽤程序服务器,不理会后端服务器的实际压⼒。如下⾯代码,当⽤户访问server站点时,Nginx会负载平衡分配给后端的三个服务器。使⽤ab做压⼒测试可以看到在加了负载均衡后
Time per request(每个请求平均消耗时间)降低、Request per second(每秒请求数)提升。如果没有配置upstream模块⽽只使⽤
proxy_pass模块,可以实现反向代理的作⽤。
http { #upstream模块包含在http模块下
upstream myserver{ #定义upstream名字,下⾯会引⽤
server 192.168.1.100; #指定后端服务器地址
server 192.168.1.110; #指定后端服务器地址
server 192.168.1.120; #指定后端服务器地址
}
server {
listen 80;
server server;
location / {
}
}
}
加权负载均衡:权重越⼤的服务器,被分配到的次数就会越多,通常⽤于后端服务器性能不⼀致的情况。在下⾯代码中,每3个请求都分配给192.168.1.100,然后第4个请求会分配给192.168.1.110,如此循环下去
http {
upstream myserver{
server 192.168.1.100 weight=3; #指定后端服务器地址,权重为3
server 192.168.1.110;
}
server {
listen 80;
server server;
location / {
}
}
}
IP HASH:当同IP进⾏重复访问时会被指定到上次访问到的服务器,可以解决动态⽹站SESSION共享问题。如果需要将客户与后端⼀台服务器“绑定”起来,可以使⽤ip-hash负载平衡。这样可以确保来⾃相同客户机的请求总是指向相同的服务器除⾮该服务器不可⽤。
upstream myserver {
ip_hash; #采⽤IP HASH算法
server 192.168.1.100;
server 192.168.1.110;
server 192.168.1.120;
}
基于URL的HASH:当客户端多次访问同⼀个地址时分配到固定的节点
upstream myserver {
hash $request_uri;
server 192.168.1.100;
server 192.168.1.110;
server 192.168.1.120;
}
最少连接数轮询:哪个节点当前的连接数少就分配给哪个节点处理
least_conn;
三、Nginx反向代理模块——proxy_pass
1、proxy_pass语法⽰例
#将/test的请求转发到127.0.0.1的81端⼝
location = /test {
}
2、proxy_pass模块常⽤指令
proxy_pass:指定需要反向代理的服务器地址,可以是⼀个upstream池
proxy_next_upstream:如果后端服务器不可⽤的话⾃动将请求转发到另⼀台服务器,默认为on,还可以设置为timeout或者http状态码proxy_method:修改⽤户的method请求
proxy_http_version:修改⽤户的http协议版本
proxy_set_header:修改⽤户header头部,如客户端真实IP信息,也是配置较多的选项
proxy_set_body:修改⽤户包体信息
proxy_send_timeout:默认60S
proxy_connect_timeout:默认60S,Nginx与后端服务器连接超时时间
server {
listen 80;
server_name linxue;
location / {
proxy_method PUT;
proxy_http_version 1.1;
proxy_set_header test "var modify by nginx";
}
nginx和apache区别}
3、proxy_pass“/”的常见误区。不带"/"的话不会修改⽤户的URL,⽤户请求的是什么URL就返回什么URL;带"/"则相反,会将location指定的URL从⽤户URL删除掉
location /bbs/ {
}
location /bbs/ {
}
#⽰例3
location /test {
}
四、Nginx⾼可⽤的实现
利⽤backup标签可以实现⾼可⽤,当所有节点挂掉后backup服务器会⾃动接管服务,当有任意⼀台节点恢复后backup也会⾃动放弃服务
http {
upstream myserver{
server 192.168.1.100
server 192.168.1.110 backup;
}
server {
listen 80;
server server;
location / {
}
}
}
从上⾯多个配置⽰例来看Nginx的upstream模块相当于是建⽴⼀个服务池,把后端的服务器都放在池⼦⾥,⽽proxy模块则是从这个池⼦⾥调⽤这些服务器。
五、线上配置⽰例:
#先在f中定义⼀组upstream
upstream pre-cloud_Backend {
server pre-cloud.website:8080;
ip_hash;
check interval=5000 rise=1 fall=3 timeout=30000;
check_http_expect_alive http_2xx http_3xx; #tengine的健康检查模块
}
#conf.d/下定义⼀个⽂件
server{
listen 80;
server_name cloud.website;
limit_conn perserver 10000;
location / {
proxy_next_upstream error timeout http_503 http_504 http_502; #如果请求当前节点触发了这⾥指定的条件就将请求转发到下⼀个机器
proxy_connect_timeout 500s;
proxy_read_timeout 500s;
proxy_send_timeout 500s;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论