Nginx原理剖析

Nginx的中间件架构

Nginx诞生的

在网站的后台往往存在许多的域名服务,对应的是我们操作系统来驱动我们的硬件,为我们提供对应的服务。
1.应用与应用之间的调用,或者应用与应用之间的直接交互会导致,在很多应用存在时候层次化的不够隔离,代码耦合程度。
2.需有有一个东西能够为我们代理来处理我们的请求,应用只是负责业务的逻辑处理,这样就需要有一个中间件,能够与系统能够直接性的调用。

Nginx简述

  • Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务

  • 支持海量并发

什么是I/O复用epoll

什么是I/O请求呢?

请求的发展历史

什么是I/O多路复用?

  • 多个描述符的I/O操作都能够在一个线程内并发按照顺序完成,这就是I/O多路复用,这里的 “复用” 指的是复用同一个线程

什么是epoll?

  • I/O多路复用的实现方式select(早期出现)、poll、epoll
    • select的缺点:

    • (1)能够监视文件描述符的数量存在最大限制

    • (2)线性扫描效率低下,遍历所有的队列效率低下

  • epoll模型
    • (1)每当FD就绪,采用系统的回调函数之间将fd放入,效率更高

    • (2)最大连接无限制

轻量级

  • 功能模块少

  • 代码模块化

CPU的亲和力(affinity)

为什么需要cpu的亲和?

  • 是一种把CPU的核心和Nginx工作进程绑定的方式,把每一个worker进程固定在一个cpu上执行,减少切换cpu的cache miss,获得更好的性能。

  • 均匀分配work绑定在CPU上

sendfile

常规的处理模式和Nginx处理模式的对比

Nginx原理

http的请求

进程间的信号

reload流程

Reload流程-优雅方式

  • (1)向master进程发送HUP信号

  • (2)master进程校验配置语法是否正确

  • (3)master进程打开新的监听端口

  • (4)master进程用新的配置启动新的worker子进程

  • (5)master进程向老的worker子进程发送QUIT信号

  • (6)老的worker进程关闭监听句柄,处理完当前连接后结束进程

热升级流程

  • (1)将旧Nginx文件换成新的Nginx文件

  • (2)向Master进程发起USR2信号

  • (3)Master进程修改PID文件名,后缀名.oldbin

  • (4)Master进程用新的Nginx文件启动新Master进程

  • (5)向老Master进程发送WINCH信号,关闭老woker

  • (6)回滚 -> 老master发送HUP -> 新master发送QUIT

如何优雅的关闭worker

  • (1)设定定时器worker_shutdown_timeout -> 会自动的添加一个标注位优雅的关闭

  • (2)关闭监听句柄 -> 当期的woker进程保证不再处理新的连接了

  • (3)关闭空闲连接

  • (4)在循环中等待全部连接关闭

  • (5)退出进程

TCP协议与非阻塞接口

Nginx的日志类型

log_format

  • log_format
    • 配置语法 -> Syntax:log_format name [escape=default|json] string;

    • Default -> log_format combined “…”;

    • Context:http

Nginx变量

  • HTTP请求
    • arg_PARAMETER
    • http_Header
    • sent_http_HEADER
  • 内置变量 -> Nginx内置的

  • 自定义变量 ->自己定义的

log_format main 'remote_addr - remote_user [stime_local] "request"'                   'status body_bytes_sent "http_referer"'
                  '"http_user_agent" "http_x_forwarded_for";'
代码 作用解释
$remote_addr 表示客户端的地址
$remote_user 表示用户客户端请求Nginx的用户名(不开认证模块不运行)
[stime_local] Nginx的时间
$request HTTP请求行
$status 表示当前的返回的状态
$body_bytes_sent 服务端响应客户端,boby信息里面的大小
$http_referer HTTP标准body,访问上一级目录的页面是什么(防盗链)
$http_user_agent 当前访问的的客户端使用的什么浏览器访问的
$http_x_forwarded_for 每一级用户,通过HTTP访问服务端的信息

Nginx的模块

  • 官方模块

  • 第三方模块

状态模块

  • –with-http_status_module

    • 配置语法:
    • Syntax:stub_status;
    • Default:——
    • Context:server,location
  • Nginx的客户端状态

配置方法

ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
vim /usr/local/nginx/conf/nginx.conf

       location /mystatus {
                stub_status;
        }
