落伍者站长论坛's Archiver

chch4 发表于 2008-1-8 09:58

apache如何在不重启的情况下绑定新域名或者虚拟目录?

apache如何在不重启的情况下绑定新域名或者虚拟目录?

fengshen34 发表于 2008-1-8 12:27

同样问!  我也想知道

renyu 发表于 2008-1-8 16:51

是不是有一种方法:将需拟目录设为类似 \var\www\$d
其中$d是绑定新域名

yybs 发表于 2008-1-8 18:59

可以使用Apache模块 mod_vhost_alias

对于一个简单的基于名称的虚拟主机,配置文件中可能会使用下面的指令:

UseCanonicalName Off
VirtualDocumentRoot /usr/local/apache/vhosts/%0

那么对[url]http://www.example.com/directory/file.html[/url]的请求将会返回文件/usr/local/apache/vhosts/www.example.com/directory/file.html

chch4 发表于 2008-1-8 21:59

楼上。。我说的是WIN环境下

yybs 发表于 2008-1-8 23:42

楼上,windows下的apache也有 mod_vhost_alias 模块

bleakwind 发表于 2008-1-9 04:06

mod_vhost_alias 可以实现简单配置
url重定向可以实现复杂配置

不过用了这些技术都无法应用诸多强大的apache插件了
不过可以用apache2 graceful重启,这样不会影响正在运行的程序

夏娃 发表于 2008-1-9 11:27

apachectl graceful

apachectl restart

chch4 发表于 2008-1-11 15:40

楼上。。厉害

五花小鱼 发表于 2008-1-12 14:34

大容量虚拟主机的动态配置


方法一:简单的动态虚拟主机

代码:
这是 httpd.conf 文件中,完成虚拟主机的配置方法,这里采用了 mod_vhost_alias 。

# 从 Host: 头中取得服务器名字 Server Name
UseCanonicalName Off

# 这里的日志格式,可以在将来通过第一个参数域来分隔不同的虚拟主机的日志
LogFormat "%V %h %l %u %t "%r" %s %b" vcommon
CustomLog logs/access_log vcommon

# 在返回请求的文件名的路径中包含进服务器名字: server name
VirtualDocumentRoot /虚拟主机空间根目录/%0/htdocs
VirtualScriptAlias /虚拟主机空间根目录/%0/cgi-bin
#需要首先建立 /%0/htdocs ,然后把文件放在htdocs才可以访问
#%0表示虚拟主机的Server Name的这个名字,例如[url]www.net.cn[/url]

将 UseCanonicalName Off 的配置改为 UseCanonicalName DNS 即可实现基于 IP 地址的虚拟主机。而在文件路径中所要插入的服务器名字(server name) 则通过虚拟主机的 IP 地址解析而得。
方法二:多个的动态虚拟主机

代码:
UseCanonicalName Off

LogFormat "%V %h %l %u %t "%r" %s %b" vcommon

<Directory /www/commercial>

Options FollowSymLinks
AllowOverride All

</Directory>

<Directory /www/homepages>

Options FollowSymLinks
AllowOverride None

</Directory>

<VirtualHost 111.22.33.44>

ServerName [url]www.commercial.isp.com[/url]

CustomLog logs/access_log.commercial vcommon

VirtualDocumentRoot /www/commercial/%0/docs
VirtualScriptAlias /www/commercial/%0/cgi-bin

</VirtualHost>

<VirtualHost 111.22.33.45>

ServerName [url]www.homepages.isp.com[/url]

CustomLog logs/access_log.homepages vcommon

VirtualDocumentRoot /虚拟主机空间根目录/%0/htdocs
VirtualScriptAlias /虚拟主机空间根目录/%0/cgi-bin

</VirtualHost>



方法三:基于 IP 地址的虚拟主机

代码:

# 从 IP 地址反解析得到服务器名字(server name)
UseCanonicalName DNS

# 在日志中包含 IP 地址,便于后续分发
LogFormat "%A %h %l %u %t "%r" %s %b" vcommon
CustomLog logs/access_log vcommon

# 在文件路径中包含 IP 地址 %0表示IP
VirtualDocumentRootIP /www/hosts/%0/docs
VirtualScriptAliasIP /www/hosts/%0/cgi-bin



方法四:使用 mod_rewrite 的虚拟主机系统

代码:

RewriteEngine on

RewriteMap lowercase int:tolower

# 检查 hostname 正确与否,之后才能使 RewriteRule 起作用
RewriteCond ${lowercase:%{SERVER_NAME}} ^www.[a-z-]+.isp.com$

# 将虚拟主机名字廉洁到 URI 的开头
# [C] 表明本次重写的结果将在下一个 rewrite 规则中使用
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]

# 现在创建实际的文件名
RewriteRule ^www.([a-z-]+).isp.com/(.*) /home/$1/$2




重头戏
方法五:使用独立的虚拟主机配置文件
当你修改vhost.map的时候,不需要重新启动Apache

代码:

这样的布局利用了 mod_rewrite 的高级特性, 在独立的虚拟主机配置文件中转换。如此可以更为灵活,但需要较为复杂的设置。

vhost.map 文件包含了类似下面的内容:

[url]www.customer-1.com[/url] /www/customers/1
[url]www.customer-2.com[/url] /www/customers/2
#......
[url]www.customer-N.com[/url] /www/customers/N


http.conf 包含了:

