nginx详解(二)

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




你可能感兴趣的:(nginx,日志模块)