前提:前些日子公司迁移服务器,让我对nginx产生了新的思考,如果可以在服务端的上游进行限制、流量控制,会使整个系统的性能有飞速的提高,这是我近期整理的一些笔记,和大家分享。
postread阶段 : realip - 如何拿到用户的真实IP?
set_real_ip_from address | CIDR | Unix;
real_ip_header X-Real-IP;
real_ip_recursive on | off;
rewrite阶段 :return - 执行return模块,之后的指令都不会执行了。
return code[text];
return code URL;
return URL;
- Nginx 自定义
- 444:关闭连接,不返回任何响应
- http1.0标准
- 301:永久重定向
- 302:临时重定向,禁止被缓存
- http2.0标准
- 303:临时重定向,允许改变方法,禁止被缓存
- 307:临时重定向,不允许改变方法,禁止被缓存
- 永久重定向,不允许改变方法
rewrite阶段 :return模块和error_page的关系
error_page 404 /404.html;
rewrite阶段 :rewite - 重写URL
优点
- URL访问跳转,支持开发设计
- SEO优化
- 维护 后台维护、流量转发
- 安全
–
rewrite regex replacement[flag]
server,location,if
正则表达式:
pcretest 吊起正则表达式匹配的命令行
Rewrite的类型
last 停止Rewrite检测
break 停止Rewrite检测
redirect 返回302临时重定向,地址会显示跳转后的地址
permanent 返回301临时重定向,地址会显示跳转后的地址
last和break的区别:last在没有匹配的情况下,开启第二次匹配,break匹配一次停止匹配了。
server {
listen 80;
server_name www.stark.com;
index index.php index.html index.htm;
root /usr/local/var/www/stark;
location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
}
location /test/ {
default_type application/json;
return 200 '{"name":"stark"}';
}
}
301是永久重定向,内容会保存在客户端,302是临时重定向。
server {
listen 80;
server_name www.gzip.com;
index index.php index.html index.htm;
root /usr/local/var/www/gzip;
location ~ ^/imooc {
#rewrite ^/imooc http://www.baidu.com redirect; #302临时重定向
rewrite ^/imooc http://www.baidu.com permanent #301永久重定向;
}
}
rewrite 规则场景:
server {
listen 80;
server_name www.gzip.com;
index index.php index.html index.htm;
root /usr/local/var/www/gzip;
location / {
rewrite ^/course-(\d+)-(\d+)-(\d+)\.html$ /course/$1/$2/course_$3.html break;
if( $http_user_agent ~* Chrome ){
rewrite ^/nginx http://www.zhuangbfan.com/blog break;
}
#当访问文件不存在进行的转发
if(!-f $request_filename){
rewrite ^/(.*)$ http://www.zhuangbfan.com/$1 redirect;
}
}
}
rewrite阶段 :rewite - if指令
if指令的条件表达式
语法: if (condition) { ... }
默认: none
作用域: server, location
- 检查变量为空或者值是否为0,直接使用
- 将变量与字符串做匹配,使用 = 或者 !=
- 将变量与正则表达式做匹配
- 大小写敏感 ~ 或者 !~
- 大小写不敏感 ~* 或者 !~*
- 检查文件是否存在,使用 -f 或者 !-f
- 检查目录是否存在,使用-d 或者 !-d
- 检查文件、目录、软连接是否存在,使用-e或者!-e
- 检查是否为执行文件,使用-x或者!-x
find_config 阶段 :找到处理的location模块
syntax: location [=|~|~*|^~] /uri/ { ... }
default: no
context: server
location 的匹配优先级
preaccess 阶段 :对连接做限制的limit_conn模块
问题:如何限制每个客户端的并发连接数?
limit_conn模块:限制并发连接数
语法: limit_conn zone_name the_size
默认值: no
作用域: http, server, location
指定一个会话最大的并发连接数。 当超过指定的最发并发连接数时,服务器将返回 "Service unavailable" (503)。
limit_conn_log_level : 限制发生时的日志级别
limit_conn_status:限制发生时客户端返回的错误码
–
limit_req 模块 : 限制并发连接数
limit_req
http,server,location
limit_req_zone :定义共享内存(包括大小)???????????????,以及key关键字和限制速率
limit_req_log_level : 限制发生时的日志级别
limit_req_status:限制发生时的返回错误码 ??? ??????????????????????? ??? ????????
??????????????? ??? ???
access 阶段 :对IP限制的access模块
syntax: allow [ address | CIDR | all ]
default: no
context: http, server, location, limit_except
以上描述的网络地址有权直接访问
syntax: deny [ address | CIDR | all ]
default: no
context: http, server, location, limit_except
以上描述的网络地址拒绝访问