Nginx 基本配置和日志分析

时间:2023-03-08 18:10:09

  最近在维护的一个项目,路由转发规则都统一通过Nginx转发,所以再次参考部分博文和书本,熟悉Nginx的基本配置,还有一个重点也是日志的分析

  Nginx 常用模块是server块,location块。

  常用的location块配置:

  语法规则: location [=|~|~*|^~] /uri/ { … }
  = 表示精确匹配,这个优先级也是最高的
  ^~ 表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。
  ~  表示区分大小写的正则匹配
  ~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)
  !~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
  / 通用匹配,任何请求都会匹配到,默认匹配.

  例子:静态文件的匹配规则

  location ~* .*\.(js|css)?$

  {

  }

  location ~* .*\.(png|jpg|gif|jpeg|bmp|ico)?$
  {
  }

  location ~* .*\.(zip|rar|exe|msi|iso|gho|mp3|rmvb|mp4|wma|wmv|rm)?$
  {
  deny all; //禁止这些文件下载,大家可以根据自己的环境来配置
  }

  与php作为apache的一个模块运行不同,nginx完全是一个代理很强的服务器,相当于接到请求php文件然后交给php-fpm来处理,php的几种运行模式这里不详说

  location ~ \.php$ {

root   /httpd;

fastcgi_pass   127.0.0.1:8080;

fastcgi_index  index.php;

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

include        fastcgi_params;

}

  server块主要是虚拟主机的配置:

  server{
    server_name  test;
    listen 80;
    root /opt/www/test;

    location /
    {

    }
  }

  Nginx 主要模块还有Rewrite模块,可以使url更加友好等。书写的重点是正则表达式,匹配url来做一些事情,所以正则表达式是我们做什么开发都必须掌握的东西,与大家共勉,本人的正则写的很烂。。

  语法规则:

  break
  语法:break
  默认值:none
  使用字段:server, location, if
  完成当前设置的重写规则,停止执行其他的重写规则。

  if
  语法:if (condition) { … }
  默认值:none
  使用字段:server, location
  注意:尽量考虑使用trp_files代替。
  判断的条件可以有以下值:
  1. 一个变量的名称:空字符传”“或者一些“0”开始的字符串为false。
  2. 字符串比较:使用=或!=运算符
  3. 正则表达式匹配:使用~(区分大小写)和~*(不区分大小写),取反运算!~和!~*。
  4. 文件是否存在:使用-f和!-f操作符
  5. 目录是否存在:使用-d和!-d操作符
  6. 文件、目录、符号链接是否存在:使用-e和!-e操作符
  7. 文件是否可执行:使用-x和!-x操作符

  return
  语法:return code
  默认值:none
  使用字段:server, location, if
  停止处理并为客户端返回状态码。非标准的444状态码将关闭连接,不发送任何响应头。可以使用的状态码有:204,400,402-406,408,410, 411, 413, 416与500-504。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。

  rewrite
  语法:rewrite regex replacement flag
  默认值:none
  使用字段:server, location, if
  按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。可以在重写指令后面添加标记。
  注意:如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
  **尾部的标记(flag)可以是以下的值:
  last – 停止处理重写模块指令,之后搜索location与更改后的URI匹配。
  break – 完成重写指令。
  redirect – 返回302临时重定向,如果替换字段用http://开头则被使用。
  permanent – 返回301永久重定向。

  rewrite_log
  语法:rewrite_log on | off
  默认值:rewrite_log off
  使用字段:server, location, if
  变量:无
  启用时将在error log中记录notice级别的重写日志。

  set
  语法:set variable value
  默认值:none
  使用字段:server, location, if
  为给定的变量设置一个特定值。

  uninitialized_variable_warn
  语法:uninitialized_variable_warn on|off
  默认值:uninitialized_variable_warn on
  使用字段:http, server, location, if
  控制是否记录未初始化变量的警告信息。

重写规则组成部分

 任何重写规则的第一部分都是一个正则表达式

  可以使用括号来捕获,后续可以根据位置来将其引用,位置变量值取决于捕获正则表达式中的顺序,$1引用第一个括号中的值,$2引用第二个括号中的值,以此类推。如:

  ^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$

  $1是两个小写字母组成的字符串,$2是由小写字母和0到9的数字组成的5个字符的字符串,$3将是个文件名,$4是png、jpg、gif中的其中一个。

重写规则的第二部分是URI

请求被改写。该URI可能包含正则表达式中的捕获的位置参数或这个级别下的nginx任何配置变量。如:

    /data?file=$3.$4

如果这个URI不匹配nginx配置的任何location,那么将给客户端返回301(永久重定向)或302(临时重定向)的状态码来表示重定向类型。该状态码可以通过第三个参数来明确指定。

重写规则的第三部分
   第三部分也就是尾部的标记(flag)。 last标记将导致重写后的URI搜索匹配nginx的其他location,最多可循环10次。如:

   rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 last;

break指令可以当做自身指令。如:

if ($bwhog) {
  limit_rate 300k;
  break;
   }

另一个停止重写模块处理指令是return, 来控制主HTTP模块处理请求。 这意味着,nginx直接返回信息给客户端,与error_page结合为客户端呈现格式化的HTML页面或激活不同的模块来完成请求。如果状态码附带文字段落,该文本将被放置在响应主体。相反,如果状态码后面是一个URL,该URL将成为location头补值。没有状态码的URL将被视为一个302状态码。如:

location = /image404.html {
  return 404 "image not found\n";
 }

日志分析包括了日志切割和常用的一些简单分析的bash脚本:

切割日志以nginx为例:

  #nginx日志切割脚本

#!/bin/bash

   #设置日志文件存放目录
   logs_path="/usr/local/nginx/logs/"
  #设置pid文件
  pid_path="/usr/local/nginx/nginx.pid"

#重命名日志文件
  mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log

#向nginx主进程发信号重新打开日志
  kill -USR1 `cat ${pid_path}`

至于日志分析根据具体需求来写shell,其实重点就是熟悉强大的bash脚本才能写

 参考:http://www.jb51.net/article/53954.htm

 全文参考的博客:http://linux.cn/article-4279-weixin.html

      书本:《Nginx高性能服务器详解》