log
模块 ngx_http_log_module,自定义 access 日志
eg:
log_format gzip '$remote_addr-$remote_user[$time_local]' '$request$status $bytes_sent' '"$ http _ referer" "$http_user_agent" "$gzip_ratio"';
access_log /spool/logs/nginx-access.log gzip buffer=32k;
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 ,缓存大小无此限制。
log_format
语法:
log_format name format [format ...];
默认值: log_format combined "..."
作用域: http server
index
ngx_http_index #处理以/
结尾的请求,如果没有找到 index 页,则看是否开启了
语法
index file ...;
eg:
location / {
index index.$geo.html index.html;
}
默认值:index index.html;
作用域:http, server, location
模块功能及注意:
- 定义将要被作为默认页的文件。
- 文件的名字可以包含变量。
- 文件以配置中指定的顺序被 Nginx 检查。
- 列表中的最后一个元素可以是一个带有绝对路径的文件。
Access
模块:ngx_http_access_module
基于 IP 地址的访问控制 (deny,allow)
模块功能及注意:
- 此模块提供了一个简易的基于主机的访问控制(对网络地址有放行和禁止的权利),使 Nginx 可以对特定
IP
客户端进行控制。 - 规则为:顺序匹配,以第一次匹配到的结果为准。
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 访问。
allow
allow address | CIDR | all;
在上面的配置范例中, 192.168.1.1 为 address,192.168.1.0/24 为 CIDR,all 对应 all。
deny
deny address | CIDR | all;
作用域:http, server, location, limit_except
指令功能:deny
描述的网络地址拒绝访问
Rewrite
if
if (condition) {
...
}
功能描述:对重定向进行流程控制
作用域:server, location
return
语法:
return code;
作用域:server, location, if
功能描述:这个指令根据规则的执行情况,返回一个状态值给客户端。
- 可使用值包括:204,400,402 - 406,408,410,411,413,416 及 500 - 504。
- 也可以发送非标准的 444 代码 - 未发送任何头信息,然后结束连接。
rewrite
这个指令根据正则表达式或者待替换的字符串来更改 URL。指令根据配置文件中的先后顺序执行生效。
语法
regex :用于匹配 url 的正则表达式。使用括号()标记要截取的内容rewrite regex replacement flag
replacement : 匹配成功后用于替换 url 中被截取内容的字符串
flag : 用来设置 rewrite 对 url 的处理行为
作用域:server, location, if
flag
字段 | 作用 |
---|---|
last | 表示完成 rewrite |
break | 本规则匹配完成后,终止匹配,不再匹配后面的规则 |
redirect | 返回302临时重定向,地址栏会显示跳转后的地址 |
permanent | 返回301永久重定向,地址栏会显示跳转后的地址(浏览器下次直接访问重定向后的地址 |
nginx地址重写的两种方式
- 由于业务需要,例如现网已经有了AgentProxy这个模块通过Nginx代理访问,在为了不影响该模块使用,需要新增加测试AgentProxy地址模块名称不变
- 第一种具体操作如下
location /api/agentProxy/{
rewrite "^/api/(.*)$" /$1 break;
proxy_pass http://agentProxy;
proxy_set_header Host $host;
}
- rewrite “^/api/(.*)
1 break,路径重写
- “^/api/(.*)$”:匹配路径的正则表达式,用了分组语法,把/api/以后的所有部分当做1组
- /$1:重写的目标路径,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始),即/api/后面的所有。这样新的路径就是除去/api/以外的所有,就达到了去除/api前缀的目的
- break:指令,常用的有2个,分别是:last、break
- last:重写路径结束后,将得到的路径重新进行一次路径匹配
- break:重写路径结束后,不再重新匹配路径。
- 第二种方式
- 第二种方式更简单在Proxy-pass里面把后缀agentProxy直接写上,可直接代理到AgentProxy服务器上面去
location /agentProxy2/{
proxy_pass http://agentProxy/agentProxy/;
proxy_set_header Host $host;
}
location ^~ /test {
rewrite "^/idp3/(.*)" /$1 break;
proxy_pass http://localhost;
}
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 backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
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。
实例:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}