违法℃玩家 发表于 2018-11-12 09:37:27

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超链接语言(注意是英文引号):
  
    Welcome
  
   
  
      大片链接
  
      index.html
  
      index.php
  
   
  

  $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_logoff表示关闭访问日志,比如当访问: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-namenginx内置变量
  可以添加的"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 ;  

  
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.ralast;
  
    return403;
  
    ...
  
}
  
注意:这里是在server段,表示所有media和audio目录下的内容都定向到mp3目录中,即使用last也不会发生循环现象。
location /download/ {  
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
  
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.rabreak;
  
    return403;
  
}
  
这里表示所有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 ;  
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_buffersnumbersize;
  指定缓存压缩应答的缓冲区数量和大小,如果不设置,一个缓存区的大小为分页大小,根据环境的不同可能是4k或8k。
  gzip_comp_levellevel;
  压缩级别1-9。
  gzip_disableregex;
  符合正则的就不压缩,以适应不支持压缩的老板IE6。
  gzip_min_lengthlength;
  需要压缩的文件的最小值,否则压缩无意义,徒然浪费CPU。
  gzip_http_version1.0|1.1;
  是否根据HTTP请求版本来启用gzip压缩。
  当HTTP版本为1.0时,Vary: Accept-Encoding没有被设置,这将引起某些代理缓存失效,可以使用add_header,同样,在使用这个版本时Content-Length也没有设置,因此Keepalive不能在这个版本使用。
  gzip_proxiedoff;
  根据某些请求和应答来决定是否在对代理请求的应答启用压缩,其后有很多参数可选。
  查看压缩与否的方法:
  F12→Network→网页→Accept-Encoding:gzip,deflate,sdch


页: [1]
查看完整版本: nginx详解(二)