Nginx配之负载均衡、缓存、黑名单和灰度发布
一、Nginx安装(基于CentOS 6.5)
1.yum命令安装
yum install nginx –y
(若不能安装,执行命令yum install epel-release)
2. 启动、停止和重启
service nginx start
service nginx stop
service nginx restart
浏览器中 输入服务器的 ip 地址,即可看到相应信息
3. 其他信息
rpm -ql nginx 来查看安装路径
yum remove nginx 来卸载
nginx -s reload 配置热更新
二、Nginx负载均衡配置(/etc/nginx/nginx.conf)
- 负载均衡配置
http {
……
upstream real_server {
server 192.168.103.100:2001 weight=1; #轮询服务器和访问权重
server 192.168.103.100:2002 weight=2;
} server {
listen 80; location / {
proxy_pass http://real_server;
}
}
}
2.失败重试配置
upstream real_server {
server 192.168.103.100:2001 weight=1 max_fails=2 fail_timeout=60s;
server 192.168.103.100:2002 weight=2 max_fails=2 fail_timeout=60s;
}
意思是在fail_timeout时间内失败了max_fails次请求后,则认为该上游服务器不可用,然后将该服务地址踢除掉。fail_timeout时间后会再次将该服务器加入存活列表,进行重试。
三、Nginx限流配置
- 配置参数
limit_req_zone指令设置参数
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
1)limit_req_zone定义在http块中,$binary_remote_addr表示保存客户端IP地址的二进制形式。
2)Zone定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息约1MB,所以示例中区域可以存储160000个IP地址。
3)Rate定义最大请求速率。示例中速率不能超过每秒10个请求。
2.设置限流
location / {
limit_req zone=mylimit burst=20 nodelay;
proxy_pass http://real_server;
}
burst排队大小,nodelay不限制单个请求间的时间
3.不限流白名单
geo $limit {
default 1;
192.168.2.0/24 0;
} map $limit $limit_key {
1 $binary_remote_addr;
0 "";
} limit_req_zone $limit_key zone=mylimit:10m rate=1r/s; location / {
limit_req zone=mylimit burst=1 nodelay;
proxy_pass http://real_server;
}
上述配置中,192.168.2.0/24网段的IP访问是不限流的,其他限流。
IP后面的数字含义:
24表示子网掩码:255.255.255.0
16表示子网掩码:255.255.0.0
8表示子网掩码:255.0.0.0
四、Nginx缓存配置
- 浏览器缓存
静态资源缓存用expire
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 2d;
}
Response Header中添加了Expires和Cache-Control
静态资源包括(一般缓存)
1)普通不变的图像,如logo,图标等
2)js、css静态文件
3)可下载的内容,媒体文件
协商缓存(add_header ETag/Last-Modified value)
1)HTML文件
2)经常替换的图片
3)经常修改的js、css文件
4)基本不变的API接口
不需要缓存
1)用户隐私等敏感数据
2)经常改变的api数据接口
2.代理层缓存
//缓存路径,inactive表示缓存的时间,到期之后将会把缓存清理
proxy_cache_path /data/cache/nginx/ levels=1:2 keys_zone=cache:512m inactive = 1d max_size=8g; location / {
location ~ \.(htm|html)?$ {
proxy_cache cache;
proxy_cache_key $uri$is_args$args; //以此变量值做HASH,作为KEY
//HTTP响应首部可以看到X-Cache字段,内容可以有HIT,MISS,EXPIRES等等
add_header X-Cache $upstream_cache_status;
proxy_cache_valid 200 10m;
proxy_cache_valid any 1m;
proxy_pass http://real_server;
proxy_redirect off;
}
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
root /data/webapps/edc;
expires 3d;
add_header Static Nginx-Proxy;
}
}
在本地磁盘创建一个文件目录,根据设置,将请求的资源以K-V形式缓存在此目录当中,KEY需要自己定义(这里用的是url的hash值),同时可以根据需要指定某内容的缓存时长,比如状态码为200缓存10分钟,状态码为301,302的缓存5分钟,其他所有内容缓存1分钟等等。
可以通过purger的功能清理缓存。
AB测试/个性化需求时应禁用掉浏览器缓存。
五、Nginx黑名单
1.一般配置
location / {
deny 192.168.1.1;
deny 192.168.1.0/24;
allow 10.1.1.0/16;
allow 2001:0db8::/32;
deny all;
}
2. Lua+Redis动态黑名单(OpenResty)
1)安装运行
yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty
yum install openresty-resty
查看
yum --disablerepo="*" --enablerepo="openresty" list available
运行
service openresty start
2) 配置(/usr/local/openresty/nginx/conf/nginx.conf)
lua_shared_dict ip_blacklist 1m; server {
listen 80; location / {
access_by_lua_file lua/ip_blacklist.lua;
proxy_pass http://real_server;
}
}
lua脚本(ip_blacklist.lua)
local redis_host = "192.168.1.132"
local redis_port = 6379
local redis_pwd = 123456
local redis_db = 2 -- connection timeout for redis in ms.
local redis_connection_timeout = 100 -- a set key for blacklist entries
local redis_key = "ip_blacklist" -- cache lookups for this many seconds
local cache_ttl = 60 -- end configuration local ip = ngx.var.remote_addr
local ip_blacklist = ngx.shared.ip_blacklist
local last_update_time = ip_blacklist:get("last_update_time"); -- update ip_blacklist from Redis every cache_ttl seconds:
if last_update_time == nil or last_update_time < ( ngx.now() - cache_ttl ) then local redis = require "resty.redis";
local red = redis:new(); red:set_timeout(redis_connect_timeout); local ok, err = red:connect(redis_host, redis_port);
if not ok then
ngx.log(ngx.ERR, "Redis connection error while connect: " .. err);
else
local ok, err = red:auth(redis_pwd)
if not ok then
ngx.log(ngx.ERR, "Redis password error while auth: " .. err);
else
local new_ip_blacklist, err = red:smembers(redis_key);
if err then
ngx.log(ngx.ERR, "Redis read error while retrieving ip_blacklist: " .. err);
else
ngx.log(ngx.ERR, "Get data success:" .. new_ip_blacklist)
-- replace the locally stored ip_blacklist with the updated values:
ip_blacklist:flush_all();
for index, banned_ip in ipairs(new_ip_blacklist) do
ip_blacklist:set(banned_ip, true);
end
-- update time
ip_blacklist:set("last_update_time", ngx.now());
end
end
end
end if ip_blacklist:get(ip) then
ngx.log(ngx.ERR, "Banned IP detected and refused access: " .. ip);
return ngx.exit(ngx.HTTP_FORBIDDEN);
end
六、Nginx灰度发布
- 根据Cookie实现灰度发布
根据Cookie查询version值,如果该version值为v1转发到host1,为v2转发到host2,都不匹配的情况下转发默认。
upstream host1 {
server 192.168.2.46:2001 weight=1; #轮询服务器和访问权重
server 192.168.2.46:2002 weight=2;
} upstream host2 {
server 192.168.1.155:1111 max_fails=1 fail_timeout=60;
} upstream default {
server 192.168.1.153:1111 max_fails=1 fail_timeout=60;
} map $COOKIE_version $group {
~*v1$ host1;
~*v2$ host2;
default default;
} lua_shared_dict ip_blacklist 1m; server {
listen 80; #set $group "default";
#if ($http_cookie ~* "version=v1"){
# set $group host1;
#}
#if ($http_cookie ~* "version=v2"){
# set $group host2;
#} location / {
access_by_lua_file lua/ip_blacklist.lua;
proxy_pass http://$group;
}
}
2. 根据来路IP实现灰度发布
server {
……………
set $group default;
if ($remote_addr ~ "192.168.119.1") {
set $group host1;
}
if ($remote_addr ~ "192.168.119.2") {
set $group host2;
}
3. 更细粒度灰度发布
可用lua脚本实现,参考开源项目:https://github.com/CNSRE/ABTestingGateway
PS:欢迎关注本人公众号:Devin说。会有最新最及时的技术文档推荐。
Nginx配之负载均衡、缓存、黑名单和灰度发布的更多相关文章
- Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布
一.Nginx安装(基于CentOS 6.5) 1.yum命令安装 yum install nginx –y(若不能安装,执行命令yum install epel-release) 2. 启动.停止和 ...
- windows使用nginx+memcached实现负载均衡和session或者缓存共享
windows使用nginx+memcached实现负载均衡和session或者缓存共享 两台server server1:115.29.186.215 windows2008 64位操作系统 ser ...
- Nginx + IIS实现负载均衡 Session多站点共享
日子过得太索然无味了,研究了一下,所谓的负载均衡(主要是windows服务器IIS下的).先看看分析图:环境:linux服务器: centos 6.3windows服务器: windows serve ...
- Nginx/LVS/HAProxy 负载均衡软件的优缺点详解
Nginx/LVS/HAProxy 负载均衡软件的优缺点详解 Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验 ...
- nginx+php负载均衡集群环境中的session共享方案梳理
在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...
- [转帖]nginx upstream模块--负载均衡
nginx upstream模块--负载均衡 https://www.cnblogs.com/linjiqin/p/5494783.html Module ngx_http_upstream_modu ...
- [转帖]Nginx 的 TCP 负载均衡介绍
Nginx 的 TCP 负载均衡介绍 https://www.cnblogs.com/felixzh/ 前几天同事问 nginx的代理 当时以为只有http的 现在看起来还有tcp的可以使用tcp 代 ...
- 总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解
总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解 PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使 ...
- Nginx/LVS/HAProxy负载均衡软件的优缺点详解【转】
转自 (总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均 ...
随机推荐
- Markdown格式
一个例子: 例子开始 1. 本章学习总结 今天主要学习了三个知识点 封装 继承 多态 2. 书面作业 Q1. java HelloWorld命令中,HelloWorld这个参数是什么含义? 今天学了一 ...
- 接口测试入门(2)--get和post初级请求/使用httpclient做一个获取信息list的请求(需要登录才可以)
抛去测试自动化的架构来,直接写单个测试用例的思路如下: 1.获取测试case的接口,对每一个接口的请求方式(get/post/delete/put)进行分析,是否需要参数(不同的用例设置不同的参数,如 ...
- Spring03-jdbc
1,Spring集成Jdbc,需要导入spring包和数据库驱动包,这里我们使用的是mysql驱动包 2,选择一个数据源(DBCP,C3P0),这里我们使用DBCP,需要导入DBCP驱动包 3,创建j ...
- 解决Maven管理的项目下"Missing artifact xxx bundle"问题
例如使用maven编译使用了mina的包的工程,出现如下提示: [INFO] Scanning for projects... [INFO] ...
- Saltstack批量编译部署nginx(多模块)
最近一直在研究saltstack的同步文件和批量执行命令,随着架构的变大,批量部署的需求也变得明显起来了,我需要用一条命令就部署好nginx和tomcat,并且符合我所有的环境需求,可以直接投入生产环 ...
- Windows的文件权限 研究笔记
最近公司的一台设备中了病毒,杀了又出现,总是破坏机器上面运行的程序. 想着研究下文件权限,把文件设为只读,让病毒破坏不了即可. 于是开始了实验1: 首先建立一个txt文件,查看权限: 可以看到User ...
- 由throw new Error() 引发的探讨
问题复现 在工作时遇到了需要抛出异常并且需要自己捕获处理的地方,于是在抛出的地方写下 function parseExcel(con) { try { // doSomething } catch ( ...
- [UIKit学习]00.关于前置知识(storyboard,UIViewController,类扩展,项目属性)
storyboard文件的认识 用来描述软件界面 默认情况下,程序一启动就会加载Main.storyboard 加载storyboard时,会首先创建和显示箭头所指的控制器界面 IBAction和IB ...
- Python之面向对象与类
本节内容 面向对象的概念 类的封装 类的继承 类的多态 静态方法.类方法 和 属性方法 类的特殊成员方法 子类属性查找顺序 一.面向对象的概念 1. "面向对象(OOP)"是什么? ...
- BZOJ2748_音量调节_KEY
[HAOI2012]音量调节 Time Limit: 3 Sec Memory Limit: 128 MB Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以 ...