PHP初学者:设置Apache服务器并且设置DNS

当然主要有技术含量的是点DNS的解析,我正给我们公司负责,先查资料的说...‘

  我们通常所说的虚拟主机技术就是将一台(或一组)服务器的资源(系统资源、网络带宽、存储空间等)按照一定的比例分割成若干台相对独立的“小主机”的技术。每一台这样的“小主机”在功能上都能实现WWW、FTP、Mail等基本的Internet服务,就像使用独立的主机相同。
 
    目前网站服务器的虚拟主机平台使用以开放的Apache为最多,其次是微软的视窗系统 IIS。Apache具有跨平台(FreeBSD/Linux/视窗系统/Solaris/Other UNIX)、易于维护和最佳安全性等好处。
    Apache是率先支持基于IP虚拟主机的服务器之一。 Apache 1.1及其更新版本同时支持基于IP和基于主机名的虚拟主机,不同的虚拟主机有时会被称为基于主机(host-based) 或非IP虚拟主机(non-IP virtual hosts)。

    用Apache设置虚拟主机服务通常能采用两种方案:基于IP地址的虚拟主机和基于主机名字的虚拟主机,下面我们分别介绍一下他们的实现方法及优缺点。以便大家在具体的应用中能够选择最合适的实现方法。

   一、Apache实现基于IP地址的虚拟主机(每个站点拥有一个独立IP地址)

    使用这种虚拟主机方式,首先要在服务器上为每个虚拟主机独立设置一个IP地址。这些IP地址能通过增加多个网卡或在一个网卡上设立多个IP地址来完成。有了多个IP地址后,能采用以下两种方式之一来设置Apache。

1、为每个虚拟主机运行一份Apache
    采用这种方式,每一份Apache程式能以独立的用户运行,因此各个虚拟主机之间互不影响。设置这种虚拟主机时,只要为每一份Apache设置一套设置文件就能了,唯一需要注意的是:必须使用“Listen”语句,强制每一份Apache 仅仅在属于“自己”的IP地址上接收服务请求。

    好处:各个虚拟主机之间互不干扰,安全性高。
    缺点:占用系统资源较多。

2、多个虚拟主机共享同一份Apache
    采用这种方式,各个虚拟主机共享同一份Apache,因此各个虚拟主机之间有一定的影响,尤其是执行CGI程式时,可能会带来一些严重的安全问题。设置这种虚拟主机时,只要为每一个虚拟主机设置类似如下的信息即可:
    <VirtualHost www.ghq1.com>
    DocumentRoot /www/ghq1
    …
    </VirrualHost>

    好处:占用系统资源比上一种方式少。
    缺点:安全性低,每个虚拟主机仍然需要占用一个IP地址。

  
    例如服务器一个网卡上绑定有两个IP地址(172.16.3.40和 172.16.3.50)分别对应域名 www.ghq1.com和www.ghq2.org的服务,设置如下:

    服务器设置(apache的设置文件httpd.conf)
    Listen 80

    <VirtualHost 172.16.3.40>
    DocumentRoot /www/ghq1
    ServerName www.ghq1.com
    </VirtualHost>

    <VirtualHost 172.16.3.50>
    DocumentRoot /www/ghq2
    ServerName www.ghq2.org
    </VirtualHost>

    设置简单说明:“Listen”默认httpd服务会监视第80号通信端口, “Listen”选项让用户自行指定apache 服务器监视的IP地址或通信端口。

    “DocumentRoot”:指定apache 服务器存放网页的根目录;“ServerName”:允许用户自行设置主机名,这个名称将被送到远程连接程式,以取代安装apache 服务器主机的真实名称。<VirtualHost IP >和</VirtualHost>构成虚拟主机的语法结构,其中的IP就是我们在服务器上绑定的不同的IP地址,也能是IP地址加上通信端口号(见下面的例子)。

    如果服务器有两个IP地址(172.16.3.40和 172.16.3.50)分别对应域名 www.ghq1.com和www.ghq2.org。对每个域名,我们都希望在80端口和8080端口发布我们的网站。能这样设置:

    服务器设置(apache的设置文件httpd.conf)
    Listen 172.16.3.40:80
    Listen 172.16.3.40:8080
    Listen 172.16.3.50:80
    Listen 172.16.3.50:8080

    <VirtualHost 172.16.3.40:80>
    DocumentRoot /www/ghq1-80
    ServerName www.ghq1.com
    </VirtualHost>

    <VirtualHost 172.16.3.40:8080>
    DocumentRoot /www/ghq1-8080
    ServerName www.ghq1.com
    </VirtualHost>

    <VirtualHost 172.16.3.50:80>
    DocumentRoot /www/ghq2-80
    ServerName www.ghq1.org
    </VirtualHost>

    <VirtualHost 172.16.3.50:8080>
    DocumentRoot /www/ghq2-8080
    ServerName www.ghq2.org
    </VirtualHost>

    因此,建立虚拟主机,我们要做好不同的IP对应的域名解析工作,建立相应的目录(如/www/ghq1),将相应的主页内容存放在相应的目录中即可。