RewriteEngine on

RewriteMap lowercase int:tolower

# 定义映像文件
RewriteMap vhost txt:/VHOST.map的路径/vhost.map

# 和上面的例子一样,处理变名
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{REQUEST_URI} !^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
# 这里做基于文件的重新映射
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/docs/$1

RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/cgi-bin/$1


动态虚拟主机配置方法



动态配置海量虚拟主机驻留,用于巨量数目的WEB站点。随apache提供的标准模块+mod_vhost_aliases实现动态配置的主机。作用是在检查完进来的URL后为这些目录生成实际路径。
实现基于名字的动态虚拟主机指令:

VirtualDocumentRoot
指定模块如何从URL请求那里为动态虚拟主机构造DocumentRoot路径。
VirtualScriptAlias
和ScriptAlias一样,从URL请求那里构造一个包含CGI脚本的目录路径

%N
服务器的第N部分,如果服务器的全名是 vhost1.sohu.com,那么%1解析成vhost1,%2 解析成sohu,以此类推。

%N+
服务器名称的地N部分和其后所有其余部分。如果服务器全名为vhost1.sohu.com,那么%2+解析为sohu.com。

%-N
字符串倒数第N部分。如果服务器全名为vhost1.sohu.com,那么%-1解析成com。%-2解析成sohu

%p
动态虚拟主机的TCP端口号


还可以从服务器名字中抽取的每一部分可以使用分类符%N.M继续对子部分进一步划分,其中N是主部分,M是子部分。例如:
%1=vhost1
%2=sohu
%3=com

可以划分子部分:
%1.1=v
%1.2=h
%1.3=o
%2.1=s
%2.2=o


例如:
在httpd.conf文件中:
UseCanonicalName off
VirtualDocumentRoot /home/httpd/%1/%p

要实现输入[url]http://www.263.net:443[/url]
需要在/home/httpd目录中建立www(%1)/443
然后在/home/httpd/%1/443/目录中建立网页文件, 在DNS中设置解析
访问即可。



例2:

将例子一中的VirtualDocumentRoot定义的内容删除。
然后再添加:
VirtualHostDocumentRoot /home/httpd/%1/%2


要求:
实现动态虚拟主机:
[url]www.abc.com[/url]
[url]www.xyz.com[/url]

#mkdir /home/httpd/www
#mkdir /home/httpd/www/abc
#mkdir /home/httpd/www/xyz
将网页文件放入/home/httpd/www/abc和/home/httpd/www/xyz即可
在DNS中设置解析

基于IP的动态虚拟主机


需要的指令:

VirtualDocumentRootIP

和VirtualDocumentRoot相似,但它是从请求到达的IP地址那里构造动态虚拟主机DocumentRoot的路径地

VirutalScriptAliasIP
和VirtualScirptAlias相似,但它是从请求到达的IP地址那里,构造CGI脚本目录的路径。


/*由于mod_vhost_aliases在请求到达服务器时构造动态主机路径,所以DocumentRoot和ScriptAlias实际上是根据客户尝试请求的虚拟主机进行变化的变量,所以在httpd.conf当中,不必针对每个虚拟主机明确指定这两个指令。实际上不需要在httpd.conf中指定任何虚拟主机,网管唯一要做的是,确保在服务器上针对每个虚拟主机都存在一个目录,如果该目录不存在,客户端将收到一个not found的信息。*/

例子:
环境:本机IP:192。168。9。254
一、增加IP地址
方法:
#ifconfig 192.168.9.1
#ifconfig 192.168.9.2

// 重新启动后失效,若希望永远生效,请增加eth0:0和eth0:1.以192.168.9.1为例,%1=192,%2=168,%=9,%4=1

二、修改httpd.conf文件
UseCanonicalName DNS
VirtualDocumentRootIP /home/httpd/www/%4
VirtualScriptAliasIP /home/httpd/www/cgi-bin/%4
重新启动apache。
三、在相关位置建立以下目录
#mkdir /home/httpd/www
#mkdir /home/httpd/www/1
#mkdir /home/httpd/www/cgi-bin/1
//创建到192。168。9。1的虚拟主机网页根目录
#mkdir /home/httpd/www/2
#mkdir /home/httpd/www/cgi-bin/2
//创建到192.168.9.2的虚拟主机网页根目录。

三、在DNS中设置,将192.168.9.1解析成 [url]www.163.com[/url]
将192.168.9.2解析成 [url]www.263.net[/url]
四、可以访问拉。
/*由于IP地址的每个部分可以取1---254之间的数值,所以这个方法可以建立254个基于IP的虚拟主机。也可以做支持254*254 台的虚拟主机,但意义不大。*/
UseCanonicalName on
apahce使用 ServerName和Port生成自指URL,来构造服务器的规范名称。


UseCanonicalName off
apache使用由客户提供的主机头指令的主机名称和端口号为服务器构造自指URL, off经常用于基于名称的动态虚拟主机

UseCanonicalName DNS
用于基于IP的动态虚拟主机。apache使用DNS执行客户连接IP地址搜索时确定的主机名,构造服务器自指URL,可以用在服务器环境,但在基于名字的虚拟主机下不起作用地。

[[i] 本帖最后由 五花小鱼 于 2008-1-12 14:37 编辑 [/i]]

chch4 发表于 2008-1-13 20:38

太厉害了!  看不懂了

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.