Apache:在confO中包含htaccess和AllowOverride无,性能更好?

时间:2015-10-03 09:06:26

标签: apache .htaccess

假设我们在文件系统上有/home/example.org/public_html/目录,该目录充当我的虚拟主机的文档根目录。

该vhost的相关httpd配置如下所示:

<VirtualHost *:80>
  ServerName example.org:80
  ...
  DocumentRoot /home/example.org/public_html
  <Directory /home/example.org/public_html>
    AllowOverride All
    ...
  </Directory>
  ...
</VirtualHost>

为了防止文件系统上的htaccess查找而不丢失htaccess功能 - 至少在DocumentRoot级别 - 我将配置转换为以下内容:

<VirtualHost *:80>
  ServerName example.org:80
  ...
  DocumentRoot /home/example.org/public_html
  <Directory /home/example.org/public_html>
    AllowOverride None
    Include /home/example.org/public_html/.htaccess
    ...
  </Directory>
  ...
</VirtualHost>

差分

AllowOverride None
Include /home/example.org/public_html/.htaccess

让我们看看我们用这个完成了什么:

  

httpd不会浪费任何时间寻找和解析htaccess文件   导致更快的请求处理

问题:

  1. 使用Include指令,Apache仅在服务启动时或每个请求中加载htaccess?
  2. 如果第1点是真的,如何在没有httpd.exe -k restart的情况下刷新apache conf?

2 个答案:

答案 0 :(得分:3)

Apache在每个请求上访问和处理htaccess文件。这就是为什么每次都不需要重新启动服务器以检查其当前配置的原因。

您需要重新启动服务器/服务,以测试对apache.confhttpd.conf或vhost配置所做的任何更改。

Apache's tutorial on htaccess文件引用:

  

如果您有权访问,则应该完全避免使用.htaccess个文件   到httpd主服务器配置文件。使用.htaccess文件会变慢   你的Apache http服务器。您可以包含在任何指令中   .htaccess块中的Directory文件最好设置为Include块   同样的效果和更好的表现。

由于您已经在htaccess模块块中尝试<Directory> htaccess,因此如果您包含从文件到此块本身的所有内容,性能会更好。虽然没有区别,但是有;除了必须同时在两个地方维护配置外。

在服务器启动时,babel文件只会被处理一次。

答案 1 :(得分:1)

首先,请注意检查.htaccess通常不是一个大问题,因为磁盘的相关位缓存在内存中。例如,在您的Web根目录或目录下有大量目录,并且命中分散在其中,以便缓存磁盘块上的命中率很低,这就成了一个问题。通过有选择地为创建问题的目录树禁用.htaccess,您可能会更好地处理它。解析.htaccess指令当然会产生一点CPU负载,但CPU通常不应该是你服务器的瓶颈。

回答你提出的问题;是的,您需要以root身份运行命令才能加载新配置。不是使用restart,而是使用reload或(更好)graceful

httpd.exe -k graceful

您可以(但可能不应该)编写一个cron作业来定期检查是否需要运行它。如果没有大量的测试,我认为这样的事情应该有效,作为常规的根cron工作运行:

#!/bin/bash
[ /var/run/httpd/http.pid -nt /home/example.org/public_html/.htaccess ] \
  && httpd.exe -k graceful

当然,这会产生一些磁盘负载。此负载不会随着流量的增加而增加,但如果您有许多此类包含的文件,则可能会出现问题。

安全警告:听起来您正在设置一种情况,即非root用户可能会随意将Apache发送到Include指令。这比使用.htaccess文件所做的更强大,相当于root漏洞。例如。它允许访问诸如UserLoadModule指令之类的内容,而.htaccess指令永远不会这样做。

我建议您将Included指令放在Apache配置目录中的文件中,并且只能由root访问它。还有其他方法可以确保只有root可以编辑.htaccess文件,但是将这些文件从用户拥有的区域中取出会使您不太可能在以后无意中再次打开访问。

虽然.htaccess机制确实会产生额外的磁盘负载,但它是为非root用户设计的机制。如果有不受信任的用户修改配置的机制会对.htaccess文件的检查频率进行限制会很好,但是如果它存在,我就不知道了。