[Apache] Apache 从 2.2 换至 2.4 httpd.conf 的调整笔记 (windows 环境)

Apache 从 2.2 换至 2.4 httpd.conf 的调整笔记 (windows 环境)


/* 2012.5.30 Maple 记录   

2012.7.24 Maple 整理   */

整理一下 Windows 环境 从 Apache 2.2 改成 Apache 2.4.1 后 httpd.conf 的设定笔记及遇到的问题

若有兴趣可以先看一下官方文档说明 2.4 的差异 ( 我当然是...没有看完 Orz )

http://httpd.apache.org/docs/2.4/upgrading.html

http://httpd.apache.org/docs/2.4/new_features_2_4.html

/*2012.12.25 补充*/

apache 2.4.3 版有对 window 版的 ssl bug 做修正 ,bug 说明 http://www.apachelounge.com/viewtopic.php?p=22306

这个 bug 简而言之就是会让 443 的页面连线挂点...

1. 权限设定方式变更

原本使用 Order Deny / Allow 的方式,改用 Require

官方范例:

2.2 configuration:

Order deny,allow
Deny from all

在 2.4 需要改成

2.4 configuration:

Require all denied

比较常用到的有以下几种

Require all denied

Require all granted

Require host xxx.com

Require ip 192.168.1 192.168.2

Require local

注意 : 若有设定在 .htaccess 中的也要修改

详细命令说明 : http://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

2. 设定 Log 纪录方式变更

RewriteLogLevel 命令 改为 logLevel

LogLevel 设定第一个值是针对整个 Apache 设的默认等级,后方可以对指定的模块修改此模块的 Log 记录等级

范例:

LogLevel warn rewrite: warn

详细命令说明 请查看: http://httpd.apache.org/docs/2.4/mod/core.html#loglevel

3. Namevirtualhost 被移除

虽然我查官方文档是还有 NameVirtualHost 命令,但是执行时会出现错误。

官方文档也写了这个命令目前是无作用的,因此删掉此设定。

详细说明: http://httpd.apache.org/docs/2.4/mod/core.html#namevirtualhost

4. 其他要重载入的模块

使用网站压缩除了开启 mod_deflate 外 ,在 Apache 2.4 中还需要多开 mod_filter

使用SSL凭证除了开启 mod_ssl 外 ,在 Apache 2.4 中还需要多开 mod_socache_shmcb

5. 在 windows 环境建议的设定

EnableSendfile Off

EnableMMAP Off

另外,当 Log 有出现 AcceptEx failed 相关错误时,建议调整以下设定

AcceptFilter http none

#AcceptFilter https none 这行 apache 2.4.1 设了就不能连443了,所以我没设定,在 apache 2.4.3 版可正常运行

bug 修正相关文档: http://www.apachelounge.com/viewtopic.php?p=22306

命令说明 http://httpd.apache.org/docs/2.4/mod/core.html#acceptfilter

备注:  Win32DisableAcceptEx 命令在 apache2.4 被 AcceptFilter None 取代

相关参考文章:

http://www.neo.com.tw/archives/000223

http://www.iteye.com/news/24881

http://www.apachelounge.com/viewtopic.php?t=4450

6. Listen 的设定调整

以 443 为例,不可以只设定 Listen 443

会出现以下错误

(OS 10048)一次只能用一个通讯端位址(通讯协定/网络位址/连接端口)。  : AH00072: make_sock: could not bind to address [::]:443

(OS 10048)一次只能用一个通讯端位址(通讯协定/网络位址/连接端口)。  : AH00072: make_sock: could not bind to address 0.0.0.0:443

AH00451: no listening sockets available, shutting down

AH00015: Unable to open logs

因此需指定监听的 IP ,可设定多个

例如:

Listen 192.168.2.1:443

Listen 127.0.0.1:443

其他异常BUG :

某天突然心血来潮测试了一下可不可以开启 .htaccess 的文件,很惊恐的居然可以开启  

原本 httpd.conf 默认不可开启 .ht* 的设定失效!

    Require all denied

测试的结果,httpd.conf 里的 完全失效 !

不确定跟 设定有没有关系 ( 其实我跟 httpd.conf 没这么熟,我都是被刀抵著脖子的 =..=a )

经过半天的折磨,最后发现改用 LocationMatch 设定还勉强行得通

因为我没有用到 htpasswd ,所以比较不怕 .ht* 的文件被开启 ....所以就先用这种跛脚的方式解决了.....

例如:

     Require all denied

注意: 子阶层的 LocationMatch 设定,命令要设在母阶层的行数之下,不然会被覆盖

不可以对 " .ht* " 设定!!

因为 Server 就无法读取 .ht* 的数据...当然里面的设定就不能跑了

另外就是 .htaccess 中, 可能会失效

而且 .htaccess 里无法设定 LocationMatch .........(叹气)

在我的环境中,Server 2008 的 .htaccess 有生效,

但是在 Win7 环境中,放在第二层数据夹的 .htaccess 有生效 ,若第三层数据夹才放  .htaccess 就会失效

总之一整个诡异...只好先当作 BUG 看待