Nginx请求定位&日志管理

一、请求定位

(一)资源访问

  nginx默认的配置文件如下:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
                                                                         #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ .php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
#    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

  1、添加location配置

        location /lcl/nginx/demo {
                root /aa/bb;
                index myfile.text;
        }

  2、在真实目录中,需要在root属性指定的目录下存在location指定的url路径目录,所以需要在/aa/bb目录下创建/lcl/nginx/demo文件夹,并创建myfile.text文件,向文件内写入内容。

mkdir -p /aa/bb/lcl/nginx/demo
vi myfile.text

(二)路径匹配优先级

  优先级的规则是:普通匹配 < 长路径匹配 <正则匹配 < 短路匹配 < 精确匹配

  普通匹配:以下面配置文件为例,所有以/lcl开头的请求都可以命中,这就是普通匹配,例如使用:http://8.131.245.53/lcl/nginx/dem请求,返回400

 location /lcl {
                return 400;
        }

  长路径匹配:以下面配置文件为例,所有以/lcl/mginx开头的请求都可以命中,如果一个请求既能命中/lcl又能命中/lcl/nginx,那么路经长的优先级高,例如使用:http://8.131.245.53/lcl/nginx/dem请求,变为了402

 location /lcl/nginx {
                return 402;
        }

  正则匹配:~表示这里是正则表达式,默认匹配是区分大小写的,在长路径匹配和正则匹配中,仍然是正则匹配的优先级高于长路径匹配。例如使用:http://8.131.245.53/lcl/nginx/dem请求,变为了401;为了演示和后续几个的区别,使用http://8.131.245.53/mm/lcl/nginx/dem访问,返回401,但是匹配过程中,有大小写不一致,例如访问http://8.131.245.53/mm/Lcl/nginx/dem,则会返回404

location ~/lcl {
                return 401;
        }

      如果不想区分大小写,可以在~后加*,如下配置所示,访问http://8.131.245.53/mm/Lcl/nginx/dem时,仍然返回403

 location ~*/lcl {
                return 403;
        }

  短路匹配:以^~开头的匹配路径称为短路匹配,表示只要匹配上,就不再匹配其他的了,即使正则匹配也不再匹配了。

location ^~/lcl {
                return 405;
        }

  精确匹配:以等号开头的匹配,是优先级最高的匹配

location =/lcl/nginx/dem {
                return 406;
        }

(三)缓存配置

  Nginx具有很强大的缓存功能,可以对请求的response进行缓存,起到类似CDN的作用,甚至有比CDN更强大的功能,同时,Nginx缓存还可以用来数据托底,即当后台web服务器挂掉后,nginx可以直接将缓存中的托底数据返回给用户,此功能就是Nginx实现的服务降级的体现。

  Nginx缓存功能的配置由两部分组成,全局定义和局部定义,在http{}模块的全局部分中进行缓存全局定义,在server{}模块的各个location{}模块中根据业务需求进行缓存局部定义。

  1、http{}模块的缓存全局定义

