Nginx 学习笔记--进程与模块(二)

进程与模块

Nginx 真正的魅力在于它的模块,整个应用程序建立在一个模块化系统之上,在编译时,可以对每一个模块进行启用或者禁用,需要什么就定制什么。

对 Nginx 模块的基本原理总结一下,基本就是:在特定地方调用函数。

Nginx 本身支持多种模块,如 HTTP 模块、EVENTS 模块和 MAIL 模块。
配置文件结构图:
Nginx学习笔记--进程与模块(二)

Nginx 本身做的工作实际很少,当它接到一个 HTTP 请求时,它仅仅是通过查找配置文件将此次请求映射到一个 location block,而此 location 中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做 Nginx 真正的劳动工作者。

http index模块

模块:ngx_http_index_module
语法:

index file ...;

默认值:index index.html
作用域:http, server, location

模块功能及注意:

  • 定义将要被作为默认页的文件。
  • 文件的名字可以包含变量。
  • 文件以配置中指定的顺序被 Nginx 检查。
  • 列表中的最后一个元素可以是一个带有绝对路径的文件。

范例:

location / {
    index index.$geo.html index.html index.htm /index.html
}

http log模块

模块:ngx_http_log_module

  • access_log 指令

语法:

access_log path [format [buffer=size]];
# or
access_log off;

默认值:access_log log/access.log combined

作用域:http, server, location

指令功能及注意:

  • 指令 access_log 指派路径、格式和缓存大小。
  • 参数 “off“ 将清除当前级别的所有 access_log 指令。
  • 如果未指定格式,则使用预置的 “combined“ 格式。
  • 缓存不能大于能写入磁盘的文件的最大值。在 FreeBSD 3.0-6.0 ,缓存大小无此限制。
access_log /var/log/nginx-access.log gzip buffer=32k;
  • log_format 指令

语法:

log_format name format [format ...];

默认值: log_format combined "..."

作用域: http server

功能:配置日志格式

范例:

log_format  gzip '$remote_addr-$remote_user[$time_local]' '$request$status $bytes_sent' '"$http_referer" "$http_user_agent" "$gzip_ratio"';

access模块

模块:ngx_http_access_module

模块功能及注意:

  • 此模块提供了一个简易的基于主机的访问控制(对网络地址有放行和禁止的权利),使 Nginx 可以对特定 IP 客户端进行控制。
  • 规则为:顺序匹配,以第一次匹配到的结果为准。

语法:

# 放行语法
allow address | CIDR | all;
# 禁止语法
deny address | CIDR | all;

作用域:http, server, location, limit_except
指令功能:allow 描述的网络地址有权直接访问; deny 描述的网络地址拒绝访问
范例:

location / {
    deny 192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16
    deny all;
}

在上面的例子中,仅允许网段 10.1.1.0/16192.168.1.0/24 中除 192.168.1.1 之外的 ip 访问。

Rewrite模块

模块:ngx_http_rewrite_module

模块功能及注意:

  • 执行 URL 重定向,允许你去掉带有恶意的 URL,包含多个参数(修改)
  • 利用正则的匹配,分组和引用,达到目的

if 语句块

语法:

if (condition) {
  ...
}

功能描述:对重定向进行流程控制

作用域:server, location

return 语句

语法:

return code;

作用域:server, location, if

功能描述:这个指令根据规则的执行情况,返回一个状态值给客户端。

  • 可使用值包括:204,400,402 - 406,408,410,411,413,416 及 500 - 504。
  • 也可以发送非标准的 444 代码 - 未发送任何头信息,然后结束连接。

rewrite 语句

语法:

rewrite regex replacement flag

regex :用于匹配 url 的正则表达式。使用括号()标记要截取的内容

replacement : 匹配成功后用于替换 url 中被截取内容的字符串

flag : 用来设置 rewrite 对 url 的处理行为

常用的 flag 如下:

  • last : 表示完成 rewrite
  • break: 本规则匹配完成后,终止匹配,不再匹配后面的规则
  • redirect : 返回 302 临时重定向,地址栏会显示跳转后的地址
  • permanent: 返回 301 永久重定向,地址栏会显示跳转后的地址

作用域:server, location, if

功能描述:这个指令根据正则表达式或者待替换的字符串来更改 URL。指令根据配置文件中的先后顺序执行生效。

范例:

location ~ (.*\.[png|jpg|gif]) {
    deny all;
}

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

Proxy模块

模块:ngx_http_proxy_module

功能描述:此模块能代理请求到其它服务器。就是说允许你把客户端的 HTTP 请求转到后端服务器(这部分的指令非常多,但不是全部都会被用到,这里是比较常见的指令简介)。

  • 指令:proxy_pass_header Server;

功能描述:该指令强制一些被忽略的头传递到客户端。

  • 指令:proxy_redirect off;

功能描述:允许改写出现在 HTTP 头却被后端服务器触发重定向的 URL,对响应本身不做任何处理。

  • 指令:proxy_set_header Host $http_host;

功能描述:允许你重新定义代理 header 值再转到后端服务器,目标服务器可以看到客户端的原始主机名。

  • 指令: proxy_set_header X-Real-IP $remote_addr;

功能描述:目标服务器可以看到客户端的真实 IP,而不是转发服务器的 IP。

upstream模块

模块:ngx_http_upstream_module

语法:

upstream name {
  ...
}

功能简介:该指令使请求被上行信道之间的基于客户端的 IP 地址分布

upstream 指令

语法:

upstream name { ... }

作用域:http

指令功能及注意:

  • 这个指令描述了一个服务器的集合,该集合可被用于 proxy_pass 和 fastcgi_pass 指令中,作为一个单独的实体。
  • 这些服务器可以是监听在不同的端口,另外,并发使用同时监听 TCP 端口和 Unix 套接字的服务器是可能的。
  • 这些服务器能被分配不同的权重。如果没有指定,则都为 1 。

示例:

upstream backend {
  server backend1.example.com weight=5;
  server 127.0.0.1:8080 max_fails=3  fail_timeout=30s;
  server unix:/tmp/backend3;
}

ip_hash 指令

作用域: upstream

upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com;
  server   backend4.example.com;
}

指令功能及注意:

  • 指定服务器组的负载均衡方法,请求基于客户端的 IP 地址在服务器间进行分发。IPv4 地址的前三个字节或者 IPv6 的整个地址,会被用来作为一个散列 key。
  • 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。除了当服务器被认为不可用的时候,这些客户端的请求会被传给其他服务器,而且很有可能也是同一台服务器。

如果其中一个服务器想暂时移除,应该加上 down 参数。这样可以保留当前客户端 IP 地址散列分布。就像这样:

upstream backend {
  ip_hash;
  server   backend1.example.com;
  server   backend2.example.com;
  server   backend3.example.com  down;
  server   backend4.example.com;
}

server 指令

语法:

server address [parameters];

作用域: upstream

指令功能及注意:

  • 定义服务器的地址 address 和其他参数 parameters。
  • 地址可以是域名或者 IP 地址,端口是可选的,或者是指定“unix:”前缀的 UNIX 域套接字的路径。如果没有指定端口,就使用 80 端口。
  • 如果一个域名解析到多个 IP,本质上是定义了多个 server。
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!