Nginx 日志、Rewrite及403报错信息处理等

目录

1. Nginx日志

1.1 Nginx错误日志介绍

配置Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(ngx_core_module)的参数,该参数名字为error_log,可以放在Main区块中全局配置,也可以放置在不同的虚拟主机中单独记录虚拟主机的错误信息。

#error_log的语法格式及参数语法说明如下:
error_log file level
关键字 日志文件 错误日志级别
  • 1
  • 2
  • 3

其中关键字error_log不能改变,日志文件可以指定任意存放日志的目录,错误日志级别常见的有[debug|info|notice|warn|error|crit|alert|emerg],级别越高记录的信息越少,生产场景一般是[warn|error|crit]这三个级别之一,注意不要配置info等级低级别,会带来巨大磁盘I/O消耗。

参考资料:http://nginx.org/en/docs/ngx_core_module.html#error_log

error_log的默认值为:
#default:error_log  logs/error.log  error;
可放置的标签段为:
#context:main,http,server,location
  • 1
  • 2
  • 3
  • 4

1.2 Nginx访问日志介绍

Nginx软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户浏览行为等,此功能由ngx_http_log_module模块负责,对应官方地址为:

http://nginx.org/en/docs/http/ngx_http_log_module.html

1.2.1 访问日志参数

参数 说明
log_format 用来定义记录日志的格式(可以定义多种日志格式,取不同名字即可)
access_log 用来指定日志文件的路径及使用的何种日志格式记录日志。
# Nginx日志格式中默认的参数配置如下:
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
# Nginx记录日志的默认参数配置如下:
    access_log  logs/access.log main
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.2.2 访问日志配置说明

# 日志格式定义
定义语法    log_format  name    string ...
配置位置    http标签内
  • 1
  • 2
  • 3
  • 4

Nginx日志变量说明

Nginx日志变量 说明
$remote_addr 记录访问网站的客户端地址
$http_x_forwarded_for 当前端有代理服务器时,设置Web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也要进行相关的x_forwarded_for设置。
$remote_user 远程客户名称
$time_local 记录访问时间与时区
$request 用户的http请求其实行信息
$status http状态码,记录请求返回的状态,例如:200、404、301等
$body_bytes_sents 服务器发送给客户端的相应body字节数
$http_referer 记录此次请求是从哪个链接访问过来的,可以根据referer进行防盗链设置
$http_user_agent 记录客户端访问信息,例如:浏览器,手机客户端等。

在没有特殊要求的情况下,采用默认的配置即可,详见官方文档:

http://nginx.org/en/docs/http/ngx_http_log_module.html

# 真实日志内容为:
192.168.90.61 - - [19/Mar/2018:13:02:07 +0800] "GET / HTTP/1.1" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" 
# 对应说明
$remote_addr对应的真实日志里的192.168.90.61,即客户端的IP
$remote_user对应的是第二个中杠“-”,没有远程用户,所以用“-”填充
[$time_local]对应的是[19/Mar/2018:13:02:07 +0800]。
"$request"对应的是" GET / HTTP/1.1"
$status对应的是200状态码,200是正常访问。
$body_bytes_sent对应的是25字节,相应body的大小。
"$http_referer"对应的是“-”,由于客户端直接curl浏览,因此,referer没有值
"$http_user_agent"对应的是"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
"$http_x_forwarded_for"对应的是“-”,因为Web服务没有使用dialing,因此此处为“-”。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

1.3 Nginx常用日志收集工具

Nginx常用日志收集及分析工具有rsyslog、awstats、flume、ELK(Elasticsearch 
logstash Kibana)、storm等。

更多开源工具详见http://blog.51cto.com/oldboy/775056

2 Nginx Location

2.1 location作用

location指令的作用是可以根据用户请求的URI来执行不同的应用,URI就是根据用户请求网站的地址URL匹配,匹配成功即进行相关操作。

下面是官方提供的常见的location匹配语法。

2.2 location语法

location [ =|~|~*|^~ ] uri {
......
}
  • 1
  • 2
  • 3
location [ =|\~|\~*|\^\~ ] uri {……}
指令 匹配标识 匹配的网站地址 匹配URI后要执行的配置段

上述语法中的URI部分是关键,这个URI可以是普通的字符串地址路径或者是正则表达式,当匹配成功则执行后面大括号里面的相关指令。正则表达式的前面还可以有~或~*等特殊的字符。

