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

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

  •  
  •   imdong · 32 天前 · 5227 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条附言  ·  32 天前

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

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

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

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

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