ngixn -tc 
nginx -s reload
curl http://127.0.0.1/mystatus|column -t

随机主页模块

  • –with-http_random_index_module
    • 配置语法:
    • Syntax:random_index on|off;
    • Default:random_index off;
    • Context:location
        location / {
            root   html;
            random_index on;
            #index  index.html index.htm;
            }

内容替换模块

  • –with-http_sub_module

  • 配置语法(一):

    • 解释:完成多个字符串的替换
    • Syntax:sub_filter string replacement;
    • Default:——;
    • Context:http,server,localtion;
  • 配置语法(二):
    • 解释:Nginx服务端和客户端每一次请求的时候检验,请求是否发生变更,一般时间格式记录,主要用在缓存中
    • Syntax:sub_filter_last_modified on|off
    • Default:sub_filter_last_modified off;
    • Context:http,server,location;
  • 配置语法(三):
    • 解释:配置html代码中的第一个还是匹配所有指定的字符串
    • Syntax:sub_filter_once on|off;
    • Default:sub_filter_once on;
    • Context:http.server,location

编写html文件

#编写一个html页面
vim gg.html
<html>
<head>
    <meta charset="utf-8">
    <title>submodules</title>
</head>
<body>
    <a>you kown i love you</a>
    <a>i want to shanghai</a>
    <a>kajima</a>
    <a>yeye!</a>
    <a>end</a>
</body>
</html>

修改配置文件

 location / {
            root   html;
            index  index.html index.htm;
            sub_filter '<a>kajima</a>' '<a>i miss you</a>';
            sub_filter_once off;    #开启全部替换模式
        }
curl http://127.0.0..1      #查看结果即可

Nginx的请求限制

  • 连接频率限制
    • –without-http_limit_conn_module
  • 请求频率限制
    • –without-http_limit_req_module

HTTP协议的链接与请求

建立在TCP三次握手的条件下

  • HTTP请求建立在一次TCP基础之上

  • 一次TCP请求至少要产生一次HTTP请求

HTTP协议版本 连接关系
HTTP1.0 TCP不能复用
HTTP1.1 顺序性TCP复用(主流)
HTTP2.0 多路并行复用

连接限制

  • 申请一个空间
    • Syntax:limit_conn_zone key zone=name:size;
    • Default:——
    • Context:http
  • 对并发的限制
    • Syntax:limit_conn_zone number;
    • Default:——
    • Context:http,server,location

请求限制

  • 对请求的空间大小的和速率申请
    • Syntax:limit_req_zone key zone=name:size rate=rate;
    • Default:——
    • Context:http
  • 调用开启
    • Syntax:limit_req_zone=name [burst=number] [nodelay];
    • 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;
server {
        location /{
            #limit_conn_zone 1; #连接限制
            #limit_req zone=req_zone burst=3 nodelay;   #延迟响应
            #limit_req zone=req_zone burst=3;
            #limit_req zone=req_zone;
        }
        }

访问控制

  • 基于IP的访问控制
    • –without-http_access_module
  • 基于用户的信任登入
    • –without-http_auth_basic_module

access_module

  • 允许
    • Syntax:allow address | CIDR | unix | all ;
    • Default:——
    • Context:http,server,location,limit_except
  • 拒绝
    • Syntax:deny address | CIDR | unix | all ;
    • Default:——
    • Context:http,server,location,limit_except
server{
     location ~ ^/admin.html {
            root   /var/www/html;
            deny 127.0.0.1;
            allow all;
            index  index.html index.htm;
        }
}


http_access_module局限性

  • 方法一、采用别的HTTP头信息控制访问

  • 方法二、结合GEO模块

  • 方法三、通过HTTP自定义变量传递(避免被改写头逐层累计)

用户登入认证模块

  • –without-http_auth_basic_module

    • 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;

http_auth_basic_module局限性

  • 一、用户信息依赖文件方式

  • 二、操作管理机械,效率低下

解决方案

  • 一、Nginx结合LUA实现高效验证

  • 二、Nginx和LDAP打通、利用nginx-auth-ldap模块

Nginx原理剖析》有3个想法

  1. you’re truly a excellent webmaster. The web site loading pace is incredible. It sort of feels that you are doing any distinctive trick. Furthermore, The contents are masterwork. you’ve done a excellent task in this matter!

发表评论

电子邮件地址不会被公开。 必填项已用*标注