可用站点与ng.x的conf.d目录有什么不同用法


98

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

我已经使用apt-get来安装nginx,并且一切似乎都很好。

我有一些问题。

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

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

默认配置引用www数据用户?我必须创建该用户吗?如何为该用户授予运行Nginx的最佳权限?


提出问题时,尽量避免范围蔓延;www-data是一个单独的主题。大多数操作系统都以较低的权限定义了一个单独的用户,该用户以root身份绑定到端口80后可以运行该进程。它在配置文件中定义。从那里开始应用基本安全实践;不要让用户写入Web服务器不需要写入的任何内容,除非有意为之,否则不要让其他用户写入文件。
Andrew B

Answers:


93

sites- *文件夹由nginx_ensite和管理nginx_dissite。对于通过搜索找到此内容的Apache httpd用户,等效值为a2ensite/ a2dissite

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

sites-enabled文件夹包含指向站点可用文件夹中文件的符号链接。这使您可以通过删除符号链接来有选择地禁用虚拟主机。

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

(除非您像我一样,并且是许多直接管理符号链接而又不了解脚本的Debian管理员之一)


12
我做错了吗?不了解选票。
安德鲁B

1
我很好奇这是内置在nginx中的吗?我手动安装了github.com/perusio/nginx_ensite
lfender6445 '16

18
重要的是要注意这sites-available|sites-enabled是一种Debian主义,而不是nginx或Apache所做的事情。过去它可能非常有用,但是在配置管理和容器时代,它的实用性受到了一定的限制。
迈克尔·汉普顿

您能否评论配置管理和容器如何限制可用站点|启用站点的效用?
karthik vee

1
@karthikvee的要点是,当今服务器经常显示为仅提供单个网站/服务的星历容器,因此可以将其包含在内nginx.conf而不会降低可读性。这与几年前服务器通常存储数十个网站的方法相反。
adamczi

38

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

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    include /etc/nginx/sites-enabled/my_own_conf;
...
}

这里使用的唯一指令是include,因此eg conf.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.

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


1
是的,sites-enabled它是由某种分配发明的,就像烦人的中间体一样模糊不清。从官方来源获取nginx :您将获得最新的产品,并且摆脱了这种配置废话/地狱。
伯纳德·罗塞特

2
这解释了为什么在Nginx官方文档中没有一个单独的名称约定参考。这是第三方项目!github.com/perusio/nginx_ensite
AxeEffect

30

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

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

默认配置引用www数据用户?我必须创建该用户吗?

您应该让nginx以非root用户身份运行。在某些情况下www-data,该名称为,但您可以随意命名。

如何为该用户授予运行Nginx的最佳权限?

我不太确定这个问题的答案(目前我不在运行nginx),但是如果它像Apache,则答案是www-data用户只需要读取任何静态文件的权限(并在目录上执行read + execute) )表示您正在提供服务,或者对CGI脚本之类的内容具有读取/执行权限,而在其他任何地方均没有权限。


1
具有专用于运行Web服务器的用户也很重要,因为通过删除有效的Shell记录来为此用户禁用登录功能。
2013年

>“您应该让nginx以非root用户身份运行”-您能否详细说明一下?
lfender6445 '16

1
以非特权用户身份运行是一种控制可能由远程破坏造成的损害的方法。如果您正在运行Web服务器,root并且存在某种形式的远程威胁,则攻击者将立即拥有对系统的完全访问权限。当以非特权用户身份运行时,管理访问权限只能与某种本地漏洞利用结合使用。
larsk's

14

这是怎么回事?

您必须使用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;
}

这是/etc/nginx/nginx.confDebian / Ubuntu的摘录:

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

因此,从NGINX的角度来看,唯一的区别是from的文件将conf.d得到更快的处理,因此,如果您的配置相互之间无声冲突,则from的文件conf.d可能会优先于中的文件sites-enabled


最佳实践是conf.d

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

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

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

或相反地启用站点:

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。)

不仅所有的上述情况,还要注意具体include由于Debian / Ubuntu使用的指令- /etc/nginx/sites-enabled/*-对于没有指定文件名后缀sites-enabled,不像conf.d

  • 这意味着如果有一天您决定在中快速编辑一个或两个文件/etc/nginx/sites-enabled,并emacs创建了一个备份文件(如)default~,则突然之间,您同时拥有这两个文件default并将default~其作为活动配置包含在内,根据所使用的指令,该配置甚至可能不会您会收到任何警告,并导致调试会话时间延长。(是的,这确实发生在我身上;那是在一次黑客马拉松期间,我完全不知道为什么我的conf无法正常工作。)

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


除了上述所有以外,创建不正确的符号链接也很常见!stackoverflow.com/a/14107803/1122270 以防万一您认为sites-enabled不够邪恶!
cnst

或者,有时可能是某人决定编辑中的文件sites-enabled,然后又有人决定通过删除它来禁用它,可能是认为这只是一个符号链接,需要随后的nginx堆内存转储来恢复conf文件:stackoverflow.com/q/45852224/1122270
CNST

我必须不同意关于sites-available和的主张sites-enabled。重要的是要能够在“实时”拾取目录之外准备配置文件,这样,如果重新加载或重新启动了nginx,它将不会拾取部分配置文件。保留不再处于活动状态的配置文件也很有用。如果您首先有足够的经验来管理nginx(即IMO),则创建符号链接并不是特别困难的任务。
BE77Y

@ BE77Y您正在采用更复杂的方法。在编程中,最好的方法是完全删除未使用的代码,而不仅仅是禁用或注释掉它。我看不出DevOps应该有什么不同的原因-如果不再需要配置,请将其删除(它仍应存在于您的VCS中)。与部分conf文件相同—为什么要启用它们才能编辑它们,并在后台重装nginx?(USR1,它重新打开日志,不会重新加载conf。)我发现您的符号链接“体验”注释被误导了-问题是一致性的问题,与经验无关。
cnst

2
显然,a)这不是进行此讨论的合适媒介,也许甚至更重要的是,b)在任何情况下都可能毫无结果。让我们接收有差异的看法。
BE77Y
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.