http {
    include       mime.types;
    default_type  application/octet-stream;

    proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=5g inactive=2h use_temp_path=off;
    #proxy_temp_path proxy/cache;

  proxy_cache_path用于指定Nginx缓存的存放路径及相关配置;proxy_temp_path用于指定nginx缓存的临时存放目录,若proxy_cache_path中的use_temp_path设置为off,则该属性可以不指定。

  2、location{}模块的缓存局部定义

配置 描述
proxy_cache mycache 指定用户存放缓存key内存区域名称,,其值为http{}模块中proxy_cache_path中的keys_zone的值
proxy_cache_key $host$request_uri$arg_age 指定nginx生成的缓存的key的组成
proxy_cache_bypass $arg_age 指定是否越过缓存
proxy_cache-methods GET HEAD 指定客户端请求的哪些提交方法将被缓存,默认为GET与HEAD,但不缓存POST
proxy_no_cache $aaa $bbb $ccc 指定本次请求是否不做缓存,只要有一个不为0,就不对该请求结果做缓存
proxy_cache_purge $ddd $eee $fff 指定是否清除缓存
proxy_cache_lock on 指定是否采用互斥方式回源
proxy_cache_lock_timeout 5s 指定再次生成回源互斥锁的时限
proxy_cache_valid 5s 对指定的http状态码的响应数据进行缓存,并指定缓存时间,默认指定的状态码为200,301,302
proxy_cache_use_stale http_404 http_500 设置启用托底缓存的条件,而一旦这里指定了相应的状态码,则前面proxy_cache_valid中指定的相应状态码所生成的缓存就变为托底缓存
expires 3m 为请求的静态资源开启浏览器端的缓存

  3、Nginx变量

    (1)自定义变量

      由于Nginx配置文件是perl脚本,所以其是可以使用如下方式定义:

        set $aaa "hello";
        set $bbb 123;

        location / {
            root   html;
            index  index.html index.htm;
        }

    (2)内置变量

      Nginx中已经内置定义了很多变量,如下:

变量 说明 变量 说明 变量 说明
$args 请求中的参数 $binary_remote_addr 远程地址的二进制表示 $body_bytes_sent 已发送的消息体字节数
$content_length http请求信息里的“Content-Type” $document_root 针对当前请求的根路径设置值 $document_uri 与$uri相同
$host 请求信息中的Host,如果请求中没有Host行,则等于设置的服务器名 $http_cookie cookie信息 $http_referer 来源地址
$http_user_agent 客户端代理信息 $http_via 最后一个访问服务器的ip地址 $http_x_forwarded_for 相当于网络访问路径
$limit_rate 对连接速率的限制 $remote_addr 客户端地址 $remote_port 客户端端口号
$remote_user 客户端用户名,认证用 $request 用户请求信息 $request_body 用户请求主体
$request_body_file 发往后端的本地文件名称 $request_filename 当前请求的文件路径名 $request_method 请求的方法,比如get、post等
$request_uri 请求的uri,带参数 $server_addr 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取的地址(造成资源浪费) $server_name 请求到达的服务器名
$server_port 请求到达的服务器端口号 $uri 请求的uri,可能和最初的值有不同,比如经过重定向之类的    

二、Nginx日志管理及自动切割

  对于开发、运维人员来说,日志非常重要,通过日志可以查看很多请求访问信息及异常信息,Nginx也提供了对日志的强大支持。

(一)日志管理规范

  Nginx的日志分为两类,访问日志和错误日志,Nginx整个系统的默认日志在生成预编译文件makefile时就默认配置好了。当然,无论是访问日志还是错误日志,其默认路径与名称在配置文件中均可修改,在配置文件中不仅定义了日志文件的路径及名称,还定义了日志格式。

  Nginx日志一般可以指定三个范围:http{}模块范围、server{}范围、location{}模块范围。

  1、http{}模块范围

    只要有请求通过http协议访问该Nginx,就会有日志信息写入到这里的日志文件。

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main buffer=64k;
    error_log logs/myerror.log;
    open_log_file_cache max=1000 inactive=10s min_uses=2 valid=60s;

   log_format:

    其中,log_format用于设置访问日志的格式,其后的main是为该格式的名称,可以任意,在后面的就是具体的格式,通过Nginx内置变量定义。内置变量描述如下:

      $remote_addr:获取访问者的IP地址,若当前Nginx是反向代理服务器,则此变量获取到的就是客户端的IP地址;若当前Nginx是静态代理服务器,则此变量获取到的是反向代理服务器的地址。

      $http_x_forwarded_for:获取客户端浏览器的IP,若当前Nginx是反向代理服务器,则此变量获取到的值为横杠(-);若当前Nginx是静态代理服务器,则此变量获取到的是客户端的IP地址。

      $remote_user:获取访问者的用户名

      $time_local:获取请求访问的时间与时区

      $request:获取请求的相关信息,包含请求方式、请求的URI、访问协议。

      $status:后端服务器向其返回的状态码,例如200

      $body_bytes_sent:后端服务器向客户端发送的响应体内容字节数

      $http_referer:获取当前请求是从哪个页面过来的,其值在这里显示为横杠(-)

      $http_user_agent:用户所使用的代理,一般为浏览器

    access_log:

     该指令用于设置访问日志,后面跟的三个参数分别为:

      第一个参数:日志的存放路径及文件名

      第二个参数:日志格式名

      第三个参数:日志文件所使用的缓存,不过,即使不指定buffer,其也会存在默认日志缓存。

    error_log:

    该指令用于指定错误日志的路径和文件名,需要注意以下几点:

      其不能指定格式,因为其有默认格式。

      可以使用自己指定的错误日志文件,不过,将来的访问异常日志就不会再写入到默认的logs/error.log文件中了,所以关于错误日志,一般使用默认即可。

      错误日志级别由低到高有:debug、info、notice、warn、error、crit、alert、emerg,默认为error,级别越高,记录的信息越少,可以使用error_log logs/myerror.log info;设置日志级别。

      错误日志默认是开启的,关闭错误日志的写法为 error_log /dev/null;

    open_log_file_cache:

      该指令用于打开日志文件读缓存,将日志信息读取到缓存中,以加快对日志的访问,该功能默认为off,即open_log_file_cache off;

  2、server{}模块范围

    只要有请求访问当前server,就会有日志信息写入到这里的日志文件。

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        access_log  logs/host.access.log  main;
        error_log logs/host.error.log;

  3、location{}模块范围

    只有当请求访问当前location,就会有日志信息写入到这里的日志文件。

location / {
            root   html;
            index  index.html index.htm;

            access_log logs/location.access.log main;
            error_log logs/location.error.log;
        }

(二)默认的/favicon.ico请求

  客户端对于服务端页面会自动提交一个/favicon.ico请求,若没有favicon.ico文件则会在日志文件中报出404.

  从网上任意下载一个ico图标,将其重命名为favicon.ico,然后放到linux中的任意目录,然后再修改nginx的配置文件,在其中添加如下location{}模块,

    

 (三)日志自动切割

  日志切割的实现步骤:

  (1)创建切割shell脚本文件

    在Linux下创建一个实现日志切割的shell脚本文件,脚本文件的具体内容可以在网上查,例如,将该shell文件创建在nginx安装目录下的logs目录中,并命名为cut_nginx_log.sh

  (2)为该文件添加可执行权限

  (3)向crontab中添加一个定时任务

    crontab是Linux中的一个定义任务文件,每一行都代表一项定义任务,每行由6个字段组成,前5段是时间设定段,第6段是任务段,具体格式如下:

    minute(0-59)  hour(0-23)  day(1-31)  month(1-12)  week(0-6)  commond

    可以使用 crontab -e打开文件进行编辑

    

------------------------------------------------------------------
-----------------------------------------------------------
---------------------------------------------
朦胧的夜 留笔~~
原文地址:https://www.cnblogs.com/liconglong/p/14504719.html