V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
zwillhill
V2EX  ›  Linux

请问 nginx 中几个文件夹和 conf 文件优先级是什么?

  •  
  •   zwillhill · 2017-06-11 01:19:45 +08:00 · 9500 次点击
    这是一个创建于 2752 天前的主题,其中的信息可能已经有所发展或是发生改变。

    centos 安装 nginx 后的目录和 Ubuntu 的有所不同,网上相关资料也很少 所以上来问下

    /etc/nginx 下有两个目录和两个文件:

    conf.d 目录 default.d 目录

    ——如果 conf.d 目录中的设置和下面 nginx.conf 冲突,哪个会起作用? default.d 目录呢?

    nginx.conf 文件 nginx.conf.default 文件 ——下面这个.default 大部分参数被注释掉了,但是也有没注释掉的,是否起作用? 和 conf 文件的优先级是?

    网上教程经常改 conf,或者在 conf.d 里新建 conf 文件——不明白有何不同。 强迫症……

    12 条回复    2017-09-06 18:27:03 +08:00
    580a388da131
        1
    580a388da131  
       2017-06-11 02:37:23 +08:00
    nginx -t
    检测配置文件语法错误,同时会显示主配置文件路径

    .default
    这是备份文件,不起作用,很多项目都是这样

    新建 .conf 后,可以在主配置文件中用 include 批量包含,目的是做到一个网站一个配置文件
    580a388da131
        2
    580a388da131  
       2017-06-11 02:49:03 +08:00   ❤️ 1
    /etc 习惯上存放配置文件的目录,.d 的意思是目录,里面包含了配置文件,前面的名字你可以自己起,这是 linux 的惯例。
    其实你可以自己随便放,只要 nginx 的启动配置文件中用 include 加载就可以。
    sylecn
        3
    sylecn  
       2017-06-11 08:24:41 +08:00 via Android
    看 nginx.conf 里面 include 是怎么写的就行了。
    目录都是显式 include 的,并不强制目录名称。

    配置项一般后面的会覆盖前面的。部分不允许覆盖的选项,nginx 会报 warning。启动和 reload 的时候可以在日志里面看到。
    zwillhill
        4
    zwillhill  
    OP
       2017-06-11 16:20:00 +08:00
    @580a388da131 @sylecn 感谢回复。

    默认 include conf.d 目录,
    早上测试了下,权限方面大约是 nginx.conf>conf.d 文件夹>default.d 文件夹,
    conf.d 能设置 server,但不能设置 http ——但如果其中 server 设置和 nginx.conf 冲突的话,nginx 启动出错。
    而 default.d 文件夹中的配置不能设置 server。

    gzip 应该是属于 http 级别的?
    sylecn
        5
    sylecn  
       2017-06-11 17:09:07 +08:00 via Android
    gzip 可以配置的作用域见
    http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip

    Syntax: gzip on | off;
    Default:
    gzip off;
    Context: http, server, location, if in location
    WhiteLament
        6
    WhiteLament  
       2017-06-11 20:48:30 +08:00
    conf.d 目录下文件的优先级是按文件名字母序来的
    同一个文件里的优先级是从上至下的(即有冲突的内容前面的匹配到后会忽略后面的)
    WhiteLament
        7
    WhiteLament  
       2017-06-11 21:01:06 +08:00
    为楼上“同一个文件里的优先级”补充一下
    例如用 abc.com 反代了一个程序,访问 abc.com 时需要浏览器自动跳转到 abc.com/subpath
    那么下面这样写可以达到目的( location =/ 表示仅仅匹配 / ,location /匹配以 / 开头的任意。)

    server {
    server_name abc.com;
    location =/ {
    return 301 /subpath;
    }
    location / {
    proxy_pass xxx;
    }
    }

    而下面这样交换顺序后就失效了,Nginx 匹配到 location /就忽略了 location =/

    server {
    server_name abc.com;
    location / {
    proxy_pass xxx;
    }
    location =/ {
    return 301 /subpath;
    }
    }
    WhiteLament
        8
    WhiteLament  
       2017-06-11 21:04:05 +08:00
    >>网上教程经常改 conf,或者在 conf.d 里新建 conf 文件——不明白有何不同。
    因为实际情况一台机器上往往会有多个站点,每个站点一个单独的 conf 文件更方便维护,出错了也容易排查
    ( nginx 经常一个配置出问题就全部罢工)
    zwillhill
        9
    zwillhill  
    OP
       2017-06-11 21:22:46 +08:00
    @WhiteLament 感谢热心回复,谢谢啦
    julyclyde
        10
    julyclyde  
       2017-06-11 23:14:08 +08:00
    启动 nginx 时,命令行写的那个为准。如果没写,以默认配置文件名为准
    其他的都是被 include 进来的
    dylanninin
        11
    dylanninin  
       2017-06-18 10:28:03 +08:00
    @WhiteLament 大概看了下『为楼上“同一个文件里的优先级”补充一下 』,发现你对 Nginx localtion 规则有很大的误解;很多人可能也一样,最开始我也是这么理解的,但没有亲自去验证。(这里并无任何冒犯的意思~

    看到这里,觉得有必要补充下,在 Nginx 你编写指令的先后顺序一般情况下并没有那么重要,要取决于 Nginx 内部的解析阶段、机制。摘录 《 Nginx 开发从入门到精通》的部分 http://tengine.taobao.org/book/chapter_11.html#id9

    1. Nginx 路径的分类
    - 普通前端匹配的路径,例如 location / {}
    - 抢占式前缀匹配的路径,例如 location ^~ / {}
    - 精确匹配的路径,例如 location = / {}
    - 命名路径,比如 location @a {}
    - 无名路径,比如 if {}或者 limit_except {}生成的路径

    2. Nginx location 的大致匹配顺序

    - 精确匹配的路径和两类前缀匹配的路径(字母序,如果某个精确匹配的路径的名字和前缀匹配的路径相同,精确匹配的路径排在前面)
    - 正则路径(出现序)
    - 命名路径(字母序)
    - 无名路径(出现序)

    看原文链接更加详细,还有代码示例。以上是原理,推荐系统性的学习、实践下。

    其实还有一个很朴素的办法:实践,通过实践去验证自己的猜想;而非让它们停留在猜想甚至是臆想的阶段。

    推荐大家可以看看我总结的分享《 Nginx Essential 》 https://www.slideshare.net/DylannininGogh/nginx-essential-68703694,这里做了一个简单的总结,也有测试的配置。

    若有任何错误、疏漏,请随时批评指正。
    ytlm
        12
    ytlm  
       2017-09-06 18:27:03 +08:00
    一般还是习惯 nginx -p /prefix -c /prefix/conf 这种方式启动 nginx
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:40 · PVG 07:40 · LAX 15:40 · JFK 18:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.