前言

之前使用过的方法是 apache 的 mod_proxy_ajp 方式代理 tomcat。但是在 windows 下我始终没有配置成功,前几天使用过 nginx 反向代理后,今天想尝试一下用apache 反射代理 tomcat。这一次使用的模块是:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
  • 1
  • 2
  • 3
  • 4

这4个模块可以实现正反向代理,负载均衡,url重写。

去除这一行的注释

Include conf/extra/httpd-vhosts.conf
  • 1

然后所有的虚拟主机的配置都在httpd-vhosts.conf文件中配置。
其它详细参见:Apache配置正向代理与反向代理

完成后的配置文件:

<VirtualHost *:80>
    #ServerAdmin 管理员邮箱
    ServerName localhost
    ServerAlias localhost
    ErrorLog "logs/localhost-error.log"
    CustomLog "logs/localhost-access.log" common
 <Directory C:/webroot>
        Order deny,allow
        Deny from all
    </Directory>
</VirtualHost>
<VirtualHost *:80>
    #ServerAdmin 管理员邮箱
    ServerName bill.vpigirl.com
    ServerAlias bill.vpigirl.com
    ErrorLog "logs/bill.vpigirl.com-error.log"
    CustomLog "logs/bill.vpigirl.com-access.log" common
 ProxyRequests Off
    ProxyPreserveHost on
    #反向代理设置
    ProxyPass / balancer://cluster/ stickysession=jsessionid nofailover=Off
    ProxyPassReverse / balancer://cluster/
 <Proxy balancer://cluster>
        BalancerMember  http://localhost:18080/ loadfactor=1 retry=10
        ProxySet lbmethod=bybusyness
    </Proxy>
</VirtualHost>
<VirtualHost *:80>
    #ServerAdmin 管理员邮箱
    ServerName *.vpigirl.com
    ServerAlias *.vpigirl.com
    ErrorLog "logs/vpigirl.com-error.log"
    CustomLog "logs/vpigirl.com-access.log" common

    RewriteEngine on
    RewriteMap lowercase int:tolower
    RewriteMap vhost txt:C:/website/Apache22/vhost.map
    RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
    RewriteCond ${vhost:%1} ^(C:/.*)$
    RewriteRule ^/(.*)$ %1/$1
</VirtualHost>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

解释

· 第一个<VirtualHost *:80>的ServerName 是 localhost,也即是,本地访问或者没有定义的域名,或者ip访问都会经过这里。这里设置为禁止访问,当然也可以直接在外面直接禁止。
· 第二个<VirtualHost *:80>的ServerName 是 bill.vpigirl.com ,也即是,只有是这个域名的时候,才会用这个域名。
· 第三个<VirtualHost :80>的ServerName 是 .vpigirl.com ,也即是,它会匹配所有的以 .vpigirl.com 结尾的所有域名。但是在这个 VirtualHost 里面,使用了 url 重写,这个重写也是之前使用过的方法。只不过,以前是直接写在 http.conf 中的,而这一次是写在 VirtualHost 里面。这样它就只在这个 VirtualHost 中生效。

注:但是这里有个问题,当使用localhost,ip,或者使用没有定义的域名时,会默认去匹配第一个规则。

在这里遇到一个奇怪的问题:

DocumentRoot "C:/webroot"
<Directory />
    Order deny,allow
    Deny from all
</Directory>
  • 1
  • 2
  • 3
  • 4
  • 5

这样的设置并不能生效。

只能如下设置

<Directory C:/webroot>
    Order deny,allow
    Deny from all
</Directory>