让Nginx像Apache那样支持.htaccess?

这几天我写了一个AK博客系统,因为要支持伪静态所以想研究一下nginx下如何通过类似.htaccess的机制,通过WEB目录下新增一个文件动态的修改nginx配置,以实现伪静态。

研究了半天,最终的结论是实现不了,网上有红薯朋友说自己有办法实现了nginx对.htaccess的支持,实际上跟Apache下的htaccess是完全不同的两回事:

首先,.htaccess不是动态载入的,而是nginx启动时载入的,如果载入后修改.htaccess,则不会生效
其次,.htaccess不像Apache的那样基于站点,include进来的.htaccess如果有语法错误的话,nginx的语法检查通不过就无法启动。

综上所述,这种.htaccess除了文件名之外根本算不上.htaccess。

在Nginx官方网站上有一则说明:http://wiki.nginx.org/LikeApache-htaccess,大概翻译如下:

如何让nginx支持.htaccess?

支持不了,不应该,也不需要支持.htaccess。如果你想用.htaccess,八成是要犯错误了。

为什么?

问得好,Apache的.htaccess在每次请求时都要检查每一层目录下有没有.htaccess并解析它。你修改.htaccess后立即就生效,这就是因为Apache每次请求都要重新读这个文件。

接下来Nginx罗列了一些数字,表示在处理同样的请求时,Nginx和Apache读文件次数的比较来证明.htaccess是多么的降低性能。

结论

停止使用.htaccess,它对服务器性能是一场灾难。Nginx的设计原则是效率优先,增加.htaccess功能会破坏这个原则。

我对Nginx官方的这篇说明很不以为然:要支持动态修改站点配置这个需求对虚拟主机来说是非常合理的。让你满足这个需求又没有说让你要用和Apache一样的方法来实现!我替Nginx想了两个提高性能的方法:

一 支持.htaccess没有必要支持目录的递归查询,只要支持域名根目录就可以了。我在这么多年的技术实践中没发现子目录支持.htaccess的必要性。这样就能让性能大幅提高,每次请求也只多了一次文件读取而已。

二 对配置文件改动的读取不必是实时的,可以让Nginx的master主进程检测配置文件的修改,如果文件有改动则检查配置文件的语法有效性,如果可以就平滑的重新载入新配置,而无需每次请求同步读取。

有了这两个优化措施,可以让.htaccess对系统性能反面的影响几乎忽略不计,改动也比较小:只需要在Nginx的主进程中增加这个比较独立的小功能即可,Nginx引以为傲的高性能访问不受任何影响也不需做任何改动。Nginx的那个偏执的俄罗斯作者,请你有空看看我这个偏执的中国屌丝的博客吧。

 评论
  膜拜。。。。

  辩护立场有了,解决措施呢!那么当遇到项目需要在nginx上跑,并且必须支持.htaccess,那岂不是无法进行了!!
回复:我没辩护啊。你仔细看完:我对nginx的解释“不以为然”,认为这是很有用的功能。“解决措施呢?那么当遇到项目需要在nginx上跑,并且必须支持.htaccess,那岂不是无法进行了!! ”我的解决措施写在那儿了,或者nginx官方实施,或者自己写个插件。

  手游基地 www.shouyou888.com

  神一样的人

  你得写英文他才看得懂啊~ 另外,即使每个请求多一次 IO ,其实性能差距还是很大的。
回复:你还没看完我的措施二,连一次IO也不会多请求了。

  红薯?OSC的红薯?

  希望能多看到评论,翻页,后台管理的AJAX。
 发表评论
姓   名: