站点可用与站点启用与 conf.d 目录(Nginx)的区别?

Set*_*man 157 linux ubuntu configuration nginx web-server

我有一些使用 linux 的经验,但没有使用 nginx 的经验。我的任务是研究应用服务器的负载平衡选项。

我已经使用 apt-get 安装了 nginx,一切看起来都很好。

我有一些问题。

sites-available 文件夹和 conf.d 文件夹有什么区别。这两个文件夹都包含在 nginx 的默认配置设置中。教程使用两者。它们的用途是什么,最佳实践是什么?

启用站点的文件夹有什么用?我如何使用它?

默认配置引用一个 www-data 用户?我必须创建那个用户吗?如何为该用户提供运行 nginx 的最佳权限?

And*_*w B 128

站点-* 文件夹由nginx_ensite和管理nginx_dissite。对于通过搜索找到它的 Apache httpd 用户,等效项是a2ensite/ a2dissite

sites-available文件夹用于存储您的所有虚拟主机配置,无论它们当前是否已启用。

sites-enabled文件夹包含指向sites-available 文件夹中文件的符号链接。这允许您通过删除符号链接有选择地禁用虚拟主机。

conf.d可以完成这项工作,但是当您需要禁用某些内容时,您必须将某些内容移出文件夹,将其删除或对其进行更改。站点-* 文件夹抽象使事情更有条理,并允许您使用单独的支持脚本管理它们。

(除非你像我一样,并且是许多直接管理符号链接的 debian 管理员之一,不知道脚本......)

  • 重要的是要注意,`sites-available|sites-enabled` 是 Debian 主义,而不是 nginx 或 Apache 做的事情。它在过去可能非常有用,但在配置管理和容器时代,它的实用性受到了一定的限制。 (27认同)
  • 我做错了什么吗?不理解downvote。 (14认同)
  • @karthikvee 重点是,现在服务器通常显示为仅服务于单个网站/服务的临时容器,因此可以将其包含在 `nginx.conf` 中而不会损失任何可读性。这与几年前服务器通常存储数十个网站的方法相反。 (8认同)
  • 我很好奇这是内置在 nginx 中的吗?我手动安装 https://github.com/perusio/nginx_ensite (2认同)
  • 您能否评论一下配置管理和容器如何限制可用站点|已启用站点的实用性? (2认同)

Yar*_*nko 50

我想补充之前的答案,最重要的不是您如何调用目录(尽管这是一个非常有用的约定),而是您实际放入nginx.conf. 示例配置:

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    include /etc/nginx/sites-enabled/my_own_conf;
...
}
Run Code Online (Sandbox Code Playgroud)

这里使用的唯一指令是include,因此 egconf.d/和之间没有内部差异sites-enabled/

从上面的文档:

Syntax:     include file | mask;
Default:    —
Context:    any

Includes another file, or files matching the specified mask, 
into configuration. Included files should consist of 
syntactically correct directives and blocks.
Run Code Online (Sandbox Code Playgroud)

所以,回答最初的问题:没有内部差异,你可以以最好的方式使用它们,记住其他答案中的建议。请不要忘记选择“正确”的答案。

  • 是的,`sites-enabled` 在某种程度上是由某些发行版发明的,像一个烦人的中间人一样模糊不清。从[官方来源](http://nginx.org/en/download.html) 获取 nginx:您将获得最新的产品,并摆脱这种配置废话/地狱。 (2认同)
  • 这解释了为什么在官方 Nginx 文档中没有一个关于此命名约定的参考。这是一个第三方项目!https://github.com/perusio/nginx_ensite (2认同)

cns*_*nst 47

这是怎么回事?

您必须使用 Debian 或 Ubuntu,因为来自http://nginx.org/packages/的 nginx上游打包没有使用邪恶的 sites-available/sites-enabled逻辑。

在任何一种情况下,两者都是include/etc/nginx/nginx.conf.

这是/etc/nginx/nginx.conf来自 nginx.org 的官方 nginx 上游包的片段:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}
Run Code Online (Sandbox Code Playgroud)

这是/etc/nginx/nginx.conf来自 Debian/Ubuntu的片段:

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
Run Code Online (Sandbox Code Playgroud)

因此,从NGINX的点,唯一的区别是从该文件中conf.d获取到更快地处理,并且,正因为如此,如果你有配置,彼此默默的冲突,那么这些来自conf.d可优先于那些sites-enabled


最佳实践是conf.d

您应该使用/etc/nginx/conf.d,因为这是标准约定,并且应该可以在任何地方使用。

如果您需要禁用站点,只需将文件名重命名为不再有.conf后缀,非常简单、直接且防错:

sudo mv -i /etc/nginx/conf.d/default.conf{,.disabled}

