阿里云服务器搭建apache+https+集群tomcat

当需要搭建apache+https+tomcat集群时,请参看第1节。
当需要搭建apache+tomcat集群时,请参看第2节。
1、 apache+https+tomcat集群


1.1 安装openssl
执行 ~> openssl version -a ,查看系统预装openssl版本。
放弃使用系统预装的openssl。
安装最新版本openssl,并且必须与系统预装版本不同。
禁止使用1.0.1~1.0.1f以及1.0.2-beta版本的openssl,已确认存在心脏出血漏洞。
* 上传openssl-1.0.2a.tar.gz 至${SSL_DIR}=/data/develop。
* 解压 ~> tar -zxvf openssl-1.0.2a.tar.gz ,至目录${SSL_SRC}=/home/data/develop/openssl-1.0.2a。如果${SSL_SRC}已存在,请先删除。
* 建立安装目录 ${SSL_HOME}=/data/develop/open-ssl。如果${SSL_HOME }已存在,请先删除。
* ~> cd ${SSL_SRC}
* 配置 ~> ./config --prefix=${SSL_HOME} -fPIC enable-shared
* 编译openssl ~> make
* 安装openssl ~> make install

1.2 生成证书
* 建立目录
${SSL_HOME}/bin/demoCA
${SSL_HOME}/bin/demoCA/newcerts
* 建立文件
${SSL_HOME}/bin/demoCA/index.txt ,内容为空
${SSL_HOME}/bin/demoCA/serial ,写入“01”
mkdir -p ${SSL_HOME}/bin/demoCA/newcerts
touch ${SSL_HOME}/bin/demoCA/index.txt
echo "01" >> ${SSL_HOME}/bin/demoCA/serial

* ~> cp ${SSL_HOME}/ssl/openssl.cnf ${SSL_HOME}/bin
* 编辑 ${SSL_HOME}/bin/openssl.cnf
修改 dir = ${SSL_HOME}/bin/demoCA
default_md = md5
* ~> cd ${SSL_HOME}/bin
* 生成CA密钥 ~>./openssl genrsa -des3 -out demoCA/ca.key 1024
按照提示输入
pass phrase key : ${CA_KEY}
* 生成CA凭证需求 ~> ./openssl req -config openssl.cnf -new -key demoCA/ca.key -out demoCA/ca.csr
按照提示分别输入
Country Name : CN
State or Province Name : TianJin
Locality Name : TianJin
Organization Name : beiking
Organizational Unit Name : ardo
Common Name : ${CANAME} 
Email Address : .
A challenge password : .
An optional company name : .
输入“.”表示留空
* 生成CA凭证 ~> ./openssl x509 -days 3650 -req -signkey demoCA/ca.key -in demoCA/ca.csr -out demoCA/ca.crt
* 生成服务器密钥 ~> ./openssl genrsa -des3 -out demoCA/server.key 1024
按照提示输入
pass phrase key : ${SERVER_KEY}
* 生成服务器凭证需求 ~> ./openssl req -config openssl.cnf -new -key demoCA/server.key -out demoCA/server.csr
按照提示分别输入
Country Name : CN
State or Province Name : TianJin
Locality Name : TianJin
Organization Name : beiking
Organizational Unit Name : ardo
Common Name : ${SERVERNAME} 
Email Address : .
A challenge password : .
An optional company name : .
输入“.”表示留空
* 生成服务器凭证 ~> ./openssl ca -config openssl.cnf -days 3650 -cert demoCA/ca.crt -keyfile demoCA/ca.key -in demoCA/server.csr -out demoCA/server.crt
* ${CA_KEY}和${SERVER_KEY} 
以下是生成签名信息:
错误以及解决方案
* 若生成服务器凭证时,出现No such file or directory:./crypto/bio/bss_file.c:104:fopen('ssl/index.txt.attr','rb')
尝试建立文件 ${SSL_HOME}/bin/demoCA/index.txt.attr ,内容为空。重新生成服务器凭证。
* 若生成服务器凭证时,出现NCONF_get_string:no value:./crypto/conf/conf_lib.c
编辑 ${SSL_HOME}/bin/openssl.cnf,尝试将x509_extensions相关的2个配置注释掉。重新从生成CA凭证需求步骤开始。

