【问题标题】:Apache: include htaccess in conf with AllowOverride None, better performance?Apache:在 conf 中包含 htaccess 和 AllowOverride None,性能更好吗?
【发布时间】:2015-12-31 11:14:53
【问题描述】:

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

该虚拟主机的相关 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?

【问题讨论】:

    标签: apache .htaccess


    【解决方案1】:

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

    按照提出的方式回答您的问题;是的,您需要以 root 身份运行命令来加载新配置。与其使用restart,不如使用reload 或(更好)graceful

    httpd.exe -k graceful
    

    您可以(但可能不应该)编写一个 cron 作业来定期检查它是否需要运行。没有大量测试,我认为这样的事情应该可以工作,作为常规的 root 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 文件的频率,但如果它存在,我不知道。

    【讨论】:

      【解决方案2】:

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

      您确实需要重新启动服务器/服务以测试对 apache.confhttpd.conf 或虚拟主机配置所做的任何更改。


      引用Apache's tutorial on htaccess文件:

      如果您有权访问,则应完全避免使用 .htaccess 文件 到 httpd 主服务器配置文件。使用.htaccess 文件会变慢 你的 Apache http 服务器。您可以包含在 .htaccess 文件最好设置在 Directory 块中,因为它会有 效果相同,性能更好。


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

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

      【讨论】:

      • 抱歉,第 1 点不清楚.. 正确的问题是:使用 Include 指令,Apache 仅在服务启动或每个请求时加载 htaccess?
      • 虽然这解决了问题的某些部分,但您实际上并没有解决所要求的整体意图。
      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 2018-06-22
      • 2015-09-29
      • 2013-06-15
      • 2013-10-25
      • 2015-03-03
      相关资源
      最近更新 更多