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

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

我有几个问题。

之间有什么区别站点可用文件夹和conf.d文件夹。这两个文件夹都包含在nginx的默认配置设置中。教程同时使用。它们的用途是什么,最佳做法是什么?

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

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

评论

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

#1 楼

sites- *文件夹由nginx_ensitenginx_dissite管理。对于通过搜索找到该目录的Apache httpd用户,等效项是a2ensite / a2dissite

sites-available文件夹用于存储所有vhost配置,无论它们当前是否已启用。

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

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

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

评论


我做错了吗?不了解选票。

–安德鲁(Andrew B)
13年8月9日在13:27

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

–lfender6445
16/12/22在2:39



重要的是要注意,sites-available | sites-enabled是Debian主义的,不是nginx或Apache所做的。过去它可能非常有用,但是在配置管理和容器时代,它的实用性受到了一定的限制。

–迈克尔·汉普顿
16-12-22在17:43



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

–karthik v
19年2月23日在22:46



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

– adamczi
19年7月7日在21:37

#2 楼

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

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


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


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

评论


没错,启用网站的方法是通过某种方式发明的,就像烦人的中间工具一样。从官方来源获取nginx:您将获得最新的产品,并摆脱这种配置废话/地狱。

–伯纳德·罗塞(Bernard Rosset)
16-4-4在16:10



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

– AxeEffect
17年5月24日在10:19



#3 楼

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


您应该让nginx以非root用户身份运行。在某些情况下,其名称为conf.d,但您可以根据需要命名。


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


我不太确定答案问题(目前我不在运行nginx),但是如果它类似于Apache,则答案是www-data用户只需要对您正在服务的任何静态文件(以及目录中的read + execute)具有读权限,或者/ execute权限(例如CGI脚本),而其他任何地方都没有权限。

评论


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

–公爵狮子
2013年8月9日13:02

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

–lfender6445
16/12/22在2:31

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

–幼虫
16 Dec 22 '16:10

#4 楼




您必须使用Debian或Ubuntu,因为来自http://nginx.org/packages/的nginx上游包装没有使用邪恶的sites-available / sites-enabled逻辑。 />
在这两种情况下,都可以通过include中的标准/etc/nginx/nginx.conf指令将它们作为配置约定来实现。

这是来自nginx的nginx官方上游软件包的/etc/nginx/nginx.conf的摘要.org:

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


这是Debian / Ubuntu的/etc/nginx/nginx.conf的摘录:

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


所以,来自从NGINX的角度来看,唯一的不同是conf.d中的文件将得到更快的处理,因此,如果您的配置相互之间无声冲突,则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脚本-这些脚本的名称甚至比其余的崩溃更糟-但这些脚本也无处可寻-他们即使在Debian(甚至可能在Ubuntu)中,nginx软件包中也不存在,并且也不存在于它们自己的软件包中,此外,您是否真的需要一个完整的非标准第三方脚本来简单地移动和//或链接两个目录之间的文件?!

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


您创建了从sites-availablesites-enabled的符号链接?
复制文件?
移动文件?
sites-enabled中编辑文件吗?



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

这使我们想到:


sites-enabled删除文件是否安全?它是软链接吗?硬链接?还是配置的唯一副本?配置地狱的一个典型例子。
哪些站点已被禁用? (使用conf.d时,只需对不以.conf结尾的文件进行反向搜索-find /etc/nginx/conf.d -not -name "*.conf"或使用grep -v即可。)

不仅要以上所有,还要注意Debian / Ubuntu使用的特定include指令— /etc/nginx/sites-enabled/* —与sites-enabled不同,没有为conf.d指定文件名后缀。


这意味着,如果有一天您决定快速编辑/etc/nginx/sites-enabled中的一两个文件,而您的emacs创建一个类似default~的备份文件,然后突然将defaultdefault~都包含为活动配置,根据所使用的指令,它们甚至可能不会给您任何警告,并且会导致长时间的调试会话。 (是的,这确实发生在我身上;那是在一次黑客马拉松期间,我完全困惑为什么我的conf无法正常工作。)

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

评论


除了上述所有以外,显然,创建不正确的符号链接也很常见! stackoverflow.com/a/14107803/1122270以防万一您认为启用站点还不够邪恶!

–cnst
17年8月27日在21:31

有时,可能是某人决定编辑启用了站点的文件,然后又有人决定通过删除它来禁用它,可能是因为这只是一个符号链接,需要随后的nginx堆内存转储来恢复。 conf文件:stackoverflow.com/q/45852224/1122270

–cnst
17年5月5日在18:01

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

– BE77Y
17-09-22在7:47



很明显,a)这不是进行此讨论的合适媒介,也许更重要的是,b)在任何情况下都可能毫无结果。让我们接收有差异的看法。

– BE77Y
17年9月22日在23:26

在2020年接近这一目标时,我个人觉得一定有理由将NGINX安装在CentOS 7服务器上时,它仅包含conf.d目录。 NGINX习惯于在Ubuntu上使用Apache进行无休止的自我教育,并在sites- *目录中定义了虚拟主机,因此NGNNX似乎正朝着更加简约的方法论发展。我经常发现自己也不得不在.conf文件中编写更少的代码。有时,简单是更好的选择,尽管组织是关键因素,但似乎总是有其他方法不会将其列为如此重要的优先事项。

–史蒂文·文蒂米利亚(Steven Ventimiglia)
20 May 17'4:48