这两种特殊字符~或~*匹配的区别为:“~”用于区分大小写(大小写敏感) 的匹配;“~*”用于不区分大小写的匹配。还可以用逻辑操作符! 对上面的匹配取反,即!~ 和!~*。此外,“^~”作用是在常规的字符串匹配检查之后,不做正则表达式的检查,即如果最明确的那个字符串匹配的location 配置中有此前缀,那么不做正则表达式的检查。

2.3 location匹配示例

# 修改/application/nginx/conf/extra/www.conf,修改之前做备份
[root@web01 extra]# cp www.conf www.conf.rsq.20180320.bak
[root@web01 extra]# cat www.conf
    server {
        listen       80;
        server_name  www.rsq.com rsq.com;
     location / {
        return 401;
    }

    location = / {
        return 402;
    }

    location /documents/ {
        return 403;
    }

    location ^~ /images/ {
        return 404;
    }

    location ~* \.(gif|jpg|jpeg)$ {
        return 500;
    }

        access_log logs/www_access.log main;
}
[root@web01 extra]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.6.3//conf/nginx.conf test is successful
[root@web01 extra]# /application/nginx/sbin/nginx -s reload
# 客户端测试,直接取状态码
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.rsq.com
402
# 会发现加载的,等号优先
    location = / {
        return 402;
    }
# 再次测试,把402的localtion给删除掉
[root@web01 extra]# cp www.conf www.conf.test.location  #做备份
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.rsq.com
401
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.rsq.com/documents/document.html
403
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.rsq.com/images/1.gif
404 
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.rsq.com/kkkkk/1.gif
500
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.rsq.com/documents/1.gif
500
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

用户请求URI说明

用户请求的URI 设置的状态码 说明
当为空或 / 的时候 返回402,即匹配了: location = / { return 402; } 是精确匹配优先级最高,无论放置的顺序如何都将优先被匹配并执行
/index.html或任意不匹配其他location的字符串 返回401,即匹配了: location / { return 401; } /为默认匹配,即如果没有匹配上其它的location,则最后匹配“默认匹配”的部分
/documents/document.html 返回403,即匹配了: location /documents/ { return 403; } 此部分为路径匹配,即匹配了路径/documents/,注意后面的/documents/1.jpg,没有匹配此处的location,而是匹配了结尾的1.jpg
/images/1.gif 返回404,即匹配了: location ^~/images/ { return 404; } 此部分为路径匹配,但是前面增加了特殊字符^~,多以优先匹配路径,而没有匹配结尾的1.gif。
/documents/1.jpg 返回500,即匹配了: location ~* .(gif|jpg|jpeg)$ { return 500; } 此部分匹配了1.jpg,属于扩展名匹配,虽然有/documents/但是还是匹配了扩展名。

不用URI及特殊字符串组合匹配的顺序说明

