Windows服务器,在不影响数据的前提下,抛弃IIS,采用Apache

November 15th, 2007 / 求知·技术新知 / 144 条评论

Windows 2003的服务器,一直采用IIS+PHP+Mysql,虽然Linux+Apache才是PHP的元配,但是因为我不熟Linux,而且IIS从我学生时代用到现在,可谓驾轻就熟,所以沿用IIS+PHP+Mysql这种似乎有些奇怪的组合,虽然一直也有想过换用Apache,但一直没有太好的”理由“,以至于下不了决心,直到这几天因为ISAPI下的Rewrite缺憾而被烦死,才决定改用Apache,希望这个选择是对的!

之前虽然有装过Apache,但都是“点到即止”,今天第一次应用,发现一些细节上的问题,记录一下,以待后用:

之前的服务器环境:Windows 2003+IIS6+PHP5+Mysql5

很久之前看过一些资料,发现IIS是可以跟Apache“和平相处”的,而且可以利用Apache强大的rewrite功能实现“共用”80端口,但是觉得有些“变态”,放弃,就用Apache就好了,反正现在几乎都不碰ASP了。

禁用IIS,安装Apache:
因为服务器上已经有几个网站在运行,所以我要保证在不影响网站数据的情况下用Apache代替IIS,为了保险起见,不删除IIS(以防万一,必要时暂时用回IIS),在服务里直接禁用了IIS的服务项,这样就解决了安装Apache时端口冲突的问题。。。安装Apache2.2,除了Window本身,我不允许其它任何程序安装在系统盘,然后自定义了Apache的安装路径,比如e:\Apache2.2,一切顺利,浏览localhost,见到了“It works!”,安装Apache成功。

配置Apache 2.2来运行PHP5:
打开httpd.conf,找到:


XML/HTML代码

  1. <IfModule dir_module>  
  2.     DirectoryIndex index.html   
  3. </IfModule>  

替换为:


XML/HTML代码

  1. <IfModule dir_module>  
  2.     DirectoryIndex index.html index.php   
  3. </IfModule>  

当然,这只是一个例子,可以添加更多的默认页。

再查找:


XML/HTML代码

  1.     #AddType text/html .shtml   
  2.     #AddOutputFilter INCLUDES .shtml  

在这下面增加以下内容:


XML/HTML代码

  1. AddType application/x-httpd-php .php  

接下来这一步,是要允许Apache将PHP程序作为模块来运行!

继续查找:


XML/HTML代码

  1. #LoadModule ssl_module modules/mod_ssl.so  

在这行下面添加:


XML/HTML代码

  1. LoadFile "E:/PHP/libmysql.dll"   
  2. LoadModule php5_module "E:/PHP/php5apache2_2.dll"   
  3. PHPIniDir "E:/PHP/php.ini"  

在这一步,走了好多弯路,一开始我在网上搜过到的都是类似下面这样的描述:


XML/HTML代码

  1. 在Httpd.conf中找到LoadModule小节,自己添加下面这一行:    
  2.   
  3. LoadModule php4_module “c:/php/php4apache2.dll”   
  4.     
  5. 如果你出于某种原因而需要在CGI模式中运行PHP程序(使用Php.exe),请将上面这一行变成注释,并在Httpd.conf中添加下面这些行:   
  6.     
  7. ScriptAlias /php/ "c:/php/"   
  8. Action application/x-httpd-php "/php/php.exe"  

按网上的这个到处被转载的“教程”做,把类似"php4apache2.dll"的文件改为"php5apache2.dll"也是不行的,至于我用的APache 2.2是肯定运行出错的:

1、注意php4apache2.dll、php5apache2.dll以及php5apache2_2.dll是很大差别的,一开始我依样画葫芦,把LoadModule php4_module “c:/php/php4apache2.dll”改为LoadModule php4_module “e:/php/php5apache2.dll”,重启Apache的时候提示启动失败,试了很多方法都行不通,后来想起在此之前有下载一个APMServ(点击这里去APMServ官方下载APMServ5.2.0),进去一看,php目录下php5apache2.dll和php5apache2_2.dll这两个文件都有,说明是有区别的,而我的PHP里面竟然没有php5apache2_2.dll,汗死,就这样浪费了好多时间。

2、下面这两行我按服务器的情况修改以后加到httpd.conf里面,运行php程序的时候会提示路径错误,不知是什么原因,还是不加为妙,,网上的误导真多!

让Apache支持自定义Rewrite:

查找:


