Nginx知识汇总

一,简介

     Nginx的是一种轻量级高性能的HTTP和反向代理服务器,因为它的稳定性,丰富的模块库,灵活的配置和低系统资源的消耗而闻名

     1)中,作为服务器:相比的Apache,Nginx的使用更少的资源,支持更多的并发链接,能够支持高达50000个并发链接数的响应;

     2),作为负载均衡服务器:既可以在内部直接支持的Rails和PHP,也可支持作为HTTP代理服务器对外进行服务.Nginx用Ç编写,不论是系统资源开销还是CPU使用效率都比Perlbal要好的多

     3)中,作为邮件代理服务器:Nginx的同时也是一个非常优秀的邮件代理服务器

     4),作为的的Http服务器,具有以下特点:

            一)所示,处理静态文件,索引文件以及自动索引;打开文件描述符缓冲;

            b)中所示,无缓存的反向代理加速,简单的负载均衡和容错;

            C)中,FastCGI的的,简单的负载均衡和容错

            d),模块化的结构:gzipping ,,字节范围,分块响应,SSI-过滤器等过滤器

二,Nginx的的架构

      1,模块

           Nginx的从结构上分为核心模块,基础模块,第三方模块

           1),核心模块:HTTP模块,EVENT模块,MAIL模块

           2),基础模块:HTTP Access模块​​,HTTP FastCGI模块,HTTP代理模块,HTTP重写模块

           3),第三方模块:HTTP上游哈希模块,注意模块,HTTP访问密钥模块

      1,Nginx的的启动后后台包含两类进程:

           1),一个主进程:管理工作者进程,包含接收外界信号,向工作者进程发送信号,监控工作者进程运行状态,当工人进程退出(异常情况下),启动新的

           2),多个工作者进程:基本的网络事件在工作者进程中执行,工作者进程是相互独立的,一个请求只能在一个工人进程中执行,工作者进程数是可设置的(一般设置与CPU核数相等,原因与Nginx的的进程模型以及事件模型相关)

      2,进程模型:

           1),如何操作Nginx:当要操作Nginx时,只需要与主进程通讯即可,主会接收外界的信息,根据信息进行不同的操作(比如重新加载配置:master接受到 kill -HUP pid信号后,先重新加载配置,开启新的工人进程接收新的。而老的工作者进程接收到主信息,不在接收新的请求,并在处理完当前进程未处理完的

           2),工作者进程如何处理请求:首先每个工人进程都是从主进程中叉过来的,在主进程中先建立好要听的插座(listenfd),叉然后多个工作者进程,所有的工作者进程的listenfd在新的请求进来都变得可读,为保证只有一个工人进程处理请求,的所有工人进程在注册listenfd读事件前抢夺accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用接受接受该,然后开始读取请求,解析请求,处理请求返回数据给客户端,然后断开连接

           3),Nginx的如何处理事件:Nginx的采用异步非阻塞的方式处理请求,具体到系统调用就像选择/投票/ epoll的/ kqueue的这样的系统调用,它们提供一种机制,让你可以同时监控多个事件,调用它们是阻塞的,但可以设置超时时间,在超时时间内,如果有事件准备好就返回

