- 前言
- upstream模块配置
- upstream相关参数
- 反向代理方式
- http_proxy_pass模块
- 调度算法
- 缓存
- 企业案例
- nginx内核优化
- 高可用
- 点击劫持的避免以及防止页面被iframe嵌套
前言
nginx的负载均衡是应用层的负载均衡,也就是七层负载均衡。而nginx做反向代理有一个特点,当后端节点挂掉时会报502网关错误
upstream模块配置
概述 简单版本由于过程过于简单,不再复述了
egrep -v '#|^$' /usr/local/nginx/conf/nginx.conf.default > /usr/local/nginx/conf/nginx.conf
upstream web_pools {
server 192.168.1.2:80 weight=5;
server 192.168.1.3:80 weight=5;
#server backup2.example.com:8080 backup;
}
#server {
# location / {
# proxy_pass http://backend;
# }
#}
主机模块需要添加转发功能
proxy_pass http://web_pools;
upstream相关参数
ip_hash //默认的算法是wrr(权重轮询),IP哈希会将同一个ip的请求分发到同一台机器上。并且启用哈希时备份的功能不能使用
server //后面可以跟服务器具体ip,也可以跟域名,然后做dns负载均衡,适用高并发。
max_fails=2 //最大尝试失败次数,默认为1次,0则代表不能失败
backup //可以做热备,并且当主活了之后会切回去,这里就相当于高可用了,web服务器之间做keepalive可以用一台nginx的backup替代
fail_timeout=20s //探测规定次数失败后间隔多长时间再继续探测,成功则切回去
max_conns=10 //该台web最大连接数
proxy_next_upstream http_502 http_504 error timeout invalid_header //后端服务器返回相关错误,请求转发给负载均衡池中的其他机器
反向代理方式
- proxy_pass
- 这个模块使得请求转发成为可能,后面接url。由于是一个单独的模块,所以后面拿出来单独讲
- fastcgi_pass
- memcache_pass
http_proxy_pass模块
proxy_set_header
//后端的服务器获取用户的主机名和源ip以及本机代理的ip
//这个作用是因为nginx代理的时候用户请求会重新由自己发起一个请求,用户请求的一些参数就会被忽略掉,因此当后端服务器上配有多个虚拟主机的时候就需要获取带上用户的host来区分代理的是哪个主机名
Host $host
X-Forwarded-For $remote_addr
调度算法
- rr轮询这和lvs的rr算法一样
- weight 一般就是和默认rr配合使用,一般用来解决服务器性能不均的问题
- ip_hash 这个一般用来解决session的共享问题,但鉴于国内普遍nat的网络,很大程度上会导致请求分配不均的问题。当然session保持的问题也可以用memcache来缓存后端web集群的session会话信息
- fair 这是第三方的动态算法,根据后端服务器的响应时延来分配请求,需要额外下载upstream_fair模块
- url_hash
- 属于第三方功能模块,要额外下载hash软件。这个对于后端为cs的架构十分有效,提高缓存命中率。
- 从这里也能够看出缓存服务器和web服务器的区别在于cs每台内容都不一样,而web则都是相同的
- 一致性hash
- 在url-hash情况下如果一台缓存服务器down掉,就会进行重新hash,导致其他所有cs的缓存内容发生变化
- 并且url-hash采用的余数hash算法伸缩性差,机器的增减会影响用户id和服务器的映射关系
- 一致性hash利用hash环的概念,让down/新增/减少的机器在哈希环上撤除或添加,但是能够保证无变化cs上的请求不受到影响,只会将改变的cs上的请求顺延给下一个cs代理处理
- least_conn
缓存
http模块下
proxy_temp_path //该目录必须和cache_path一致
proxy_cache_path //缓存路径
keys_zone=cache_one:200m //缓存区名称和内存缓存空间
inactive=1d //失效删除时间
max_size=30g //磁盘缓存空间
server模块下
proxy_cache 名称 //调用cache配置
proxy_cache_valid 200 304 12h; //不同状态码设置不同的缓存时间
proxy_cache_key $host$uri$is_args$args //以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
企业案例
动静分离
概述 一方面是易于管理,另一方面在权限设置方面更加灵活,提高安全性
- 根据请求文件扩展名
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
proxy_pass http://pools;
}
- 根据请求文件所在目录
location /static {
proxy_pass http://pools;
}
- 根据user-agent(客户端标识)
概述 不同客户端访问同一个url得到不同的内容,这种实际应用在于移动端和pc端的页面显示不兼容的问题,也就是通过不同的域名前缀来区分
location / {
if ($http_user_agent ~* "MSIE")
{
proxy_pass http://dynamic_pools;
}
if ($http_user_agent ~* "Firefox")
{
proxy_pass http://static_pools;
}
proxy_pass http://dynamic_pools;
}
//移动端标识:android|iphone
//pc端标识:MSIE|Firefox|Chrome
nginx内核优化
tcp连接优化
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_rw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepablive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
iptables优化
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
高可用
概述 配合keepablive(ip迁移)实现,也可以配合heartbeat(联系更加紧密),它的局限性还是有的,也就是
keepalive
概述
- 起初是为了配合lvs进行设计的,进行节点存活监控,后来加入了vrrp功能,使得能够保证服务的不间断运行。也就是通过虚ip来进行故障切换,并且对集群节点做健康检查(端口/url)
- 当然配合nginx也不是没有缺点,比如说如果两边keepalived服务挂掉了,那么虚ip就消失了。另外只能监控到机器挂掉了,而不能精确到反向代理服务是否挂了。
vrrp原理
- 解决静态路由单点故障的问题,使用ip多播方式实现通信,平且使用了加密协议
keepalive安装
www.keepalived.org
//官网下载1.2.16版本
cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/ //规范启动命令
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ //配置文件规范
mkdir /etc/keepalived && cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ //创建默认配置文件路径并拷贝
cp /usr/local/sbin/keepalived /usr/sbin/ //命令规范
/etc/ini.d/keepalived start/stop
keepalived配置
全局
global_defs {
router_id LVS_01 //两端要配置不一样的
}
vrrp实例
vrrp_instance VI_1 {
state MASTER/BACKUP //本机角色
interface eth0 //虚ip绑定的接口
virtual_router_id 51 //实例id,两边保持一致,最多20个实例
priority 100 //优先级,越大越优先
advert_int 1 //心跳接管间隔
authentication {
auth_type PASS //认证,vrrp两边要一致,一般不动
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 //虚ip配置
192.168.200.17
192.168.200.18
}
}
//启动两端的keepalived后如果两边都有虚ip出现说明配置有问题导致脑裂了
点击劫持的避免以及防止页面被iframe嵌套
add_header X-Frame-Options SAMEORIGIN;
SAMEORIGIN //拒绝任何域加载,即完全不能使用iframe
DENY //允许同源域加载,即相同域名下可以使用iframe加载
ALLOW-FROM uri //允许加载的页面地址