1.3 安装apache
* 上传httpd-2.2.29.tar.bz2 至${APACHE_DIR}=/data/develop
* 解压 ~> tar -jxvf httpd-2.2.29.tar.bz2 ,至目录${APACHE_SRC}=/data/develop/httpd-2.2.29。
* 如果${APACHE_SRC}已存在,请先删除,不要在原有的${APACHE_SRC}目录下重新./configure。
* 建立安装目录 ${APACHE_HOME}=/data/develop/apache-proxy。
* 如果${APACHE_HOME}已存在,请先删除。
* ~> cd ${APACHE_SRC}
* 查看配置帮助 ~> ./configure --help
* 配置 ~> ./configure --prefix=${APACHE_HOME} --enable-so --enable-mods-shared=most --enable-proxy --enable-proxy-connect --enable-proxy-http --enable-proxy-scgi --enable-proxy-ajp --enable-proxy-balancer --enable-http --enable-rewrite --enable-log-forensic --enable-mime-magic --enable-cern-meta --enable-usertrack --enable-unique-id --enable-cgid --with-ssl=${SSL_HOME} --enable-ssl

* 编译apache ~> make
* 安装apache ~> make install
* 检查目录${APACHE_HOME}/modules下是否有mod_proxy*.so、mod_ssl.so等文件
错误以及解决方案
* 若安装apache时,出现Error, SSL/TLS libraries were missing or unusable。
尝试执行~> export LDFLAGS=-ld,然后重新安装。
* 若安装apache时,出现Cannot use an external APR with the bundled APR-util。
需要手动安装apr和apr-util。
安装apr:
建立apr安装目录 ${APR_HOME}=/data/develop/apr-home
进入apr源码目录 ~> cd ${APACHE_SRC}/srclib/apr
配置 ~> ./configure --prefix=${APR_HOME}
编译 ~> make
安装 ~> make install
安装apr-util:
建立apr-util安装目录 ${APRUTIL_HOME}=/data/develop/apr-util-home
进入apr-util源码目录 ~> cd ${APACHE_SRC}/srclib/apr-util
配置 ~> ./configure --prefix=${APRUTIL_HOME} --with-apr=${APR_HOME}
编译 ~> make
安装 ~> make install
配置apache ~> ./configure --prefix=${APACHE_HOME} --enable-so --enable-mods-shared=most --enable-proxy --enable-proxy-connect --enable-proxy-http --enable-proxy-scgi --enable-proxy-ajp --enable-proxy-balancer --enable-http --enable-rewrite --enable-log-forensic --enable-mime-magic --enable-cern-meta --enable-usertrack --enable-unique-id --enable-cgid --with-ssl=${SSL_HOME} --enable-ssl --with-apr=${APR_HOME} --with-apr-util=${APRUTIL_HOME}
若上述3次./configure时,出现c compiler cannot create executables,
尝试加上参数LDFLAGS=-lpthread

