Nginx学习总结之路

225 阅读2分钟

持续更新中。。。

一. 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