不用URI及特殊字符串组合匹配顺序 匹配说明
第一名:”location = / {“ 精确匹配/
第二名:”location ^~/images/ {“ 匹配常规字符串,不做正则匹配检查
第三名:”location ~* .(gif|jpg|jpeg)$ {“ 正则匹配
第四名:”location /documents/ {“ 匹配常规字符串,如果有正则则优先匹配正则
第五名:”location / {“ 所有location都不能匹配后的默认匹配
# 可以做一个例子测试,把location中的documents下的return返回一个页面
# 修改www.conf中的documents
        location /documents/ {
            root html/www;
            index index.html;
        }
[root@web01 extra]# vim www.conf
[root@web01 extra]# /application/nginx/sbin/nginx -s reload
[root@web01 extra]# cd ../../html/www/
[root@web01 www]# mkdir documents
[root@web01 www]# echo documents >/documents/index.html
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

# 找个浏览器访问

这里写图片描述

3 Nginx Rewrite

3.1 Nginx Rewrite语法

指令语法:rewrite regex replacement [flag];
默认值:none
应用位置:server、location、if
  • 1
  • 2
  • 3
  • 4

rewrite是显示URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记。下面是一个简单的URL Rewrite跳转的例子:

rewrite ^/(.*) http://blog.rsq.com/$1 permanent;
  • 1
  • 2

在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,匹配所有,匹配成功后跳转到http://www.rsq.com/$1,这里的$1是取前面regex部分()里的内容,结尾permanent;表示永久301重定向标记,即跳转到后面的http://www.rsq.com/$1地址上。

# 修改www.conf文件如下
[root@web01 extra]# cat www.conf
    server {
        listen       80;
        server_name  www.rsq.com rsq.com;
        location / {
        rewrite ^/(.*) http://blog.rsq.com/$1 permanent;
    }
        access_log logs/www_access.log main;
}
[root@web01 extra]# ../../sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.6.3//conf/nginx.conf test is successful
[root@web01 extra]# ../../sbin/nginx -s reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

# 找个浏览器随便输入一个www.rsq.com/xxxxx用来测试

这里写图片描述

# 回车后看结果,已经跳转到blog.rsq.com/rsq/index.html

这里写图片描述

regex常用正则表达式字符串

字符 描述
\ 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。例如,“\n”匹配一个换行符,序列“\\”和“\$”则匹配“$
^ 匹配输入字符串的起始位置,如果设置RegExp对象的Multiline属性,\^也匹配“\n”或“\r”之后的位置
$ 匹配输入字符串的结束位置,如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置
* 匹配前面的字符零次或多次,例如,ol*能匹配“o”及“olll”,*等价于{0,}
+ 匹配前面的字符一次或多次,例如,“ol+”能匹配“ol”及“oll”但不能匹配“o”,.+等价于{1,}
? 匹配前面的的字符零次或一次,例如,“do(es)?”可以匹配“do”或“does中的“do”.?等价于{0,1} 当该字符紧跟在任何一个其他限制符(*,+?,{n},{n},{n,m})后面时,匹配模式是非贪婪模式的,非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串,例如,对于字符串“OOOO”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”
. 匹配除“\n”之外的任何单个字符,要匹配包括“\n”在内的任何字符,请使用像“[.\n]”的模式
(pattern) 匹配括号内pattern 并可以在后面获取对应的匹配,常用用S0…$9属性获取小括号中的匹配内容。要匹配圆括号字符,请使用“”或“

3.2 Rewrite指令结尾flag标记说明

flag标记符号 说明
last 本条规则匹配完成后,继续向下匹配新的location URI规则;
break 本条规则匹配完成即终止。不在匹配后面的任何规则;
redirect 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址;
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址;

在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL 
地址。

lastbreak标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break 标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{...}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

3.3 Nginx Rewrite的企业应用场景

  • 可以调整用户浏览的URL,看起来更规范,呵护开发及产品人员的需求
  • 为了让搜索引擎收录网站内容及用户体验更好,企业会将东塔URL地址伪装成静态地址提供服务
  • 网站换新域名后,让旧的域名的访问跳转到更新的域名商上,例如:让京东的360buy换成了jd.com
  • 根据特殊变量、目录、客户端的信息进行URL跳转等。
# 修改www.conf文件
[root@web01 extra]# cat www.conf
server {
    listen  80;
    server_name rsq.com;
    rewrite ^/(.*) http://www.rsq.com/$1 permanent;
}

server {
    listen  80;
    server_name www.rsq.com;
    location / {
        root    html/www;
        index   index.html index.htm;
    }
    access_log logs/access_www.log main gzip buffer=32k flush=5s;
}
[root@web01 extra]# ../../sbin/nginx -s reload
# 测试
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.rsq.com
200
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" rsq.com
301         # 这里就301跳转了
# 再次测试,用以前别名测试,看状态码
[root@web01 extra]# cp www.conf www.conf.rewrite2
[root@web01 extra]# cat www.conf.rsq.20180320.bak
    server {
        listen       80;
        server_name  www.rsq.com rsq.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log logs/www_access.log main;
    }
[root@web01 extra]# cp www.conf.rsq.20180320.bak www.conf
cp:是否覆盖"www.conf"y
[root@web01 extra]# ../../sbin/nginx -s reload
# 测试,会发现状态码一样,没有跳转
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" www.rsq.com
200
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" rsq.com
200
# 用别名的话效率高点,但是看不到改过的域名;rewrite重写,可以301跳转,效率低点
# 下边测试一下不同网站返回的状态码
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" http://taobao.com
302
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" http://baidu.com
200
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" http://jd.com
302
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" http://51cto.com
301
[root@m01 ~]# curl -s -o /dev/null -I -w "%{http_code}\n" http://csdn.net
302
# 302重定向是暂时的重定向,搜索引擎会抓取新的内容而保留旧的网址,因为服务器返回302代码,搜索引擎认为新的网页只是暂时的。SEO 302好于301.
# 301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

4 Nginx用户访问及密码验证

  • 有时候,企业在实际工作要求我们为网站设置访问账号和密码权限,这样操作后,只有拥有账号密码的用户才可以访问网站内容,访问验证效果如下:

这里写图片描述

  • 这种使用账号密码才可以访问网站的功能朱啊哟应用在企业内部人员访问的低智商,例如:企业网站后台、MySQL客户端phpmyadmin、企业内部的CRM、WIKI等网站平台等。

4.1 两个重要参数说明

# auth_basic
语法:auth_basic string off;
默认值:auth_basic off;
使用位置:http,server,location、limit_except

# auth_basic_user_file
语法:auth_basic_user_file file;
默认值:--
使用位置:http,server,location、limit_except

# auth_basic_user_file file参数厚街认证密码文件,file的内容如下:
# comment
name1:password1
name2:password2:comment
name3:password3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4.2 测试

# 修改配置文件www.conf
[root@web01 extra]# cat www.conf
    server {
        listen       80;
        server_name  www.rsq.com rsq.com;
        location / {
            auth_basic  "rsq web site";
            auth_basic_user_file /application/nginx/conf/htpasswd;

            root   html/www;
            index  index.html index.htm;
        }
        access_log logs/www_access.log main;
}
# 由于要用到htpasswd这个命令,这个包是安装httpd-tools时附带的,若是没有则先yum安装它
[root@web01 extra]# htpasswd -cb /application/nginx/conf/htpasswd oldboy 123456
Adding password for user oldboy # -c指定文件,-b非交互式
[root@web01 extra]# cat /application/nginx/conf/htpasswd
oldboy:MkKvxko6goeT6
# 这里提示下,如果要给此密码文件以权限,一定都要有r权限,否则会报500服务器错误
[root@web01 extra]# ../../sbin/nginx -s reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

# 浏览器测试

这里写图片描述
这里写图片描述
这里写图片描述

5 出现403报错信息的几种原因

5.1 没有web站点文件

[root@web01 extra]# cp www.conf www.conf.auth_basic.ori
[root@web01 extra]# vim www.conf
[root@web01 extra]# cat www.conf
    server {
        listen       80;
        server_name  www.rsq.com rsq.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        access_log logs/www_access.log main;
    }
[root@web01 extra]# rm -f ../../html/www/index.html 
[root@web01 extra]# ../../sbin/nginx -s reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

# 浏览器测试

这里写图片描述

5.2 首页文件没有权限

# 先恢复正常
[root@web01 extra]# echo www >../../html/www/index.html
[root@web01 extra]# ll ../../html/www/index.html
-rw-r--r-- 1 root root 4 320 18:46 ../../html/www/index.html
  • 1
  • 2
  • 3
  • 4

这里写图片描述

# 修改index.html权限
[root@web01 extra]# chmod 700 ../../html/www/index.html
[root@web01 extra]# ll ../../html/www/index.html
-rwx------ 1 root root 4 320 18:46 ../../html/www/index.html
  • 1
  • 2
  • 3
  • 4

# 测试

这里写图片描述

5.3 没有首页文件配置

# 修改www.conf配置文件
[root@web01 extra]# chmod 644 ../../html/www/index.html
[root@web01 extra]# cat www.conf
    server {
        listen       80;
        server_name  www.rsq.com rsq.com;
        location / {
            root   html/www;
            index  index.htm;       # 这个地方没有index.html
        }
        access_log logs/www_access.log main;
}
[root@web01 extra]# ../../sbin/nginx -s reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

# 测试

这里写图片描述

# 此时可以在配置文件中加上autoindex on,可以避免出现403问题,不过可能不太安全;
[root@web01 extra]# cat www.conf
    server {
        listen       80;
        server_name  www.rsq.com rsq.com;
        location / {
            root   html/www;
            index  index.htm;
            autoindex on;
        }
        access_log logs/www_access.log main;
    }
[root@web01 extra]# ../../sbin/nginx -s reload
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

# 测试

这里写图片描述


转载至https://blog.csdn.net/mr_rsq/article/details/79632034


猜你喜欢

转载自blog.csdn.net/vic_qxz/article/details/80537473