1.4 配置apache
编辑 ${APACHE_HOME}/conf/httpd.conf
* 配置Listen ${IP}:${PORT}
如:Listen 18080。即监听所有网卡的18080端口
如:Listen 120.76.130.68:18080。即监听120.76.130.68的18080端口
* 检查LoadModule proxy_*_module modules/mod_proxy_*.so是否已启用
* 检查LoadModule ssl_module modules/mod_ssl.so是否已启用
* 配置ServerName ${SERVERNAME}
${SERVERNAME}取值参见1.2中的配置
* 启用Include conf/extra/httpd-ssl.conf配置项
部署证书
* 建立目录 ${APACHE_HOME}/conf/ssl-key
* 建立目录 ${APACHE_HOME}/conf/ssl-crt
* ~> cp ${SSL_HOME}/bin/demoCA/sever.key ${APACHE_HOME}/conf/ssl-key
* ~> cp ${SSL_HOME}/bin/demoCA/sever.crt ${APACHE_HOME}/conf/ssl-crt
* ~> cp ${SSL_HOME}/bin/demoCA/ca.crt ${APACHE_HOME}/conf/ssl-crt
编辑${APACHE_HOME}/conf/extra/httpd-ssl.conf
* 配置Listen ${SSL_IP}:${SSL_PORT}
如:Listen 18443。即监听所有网卡的18443端口
如:Listen 120.76.130.68:18443。即监听120.76.130.68的18443端口
* 配置 <VirtualHost *:{SSL_PORT}>
* 配置 ServerName ${SERVERNAME}
${SERVERNAME}取值参见2.2中的配置
* 配置 SSLCertificateFile ”${APACHE_HOME}/conf/ssl-crt/sever.crt”
* 配置 SSLCertificateKeyFile ”${APACHE_HOME}/conf/ssl-key/sever.key”
* 配置 SSLCertificateChainFile ”${APACHE_HOME}/conf/ssl-crt/ca.crt”
* 其余ssl文件的相关配置注释掉
* 配置负载均衡+反向代理
在<VirtualHost>节点下添加如下配置:
SSLProxyEngine on
ProxyRequests off
ProxyPass /${APP_ROOT} balancer://${CLUSTER_NAME} stickysession=JSESSIONID
ProxyPassReverse /${APP_ROOT} balancer://${CLUSTER_NAME}/ stickysession=JSESSIONID
<Proxy balancer://${CLUSTER_NAME}>
BalancerMember ajp://${T1_IP}:${T1_PORT}/${APP_ROOT} route=${T1_ROUTE} loadfactor=${T1_LOAD}
BalancerMember ajp://${T2_IP}:${T2_PORT}/${APP_ROOT} route=${T2_ROUTE} loadfactor=${T2_LOAD}
</Proxy>
<Location /balancer-manager>
SetHandler balancer-manager
order Deny,Allow
Deny from all
Allow from ${ALLOW_IP}
</Location>


其中变量可参考如下:
${APP_ROOT}=beikingTest
${CLUSTER_NAME}=mycluster
${T1_IP}=10.116.113.43
${T1_AJP_PORT}=18081
${T1_JVM_ROUTE}=tomcat-1
${T1_LOAD}=1
${T2_IP}=10.116.113.43
${T2_AJP_PORT}=18082
${T2_JVM_ROUTE}=tomcat-2
${T2_LOAD}=1
如果需要连接更多的tomcat,增加相应的BalancerMember配置即可。
但当${T1_IP}=${T2_IP},必须保证如下变量不相同:
${T*_AJP_PORT}
${T*_JVM_ROUTE}
对于${ALLOW_IP},在启动apache后尝试登录https://${SSL_IP}:${SSL_PORT}/balancer-manager,查看${APACHE_HOME}/logs/access_log,确认向apache发出“GET /balancer-manager HTTP/1.1”请求的IP,此IP即${ALLOW_IP}。修改${APACHE_HOME}/conf/extra/httpd-ssl.conf之后,重启apache,再尝试登录https://${SSL_IP}:${SSL_PORT}/balancer-manager。

