V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imdong
V2EX  ›  程序员

发现 Nginx 的注释也是会影响执行,死坑一上午...

  •  
  •   imdong ·
    imdong · 2019-05-24 11:35:47 +08:00 · 6918 次点击
    这是一个创建于 2010 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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)$ {
        }
    }
    

    这两段代码居然是不等效的,神特么坑...

    第 1 条附言  ·  2019-05-24 13:06:29 +08:00

    感谢 @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 多(不同的)浏览器窗口...

    当然,我也一直主张的: 有问题,一定不要找(成熟的)环境的锅,一定是自己哪里搞错了。 难以解决的问题都是简单的问题导致的。

    但是,没想到最后自己还是栽这上面了...

    铭记:在没有反复试验之前,请不要妄下结论。

    38 条回复    2019-05-24 19:32:10 +08:00
    xyqhkr
        1
    xyqhkr  
       2019-05-24 11:41:27 +08:00
    。。。神奇
    xzc19970719
        2
    xzc19970719  
       2019-05-24 11:42:48 +08:00 via Android
    为啥???
    pmispig
        3
    pmispig  
       2019-05-24 11:42:51 +08:00
    有啥区别?
    zzf2019
        4
    zzf2019  
       2019-05-24 11:43:44 +08:00
    有这种事吗?我也写过注释啊,没有啥问题啊
    Removable
        5
    Removable  
       2019-05-24 11:49:02 +08:00   ❤️ 1
    是不是端口不同导致的问题?毕竟变量不唯一。。。
    lonelygo
        6
    lonelygo  
       2019-05-24 11:51:12 +08:00
    真是注释的锅?
    xiri
        7
    xiri  
       2019-05-24 12:00:12 +08:00
    ???
    这两段代码不是只有端口不同吗,唯一的一句注释也是一模一样的啊
    xiri
        8
    xiri  
       2019-05-24 12:01:46 +08:00
    @xiri 完全看不懂楼主标题里的“注释”不同在哪
    FFLY
        9
    FFLY  
       2019-05-24 12:02:33 +08:00
    @pmispig @xiri

    貌似是“# something you want ”……
    zhihaofans
        10
    zhihaofans  
       2019-05-24 12:03:23 +08:00 via Android
    @xiri 兄啊,一共 3 句注释呢
    xiri
        11
    xiri  
       2019-05-24 12:07:40 +08:00
    @zhihaofans 额,,,刚刚眼瞎了,没看见。
    关键楼主也不说这个“不等效”具体体现在哪里,单按“等效”的字面意思理解的话,这两段配置的端口都不一样,本来就不是等效的啊
    suriv520
        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
    0312birdzhang
        13
    0312birdzhang  
       2019-05-24 12:20:34 +08:00   ❤️ 1
    @suriv520 #12 +10086,楼主直接说了结论,都没说发生了什么。
    VDimos
        14
    VDimos  
       2019-05-24 12:21:09 +08:00 via Android
    我不信这么重要的 bug 会出现在 nginx 这种级别的软件上
    ho121
        15
    ho121  
       2019-05-24 12:21:32 +08:00 via Android
    是不是注释那行有什么奇奇怪怪的不可见字符?
    suriv520
        16
    suriv520  
       2019-05-24 12:26:21 +08:00   ❤️ 4
    @0312birdzhang 我个人会尽量避免自带假设或者预设立场的提问,这对于获得知识并不好。且因为这篇帖子已经预设立场了,所以我只是就事论事讨论这个注释的问题。至于发生这个现象的具体原因,我应该是清楚的(源码级的那种清楚),但 who cares,毕竟这不是这篇帖子提出的问题。
    brust
        17
    brust  
       2019-05-24 12:39:16 +08:00
    好奇有什么区别,一直以为注释是无影响的,楼主 nginx 版本多少
    liangzi
        18
    liangzi  
       2019-05-24 12:42:53 +08:00
    docker 的注释也坑...
    dyxLike
        19
    dyxLike  
       2019-05-24 12:47:23 +08:00
    楼主倒是说清楚啊....哪句注释?产生了什么影响?
    aaa5838769
        20
    aaa5838769  
       2019-05-24 13:06:49 +08:00
    一直以为注释没有任何问题=
    watzds
        21
    watzds  
       2019-05-24 13:20:29 +08:00 via Android   ❤️ 1
    少说点“一定”吧
    stzz
        22
    stzz  
       2019-05-24 13:23:37 +08:00
    这个"她"是重点
    lusi1990
        23
    lusi1990  
       2019-05-24 13:28:32 +08:00 via Android
    重点难道不是 她
    brust
        24
    brust  
       2019-05-24 13:36:10 +08:00
    @liangzi #18
    吃了个 nginx 的瓜
    要不你给讲讲 docker 有啥坑
    redbuck
        25
    redbuck  
       2019-05-24 13:37:32 +08:00
    哈,有个笑话.

    程序员是最好的丈夫.
    他们相信有问题一定是自己的错
    woffee
        26
    woffee  
       2019-05-24 14:06:57 +08:00
    端口不一致,哈哈哈哈,我也遇到这么乌龙的事情。

    我和同事一起搞个新项目,他环境搭建好之后,我在我本地改了下,配置文件的端口号,代码里死活读不出来 PORT 的值。其他配置均可以读的出来。调试半天,差点就和楼主一样怀疑框架了:难道配置名不能取“ PORT ”?

    TMD 仔细一看,同事写的是 POST !艹
    xyqhkr
        27
    xyqhkr  
       2019-05-24 14:17:55 +08:00
    @liangzi docker-compose.yml 文件的注释和列对齐确实是个坑。
    liangzi
        28
    liangzi  
       2019-05-24 14:21:23 +08:00 via Android
    @brust 洗耳恭听
    huiyifyj
        29
    huiyifyj  
       2019-05-24 14:25:36 +08:00 via Android
    注释?🙃ngnix 注释莫名其妙背锅
    cnzjl
        30
    cnzjl  
       2019-05-24 14:37:37 +08:00
    注释这个东西...之前写 mybatis 的 mapper,注释掉了一个占位符,也被执行了.
    cominghome
        31
    cominghome  
       2019-05-24 14:42:22 +08:00
    总结还算到位,一般遇到神奇的、令人抓狂的故障时,不要瞎质疑软件 /代码,冷静下来思考是不是自己配错了,大部分时候都是这样
    brust
        32
    brust  
       2019-05-24 14:43:35 +08:00
    @liangzi #28
    我说的是你给 讲讲 有什么坑
    你是不是误解我讲有什么坑,目前我没发现什么坑
    liangzi
        33
    liangzi  
       2019-05-24 14:49:17 +08:00
    @brust 那确实是我误解了 .....
    zw1one
        34
    zw1one  
       2019-05-24 14:53:02 +08:00 via Android
    散了吧,up 主在秀妹子
    demo
        35
    demo  
       2019-05-24 16:25:55 +08:00
    帮了妹子没下文了?
    lynndon720
        36
    lynndon720  
       2019-05-24 17:45:36 +08:00
    看下文本格式,unix 回车还是 windows 回车?
    xiaotianhu
        37
    xiaotianhu  
       2019-05-24 17:54:17 +08:00   ❤️ 1
    我的经验是
    如果是诡异的问题,一定是(大概率是)低级错误.首先怀疑自己
    真碰到成熟软件的 bug 也是不容易的.至少我还没有.
    xcoderan
        38
    xcoderan  
       2019-05-24 19:32:10 +08:00
    @demo 帮完妹子不就是该要去 KFC?当然不会再来回覆了,至少今天是这样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1825 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:27 · PVG 00:27 · LAX 08:27 · JFK 11:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.