二、Apache实现基于主机名的虚拟主机服务(一个IP地址实现多个网站)
  
    基于主机名字的虚拟主机服务,是目前虚拟主机比较常用的一种方案。因为他不必更多的IP地址,无须什么特别的软硬件支持。而且目前的浏览器大都支持这种虚拟主机的实现方法。基于域名的的虚拟主机是根据客户端提交的HTTP头中的关于主机名的部分决定的。使用这种技术,非常多虚拟主机能享用同一个IP地址。

    基于域名虚拟主机相对比较简单,因为我们只需要设置DNS服务器将每个主机名映射(CNAMES)到正确的IP地址,然后设置Apache HTTP服务器,令其辨识不同的主机名就能了。基于域名的服务器也能缓解IP地址(IPV4)不足的问题。这种方式下,各个虚拟主机共享同一份Apache,因此有CGI程式运行时,安全性也不高。

    好处:只要一个IP地址就能提供大量的虚拟主机服务。
    缺点:安全性差。维护这些虚拟主机时需要更改设置文件,并且需要重新启动Apache进程才能起作用。因此不适合进行大规模的虚拟主机服务。

    如果服务器只有一个IP地址,而在DNS中有非常多映射到这个机器。我们想要在这个机器上运行www.ghq1.com和 www.ghq2.org两个站点。在Apache服务器的设置中创建一个虚拟主机并不会自动在DNS中对主机名做相应更新。我们必须自己在DNS中添加域名来指向我们的IP地址。否则别人是无法看到我们的web 站点。

    服务器设置(apache的设置文件httpd.conf)
    # Ensure that Apache listens on port 80
    Listen 80

    # Listen for virtual host requests on all IP addresses
    NameVirtualHost *

    <VirtualHost *>
    DocumentRoot /www/ghq1
    ServerName www.ghq1.com

    # Other directives here

    </VirtualHost>

    <VirtualHost *>
    DocumentRoot /www/ghq2
    ServerName www.ghq2.org

    # Other directives here

    </VirtualHost>

    因为*(星号)匹配所有的地址,所以主服务器不接收所有请求。因为 www.ghq1.com首先出目前设置文件中,所以他拥有最高优先级,能认为是默认或首要服务器。这意味着如果一个接受的请求不能和某个ServerName指令相匹配,他将会由第一个VirtualHost所伺服。

    当我们的IP地址无法确定的时候,使用*是非常方便的--比如说, ISP给我们设置的是动态IP地址(如ADSL拨号上网),而我们有使用了某种动态域名解析系统时。因为*匹配所有IP 地址,所以在这样的情况下,不论IP地址怎么变化,我们都不必另外进行设置。上述设置就是我们在绝大多数情况下使用基于域名虚拟主机时将要用到的。

关于DNS和Apache