XML/HTML代码

  1. #LoadModule rewrite_module modules/mod_rewrite.so  

去掉前面的#。

同样要注意一下,按网上大部分四处转载的“教程”的说法,这样可以使用自定义rewrite了,其实要能够每个站点“自定义”Rewrite,还需要查找:


XML/HTML代码

  1. AllowOverride None  

把它改为:


XML/HTML代码

  1. AllowOverride All  

到此,Apache最吸引力的rewrite模块可以让你自定义每个站点的Rewrite规则了!

对了,似乎很多教程都没有提到怎样让Apache支持多站点(虚拟主机),这里记录一下:

在httpd.conf最后加入以下类似的内容:

这个就是基于主机名的虚拟主机(一个IP地址,多个网站) 了。

到此,所有的问题完美解决!

其实,看Apache的官方文档是最好的选择,虽然E文的技术类文章看起来有些吃力,但是起码比网上那些以讹化讹的教程有用得多,建议初学者看一下官方的文档再去参考其实中文的资料,这样会少走一些弯路!

 点击这里打开中文版的Apache官方手册


XML/HTML代码

  1. <VirtualHost 172.0.0.1>  
  2. ServerAdmin webmaster@bluefeel.com   
  3. DocumentRoot d:/WwwRoot/bluefeel.com   
  4. ServerName bluefeel.com   
  5. ErrorLog logs/bluefeel.com-error_log   
  6. TransferLog logs/bluefeel.com-access_log   
  7. </VirtualHost>  

注意:以上纯属初学者记录,可能错误百出!

WordPress permalinks(永久链接)rewrite rules for IIS

October 13th, 2006 / 经验·优化推广 / 20 条评论

因为对之前用的rewrite rules不是很满意,所以今晚尝试重写一下rewrite rules...... 因为有之前乱撞乱中的经验,所以回过头来重写还算顺利,主要是美化permalinks的形式,搜索过iis下的permalinks美化,几乎没有一个可用的(应该是我一知半解不懂怎么用的原因),可参考的资料也很少,边试边学的情况下还是基本达到了自己的要求(再次感谢帮忙测试):

1,规则为"/%year%%monthnum%%day%/%postname%/"(之前的为"/index.php/%year%%monthnum%%day%/%hour%%minute%%second%/%postname%/";

2,去掉了index.php,从搜索到的资料看,几乎所有的人都说iis下url必须以"根目录/index.php/为前缀,要不然有一些功能不能用,我之前用的规则的确是这样,去掉/index.php/的话,搜索不可用,现在解决了,暂时没有发现问题;

3,去掉大部分重复繁杂的rule,可能是我还没有发现其中的"利害关系",但是暂是还没发现太大的问题,对比了一下,从网上搜索到的httpd.ini里面rule是"相当"的多啊,那个比较有名的"permalinks3插件"里面竟然有差不多60行的rule,汗.......我现在写出来的,去掉注释,只有11条rule,晕,不知哪里不对,请大家帮帮找一下bug!

4,修改了脚本的Entries RSS和Comments RSS两个feed链接,改为http协议形式的,个人觉得这样灵活一点,因为不懂2.0的东西,所以不知这样的修改是不是自作聪明了! :(

暂时发现的问题:

1,在"文章缩略名"方面,对中文支持不好,有些可以,有些不行,暂时找不到解决的办法,不过也不想去想,因为我习惯把"文章缩略名"用英文来表达,一大串类似"%e4%bd%bf%e7%94%a8ping%e5%91%bd%e4%bb%a4%e8"这样的url,就算支持中文我也不喜欢!(嘿嘿,原来是rewrite rules有问题,已解决 :))

2,因为使用了tag插件,而tag的话肯定要支持中文才有意义,所以这个不支持中文真的很头痛,假如这个能解决我就心满意足了!(嘿嘿,原来是rewrite rules有问题,已解决 :))

3,等待发现(请大家帮忙测试)...... 贴一下我的httpd.ini内容:


PHP代码

  1. # /%year%%monthnum%%day%/%postname%/   
  2. RewriteRule /category/?(.*)/ /index.php\?category_name=
  3. $1&feed=  
  4. $1  
  5. &day=$3$4$5
  6. $2&day=&page=  
  7. RewriteRule /([0-9]{4})/([0-9]{1,2})/?$ /index\.php\?year=&monthnum=&page=  

因为对这些规则是完全不懂的情况下依样画葫芦,所以见笑了!

PS:Utom之前帮我写过几条规则,虽然我觉得也有问题,但是感谢他的帮助!谢谢!