之前介绍了Nginx作为静态资源服务器的用法,除此之外,Nginx更多的场景是作为反向代理服务器,提高网站的并发和可用性。下面几节着重说一下作为反向代理的http模块,并且了解一些Nginx的架构。

一. 前言

    1. 指令冲突时以谁为准

        Nginx的大多指令都支持多层级配置,比如配置在server层或者location层都可以生效。当指令冲突时,Nginx会遵从如下几个原则。

        a)Nginx的指令分为两种:值指令和动作指令,值指令是指存储配置项的值 比如root、access_log,动作指令是指定Nginx的行为 比如rewrite proxy_pass。遇到动作指令时Nginx会直接执行相关的功能(比如重定向),并根据该功能的返回值决定是否继续往下执行。所以动作类指令是遇到一个执行一个,不会合并。而值指令是Nginx执行流程过程中去读取相关配置的值,而读取到的值只能是一个。所以值指令是运行时获取的配置,会将相同的值指令进行合并。

        b)值指令合并规则:向上覆盖。子配置不存在时,使用父配置块。子配置存在时,覆盖父配置块。

二. Listen指令

    listen指令放在server配置块下,监听端口或者地址,使Nginx和客户端可以建立一个tcp连接。

    例: listen unix:/var/run/nginx.sock;

            listen 127.0.0.1:8000;

            listen 127.0.0.1;

            listen 8000;

            listen *:8000;

            listen localhost:8000 bind;

            listen [::]8000 ipv6only=on;

            listen [::1]

三. 接收请求事件模块

    建立了listen监听端口以后,客户端就可以与Nginx进行通讯了,Nginx做的第一步就是接收请求。

    客户端的请求发送到服务器后,会与操作系统的内核(端口)建立三次握手连接。当Nginx监听到端口成功建立起一个连接后,会从内核态将连接拷贝到Nginx用户态,然后由Nginx会根据它的负载均衡算法选择一个worker进程为这个连接添加一个epoll_wait读事件,然后调用accept方法为连接分配连接内存池、添加接收data数据超时定时器等。当客户端发送data以后,还是会经由内核态拷贝到Nginx用户态,Nginx添加另一个epoll_wait读事件来分配内存、解析请求头、关闭超时定时器等。如下图所示:

    

nginx中post以及get区别 http和nginx_nginx中post以及get区别

四. 接收请求HTTP模块

    Nginx建立好连接并接收完header后,就会正式进入到Http模块了。Http模块有十一个处理流程,如下图所示:

nginx中post以及get区别 http和nginx_nginx中post以及get区别_02

五. server_name指令

    server_name指令绑定域名,指令后可以跟多个域名,第一个是主域名,可以出现在http、server、location模块下

    泛域名:仅支持在最前或最后,如:server_name *.taobao.com;

    正则表达式:加~前缀 server_name www.taobao.com ~^www\.taobao\.\d+\.com$;

 正则表达式创建变量,用()括起正则表达式,使用$1 $2获取变量

    server_name_in_redirect on|off 命令:如果为off时,那么将会以当前服务器的IP地址进行拼接URL;如果该命令为on,那么首先查找server_name,如果没有找到,查找请求头的HOST字段,如果没有,则以当前服务器的IP进行拼接。

   server匹配顺序

  1. 精确匹配
  2. *在前的泛域名
  3. *在后的泛域名
  4. 按文件中的顺序匹配正则表达式域名
  5. default server:第1个 或者是listen指定的default

·

六. HTTP请求处理的11个阶段

  1. POST_READ:获取到Header后的第一个阶段。模块:realip
  2. SERVER_REWRITE:配置在server模块中的rewrite阶段。模块:rewrite
  3. FIND_CONFIG:根据配置查找由谁处理请求的阶段。
  4. REWRITE:配置在location模块中的rewrite阶段。模块:rewrite
  5. POST_REWRITE
  6. PREACCESS:向上游服务请求连接前的阶段。模块:limit_conn、limit_req
  7. ACCESS:与上游服务器连接的验证阶段。模块:auth_basic、access、auth_request
  8. POST_ACCESS
  9. PRECONTENT:发送data数据前的阶段。模块:try_files
  10. CONTENT:发送数据极端。模块:index、autoindex、concat
  11. LOG:记录请求日志、错误日志阶段。模块:access_log

七. 11个请求阶段的处理顺序

nginx中post以及get区别 http和nginx_nginx中post以及get区别_03