或者相反以启用站点:

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}


避免sites-availablesites-enabled不惜一切代价。

我认为绝对没有理由使用sites-available/ sites-enabled

  • 有些人提到过nginx_ensitenginx_dissite脚本——这些脚本的名称甚至比这场灾难的其余部分更糟糕——但这些脚本也无处可寻——nginx即使在 Debian 中(也可能在 Ubuntu 中),它们也没有出现在软件包中,并且不存在于它们自己的包中,此外,您是否真的需要一个完整的非标准第三方脚本来简单地移动和/或链接两个目录之间的文件?!

  • 如果您不使用脚本(实际上,如上所述,这是一个明智的选择),那么就会出现如何管理站点的问题:

  • 您是否创建了从sites-available到的符号链接sites-enabled

  • 复制文件?

  • 移动文件?

  • 就地编辑文件sites-enabled

以上似乎是一些需要解决的小问题,直到有几个人开始管理系统,或者直到您做出快速决定,直到几个月或几年后才忘记它……

这让我们想到:

  • 从中删除文件是否安全sites-enabled?是软链接吗?硬链接?还是配置的唯一副本?配置地狱的一个典型例子。

  • 哪些网站被禁用?(使用conf.d,只需对不以.conf—结尾的文件进行反向搜索find /etc/nginx/conf.d -not -name "*.conf",或使用grep -v。)

不仅是上述所有内容,还要注意includeDebian/Ubuntu 使用的特定指令——与 for 不同,/etc/nginx/sites-enabled/*没有为 指定文件名后缀。sites-enabledconf.d

  • 这意味着,如果有一天你决定快速编辑中的文件或两个/etc/nginx/sites-enabled,你的emacs创造欲备份的文件default~,然后,突然间,你已经都defaultdefault~包括作为主动配置,其中,根据所使用的指令,不得甚至放弃你有任何警告,并导致长时间的调试会话发生。(是的,它确实发生在我身上;那是在一次黑客马拉松期间,我完全不明白为什么我的 conf 不起作用。)

因此,我确信那sites-enabled是纯粹的邪恶!

  • 很明显,a) 这不是本次讨论的合适媒介,也许更重要的是,b) 在任何情况下都可能徒劳无功。让我们接收有差异的看法。 (5认同)
  • 到了 2020 年,我个人觉得 NGINX 安装在 CentOS 7 服务器上时只包含 `conf.d` 目录一定是有原因的。NGINX 习惯于在 Ubuntu 上使用 Apache 进行无休止的自我教育,并在 `sites-*` 目录中定义虚拟主机,因此似乎更倾向于更简约的方法。我经常发现自己也必须在“.conf”文件中编写更少的代码。有时越简单越好,尽管组织是一个关键因素,但似乎总是有其他方法不会使其成为如此重要的优先事项。 (5认同)
  • 我不得不不同意关于“sites-available”和“sites-enabled”的断言;能够在“实时”拾取目录之外准备配置文件很重要,这样如果 nginx 重新加载或重新启动,它就不会拾取部分配置文件。保留不再使用的配置文件也很有用。如果您首先有足够的经验来管理 nginx,那么创建符号链接并不是一项特别困难的任务,IMO。 (2认同)
  • @BE77Y 我支持我的“不惜一切代价避免”的说法,我认为你的论点是不一致的(另外,我不明白你为什么觉得系统管理与这里的编程不同)。您提到的每个用例都可以轻松实现,无需`sites-{available,enabled}/*`,仅使用`conf.d/*.conf`,也无法通过 X 种不同方式实现未来的系统管理员必须弄清楚。看来你是在暗示增加复杂性是一件好事?对于这种额外的复杂性,如上文所述,没有提供额外的好处,您究竟欣赏什么? (2认同)

lar*_*sks 36

通常,该sites-enabled文件夹用于虚拟主机定义,而conf.d用于全局服务器配置。如果您支持多个网站——即虚拟主机——那么每个网站都有自己的文件,因此您可以通过移入和移出文件sites-enabled(或创建和删除符号链接,这可能是一个更好的主意)。

使用conf.d的东西像模块加载,日志文件,以及其他的东西都是不特定于某个虚拟主机。

默认配置引用一个 www-data 用户?我必须创建那个用户吗?

您应该让 nginx 以非 root 用户身份运行。在某些情况下www-data,它被命名为,但您可以将其命名为您想要的任何名称。

如何为该用户提供运行 nginx 的最佳权限?

我不太确定这个问题的答案(我目前没有运行 nginx),但如果它是 Apache 之类的东西,答案是www-data用户只需要对任何静态文件的读取权限(以及对目录的读取+执行) ),或者对 CGI 脚本等内容的读取/执行权限,而在其他任何地方都没有权限。