Windows 下实现 负载均衡(Apache + tomcat ) 以及 ssl

       最近客人的 程序要从旧 的 Server 上转到我们公司的 Server 上, 需要首先在本地测试一下 ssl. 因为程序是 java 的,同时为了考虑以后的负载均衡等的问题,使用了 Apache + tomcat , 因此需要将 请求由 apache 转交给 tomcat 来处理, 目前因为用户数还不是非常多,其实负载平衡是没有多大必要的,只是为了以后考虑,因此我也顺便在本地也测试了一下 使用 mod_jk 将 请求转发给 tomcat, 测试了一下负载均衡。

       这个过程中参考了以下文章,对作者表示谢意:

       http://hi.baidu.com/iddune/blog/item/21ff6859305e9c222934f035.html

       http://www.itpub.net/thread-1149801-1-1.html

       http://blog.soft6.com/27854/article-v32428.html

 

       环境说明:

       Windows xp

       Apache 2.2.8

       Tomcat 6.18

       Tomcat Connectors JK 1.2.28(当前最新): mod_jk-1.2.28-httpd-2.2.3.so,找不到地址,可以到 http://www.apache.org 的网站上在 search box 中输入: mod_jk, 查找...

 

       一、将 请求由 apache 转交给 tomcat 处理

       下载 mod_jk 之后, 将 mod_jk-1.2.28-httpd-2.2.3.so 拷贝到 Apache 的 modules 目录:

        E:/wamp/bin/apache/apache2.2.8/modules

        重命名: mod_jk.so

 

        在Apache 的 conf 目录下增加: mod_jk.conf  和 workers.properties 两个文件,内容分别是:

        mod_jk.conf :

       

 

       
        JkMount /* controller

 

        workers.properties:

       

       该文件中,配置了两个 tomcat , 到此时,我只配置了一个,先暂时不用管, 不过 apache 启动的时候,mod_jk.log 会给出报错,没有多大影响。

 

         在httpd.conf 中增加如下代码:

       

 

        将 java 程序的war 包: ROOT.war 扔到 tomcat 的 webapps 目录下, 启动 tomcat, 启动 apache, 访问 http://localhost/ 既可以看到 浏览器中是你的 java 程序的内容,不再是 apache 的 document root 目录中的程序的内容,因为我是所有的请求全部转发,不止是 jsp.

 

        ok , 大功告成!

 

 

       二、配置 ssl

       继续来配置 SSL, 实现部分请求由  http -> https, 当不是我需要的 url 的时候,再由 https 转到 http.

       首先生成 ssl 证书.

       到: http://openvpn.net/index.php/downloads.html 网站下载:OpenVPN, 安装.

       这是一个虚拟个人网络制作工具,他能完美的在win(linux,BSD也行)下制作根、服务器、客户端证书。 安装完毕后,进入命令行,进到openvpn的easy-rsa目录,比如: d:/program files/openvpn/easy-rsa>  输入: init-config 回车

会产生几个文件,切换出来,打开vars.bat文件,修改其中的KEY_COUNTRY(国家2位字母), KEY_PROVINCE(省2位字母), KEY_CITY(城市), KEY_ORG(组织), KEY_EMAIL(电子邮箱)这几个参数,免的后面制证时

反复输入麻烦。保存退出。

        继续使用命令提示符, 依次输入以下两个命令,当然是分别回车喽:

       vars  回车

       clean-all 回车

      (这两个是准备工作)

     1. 建立CA根证书

     接着输入build-ca 回车(这个就是建立CA根证书啦)

     然后显示:

Generating a 1024 bit RSA private key ............++++++ ...........++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [KG]: 国家名2位字母,默认的参数就是我们刚才修改过的。 State or Province Name (full name) [NA]: 省、州名2位字母 Locality Name (eg, city) [BISHKEK]: 城市名 Organization Name (eg, company) [OpenVPN-TEST]: 组织名 Organizational Unit Name (eg, section) []: 组织里的单位名 Common Name (eg, your name or your server's hostname) []:这个是关键,应该输入颁发根证书单位的域名

,不过因为是根证书,所以怎么填都无所谓。只有服务器证书才需要认真填。 Email Address [me@myhost.mydomain]: 电子邮箱

好了,CA根证书制作完成!在keys目录下,它的名字就叫ca.crt,CA的私钥是ca.key

#######################################################################

2. 现在制作服务器证书: 在命令提示符下,输入 build-key-server server 回车 你会看到和上面很相似的东西 但要注意这里的Common Name (eg, your name or your server's hostname) []: 这个才是真正的关键。这里应该输入服务器的域名比如www.xxx.com。 如果没有域名,就应该填ip,与httpd.conf和ssl.conf里的设置对应, ServerName 10.10.10.10:80(httpd.conf) ServerName 10.10.10.10:443(ssl.conf)

也就是说填:10.10.10.10

接下来看到 a challenge password []:填不填随便,我不填 an optional company name []: 填不填随便,我不填

sign the certificate? [y/n] 敲y回车。用CA根证书对服务器证书签字认证。 1 out 1 certificate requests certified,commit? [y/n] 敲y回车,确认。

好了,建好了在keys目录下的server.crt(证书)和server.key(私钥)

#######################################################################

3. 现在制作客户端证书:

在命令提示符下,输入 build-key client1 回车 又是一通国家省市组织等等,comman name也是随便填的。 然后 a challenge password []:填不填随便,我不填 an optional company name []: 填不填随便,我不填

sign the certificate? [y/n] 敲y回车。用CA根证书对客户端证书签字认证。 1 out 1 certificate requests certified,commit? [y/n] 敲y回车,确认。

好了,建好了在keys目录下的client1.crt(客户端证书)和client1.key(私钥)

等等, .crt的客户端证书是不能使用的,必须把它转化为.pfx格式的文件!!

所以,还是在命令提示符下,输入 openssl 回车 看到openssl> 再输入 pkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx 回车, 看到Enter export password:会要求你建立客户端证书的输出密码,我填hehe, verifying-Enter export password再确认一遍hehe,好了!

########################################################################

把keys目录下的ca.crt和server.crt,server.key都复制到apache的conf/extra目录下,(ssl.conf需要) ca.key自己保留吧,找个合适的地方储存起来.

 

修改: apache 的 conf/extra/httpd-ssl.conf  文件:

SSLCertificateFile conf/server.crt (服务器证书的位置,就是公钥吧?) SSLCertificateKeyFile conf/server.key (服务器私钥的位置) SSLCACertificateFile conf/ca.crt (CA根证书的位置,进行客户端验证时需要。也是一个CA公钥吧?

 

#########################################################################

客户端安装证书

打开internet explorer(IE),工具-internet选项-内容-证书,点选'个人' 再点击导入,把客户端证书client1.pfx导入到个人组里(别忘了扩展名是pfx)。 这里还要输入刚才建立的输出密码hehe才能倒入呢。

接着,点选'受信任的根证书颁发机构',点击导入,把CA根证书ca.crt导入到受信任的根证书颁发机构里。

#########################################################################

好啦,重新启动apache,打开IE, 在地址栏里输入https://10.10.10.10或者域名,弹出个窗口要选择个人的数字证书。 点选,然后确定。 如果服务器证书的common name填写正确的话,你就可以直接进入网站了,看到右下角的小锁头(可靠的SSL128位)。 如果服务器证书的common name填写不正确,就会弹出个‘安全警报’框,告诉你3条: 1.安全证书由信任的站点颁发 (如果说是由不信任的站点颁发,那就是你的ca根证书ca.crt没有导入到ie的受信任的根证书颁发机构里)

2.安全证书的日期有效 (这个日期缺省是10年,可以在openvpn的easy-rsa目录下的openssl.cnf里调整修改,然后重新制作一整套证书(openssl.cnf看起来像拨

号网络的快捷方式,要用记事本,写字板打开修改))

3.“安全证书上的名称无效,或者与站点名称不匹配” 这就是服务器证书的common name填写不正确所致,不过这也没关系,有人好像愿意这样。我是不想看到这个警告框,烦人。

即使有安全警报,你仍能进入网站,看到右下角的小锁头(可靠的SSL128位)

#################################

ok,重启 apache, 访问 https://localhost/ 可以看到这个时候访问了httpd-ssl.conf 中设定的 DocumentRoot 目录下的内容,但是首先我们的 https 是成功啦!怎么让他变成 tomcat 下的内容呢?

在: ServerAdmin admin@localhost  后面加上这么一句就 ok 了:

JkMount /* controller

 

其实 你完全可以把 刚才配置的 <VirtualHost _default_:443> 部分的内容删掉, 这样来处理:

在 conf 目录下新建一个 localhost.conf   你可以使用 你的域名.conf 来建立该文件, 内容如下:

 

在 httpd.conf 中加入如下语句: Include conf/extra/localhost.conf

 

重启 Apache , ok, https / http 互转大功告成. 

在我上面的代码里面: 有些判断转发的条件, 可以根据情况处理.

 

 

       三、配置负载均衡.

 

      复制 apache-tomcat-6.0.18  成 apache-tomcat-6.0.18_2, 修改如下配置:

      打开tomcat2/conf/server.xml文件,找到:

      <Server port="8005" shutdown="SHUTDOWN">  将 8005 改成 9005

      找到:

      <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

      将 8080 改成 : 9080

 

      找到:

      <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> 

     修改 port 为 9009

 

      启动 该 tomcat, 访问 http://localhost/   同时打开 tomcat 1 /2 的控制台,可以看到请求分别被交给 tomcat 1 / 2 处理.  ok , 大功告成,慢着, login 出问题了,怎么一直进不去,只有一个 tomcat 的时候正常的, 怎么回事?

 

      没有同步session。

      只配置负载均衡还不行,还要session复制,也就是说其中任何一个tomcat的添加的session,是要同步复制到其它tomcat, 集群内的tomcat都有相同的session

 

      下面来建立集群,同步 session.

       在 tomcat1, tomcat2的server.xml 找到集群部分配置代码:

       <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

       用以下代码覆盖

     

      注意上面第 14 行  port 不要重复.

 

       在刚才代码的上面增加如下代码:

     

 

       tomcat 1 中同样增加:

      

 

     在应用程序的 web.xml 中增加:

    

     如:

 

     重新 生成 war 包,分别部署到 tomcat 1 / 2 中, 重启 tomcat 1 / 2 .

     访问 http://localhost/   登录, 没问题了, 而且登录之后 url 转到 https , 登出之后, 又变回 http,

     大功告成啦! !!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值