Nginx 学习笔记--进程与模块(二)
进程与模块
Nginx 真正的魅力在于它的模块,整个应用程序建立在一个模块化系统之上,在编译时,可以对每一个模块进行启用或者禁用,需要什么就定制什么。
对 Nginx 模块的基本原理总结一下,基本就是:在特定地方调用函数。
Nginx 本身支持多种模块,如 HTTP
模块、EVENTS
模块和 MAIL
模块。
配置文件结构图:
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/16
和 192.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
: 表示完成 rewritebreak
: 本规则匹配完成后,终止匹配,不再匹配后面的规则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 协议》,转载必须注明作者和本文链接