您的位置:首页 > 理论基础 > 计算机网络

Nginx 架构篇 - 详解Http模块执行的11个阶段①

2020-03-16 07:12 1421 查看

前提:前些日子公司迁移服务器,让我对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

以上描述的网络地址拒绝访问

access 阶段 :对用户名和密码限制的auth_basic模块

access 阶段 :使用第三方auth_request模块

  • 点赞 6
  • 收藏
  • 分享
  • 文章举报
stark张宇 发布了100 篇原创文章 · 获赞 202 · 访问量 11万+ 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: