用户工具

站点工具


docs:ingress:nginx:t1_trouble_shooting

配置文件

配置文件报错可以通过nginx启动报错显示和定位 nginx在启动之前将执行自检,遇到问题即停止自检报出错误点行号、原因也有说明,不再继续检查,等待下次启动自检。信息针对性非常强。只要你去读报错信息即可。

  • nginx -t 检查默认路径配置文件,默认路径及文件名可以通过编译定义来修改。查看位置可以nginx -h
  • nginx -t -c /etc/nginx/nginx.conf 检查指定配置文件

报错原因列举,以下报错均有报错提示:

  • 配置段的中括号不成对{},正则匹配中的类似情况
  • 参数重复:常见upstream重复或未定义、location重复
  • 端口问题:自检时不会检查端口是否已占用,此时自检通过,但启动报错端口占用。
  • 非法参考:参数因平台不同、编译组件不同而不一定支持这个参数,要么不用要么就编译。

nginx日志

如果nginx的server里没配置access.log,nginx会默认将server的访问日志记录到access.log,

在nginx.conf全局配置文件中,默认是开启的。 关闭方法:

  1. 在全局配置中添加 error_log off; 一般来说,错误日志有限,只配置一处。
  2. 在http块中添加:access_log off; 关闭全局后,在location中配置开启局部日志输出到单独的文件中,可以快速定位和筛查问题点。