本文件的涵义一言以蔽之就是:不要让Apache在解析设置文件的时候用到DNS。如果Apache在解析设置文件时用到了DNS,你的服务器就会发生可靠性的问题(也可能根本无法启动),或遭致拒绝(偷窃)服务攻击(包括用户能从其他用户那里偷窃点击)。

 一个简单示例
 拒绝服务
 "main server"地址
 避免这些问题的小技巧
 附录:进一步的提示

一个简单示例
<VirtualHost www.abc.dom>
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
</VirtualHost>

为了让Apache功能正常,一个虚拟主机绝对需要以下两部分的信息: ServerName和和服务器对应的至少一个IP地址。这个示例没有包括IP地址,于是Apache必须用DNS来查询www.abc.dom的地址。如果在某些不可预料的情况下,当你的服务器解析设置文件时没有得到DNS的支持, 那么这个虚拟主机 将不会被设置。他将不会对所有请求作出反应。(在Apache的1.2版本之前,服务器甚至无法启动)。

假设www.abc.dom的IP地址是10.0.0.1。那么看看以下这个设置片断:

<VirtualHost 10.0.0.1>
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
</VirtualHost>

目前Apache需要DNS对这个虚拟主机进行反向域名解析来确定ServerName。 如果反向解析失败,那么这将导致这个虚拟主机部分功能丧失。 (在Apache的1.2版本之前,服务器将不能启动)。如果虚拟主机是基于域名的, 他将完全不能使用,但如果他是基于IP的,那么他将非常有可能工作。然而,如果Apache不得不为一个已包含了服务器域名的服务器产生一个完整的URL, 那么他将可能产生一个无效的URL。

以下是个能避免上述两个问题的设置片断.

<VirtualHost 10.0.0.1>
ServerName www.abc.dom
ServerAdmin webgirl@abc.dom
DocumentRoot /www/abc
</VirtualHost>

拒绝服务
拒绝服务主要由(至少)两种形式导致。 如果你在运行Apache 1.2以前的版本,在上述两种情况下,如果你的所有一个虚拟主机的DNS解析失败,你都会无法启动服务。在一些情况下,DNS解析甚至不在你的控制范围之内。比如说,如果abc.dom是你的一个客户,而且他们自己控制着DNS。 那么仅仅是因为他们删除了www.abc.dom这个记录,都会导致你的服务器(1.2之前的版本)无法启动。

另外一种形式就更隐蔽了。比如说下面这个设置片断:

<VirtualHost www.abc.dom>
  ServerAdmin webgirl@abc.dom
  DocumentRoot /www/abc
</VirtualHost>

<VirtualHost www.def.dom>
  ServerAdmin webguy@def.dom
  DocumentRoot /www/def
</VirtualHost>

假设你已为www.abc.dom设定了10.0.0.1, 而为www.def.dom设定了10.0.0.2。更进一步,假设def.com自己控制DNS。在这种设置下, 你已把def.com放到了一个能将所有指向abc.com 的所有流量据为己有的情况之下。为了达到这样的目的, 他们只需要把www.def.dom的地址解析设置成10.0.0.1就能了。因为他们控制着自己的DNS服务, 所以你无法阻止他们把www.def.com这个记录指向所有一个IP地址。

