Nginx之HTTP模块

Posted 小张敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx之HTTP模块相关的知识,希望对你有一定的参考价值。

HTTP请求处理时的11个阶段

阶段
模块
POST_READ
realip
SERVER_REWRITE
rewrite
FIND_CONFIG
REWRITE rewrite
POST_REWRITE

PREACCESS
limit_conn,limit_req
ACCESS
auth_basic,access,auth_request
POST_ACCESS

PRECONTENT
try_files
CONTENT
index,autoindex,concat
LOG
access_log


  1. TCP连接四元组(src ip,src port,dst ip,dst port)

  2. HTTP头部X-Forwarded-For用于传递IP

  3. HTTP头部X-Real-IP用于传递用户IP

  4. 网络中存在许多反向代理

用户:192.168.0.x
ADSL:运营商公网ip 3.3.3.3
CDN:ip地址 1.1.1.1
某反向代理:IP地址 2.2.2.2(X-Forwarded-For:3.3.3.3     X-Real-IP:3.3.3.3)
nginx:用户地址3.3.3.3,remote_addr变量2.2.2.2(X-Forwarded-For:3.3.3.3,1.1.1.1   X-Real-IP:3.3.3.3)

realip模块会修改binary_remote_addr,remote_addr变量的值,其值为真实的ip,这样做连接限制(limit_conn模块)才有意义。

也可以通过realip_remote_addr和realip_remote_port拿到建立连接的ip和port。


REWRITE模块:return指令

语法:

  • return code [text]

  • return code URL

  • return URL

状态码

  • Nginx自定义

    • 444:关闭连接

  • HTTP 1.0标准

    • 301:http1.0永久重定向

    • 302:临时重定向,禁止被缓存

  • HTTP 1.1标准

    • 303:临时重定向,允许改变方法,禁止被缓存

    • 307:临时重定向,不允许改变方法,禁止被缓存

    • 308:永久重定向,不允许改变方法


error_page指令

语法:error_page code ... [=[response]]uri;


rewrite模块:rewrite指令

  • 语法:rewrite regex replacement [flag];

  • context:server,location,if

功能:

  • 将regex指定的url替换成replacement这个新的url,可以使用正则表达式及变量提取

  • 当replacement以http://或者https://或者$schema开头,则直接返回302重定向

  • 替换后的url根据flag指定的方式进行处理

    • --last:用replacement这个uri进行新的location匹配

    • --break:break指令停止当前脚本指令的执行,等价于独立的break指令

    • --redirect:返回302重定向

    • --permanent:返回301重定向


rewrite模块:if指令

  • 语法:if (condition) {...}

  • context:server,location

if指令的条件表达式

  1. 检测变量是否为空或者值是否为0,直接使用

  2. 将变量和字符串做匹配,使用=或!=

  3. 将变量和正则表达式做匹配

    1. 大小写敏感,~或者!~

    2. 大小写不敏感,~*或者!~*

  4. 检测文件是否存在,使用-f或者!-f

  5. 检测目录是否存在,使用-d或者!-d

  6. 检查文件、目录、软链接是否存在,使用-e或者!-e

  7. 检查是否为可执行文件,使用-x或者!-x

以上是关于Nginx之HTTP模块的主要内容,如果未能解决你的问题,请参考以下文章

Nginx之HTTP过滤模块

Nginx模块之http.md

Nginx实战之autoindex模块源码解析

nginx之HTTP模块配置

(006)Nginx之模块讲解

Nginx之负载均衡模块 ngx_http_upstream_module