apache与IIS共享80端口解决方案

最近我们单位受兄弟单位委托帮其开发了一个网站,网站采用的是PHP技术开发的,网站是通过apache发布的。当网站开发完成后,准备把网站部署到单位服务器的时候碰到了预想不到的问题,apache与服务器已有的IIS发生了80端口,通过apache发布的网站不能被访问。我们通过查找相关资料,经过自己的努力总算解决了apache与IIS共享80端口冲突的问题。下面我就简单介绍我们是如何解决这个问题的。

一、 服务器的环境

我发布网站的服务器是windows2003企业版,上面已经装有了IIS服务软件,用来发布采用asp和asp.net技术的网站。该服务器上只有一个网卡,因此也只有一个对外的IP。后来因为开发PHP技术的网站,又在该服务器上安装了apache.

二、 问题产生的原因

有过网站开发的经验的朋友都知道,网友们访问某个网站是通过http协议访问的,而http协议默认访问服务器的端口是80,因此大部分网站发布软件所支持的默认端口都是80。如果一台服务器中只安装了一种网站发布软件,一切访问都很正常,但是当安装了两种或两种以上网站发布软件时,就会产生80端口冲突。这是因为当有一个请求要求访问该服务器上的某个网站的时候,同样是请求该服务器的80端口,这里就会出现一个问题,服务器并不知道这个请求它要访问的是哪个网站发布软件发布的网站,这个时候服务器只会按一个默认的顺序检查哪个网站发布软先占了80端口就到那个发布软件里查找请的网站。如果查找到了就返回给发出这个请求的用户;如果没有找到,就返回一个错误信息给用户。

三、 问题解决的过程

在知道问的原因之后,通过我们的努力,和不断的尝试终于找到了解决的办法。

最初有人提出既然是80端口冲突,能否尝试改变其中的一个网站发布软件的默认端口(也就是将默认80端口改成别的端口),当这个提出后马上被否决了,因为一旦改变某个网站发布软件的默认端口(例如:将80端口改为81端口),网民访问该网站时就要在网站后面多输入一个端口号(例如:http://www.a.com:81),很不方便,也不便于网站的推广和记忆。修改端口为什么会造成在网址后面必须输入修改后的端口号呢?这是因为我们访问网站都是通过http协议访问的,而http协议正如我们在文章前面所说的,它是默认是访问服务器80端口的,并不能自己去识别修改的端口号,所以必须人为为其添加修改后的端口号,这样http协议才会去访问那个修改后的端口。

在第一个方案被否定后,经过大家讨论,第二个方案又产生了,那就是给服务器增加一块网卡,这样服务器就有两块网卡了,然后分别给两个网卡绑定两个不同的外网IP;最后再将IIS和apache分别指向一个IP,这样IIS和apache就不会产生80端口冲突了。这个方案提出后,也得到大家的同意认为可行。之所以认为可行,也是根据http协议访问原理来的。一般情况下,网站的服务器只有一个IP,虽然网民通过域名访问,但经过域名解析服务,最后通过http协议还是访问的是服务器的IP的,默认情况下一个IP下http协议只能访问该IP下的默认端口80;如果一台服务器有两个IP,这两个IP下的默认端口80是不冲突的。虽然该方案可行,但很快我们就发现,单位所有的公网IP都使用完了,没有多余的公网IP了。真是人要倒霉喝口凉水都塞牙呀!这个方案就这样夭折了。

经过第二个方案的被夭折的打击,大家又陷入痛苦沉思与寻找中。功夫不负有心人,大家经过一天的闭关修炼,终于找到了第三个方案。并且这个方案无论从可行性、可操作性、快捷性、成本节省方面都得到了大家的一致认可。到底是什么好的方案,能得到大家一致的认可呢?这个方案简单的说,就是让IIS就是通过apache代理机制发布IIS上面的网站,而apache上的网站则通过apache自身发布出去。可能这样说,大家还不太明白,下面我就把具体步骤告诉大家。

我们先假设一个实验环境;实验环境是这样的:使用apache来代理IIS,从而达到虚拟的Apache和IIS的整合。假设有网站a、b、c三个网站,其中a、b两个网站部署在IIS上,而c网站部署在apache上。即当用户请求a.com和b.com时,统一由Apache来解释,然后Apache将virualhost自动转向给IIS;而用户请求c.com时由Apache来解释并发布。

第一步:把iis所发布的网站默认端口由80改为8080;

第二步:修改apache的httpd.conf配置文件。

首先,要让apache支持转发也就是做iis的代理那么就要先启用apache的代理模块.首先我在Apache\conf目录下面找到httpd.conf文件,用记事本打开该文件找到以下几行代码:

#LoadModule proxy_module modules/mod_proxy.so

#LoadModule proxy_connect_module modules/mod_proxy_connect.so

#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

#LoadModule proxy_http_module modules/mod_proxy_http.so

然后把每行代码前面的“#”号去掉,这样就打开了apache的代理模块了。

然后再在httpd.conf文件里加入下面的代码:

NameVirtualHost 111.111.111.111:80

<VirtualHost *:80>

DocumentRoot d:/apache/www/test1(注:c站的实际本机地址)

ServerName www.c.com

</VirtualHost>

<VIRTUALHOST 111.111.111.111:80>

ServerName www.a.com

ProxyPass / http://www.a.com:8080/

ProxyPassReverse / http://www.a.com:8080/

</VIRTUALHOST>

<VIRTUALHOST 111.111.111.111:80>

ServerName www.b.com

ProxyPass / http://www.b.com:8080/

ProxyPassReverse / http://www.b.com:8080/

</VIRTUALHOST>

上面的代码中111.111.111.111表示的是服务器的IP地址,在实际应用中应该使用的是自己服务器的真实地址。

第三步、重启apache服务

这一步必不可少,否则我们前两步所做的设置不会生效。

在完成上面三步设置后,此时我们访问www.a.com、www.b.com、www.c.com都正常了,不会有哪个网站出现访问不了的情况,这说明我们设置是成功的,至此apache与IIS共享80端口的问题总算得到了解决。最后希望本文能对那些正在受相同问题困扰的朋友有所帮助。