然后,所有向10.0.0.1发出的请求 (包括用户所有类似http://www.abc.dom/所有字符的URL) 都将会为def.com这个虚拟主机所接收。 为了更好的理解着一切是怎样发生的,你需要一个关于Apache是怎样将进入的请求分配给他的虚拟主机的深入说明。 你能在这里发现一个完整的文件。


"main server"地址
在Apache 1.1中,基于域名虚拟主机支持 需要Apache知道运行着httpd的主机的IP地址。一般来说能用全局变量ServerName(如果存在) 或调用C的方法gethostname(和在命令行模式下键入hostname得到的返回值相同)。接着他就会利用DNS来查找这个地址。目前还没有办法避免这样的查找。

如果你担心这样的查找会因为你的DNS服务器没有启动而遭到失败的结果, 你就能在/etc/hosts中插入一条记录来确定主机名 (此文件中应该已存在这条记录了,否则你的机器无法正常启动)。 然后,你要确认你的机器已设置为当DNS解析失败的情况下,他将会使用/etc/hosts根据所使用的操作系统不同,你可能需要在/etc/resolv.conf或/etc/nsswitch.conf 两个文件中选择一个进行编辑。

如果你的服务器不必因为其他理由而使用DNS,你也许不必在把HOSTRESORDER环境变量设置为"local"的情况下运行Apache。 这都取决于你所使用的操作系统和解析库。如果你没有使用mod_env来控制环境变量,他还将影响到CGI。强烈建议你参考一下你所使用的操作系统附带的man帮助或FAQ。

避免这些问题的小技巧
在VirtualHost中使用IP地址
在Listen中使用IP地址
确保所有的虚拟主机拥有显式的ServerName定义。
创建一个不包含所有服务页面的<VirtualHost_default_:*>服务器

附录:进一步的提示
涉及到DNS的情况都非常让人不舒服。 在Apache 1.2 中,我们努力想让服务器在DNS解析失败的情况下至少保持能够启动,但可能我们还是没能做到最佳。在当今重编号成了必须的Internet上面,在设置文件中显式的写明IP地址已成为不合时宜的行为了。

上述盗窃攻击的解决办法是, 在一个正向的DNS查询结果后部署一个逆向DNS解析并将两个域名进行比较。 如果不同,就禁用相应的虚拟主机。 这个方法需要一个正确设置了的逆向域名解析服务器 (因为FTP服务器和TCP封装进行的“双重逆向”DNS处理的普遍应用,这已为大部分管理员所熟知了)。

在某些情况下,如果没有使用IP地址而DNS解析又失败了, 那么正常启动一个基于域名虚拟主机看来是不可能的。一些诸如禁用部分设置文件这样的权宜之计会带来比根本不能启动更遭的不可预测的结果。

随着HTTP/1.1的部署及浏览器和代理服务器开始支持Host头, 我们完全避免使用基于IP的虚拟主机也逐渐成为可能。 这种状况下,web服务器也不必在设置时进行DNS的查询。但在1997年3月,这些特性的采用还没有广泛到能在重要的web服务器应用的地步。

http://www.uplinux.com/download/doc/apache/ApacheManual/dns-caveats.html#example

http://www.uplinux.com/download/doc/apache/ApacheManual/mod/core.html#virtualhost

<VirtualHost>和</VirtualHost>用于封装一组仅施用于特定虚拟主机的指令。所有在虚拟主机设置中能使用的指令也同样能在这里使用。当服务器接受了一个特定虚拟主机的文件请求时,他会使用封装在<VirtualHost>设置段中的指令。地址能是

虚拟主机的IP地址;
虚拟主机IP地址对应的完整域名
字符*,仅和NameVirtualHost *配合使用以匹配所有 的IP地址;或是
字符串_default_,和基于IP的虚拟主机联用以捕捉所有没有匹配的IP地址。
示例
<VirtualHost 10.1.2.3>
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>

IPv6的地址必须放入方括号中指定,否则作为可选项的端口号将无法确定。一个IPv6的示例如下:

<VirtualHost [fe80::a00:20ff:fea7:ccea]>
ServerAdmin webmaster@host.foo.com
DocumentRoot /www/docs/host.foo.com
ServerName host.foo.com
ErrorLog logs/host.foo.com-error_log
TransferLog logs/host.foo.com-access_log
</VirtualHost>

每个虚拟主机必须对应不同的IP地址、端口号或是不同的主机名。在第一种情况下,服务器所在物理机器必须设置为能为多个地址接受IP包。(在机器没有多个网络硬件界面的情况下,如果你的操作系统支持,你能使用ifconfig alias命令来达到这个目的。)。

当使用基于IP的虚拟主机时,特别的名称_default_能在没有匹配上其他列出的虚拟主机的情况下作为匹配所有IP地址的虚拟主机。在没有进行_default_虚拟主机的设定时,在没有IP和请求匹配的情况下,将使用“主服务器”(包括所有在虚拟主机设置段之外的设置)的设置。(但请注意:所有匹配NameVirtualHost指令的IP地址既不会使用"main"服务器设置,也不会使用_default_虚拟主机的设置。 参阅基于域名虚拟主机文件获得更多详情。)

你能指定一个:端口来改动匹配的端口。如果没有指定,他将沿用主服务器中离他最近的那个Listen语句指定的值。你也能指定:*来匹配那个地址上的所有端口。(当你使用_default_时,这是推荐采用的方法。)

安全提示:参阅安全提示文件获得为什么当你存储日志文件的目录对于启动服务器以外的用户来说是可写的会危及服务器安全的周详资料。

注意:<VirtualHost>的使用不会影响到Apache侦听的地址。你也许需要使用Listen来确保Apache侦听着正确的地址。

为调试程式,本机安装iis和apache,无法同时使用80端口,现给出解决方法:

方法一:

IIS5,多IP下共存,IIS为192.168.0.1,apache为192.168.0.2 原文地址
c:\Inetpub\Adminscripts
cscript adsutil.vbs set w3svc/disablesocketpooling true
该命令反馈如下disablesocketpooling : (BOOLEAN) True
重启IIS
Inetpub\AdminScripts>cscript adsutil.vbs set w3svc/disablesocketpooling true
由于 DisableSocketPooling 在 IIS 6.0 元数据库架构 (MBSchema.xml) 中被定义为有效属性,所以,你仍然能使用 Adsutil.vbs 设置该属性,但这种设置不起作用。IIS 6.0 中的功能是新增的核心级别驱动程式 HTTP.sys 的一部分。要设置 HTTP.sys,你必须使用 Httpcfg.exe

方法二:

IIS6,多IP下共存,IIS为192.168.0.1,apache为192.168.0.2 原文地址
到2003的CD下的 support/tools/Support.cab。解压出httpcfg.exe文件,COPY到windows/system32/目录下,用法自己看帮助

命令行

绑定到某IP: httpcfg set iplisten -i 192.168.0.1
即命令使用IIS的只监听指定的IP及端口
查看绑定: httpcfg query iplisten
删除绑定: httpcfg delete iplisten -i 192.168.0.1

命令行
net stop Apache2
net stop iisadmin /y
net START Apache2
net START w3svc

确保iis下的ip设置为全局默认,Apache中httpconf设置listen 192.168.0.2:80,就应该能两个服务同时运行,相互不冲突了。
IIS的访问地址为http://192.168.0.1,Apache访问地址为http://192.168.0.2

方法三:

网上常用的单IP共用80端口方法,不过不推荐,只是使用Apache的代理,速度有影响将apache设为使用80端口,IIS使用其他端口,比如81,然后将apache作为IIS的代理。

在httpd.conf里面,取消下面四行的注释:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so

然后建立一个虚拟主机,将该域名的所有访问转向81端口。

ServerName iloves.vicp.net
ProxyPass / http://localhost:81/
ProxyPassReverse / http://localhost:81/

这样,对外就能只需要一个端口,即可同时使用apache和IIS的功能了

类推,使用第二种方法,你能在IIS上设置PHP4,Apache2中设置PHP5,只需要IIS中安装PHP4,把php.ini复制到\windows目录即可,这个就不用说了吧,Apache2中,只要把PHP5的php.ini放在PHP5安装目录里面就行了

设置Apache以支持PHP5:

LoadModule php5_module "D:/PHPServer/PHP5/php5apache2.dll"
AddType application/x-httpd-php .php
DirectoryIndex index.html index.php
PHPIniDir "D:/PHPServer/PHP5"

其中最重要的一条就是 PHPIniDir,用来指明php.ini文件所在位置,即PHP5的安装目录,注意所有目录的应该改为D:/PHPServer/PHP5这种格式,而非D:\PHPServer\PHP5,IIS的访问地址为http://192.168.0.1,Apache访问地址为http://192.168.0.2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值