server {
 #      server_name wiki;
        listen 127.0.0.1:8080;
        location ~* \.(css|js|png|jpg|gif|woff|woff2|jpeg|svg|bmp)$ {
            access_log  logs/access_main_static.log;                     #静态文件日志单独输出。或不输出
        }
        
        location ~* '^/main/(.*)/([^/.])+(\.([^/.]+))+\.([^/.]{5,})$' {  #一个中文4个字符数
            access_log  logs/access_main_php_reg.log;                    #由于此处是内部重定向,日志实际是在18行配置中日志中输出的。
            try_files $uri $uri/ $uri.php$is_args$args;
        }
        
        location / {
            access_log  logs/access_main.log;
        }
        error_page  404              /404.php;
        location ~ \.php$ {
            access_log  logs/access_main_php.log;
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
}


add_header

该参数位于server段上下文中,可以通过nginx内置变量输出服务信息,在调试反向代理时比日志输出更加直接,可以快速定位流量是否到达相应的后端。nginx中的参数示例:

    add_header DEBUG-INFO $remote_addr,$remote_port,$request_filename,$host,$server_protocol,$scheme,$server_addr,$server_port,$uri;
#验证操作(以下仅为示意操作)
[root@centos ~]# curl -IL xinzhiba.top
HTTP/1.1 301 Moved Permanently
Date: Tue, 17 Mar 2020 08:32:51 GMT
Content-Type: text/html
Content-Length: 171
Location: http://xinzhiba.top/main/pod/
Connection: keep-alive

HTTP/1.1 200 OK
Server: nginx/frontend
Date: Tue, 17 Mar 2020 08:32:51 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
DEBUG-INFO 127.0.0.1,60960,D:/services/nginx/html/1p//index.html,localhost,HTTP/1.1,http,127.0.0.1,5555,/1p/index.html
Expires: Wed, 18 Mar 2020 08:32:51 GMT
Cache-Control: max-age=86400

解释        
DEBUG-INFO 127.0.0.1,60960,D:/services/nginx/html/1p//index.html,localhost,HTTP/1.1,http,127.0.0.1,5555,/1p/index.html
解释以下为win10本地测试,所以
$remote_addr,访问客户端浏览器的IP:127.0.0.1
$remote_port,访问客户端浏览器的端口60960
$request_filename,请求资源在服务器端的绝对路径D:/services/nginx/html/1p//index.html
$host,localhost
$server_protocol,HTTP/1.1
$scheme,http
$server_addr,127.0.0.1,服务器IP,被浏览器访问的地址
$server_port,5555,Nginx服务器的监听端口
$uri;/1p/index.html  ,uri,不包括全部路径       

死循环

成也正则,败也正则。

        location ~* '(.*)/(([^/]{1,})$)' {    
                             #匹配了/main/pod/pages/about后,try_files /main/pod/pages/about.php
                             #但/main/pod/pages/about.php还是匹配此location,那么就到不了位于后面的php-fpm了。
                             #处理办法,将php后缀名正则匹配前置,不要放在后面。
            access_log  logs/access_main_php_reg.log;
            try_files  $uri $uri/ $uri.php$is_args$args;
        } 
        error_page  404              /main/pod/pages/404.php;
        location ~ \.php$ {   #移到前面。
            try_files $uri =404;
            fastcgi_pass   127.0.0.1:9004;
        }
补:因为此问题因去除php页面扩展名而出,那么终极处理办法为: 将匹配规则修改为不匹配php扩展名,即可跳出死循环。不用调整location php的位置。
        location ~* .*(?<!\.php|\.html|\.htm|/)$ {   #此处理排除了php、html、htm、/ 4个位置。此为否定反向环视

正则规则对吗

此处备注一个知识点:在nginx中,排除的正则,只能用否定反向环视: .*(?<!\.xml|\.html|\.htm|/)$ \\
nginx编译使用perl正则
以grep先来验验货正不正
$ grep --help

Regexp selection and interpretation:
  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
  -F, --fixed-strings       PATTERN is a set of newline-separated strings
  -G, --basic-regexp        PATTERN is a basic regular expression (BRE)
  -P, --perl-regexp         PATTERN is a Perl regular expression
  -e, --regexp=PATTERN      use PATTERN for matching
  -f, --file=FILE           obtain PATTERN from FILE
  -i, --ignore-case         ignore case distinctions
  -w, --word-regexp         force PATTERN to match only whole words
  -x, --line-regexp         force PATTERN to match only whole lines
  -z, --null-data           a data line ends in 0 byte, not newline

# ...复制代码使用 grep -P命令即可
$ echo 'a.gif' | grep -P '\.(jp?g|gif|bmp|png)'

#输出
a.gif

nginx支持的正则

^~   标识符后面跟一个字符串。Nginx将在这个字符串匹配后停止进行正则表达式的匹配(location指令中正则表
       达式的匹配的结果优先使用),如:location ^~ /images/,你希望对/images/这个目录进行一些特别的操作,
       如增加expires头,防盗链等,但是你又想把除了这个目录的图片外的所有图片只进行增加expires头的操作,这
       个操作可能会用到另外一个location,例如:location ~* \.(gif|jpg|jpeg)$,这样,如果有请求/images/1.jpg,
       nginx如何决定去进行哪个location中的操作呢?结果取决于标识符^~,如果你这样写:location /images/,
       这样nginx会将1.jpg匹配到location ~* \.(gif|jpg|jpeg)$这个location中,这并不是你需要的结果,而增加
       了^~这个标识符后,它在匹配了/images/这个字符串后就停止搜索其它带正则的location。
       
=   表示精确的查找地址,如location = /它只会匹配uri为/的请求,如果请求为/index.html,将查找另外的location,
       而不会匹配这个,当然可以写两个location,location = /和location /,这样/index.html将匹配到后者,如果
       你的站点对/的请求量较大,可以使用这个方法来加快请求的响应速度。

@      表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,只能用于Nginx产生的子请求,主要为error_page和try_files。

~      为区分大小写的匹配。
~*     不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)。
!~     不匹配的
!~*    不匹配的

.     匹配除换行符以外的任意字符
\w     匹配字母或数字或下划线或汉字
\s     匹配任意的空白符
\d     匹配数字
\b     匹配单词的开始或结束
^     匹配字符串的开始
$     匹配字符串的结束

*     重复零次或更多次
+     重复一次或更多次
?     重复零次或一次
{n}     重复n次
{n,}     重复n次或更多次
{n,m}     重复n到m次
*?     重复任意次,但尽可能少重复
+?     重复1次或更多次,但尽可能少重复
??     重复0次或1次,但尽可能少重复
{n,m}?     重复n到m次,但尽可能少重复
{n,}?     重复n次以上,但尽可能少重复

\W     匹配任意不是字母,数字,下划线,汉字的字符
\S     匹配任意不是空白符的字符
\D     匹配任意非数字的字符
\B     匹配不是单词开头或结束的位置
[^x]     匹配除了x以外的任意字符
[^aeiou]     匹配除了aeiou这几个字母以外的任意字符

捕获     (exp)     匹配exp,并捕获文本到自动命名的组里
(?<name>exp)     匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)     匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言     (?=exp)     匹配exp前面的位置
(?<=exp)     匹配exp后面的位置
(?!exp)     匹配后面跟的不是exp的位置
(?<!exp)     匹配前面不是exp的位置
注释     (?#comment)     这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

docs/ingress/nginx/t1_trouble_shooting.txt · 最后更改: 2020/09/25 21:49 (modify by Amos)