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

2017-06-11 01:19:45 +08:00
 zwillhill

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 文件——不明白有何不同。 强迫症……

9226 次点击
所在节点    Linux
12 条回复
580a388da131
2017-06-11 02:37:23 +08:00
nginx -t
检测配置文件语法错误,同时会显示主配置文件路径

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

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

配置项一般后面的会覆盖前面的。部分不允许覆盖的选项,nginx 会报 warning。启动和 reload 的时候可以在日志里面看到。
zwillhill
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
2017-06-11 17:09:07 +08:00
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
2017-06-11 20:48:30 +08:00
conf.d 目录下文件的优先级是按文件名字母序来的
同一个文件里的优先级是从上至下的(即有冲突的内容前面的匹配到后会忽略后面的)
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
2017-06-11 21:04:05 +08:00
>>网上教程经常改 conf,或者在 conf.d 里新建 conf 文件——不明白有何不同。
因为实际情况一台机器上往往会有多个站点,每个站点一个单独的 conf 文件更方便维护,出错了也容易排查
( nginx 经常一个配置出问题就全部罢工)
zwillhill
2017-06-11 21:22:46 +08:00
@WhiteLament 感谢热心回复,谢谢啦
julyclyde
2017-06-11 23:14:08 +08:00
启动 nginx 时,命令行写的那个为准。如果没写,以默认配置文件名为准
其他的都是被 include 进来的
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
2017-09-06 18:27:03 +08:00
一般还是习惯 nginx -p /prefix -c /prefix/conf 这种方式启动 nginx

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/367544

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX