配置文件报错可以通过nginx启动报错显示和定位 nginx在启动之前将执行自检,遇到问题即停止自检报出错误点行号、原因也有说明,不再继续检查,等待下次启动自检。信息针对性非常强。只要你去读报错信息即可。
报错原因列举,以下报错均有报错提示:
如果nginx的server里没配置access.log,nginx会默认将server的访问日志记录到access.log,
在nginx.conf全局配置文件中,默认是开启的。 关闭方法:
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; } }
该参数位于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 --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将在这个字符串匹配后停止进行正则表达式的匹配(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) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读