三,Nginx的的基础概念 

      1)中,连接

            一)中,Nginx的的中的连接封装了TCP连接,包括连接的插座,读事件,写事件,因此可以很方便地处理与连接相关的东西(比如建立连接,发送/接受数据等)

            B)中,Nginx的的如何处理连接的:

                  首先,Nginx的的启动会解析配置文件,得到所需要监控的IP和端口,在主进程里初始化好这个监控的插座(插座创建,配置addrreuse等选项,绑定到指定的IP和端口,再收听) ,然后叉多个子线程,然后子线程竞争接受新的连接,此时客户端就可以向Nginx的发起连接了,当客户端与服务端通过三次握手建立好一个连接后,Nginx的的某一个子进程会接受成功,得到连接的插座,然后创建Nginx的对连接的封装(ngx_connection_t结构体),接着设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,Nginx的或客户端来主动关掉连接

                  在Nginx里,每个进程都有一个最大的连接数,通过设置worker_connectons来设置每个进程支持的最大连接数如果该值大于nofile,那么最大连接数是nofile,且会有警告, Nginx最大的连接数应该是worker_connectons *进程数 .Nginx是通过一个连接池来管理的,每个工人进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组,Nginx的会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接里面链表 一个客户端的连接过来后,多个空闲的进程竞争这个连接,如果某个进程得到接受的机会比较多,它的空闲连接很快就用完了,当接到一个新的TCP连接后,因为无法到空闲连接,而且无法 将此连接转交给其它进程,会导致此TCP连接得不到处理就中止掉了,这样有的进程有空余连接却没有,有的进程因为没有空余连接却人为,如何解决这个问题呢: 

                  首先,Nginx的的处理得先打开accept_mutex选项,此时只有获得了accept_mutex的进程才会添加接受事件,也就是说Nginx的会控制进程是否添加接受事件,Nginx的使用一个叫ngx_accept_disabled的变量来控制是否去竞争accept_mutex锁

      2),请求

            a), Nginx通过ngx_http_request_t来保存解析请求与输出响应相关的数据

            B)中,Nginx的的如何处理请求的:

                  的Nginx中,一个请求是从ngx_http_init_request函数开始的,该函数设置 ngx_http_process_request_line函数(函数该处理请求行)来执行接下来的网络事件,处理请求的第一件事就是处理请求,通过ngx_http_read_request_header来读取请求数据,然后调用ngx_http_parse_request_line函数来解析请求行.Nginx为提高效率采用状态机来解析,而且在进行方法的比较时没有直接,而是将四个字符转换成一个整型,然后一次比较以减少cpu的指令数。请求行中也是可以包含有主机的(比如http://www.taobao.com/uri HTTP / 1.0 ,这时Nginx会忽略请求头中的主机域,而以请求行中的这个为准来。另外,对于对于http0.9版来说,是不支持请求头的,所以,在后面解析请求头时,协议版本都是1.0或1.1。整个请求行解析到的参数,会保存到ngx_http_request_t结构当中

                  在解析完请求行后,Nginx的会设置读事件的处理程序为ngx_http_process_request_headers,后续的请求就在ngx_http_process_request_headers中进行读取与解析,ngx_http_process_request_headers函数用来读取请求头,跟请求行一样,还是调用ngx_http_read_request_header来读取请求头,调用ngx_http_parse_header_line来解析一行请求头,解析到的请求头会保存到ngx_http_request_t的域headers_in(一个链表结构,保存所有的请求头)中,而HTTP中有些请求是需要特别处理的,这些请求头与请求处理函数存放在一个ngx_http_headers_in映射表里面,在初始化时,会生成一个哈希表,当每解析到一个请求头后,就会先在这个哈希表中查找,如果有找到,则调用相应的处理函数来处理这个请求头

                  当Nginx的解析到两个回车换行符时,就表示请求头的结束,此时调用ngx_http_process_request来处理请求,ngx_http_process_request会设置当前的连接的读写事件处理函数为ngx_http_request_handler,然后再调用ngx_http_handler来真正开始处理一个完整的HTTP请求。这里可能比较奇怪,读写事件处理函数都是ngx_http_request_handler,其实在这个函数中,会根据当前事件是读事件还是写事件,分别调用ngx_http_request_t中的read_event_handler或者是write_event_handler。由于此时,我们的请求头已经读取完成了,Nginx的做法是先不读取请求body,所以设置read_event_handler为ngx_http_block_reading(不读取数据了。真正开始处理数据是在ngx_http_handler函数里面,这个函数会设置write_event_handler为ngx_http_core_run_phases,并执行ngx_http_core_run_phases函数.ngx_http_core_run_phases函数将执行多阶段请求处理,Nginx的将一个HTTP请求 的处理分为多个阶段,那么这个函数就是执行这些阶段来产生数据因为ngx_http_core_run_phases最后会产生数据,所以设置写事件的处理函数为ngx_http_core_run_phases了在这里简要说明了一下函数的调用逻辑:。最终是调用ngx_http_core_run_phases来处理请求,产生的响应头会放在ngx_http_request_t的headers_out中.Nginx的各种阶段会对请求进行处理,最后会调用滤波器来过滤数据,对数据进行加工(如truncked传输,gzip的压缩等 .filter是一个链表结构,分别有头过滤器(处理响应头)与过滤器主体(处理响应行业释义体育),先执行报头过滤器中的所有过滤器,然后再行体过滤器中的所有过滤器。在过滤器头中的最后一个滤波器(ngx_http_header_filter 将会遍历所有的响应头存在一个连续的内存,然后调用ngx_http_write_filter进行输出.ngx_http_write_filter是身体过滤器中的最后一个,所以Nginx首先的身体信息,在经过一系列的身体过滤器之后,最后也会调用ngx_http_write_filter来进行输出


四,Nginx的的安装

       1),窗口环境下安装

             一)中,官网  https://nginx.org/en/download.html 下载压缩包,解压压缩包

             B)中,启动

                    方式一:双击EXE文件

                    方式二:命令行启动D:/resp_application/nginx-1.13.5> nginx

       2),LINUX环境下安装

             a),安装准备环境:yum install gcc gcc-c ++ automake pcre pcre-devel zlip zlib-devel 

                                                gcc,gcc-c ++ :编译源文件

                                                automake的的:Makefile.am文件自动生成Makefile.in的工具    

                                                pcre pcre-devel:Nginx的重写模块和HTTP核心模块会使用到PCRE正则表达式语法,所以Nignx编译需要用到PCRE 模块支持

                                                zlip zlib-devel:nginx启用压缩功能需要此模块支持

                                                openssl openssl-devel:开启SSL的时候需要此模块的支持

             b),下载Nginx安装包:[root @ Server1~] #wget http://nginx.org/download/nginx-1.8.1.tar.gz 

             c),解压安装包:[root @ Server1~] #tar xvf nginx-1.8.1.tar.gz
                                       [root @ Server1~] #cd nginx-1.8.1
                                       [root @ Server1 nginx-1.8.1] $ ls

             d),预编译:[root @ Server1 nginx-1.8.1]#。/ configure --prefix = / usr / local / nginx --sbin-path = / usr / local / nginx / sbin / nginx

