Apache:在conf中加入htaccess AllowOverride None,性能更好



假设文件系统上有/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是真的,如何刷新apache conf没有httpd.exe -k restart ?

首先,注意检查.htaccess通常不是什么大问题,因为磁盘的相关位缓存在内存中。例如,当您的web根目录或目录下有非常多的目录时,它就会成为一个问题,并且命中分布在它们之间,因此缓存磁盘块的命中率很低。您可以通过选择性地禁用目录树的.htaccess来更好地处理这个问题,因为它会产生问题。解析。htaccess指令当然会造成一点CPU负载,但CPU通常不应该成为服务器的瓶颈。

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

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文件要强大得多,相当于一个根漏洞。例如,它可以访问UserLoadModule指令,这是。htaccess指令永远无法做到的。

我建议你应该把Included指令放在Apache配置目录下的一个文件中,并且只有root才能访问它。还有其他方法可以确保只有root才能编辑。htaccess文件,但是将这些文件从用户拥有的区域中取出可以减少您稍后无意中再次打开访问权限的可能性。

虽然.htaccess机制会导致额外的磁盘负载,但它是为非root用户设计的。如果有一种机制可以让不受信任的用户修改配置,并限制检查.htaccess文件的频率,那就太好了,但如果存在,我不知道。

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

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


引用Apache的htaccess教程:

如果你有权限,你应该完全避免使用.htaccess文件到HTTPD主服务器配置文件。使用.htaccess文件会减慢速度Apache http服务器。可以包含的任何指令.htaccess文件最好设置在Directory块中,就像它所做的那样相同的效果,但性能更好。


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

htaccess文件只在服务器启动时处理一次。

最新更新