介绍
Apache Web服务器是目前世界上最流行的Web服务器。 它用于提供各种web内容,是一个强大的应用程序,是高度可定制的。
许多人都熟悉Apache 2.2配置语法,但是一些发行版现在随Apache 2.4提供。 这个转换的一个例子是Ubuntu 14.04 LTS来自Ubuntu 12.04 LTS。 虽然在大多数情况下语法是相同的,但有一些重要的区别,一些常见的指令已被弃用。
在本指南中,我们将讨论一些新的语法和一些其他的变化,你应该知道什么时候从Apache 2.2背景。 我们将使用Ubuntu 14.04作为使用Apache 2.4的发行版的示例,并将其与Ubuntu 12.04等发行版附带的2.2版本的Apache进行比较。
授权更改
Apache 2.4做出的主要变化之一是授权用户的首选方式。
授权是指定义被认证用户可以做什么的指令。 它规定了检查以确定是否应允许操作或访问的标准。
这与认证不同,认证必须首先发生。 认证过程定义用户如何能够肯定地向服务器标识自己。 认证从2.2变化不大,而授权已经大修。
首先,授权组件现在可以使用的Require
以前进行身份验证提供的语法。 这创建了一种简单的方法来定义授权命令,而不是依赖于复杂的规则集。 您可以以逻辑方式对它们排序,指定默认值,然后指定异常。
例如,您可以为接受流量设置默认值,但是希望阻止特定的恶意用户,您可以添加以下内容:
Require all granted
Require not ip 111.111.111.111
这将设置接受大家的默认策略,然后指定一个限定符请求不是来自未来111.111.111.111
IP地址。 要做到这一点,你需要要求这两个是真实的,我们将学习如何使用暂时做RequireAll
指令块。
授权不仅可以根据用户或组本身进行选择,而且也通过考虑到其他因素, env
, host
,或者ip
,或者与包罗万象的值all
。
- 全部 :此供应商的所有流量相匹配。 它对于设置默认值很有用。
- ENV:这个测试环境变量是否设置。
- 主持人 :这是用来测试连接的客户端的主机名。
- IP:这是用来测试连接的用户的IP地址。
这些可以基于它们被指定的顺序来控制。 你通常会在这些特殊块中看到它们:
- RequireAll:所有的块中的授权要求必须满足,以允许访问。
- RequireAny:如果任何在此块授权的要求得到满足,该块被标记为满意。
- RequireNone:如果任何列出的要求成功,该指令将失败。
这让您在设置授权方面有很大的灵活性。 你可以嵌套这些指令块在另一个像这样:
<RequireAny>
<RequireAll>
Require user root
Require ip 123.123.123.123
</RequireAll>
<RequireAll>
<RequireAny>
Require group sysadmins
Require group useraccounts
Require user anthony
</RequireAny>
<RequireNone>
Require group restrictedadmin
Require host bad.host.com
</RequireNone>
</RequireAll>
</RequireAny>
正如你所看到的,我们可以定义一些非常详细的授权路径。 如果用户是根和来自IP未来上述例子将授权123.123.123.123
。 它也将授权一个名为“安东尼”或组“系统管理员”或“useraccounts”中的任何成员的用户,但前提是他们是不是也该“restrictedadmin”组的一部分,或从标记的主机来在bad.host.com
。
这些认证块比用于访问控制的传统指令容易理解。 在Apache中的以前的版本中,你可以使用Order
, Allow from
, Deny from
和Satisfy
指令。 这些没有被删除,但已被弃用支持新的语法,这更容易理解和更一致。
他们然而,被转移到所谓的一个单独的模块mod_access_compat
。 如果您需要旧授权指令,请确保启用此模块。 但是,我建议在新的语法中实现您的条件,为将来的支持,并且因为它是很容易找出所选择的策略的影响。
Apache中的其他更改
有很多其他的变化,你应该注意,这将影响你如何构建你的配置文件。
其中一些可能需要您更改名称或覆盖新的默认值。 还有一个更完整列表的变化在这里,但我们将讨论一些可能会发觉你的那些的。
连接和儿童限制
一些指令已经经历了名称更改,以更好地描述其功能。
- MaxConnectionsPerChild:这个指令是用来取代
MaxRequestsPerChild
。 这个更改是为了更好地反映指令实际用于什么。 由于这些值实际上限制了连接数,因此这是一个更好的参数名称。 - MaxRequestWorkers:这个指令是为了取代
MaxClients
选项。 这是因为对于异步多处理模块,客户端的数量不应该假定与工作线程的数量相同。 这有助于精确指定受配置影响的此配置的部分。
AllowOverride更改
该AllowOverride
用于允许特定目录下的配置文件来改变默认设置的指令,已经发生了,可能会影响你的配置略有变化。
默认情况下,此设置的值现在为None
。 这将允许您通过默认为更加锁定的状态更容易地保护您的服务器。 它仍然是非常简单的,指定.htaccess
文件应该被读取并在需要它的目录处理,但如果你需要较少的全局和大范围AllowOverride None
为了实现这一声明。
默认情况下锁定服务器,然后覆盖安全性以允许基于目录的设置的特定实例的策略是大多数用户已经做到的。 这种改变只会帮助确保用户不容易攻击,如果他们忘记手动实现这些。
SendFile默认更改
的EnableSendfile
用于向服务器发送到客户端上的文件,而不必读取内容指令现在默认为Off
。
这是一种安全措施,用于确保所讨论的系统正确支持操作。 不正确的实施可能是一种责任或可能导致操作失败。 这些可以是操作系统特定的,取决于特定硬件,或由于访问内容的方法(远程文件系统等)而不同。
将此指令默认为禁用允许管理员验证其系统的兼容性,并进行一些测试,以确保在启用之前的正确功能。
实施细节
虽然这些不完全特定于Apache 2.4版本,但是在进行转换时,发行版附带的某些默认配置文件已更改。
这方面的一个例子是在Debian和Ubuntu发行版,Apache2.4的在主配置文件/etc/apache2/apache2.conf
现在可以处理包括其他文件略有不同。
在2.2,这些分布源的范围内的任何文件conf.d
和sites-enabled
目录,以允许额外的配置文件,最常用于虚拟主机的规格。 这些指令看起来像这样:
Include conf.d/
Include sites-enabled/
通配符匹配是一个新功能,允许您包括特定的文件模式,而不必传递整个目录。 这意味着,在传统上,你可以通过类似上面的东西,你可以有更多的灵活性,使用:
Include conf.d/*.conf
Include sites-enabled/*.conf
然而,如果你期望它像以前一样工作,这个新的语法也会导致一些问题。 在Include
指令,用通配符匹配使用时,如果没有匹配的文件被发现,从而导致错误将失败。
为了解决这个问题,一个叫新指令IncludeOptional
已创建。 这工作完全相同,但不会导致失败,如果通配符不匹配任何文件。
为了利用这一点,一些发行版已经开始包括额外的目录:
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
正如你所看到的,有已经在这里增加了额外的实现好办法:创建独立conf-enabled
和conf-available
目录镜像sites-*
和mods-*
目录。 这里的主要介绍是,现在正在指定特定的文件模式。 所有有效配置文件都需要在结束.conf
具有这种构造。
这可能需要一些时间来适应,如果你通常被称为像你的虚拟主机文件的东西default
,或site1.com
。 但是,这提供了更大的灵活性,因为我们可以在目录中有非配置文件,如旧版本,测试和README文件。
这意味着,对于测试,你可以只做一些事情:
cd /etc/apache2/sites-enabled/
cp mainconfig.conf mainconfig.conf.bak
nano mainconfig.conf
虽然你可以去通过a2dissite
和a2ensite
操作,这是可能是一些人更自然的另一种方法。 它还将您的旧工作文件保留在已启用的目录中,虽然不是完全语义,但如果您需要恢复到旧版本,可能会更容易找到重新实现。
在配置中您可能注意到的另一个变化是,一些指令已经移动,并且一些默认的虚拟主机指令已更改。 这三个块,在过去是在默认的虚拟主机文件,不再存在:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
顶部的两个块是在现已实现apache2.conf
在最新版本的Ubuntu的文件,因为他们应该任何配置进行设置。 他们已经更新为使用Require
指令:
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
在cig-bin
目录规范已经从虚拟主机文件中删除,并在实施conf-available/serve-cgi-bin.conf
文件。 这是一个更加模块化的方法和叶只负责特有指令的虚拟主机文件。 实际上,删除了所有注释的新默认虚拟主机很简单:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
正如你可以看到的,这真的可以帮助我们削减我们的网站特定的配置文件。
结论
通过审核您的现有配置和更新某些过程以利用新的指令和最佳实践,迁移到Apache 2.4并不难。 在功能上,它应该提供与附加功能相同的功能,并使用更容易理解的语法。