经测试,${ALLOW_IP}不支持通配符,多个IP请用空格分隔。
1.5 配置tomcat
参考2.3
1.6 启动tomcat
参考2.4
1.7 启动apache
~> cd ${APACHE_HOME}/bin
* 验证配置正确性 ~> ./apache -t
* 启动apache ~> ./apachectl -k start
(启动时会要求输入${SERVER_KEY})
* 关闭apache ~> ./apachectl -k graceful-stop
注意:
* 在修改httpd.conf等apache配置文件时,需按照以下步骤执行:
1、 关闭apache
2、 修改配置文件
3、 验证配置正确性
4、 启动apache
错误以及解决方案
* 若启动apache时,出现libssl.so.1.0.0: cannot open shared object file: No such file or directory
执行~> ldd ${APACHE_HOME}/modules/mod_ssl.so ,确认系统能否找到libssl.so.1.0.0、libcrypto.so.1.0.0
若不能,
对于64位机,尝试执行
~> sudo ln -s ${SSL_HOME}/lib/libssl.so.1.0.0 /usr/lib64/libssl.so.1.0.0
~> sudo ln -s ${SSL_HOME}/lib/libcrypto.so.1.0.0 /usr/lib64/libcrypto.so.1.0.0
对于32位机,尝试执行
~> sudo ln -s ${SSL_HOME}/lib/libssl.so.1.0.0 /usr/lib/libssl.so.1.0.0
~> sudo ln -s ${SSL_HOME}/lib/libcrypto.so.1.0.0 /usr/lib/libcrypto.so.1.0.0
(上述命令需要root权限)
重新执行~> ldd ${APACHE_HOME}/modules/mod_ssl.so ,确认系统能否找到libssl.so.1.0.0、libcrypto.so.1.0.0
1.8 验证系统运行状态
* 网页登录https://${SSL_IP}:${SSL_PORT}/balancer-manager,确认每个tomcat运行状态正常。运行状态的显示会有延迟,可能会长达几分钟。
* 手机客户端第一次请求会用时会比较久,可能会长达几十秒,原因是apache要检查所有tomcat运行状态。
* 验证负载均衡
使用多台手机或者网页模拟客户端(chrome的postman插件)发出一条请求,查看第一条请求时是否会被分配到负载最轻的tomcat上。
对于Method=byrequests的集群,Elected数值最低的tomcat负载最轻。
对于Method=bytraffic的集群,To/From数值最低的tomcat负载最轻。
* 验证会话粘连
使用同一台手机或者网页模拟客户端(chrome的postman插件)发出多条请求,查看这些请求是否均由同一个tomcat处理。
然后关闭该tomcat,继续发出多条请求,查看这些请求是否被均衡的分配到其他tomcat上。
然后启动该tomcat,继续发出多条请求,查看这些请求是否被该tomcat处理。
其他
查看端口占用 ~> lsof -i:${PORT}

2、 apache+tomcat集群

2.1 安装apache
* 上传httpd-2.2.29.tar.bz2 至${APACHE_DIR}=${SSL_DIR}。
* 解压 ~> tar -jxvf httpd-2.2.29.tar.bz2 ,至目录${APACHE_SRC}=${SSL_DIR}/httpd-2.2.29。如果${APACHE_SRC}已存在,请先删除,不要在原有的${APACHE_SRC}目录下重新./configure。
* 建立安装目录 ${APACHE_HOME}=${SSL_DIR}/apache-proxy。如果${APACHE_HOME}已存在,请先删除。
* ~> cd ${APACHE_SRC}
* 查看配置帮助 ~> ./configure --help
* 配置 ~> ./configure --prefix=${APACHE_HOME} --enable-so --enable-mods-shared=most --enable-proxy --enable-proxy-connect --enable-proxy-http --enable-proxy-scgi --enable-proxy-ajp --enable-proxy-balancer --enable-http --enable-rewrite --enable-log-forensic --enable-mime-magic --enable-cern-meta --enable-usertrack --enable-unique-id --enable-cgid

* 编译apache ~> make
* 安装apache ~> make install
* 检查目录${APACHE_HOME}/modules下是否有mod_proxy*.so等文件

