持续更新中。。。
一. nginx优势
描述:多个描述符I/O操作都能在一个线程内并发交替的顺序完成,“复用”指复用同一个线程
1. IO多路复用
a.select
能够监视文件描述符的数量存在最大限制
线性扫描效率地下
b.epoll
每当FD就绪,采用系统的回调函数之间将fd放入,效率更高
最大连接无限制
2. 轻量级
功能模块少
代码模块化
3. CPU亲和(affinity)
什么是CPU亲和?
是一种把CPU核心和Nginx工作进程绑定方式,把每个worker进程固定在一个cpu上执行,减少切换cpu的cache miss,获得更好的性能。
4. sendfile
二. 常用基础配置
1. Nginx日志类型
error_log /var/log/nginx/error.log warn; #warn错误级别
access_log /var/log/nginx/access.log main; # main标记
log_format main '$remote_addr' #客户端地址
'$remote_user' #http请求认证端用户名,默认不开启认证模块不会记录
'$time_local' #nginx时间
'$request' #头请求信息
'$status' #请求返回状态
'$body_bytes_sent' #相应信息大小
'$http_referer' #上一级页面
'$http_user_agent' #客户端信息 ie/chrome/curl
'$http_x_forwarded_for' #记录每一级请求http信息
#按照一定格式打入access_log中
配置参数
arg_PARAMETER
http_HEADER // HEADER-想要记录的header头信息
sent_http_HEADER
2. Nginx模块
a. http_stub_status_module
Nginx的客户端状态,连接数信息
Syntax: stub_status
Default: 无
Context:server,location
location /mystatus {
stub_status
}
b. http_sub_module
校验服务器与客户端交互时数据是否有变更
Syntax: sub_filter_last_modified on|off; #判断是否有更新,有更新则返回最新的内容,无更新则不反回,节省不必要的消耗
Default: sub_filter_last_modified off;
Context:http,server,location
Syntax: sub_filter_once on|off; #匹配第一个还是所有字符串
Default: sub_filter_once on; #on-第一个 off-所有
Context:http,server,location
location / {
sub_filter '原内容' '替换内容';
sub_filter_once off;
}
c. limit_conn_module/limit_req_module
limit_conn_module 连接频率限制
limit_req_module 请求频率限制
Syntax: limit_conn_zone key zone=name:size; #key-限制标示 name-缓存空间名 size-空间大小
Default: --
Context:http
Syntax: limit_conn zone number; #number-连接并发限制数
Default: --
Context:http,server,location
Syntax: limit_req_zone key zone=name:size rate=rate; #rate-请求限制数每秒
Default: --
Context:http
Syntax: limit_req zone=name [burst=number][nodelay]; #number-并发限制大小
Default: --
Context:http,server,location
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s; # 同一个客户端地址每秒只能发起一个请求
location /mystatus {
root /usr/share/nginx/html;
index index.html index.htm;
limit_conn conn_zone 1;
limit_req zone=req_zone burst=3 nodelay;
}
3. Nginx访问控制
a.http_access_module
基于IP的访问控制
Syntax: allow/deny ip|CIDR|unix:|all;
Default: --
Context:http, server, location, limit_except
allow: 允许的ip地址
deny: 不允许
CIDR: 网段
unix: 配置socket访问
all: 允许所有
remote_addr: ip2 //上层ip
http_x_forwarded_for : ip1,ip2,ip3 //所经过的所有ip
解决http_access_module局限性方法
1.http_x_forwarded_for,但不是所有服务都支持,可被客户端修改
2.结合geo模块
3.通过http自定义变量
b.http_auth_basic_module
Ngxin用户基本认证,账号密码登陆
Syntax: auth_basic string | off; // 字符串
Default: auth_basic off;
Context:http, server, location, limit_except;
Syntax: auth_basic_user_file file; // 配置项文件目录
Default: --;
Context:http, server, location, limit_except;
1.用户信息依赖文件方式
2.操作管理机械,效率低下
解决方案
1.Nginx结合LUA实现高效验证
2.Nginx和LDAP打通,利用nginx-auth-ldap模块
常规配置
server {
listen 80; ##监听端口
server_name localhost; ##服务名
location / { ##访问所有首页路径和子路径
root /usr/share/nginx/html; ##访问路径
index index.html index.htm; ##默认页面
}
error_page 500 502 503 504 /50x.htm; ##错误页面
}
10. 防盗链运用
refer
valid_referers none blocked 122.152.218.146;
if ($invalid_referer) {
return 403;
}
valid_referers: 允许哪些refer信息访问
none : 允许不带refer信息访问
block : refer信息不是标准的http://方式过来的
ip : 允许ip访问
三. nginx代理
1.反向代理
nginx为服务器代理
location ~ /admin.html$ {
proxy_pass http://127.0.0.1:8080;
}
2.正向代理
nginx为客户端代理
location / {
proxy_pass http://$http_host$request_uri;
}
3.其它配置
# 301重定向是否跳转,默认跳转,off关闭不跳转
proxy_redirect default;
# 获取头信息
prox_set_header Host $http_host;
# 添加头信息如:客户端id
prox_set_header X-Real-IP $remote_addr;
# 隐藏头信息如:客户端id
prox_hide_header X-Real-IP $remote_addr;
# 默认超时时间
prox_connect_timeout 30;
# 后端接受请求,处理的时间
proxy_read_timeout 60;
# 处理完成,发送给客户端的超时时间
proxy_send_timeout 60;
# 是否使用缓冲区
proxy_buffering on;
# 缓冲区大小
proxy_buffer_size 32k;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;
四. 负载均衡
1.GSLB
按地域划分
2.SLB
按地域划分
3.四层负载均衡
传输层实现,对tcp,http协议转发,不用复杂的逻辑处理,性能快
4.七层负载均衡
应用层实现,实现头信息的改写,安全应用信息的控制,可以做的更多,ngxin为七层负载均衡的SLB