2.7 日志模块:
文档连接:http://nginx.org→documentation→ngx_http_log_module
变量含义:
$remote_user :客户端用户名,一般会为“-”。
$time_local :客户端的访问时间,格式一般为"26/Jun/2014:14:44:34 +0800”。
$request :客户端请求的URI。
请求html页面时为"/index.html HTTP/1.1",
请求php页面为"/index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1”
$status :响应状态码。这里正常的话就是"200"。
$body_bytes_sent:服务器向客户端发送的字节数。
$http_referer:引用客户端来源,说明客户端是从哪个地方来的,可能就是盗链。
比如在http://172.16.100.18/index.html中添加http://172.16.100.1/index.html网页中的内容链接时,在172.16.100.1中的日志中就可以看到请求客户端是172.16.100.18,而不是Real-Client-IP。
如果Real-Client-IP是请求php内容时,那么日志中可能还会包含172.16.100.1对自己的请求。
下面是http://172.16.100.18/index.html中可以使用html超链接语言(注意是英文引号):
<html> <head><title>Welcome</title></head> <body> <h1><font size="10" color="blue">大片链接</font></h1> <a href="http://172.16.100.1/index.html">index.html</a> <br/><a href="http://172.16.100.1/index.php">index.php</a> </body> </html>
$http_user_agent:用户的浏览器型号,一般会先解析国产浏览器,然后是外国浏览器
遨游:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.2.800 Chrome/30.0.1599.101 Safari/537.36
IE10:Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Win64; x64; Trident/6.0)
$http_x_forwarded_for:nginx为后端服务器时,需要记录真实客户端IP时,
前端的nginx代理服务器需要在location段添加
"proxy_set_header realip $remote_addr"
此字段也需要更改为"$http_realip"(此格式无下划线,如果保持原格式,前端需要多加几个参数)
如果后端为Apache,则需要在日志格式定义段combined中添加"%{realip}i"以记录真实客户端IP。
access_log off表示关闭访问日志,比如当访问:http://IP/status时。
2.8 访问控制模块
ngx_http_access_module(基于IP的认证)
location / { root /web/htdocs; index index.html; deny 192.168.1.1; allow 192.168.1.0/24; deny 172.16.100.5; allow 172.16.100.0/16; deny all; }
nginx_http_auth_basic_module(基于用户的认证)
location /yinsi { root /web/htdocs; index index.html; auth_basic "user_auth"; 这表示启用basic认证,并且这个authname叫什么 auth_basic_user_file /etc/nginx/.user_auth; 用户认证的文件在哪里 这个文件借助于Apache的htpasswd创建。 } #htpasswd -c -m /etc/nginx/.user_auth yh 这里输入两次密码。 #elinks
2.9自动索引功能
autoindex
当用户访问的路径下不使用首页,或没有首页文件,那么就可以将其路径下的所有文件以列表形式显示出来。这种方式比较危险,一般是极力避免的,但是作为下载站点还是很好的。
location /download { root /www/htdocs/download; autoindex on; autoindex localtime; 显示页面文件所在主机准确时间 autoindex_exact_size on;显示页面文件的准确大小,否则只是模糊值。 } #elinks http://IP/download
3.0添加自定义响应首部:
ngx_http_headers_module
格式:
add_header custom-header-name nginx内置变量
可以添加的"nginx内置变量"头部信息有很多,这些变量可以通过这个路径获得:ngx_http_core_module→Embedded Variables
add_header server_ip $server_addr添加一个服务器IP的头部,用以说明代理服务器时谁 使用Google浏览器时→F12→Network→index.html→Response Headers→Real-Client-IP
3.1重写模块:
nginx_http_rewrite_module:
用来完成URL重写的:比如本来访问的是http://www.yh_old.com/bbs/index.html,但是由于各种原因,不管事bbs目录不存在了,或者是域名更改了,都可以将旧URL重写至新URL:http://www.yh_new/images/index.html。此部分才是难点。
Syntax:rewrite regex replacement [flag]; Default:― Context:server, location, if
简单的重写:
location / { root /web/htdocs; index index.html index.php; rewrite /bbs/(.*)$ /images/$1 last; } 这里表示访问http://IP/bbs/目录下的任何内容,都重写至http://IP/images/目录下。这里使用了正在表达式的分组,但是在引用分组时的"\1"却必须改成"$1"。
重写规则有的时候是由很多条的,所以定义各条规则之间的关系是必须的:
第一种情况:
last:在第一次重写完成后,直接跳出,然后再使用新的URL重新进行rewrite规则匹配。
brak:在第一次重写完成后,直接从新的URI去访问了,不再继续rewrite规则匹配了。
如果location后面有具体路径、或者在IF语句中都要使用break。
redirect:使用替换机制,不是重写。类似于last,第一次替换后,需要重头检查一遍。
返回302代码,临时重定向,也叫显示重定向。
permanent:返回301代码,永久重定向,也叫隐式重定向。
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... } 注意:这里是在server段,表示所有media和audio目录下的内容都定向到mp3目录中,即使用last也不会发生循环现象。
location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; } 这里表示所有http://IP/download都会进行重写判断,而rewrite规则表示只要匹配一次就直接从新的URL走了。否则,就会在循环10次后,返回500错误。
IF判断:
Syntax:if (condition) { ... } Default:― Context:server, location
... if ($request_uri ~* \.(jpg|png|gif|html)$) { ... } ... 将URI进行if判断,如果符合后面的条件,则... 这种形式与location雷同,但是更复杂了,所以一般不这么用。
condition中的正则匹配:
~ :与指定的正则模式匹配时,返回的是“真”。匹配时区分字符的大小写。
~* :功能同上,但是匹配时,不分区字符的大小写。
!~ :与指定的正则模式不匹配时,返回的才是“真”。区分大小写。
!~*:同上,但不区分大小写。
condition中的文件及目录匹配:
-f,!-f:判断指定路径是否存在,且为文件。
-d,!-d:判断指定路径是否存在,且为目录。
-e,!-e:判断指定路径的目录或文件是否存在。
-x,!-x:判断指定路径的文件是否存在,且可以执行。
IF的实际应用场景是用于匹配nginx的内置变量值,这是location做不到的:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } 变量意义日志部分已经讲过,表示用户浏览器,如果是IE,就重写到msie目录下 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } 变量表示用户的cookie信息, if ($request_method = POST) { return 405; } 表示请求方法为POST时,就返回405错误。 if ($request_method == PUT) { proxy_pass http://upload.yh.com; } 如果用户的请求方法为PUT上传,则将其代理至后端upstream。 #curl -T /etc/fstab http://IP if ($slow) { limit_rate 10k; } $slow是一个布尔值(非1即0),当为1时,表示进行限速。 if ($invalid_referer) { return 403; } 发生非法引用,就返回403错误码。
上面有return、set,也属于重写模块,所以也需要解释下:
return:停止处理并返回指定状态码(code)给客户端,URL中可以包含变量。
Syntax:return code [text]; return code URL; return URL; Default:― Context:server, location, if
set:定义一个变量并赋值,值可以是文本,变量或者文本变量混合体。
Syntax:set $variable value; Default:― Context:server, location, if
3.2状态信息输出:
ngx_http_stub_status_module:
Syntax:stub_status; Default:― Context:server, location
location /status { stub_status on; access_log off; auth_basic "stub_user_auth"; auth_basic_user_file /etc/nginx/.stub_user_auth; } 一般在启用状态信息查看功能时需要加认证功能,且关闭日志,防止敏感信息外泄。 #elinks http://IP/status Active connections: 3 server accepts handled requests 3 3 1 Reading: 0 Writing: 1 Waiting: 2
Active connections:目前的活动连接数。 accepts: 已经接受的连接数。 handled: 已经处理的连接数。 requests:已经处理过的客户端请求数。(一次tcp握手连接,可以有多个请求) reading: 正在接进来的请求数。 writing: 响应的用户请求数。 waiting: 目前处理reading+writing过程的连接。
3.3压缩模块:
ngx_http_gzip_module
Syntax:gzip on | off; Default:gzip off; Context:http, server, location, if in location
gzip on|off;
是否启用此模块。
gzip_buffers number size;
指定缓存压缩应答的缓冲区数量和大小,如果不设置,一个缓存区的大小为分页大小,根据环境的不同可能是4k或8k。
gzip_comp_level level;
压缩级别1-9。
gzip_disable regex;
符合正则的就不压缩,以适应不支持压缩的老板IE6。
gzip_min_length length;
需要压缩的文件的最小值,否则压缩无意义,徒然浪费CPU。
gzip_http_version 1.0|1.1;
是否根据HTTP请求版本来启用gzip压缩。
当HTTP版本为1.0时,Vary: Accept-Encoding没有被设置,这将引起某些代理缓存失效,可以使用add_header,同样,在使用这个版本时Content-Length也没有设置,因此Keepalive不能在这个版本使用。
gzip_proxied off;
根据某些请求和应答来决定是否在对代理请求的应答启用压缩,其后有很多参数可选。
查看压缩与否的方法:
F12→Network→网页→Accept-Encoding:gzip,deflate,sdch