2.2 配置apache
编辑 ${APACHE_HOME}/conf/httpd.conf
* 配置Listen ${IP}:${PORT}
如:Listen 18080。即监听所有网卡的18080端口
如:Listen 120.76.130.68:18080。即监听120.76.130.68的18080端口
* 检查LoadModule proxy_*_module modules/mod_proxy_*.so是否已启用
* 配置ServerName ${SERVERNAME}
如:ServerName 120.76.130.68
* 配置负载均衡+反向代理
添加如下配置:
ProxyRequests Off
ProxyPass /${APP_ROOT} balancer://mycluster stickysession=JSESSIONID
ProxyPassReverse /${APP_ROOT} balancer://mycluster/ stickysession=JSESSIONID
<Proxy balancer://mycluster>
BalancerMember ajp://${T1_IP}:${T1_AJP_PORT}/${APP_ROOT} route=${T1_ROUTE} loadfactor=${T1_LOAD}
BalancerMember ajp://${T2_IP}:${T2_AJP_PORT}/${APP_ROOT} route=${T2_ROUTE} loadfactor=${T2_LOAD}
</Proxy>
SetHandler balancer-manager

其中变量可参考如下:
${APP_ROOT}=beikingTest
${T1_IP}=10.116.113.43
${T1_AJP_PORT}=18081
${T1_JVM_ROUTE}=tomcat-1
${T1_LOAD}=1
${T2_IP}=10.116.113.43
${T2_AJP_PORT}=18082
${T2_JVM_ROUTE}=tomcat-2
${T2_LOAD}=1
如果需要连接更多的tomcat,增加相应的BalancerMember配置即可。
但当${T1_IP}=${T2_IP},必须保证如下变量不相同:
${T*_AJP_PORT}
${T*_JVM_ROUTE}

2.3 配置tomcat
tomcat1所在机器为${T1_IP},安装目录${T1_HOME}=${SSL_DIR}/tomcat-1
配置${T1_HOME}/conf/server.xml
* 配置关闭端口
<Server port="${T1_SHUT_PORT}" shutdown="SHUTDOWN">
如:${T1_SHUT_PORT}=8005
* 配置http端口
<Connector port="${T1_HTTP_PORT}" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="${T1_SSL_PORT}" />
如:${T1_HTTP_PORT}=8080

* 配置AJP端口
<Connector port="${T1_AJP_PORT}" protocol="AJP/1.3" redirectPort="${T1_SSL_PORT}" />
${T1_AJP_PORT}取值参考1.2中的配置

* 配置JVM路径
<Engine name="Catalina" defaultHost="localhost" jvmRoute="${T1_JVM_ROUTE}">
${ T1_JVM_ROUTE }取值参考2.2中的配置
* 在<Engine>节点下增加配置:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="${T1_IP}" port="${T1_NIO_PORT}" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer" tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

* 部署应用war包
在<Host>节点下增加配置:
<Context docBase="${WAR_PATH}" path="/${APP_ROOT}" reloadable="false"/>
${WAR_PATH}为应用war的路径,如${WAR_PATH}=${SSL_DIR}/beikingTest.war
${APP_ROOT}取值参考2.2中的配置

* 注意
当同一台机器配置多个tomcat时,即${T1_IP}=${T2_IP},必须保证如下变量不相同:
${T*_SHUT_PORT}
${T*_HTTP_PORT}
${T*_NIO_PORT}
而对于${T1_SSL_PORT},由于apache与tomcat之间没有使用https,暂时不做约束。

2.4 启动tomcat
* 删除目录${T*_HOME}/webapps/${APP_ROOT}
* 删除目录${T*_HOME}/work/Catalina/localhost/${APP_ROOT}

* 启动tomcat,并确认已成功启动。

2.5 启动apache
~> cd ${APACHE_HOME}/bin
* 验证配置正确性 ~> ./apache -t
* 启动apache ~> ./apachectl -k start
* 关闭apache ~> ./apachectl -k graceful-stop
* 网页登录http://${IP}:${PORT}/balancer-manager,确认每个tomcat运行状态正常
* 手机客户端第一次请求会用时会比较久,原因是apache要检查所有tomcat运行状态
apache集群管理页面

https://120.76.130.68:18443/balancer-manager


3、 缓存系统memchached或redis
后续更新memcached或redis分布式缓存系统安装。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值