V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
imdong
V2EX  ›  程序员

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

  •  
  •   imdong ·
    imdong · May 24, 2019 · 7614 views
    This topic created in 2537 days ago, the information mentioned may be changed or developed.
    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)$ {
        }
    }
    

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

    Supplement 1  ·  May 24, 2019

    感谢 @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 replies    2019-05-24 19:32:10 +08:00
    xyqhkr
        1
    xyqhkr  
       May 24, 2019
    。。。神奇
    xzc19970719
        2
    xzc19970719  
       May 24, 2019 via Android
    为啥???
    pmispig
        3
    pmispig  
       May 24, 2019
    有啥区别?
    zzf2019
        4
    zzf2019  
       May 24, 2019
    有这种事吗?我也写过注释啊,没有啥问题啊
    Removable
        5
    Removable  
       May 24, 2019   ❤️ 1
    是不是端口不同导致的问题?毕竟变量不唯一。。。
    lonelygo
        6
    lonelygo  
       May 24, 2019
    真是注释的锅?
    xiri
        7
    xiri  
       May 24, 2019
    ???
    这两段代码不是只有端口不同吗,唯一的一句注释也是一模一样的啊
    xiri
        8
    xiri  
       May 24, 2019
    @xiri 完全看不懂楼主标题里的“注释”不同在哪
    FFLY
        9
    FFLY  
       May 24, 2019
    @pmispig @xiri

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

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

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

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