server { listen 80; server_name _; root /path/web; index index.php index.html index.htm; # pass the PHP 7.3 scripts to FastCGI server listening on 127.0.0.1:9073 location / { include fastcgi_params; fastcgi_pass 127.0.0.1:9073; fastcgi_param SCRIPT_FILENAME $document_root/index.php; } location ~* \.(html|htm|txt)$ { # something you want } } server { listen 81; server_name _; root /path/web; index index.php index.html index.htm; # pass the PHP 7.3 scripts to FastCGI server listening on 127.0.0.1:9073 location / { include fastcgi_params; fastcgi_pass 127.0.0.1:9073; fastcgi_param SCRIPT_FILENAME $document_root/index.php; } location ~* \.(html|htm|txt)$ { } }
这两段代码居然是不等效的,神特么坑...
感谢 @suriv520 的提示,果然是个乌龙,帮同事解决完就发到v2上然后去吃饭了。 回来在自己电脑上重新做了对比试验,确实没有复现。 刚刚去同事的电脑上再次试验,也没能复现问题,仔细查找后,找到了乌龙所在...
这里描述下整个乌龙事件大致过程: 同事新配置一个项目(macOS Mojave + Yii2 + PHP 7.3 + Nginx 1.15.12) tips: 其实和(以上)环境无关
所有的静态文件都被指向了 PHP 执行,导致访问静态文件 404 。
很简单嘛,调整 Nginx 配置即可,她原来是用的 try_files 重写到 PHP 执行, 没写静态文件的 locationm,懒得测试修改,直接把我的配置文件发给她了。 她自己搞了半天,没搞定,我就过去帮忙弄了。
# filename: admin.conf (我的配置文件) server { listen 80; server_name admin.***.top; root /Users/***/htdocs/manager/web; index index.php index.html index.htm; # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9073 location / { include fastcgi_params; fastcgi_pass 127.0.0.1:9073; fastcgi_param SCRIPT_FILENAME $document_root/index.php; } location ~* \.(ico|css|js|gif|jpg|jpeg|png|woff|ttf)(\?.*)?$ { # something you want } location ~* \.(html|htm|txt)$ { # something you want } }
由于她有自己的一些重写规则,就没直接覆盖,而是修改。
把 try_files 的 location 和 PHP 相关的,干掉; 改成了 fastcgi_pass 的那一段。 测试重写,正常后。
将
location ~* \.(ico|css|js|gif|jpg|jpeg|png|woff|ttf)(\?.*)?$ {
复制过去,加入 } 结束后,测试 robots.txt 结果文件依然 PHP 的 404 ,并确认文件确实的存在。
反复对比配置文件,注释其他所有不相关的段,均未解决。 最后,加上唯一没写的 # something you want 切换浏览器(切错另一个浏览器),默认打开的首页,刷新,显示正常了...
然后删除注释,切换浏览器(原来 robots.txt 页面的) 刷新,依然 404。
嗯,问题到这里,好像没有这行注释,Nginx 似乎会忽略这一段。 于是,问题就告一段落了,就准备去吃饭了。
刚刚,回来后,又仔细检查以后,发现问题了... 这个静态相关的 loction 里面没有 txt ...
txt 相关的在最后一个 html 的 loction 没复制过去...
同志们啊,这个故事告诉我们什么呢?
...
就是不要在妹子的电脑上帮妹子调东西... 装了多个不同版本的Nginx,自己都不知道用的哪个... 开了 N 多(不同的)浏览器窗口...
当然,我也一直主张的: 有问题,一定不要找(成熟的)环境的锅,一定是自己哪里搞错了。 难以解决的问题都是简单的问题导致的。
但是,没想到最后自己还是栽这上面了...
铭记:在没有反复试验之前,请不要妄下结论。
1 xyqhkr 2019-05-24 11:41:27 +08:00 。。。神奇 |
![]() | 2 xzc19970719 2019-05-24 11:42:48 +08:00 via Android 为啥??? |
![]() | 3 pmispig 2019-05-24 11:42:51 +08:00 有啥区别? |
4 zzf2019 2019-05-24 11:43:44 +08:00 有这种事吗?我也写过注释啊,没有啥问题啊 |
![]() | 5 Removable 2019-05-24 11:49:02 +08:00 ![]() 是不是端口不同导致的问题?毕竟变量不唯一。。。 |
![]() | 6 lonelygo 2019-05-24 11:51:12 +08:00 真是注释的锅? |
![]() | 7 xiri 2019-05-24 12:00:12 +08:00 ??? 这两段代码不是只有端口不同吗,唯一的一句注释也是一模一样的啊 |
![]() | 10 zhihaofans 2019-05-24 12:03:23 +08:00 via Android @xiri 兄啊,一共 3 句注释呢 |
![]() | 11 xiri 2019-05-24 12:07:40 +08:00 @zhihaofans 额,,,刚刚眼瞎了,没看见。 关键楼主也不说这个“不等效”具体体现在哪里,单按“等效”的字面意思理解的话,这两段配置的端口都不一样,本来就不是等效的啊 |
![]() | 12 suriv520 2019-05-24 12:15:10 +08:00 ![]() LZ 可以把事情与现象描述具体一点的。 也请做交叉对照实验,比如把下面的 block 移到上面去,把 80/81 端口做个交换,把注释做个交换……再把结论发出来。 先别急着下结论,研究深入一点,最终应该是会对 nginx 的配置、默认值、优先级有一个更深刻的认识。 另附 nginx 关于注释的处理逻辑与函数: https://github.com/nginx/nginx/blob/34a8b4506a/src/core/ngx_conf_file.c#L692 https://github.com/nginx/nginx/blob/34a8b4506a/src/core/ngx_conf_file.c#L158 配置文件中的以#开头的注释被彻底跳过了,跳过的逻辑: https://github.com/nginx/nginx/blob/34a8b4506a/src/core/ngx_conf_file.c#L615-L625 |
14 VDimos 2019-05-24 12:21:09 +08:00 via Android 我不信这么重要的 bug 会出现在 nginx 这种级别的软件上 |
15 ho121 2019-05-24 12:21:32 +08:00 via Android 是不是注释那行有什么奇奇怪怪的不可见字符? |
![]() | 16 suriv520 2019-05-24 12:26:21 +08:00 ![]() @0312birdzhang 我个人会尽量避免自带假设或者预设立场的提问,这对于获得知识并不好。且因为这篇帖子已经预设立场了,所以我只是就事论事讨论这个注释的问题。至于发生这个现象的具体原因,我应该是清楚的(源码级的那种清楚),但 who cares,毕竟这不是这篇帖子提出的问题。 |
![]() | 17 brust 2019-05-24 12:39:16 +08:00 好奇有什么区别,一直以为注释是无影响的,楼主 nginx 版本多少 |
![]() | 18 liangzi 2019-05-24 12:42:53 +08:00 docker 的注释也坑... |
![]() | 19 dyxLike 2019-05-24 12:47:23 +08:00 楼主倒是说清楚啊....哪句注释?产生了什么影响? |
![]() | 20 aaa5838769 2019-05-24 13:06:49 +08:00 一直以为注释没有任何问题= |
![]() | 21 watzds 2019-05-24 13:20:29 +08:00 via Android ![]() 少说点“一定”吧 |
![]() | 22 stzz 2019-05-24 13:23:37 +08:00 这个"她"是重点 |
![]() | 23 lusi1990 2019-05-24 13:28:32 +08:00 via Android 重点难道不是 她 |
![]() | 25 redbuck 2019-05-24 13:37:32 +08:00 哈,有个笑话. 程序员是最好的丈夫. 他们相信有问题一定是自己的错 |
26 woffee 2019-05-24 14:06:57 +08:00 端口不一致,哈哈哈哈,我也遇到这么乌龙的事情。 我和同事一起搞个新项目,他环境搭建好之后,我在我本地改了下,配置文件的端口号,代码里死活读不出来 PORT 的值。其他配置均可以读的出来。调试半天,差点就和楼主一样怀疑框架了:难道配置名不能取“ PORT ”? TMD 仔细一看,同事写的是 POST !艹 |
![]() | 29 fengyj 2019-05-24 14:25:36 +08:00 via Android 注释?ngnix 注释莫名其妙背锅 |
![]() | 30 cnzjl 2019-05-24 14:37:37 +08:00 注释这个东西...之前写 mybatis 的 mapper,注释掉了一个占位符,也被执行了. |
![]() | 31 cominghome 2019-05-24 14:42:22 +08:00 总结还算到位,一般遇到神奇的、令人抓狂的故障时,不要瞎质疑软件 /代码,冷静下来思考是不是自己配错了,大部分时候都是这样 |
34 zw1one 2019-05-24 14:53:02 +08:00 via Android 散了吧,up 主在秀妹子 |
![]() | 35 demo 2019-05-24 16:25:55 +08:00 帮了妹子没下文了? |
36 lynndon720 2019-05-24 17:45:36 +08:00 看下文本格式,unix 回车还是 windows 回车? |
![]() | 37 xiaotianhu 2019-05-24 17:54:17 +08:00 ![]() 我的经验是 如果是诡异的问题,一定是(大概率是)低级错误.首先怀疑自己 真碰到成熟软件的 bug 也是不容易的.至少我还没有. |