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 1
是不是端口不同导致的问题?毕竟变量不唯一。。。
|
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 1
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 |
13
0312birdzhang 2019-05-24 12:20:34 +08:00 1
@suriv520 #12 +10086,楼主直接说了结论,都没说发生了什么。
|
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 4
@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 1
少说点“一定”吧
|
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
huiyifyj 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 1
我的经验是
如果是诡异的问题,一定是(大概率是)低级错误.首先怀疑自己 真碰到成熟软件的 bug 也是不容易的.至少我还没有. |