--conf-path = / usr / local / nginx / conf / nginx.conf --error-log-path = / var / log / nginx / error.log --http-log-path = / var / log / nginx /access.log --pid-path = / var / run / nginx / nginx.pid --lock-path = / var / lock / nginx.lock --user = nginx --group = nginx --with-http_ssl_module - -with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path = / var / tmp / nginx / client / --http-proxy-temp-path = / var / tmp / nginx / proxy / - -http-fastcgi-temp-path = / var / tmp / nginx / fcgi / --http-uwsgi-temp-path = / var / tmp / nginx / uwsgi --http-scgi-temp-path = / var / tmp / nginx / scgi --with-pcre

             E),生成脚本及配置文件:使

             f),安装:make install

             克),Nginx的的安装成功后,有四个目录:

                        CONF:保存的Nginx的所有配置文件

                        HTML:保存的Nginx的服务器的网页文件

                        日志:保存的Nginx的的日志文件

                        sbin目录目录:保存的Nginx的二进制启动脚本,接受不同的参数以实现不同的功能

五,Nginx的的常用命令管理

           ./sbin/nginx运行Nginx的二进制文件启动nginx的

           ./sbin/nginx  -s退出停止ngix  

           ./sbin/nginx -s reload重新载入nginx(当配置信息发生修改时)  

           ./sbin/nginx -s重新打开重新打开日志文件  

           ./sbin/nginx -v查看版本  

           ./sbin/nginx -t查看nginx的配置文件的目录  

           ./sbin/nginx -h查看帮助信息  

六,Nginx的的配置文件

           查看nginx配置文件:vim /user/local/nginx/conf/nginx.conf    

七,Nginx的的配置虚拟主机

server{ 
    listen    80    default_server; -- 监听端口,default_server表示指定为默认服务器
    server_name    www.domain.com(基于域名)、192.168..0.106(基于Ip) -- 监听域名
    location { 
      root    html(相对路径)、/ user / local / nginx / html(绝对路径) -- 访问根目录
      index    index.html  -- 默认访问文件
    } 
}

八,Nginx的的日志管理

       1),全局配置:

http { 
  //自定义日志文件输出格式全局设置
  log_format   main   '$remote_addr  -  $remote_user [$time_local] “$request”'      
	              '$status $body_bytes_sent “$http_referer”'   
	              '“$http_user_agent” “$http_x_forwarded_for”'; 

  //全局设置请求日志保存位置,使用上面定义的主main格式
  access_log   logs/access.log   main; 
}

       2),单个服务器局部配置:

server{   
      //自定义单个服务器请求日志
      access_log logs/host.access.log  main;
      
      //错误页面
      error_page 500 502 503 504 /50x.html;  
}  

       3),日志切割:

              创建目录,并定位到该目录:mkdir / data cd / data

              编写脚本:vim runLog.sh

LOGPATH = /user/local/nginx/log
BASEPATH= /data

bak = BASEPATH/access-${date -d yesterday days +%Y%m%d%h%M}.log 

mv $ LOGPATH $ bak 
touch $ LOGPATH 

kill -USER1 cat /usr/local/nginx/logs/nginx.pid

              定时执行脚本:crontab -e

                                         * / 1 * * * * sh /data/runLog.sh

九,位置详解

       1),精准匹配(优先级最高,全部匹配上才行

               匹配策略:匹配上即结束

location = /index.htm { 
     root    /var/www/html/; 
     index   index.htm index.html; 
}

       2),一般匹配(优先级最低,只要部分匹配上就可以,匹配越长,优先级越高)

               匹配策略:记忆最长的匹配结果,查找是否有正则匹配

location /index.htm { 
     root    /usr/local/nginx/html; 
     index   index.htm index.html; 
}

       3),正则匹配(优先级居中)

                匹配策略:任一正则匹配上即结束

十,rewrite 详解

location / {
   //判断访问IP
   if($remote_addr = 192.168.1.1){
	return 403
   }

   //判断用户浏览器
   if ($http_user_agent ~ MSIE) {
	rewrite ^.*$ /ie.html;
	break;    //不写break会循环重定向
   }
   
   //判断文件是否存在
   if (!-e $document_root$fastcgi_script_name) {
        //rewrite的上下文不变,还是读取原来的页面,所以要加break
        rewrite ^.*$ /404.html break;
   }
}

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值