设为首页 收藏本站
查看: 885|回复: 0

[经验分享] Nginx+Tomcat+Memcached部署应用

[复制链接]

尚未签到

发表于 2018-12-4 12:31:31 | 显示全部楼层 |阅读模式
  

  通常我们企业也会使用JSP来发布动态网页,那么我们怎样将他们很好的整合,使用一台http服务器对外发布呢?这个时候我们就可以使用Nginx作为前端服务器来对Tomcat进行调度和负载,同时基于jsp的动态特征,我们将引入memcached来保持网页在链接过程中的session同步问题。
  

  主机角色:node1:192.168.20.101tomcatmemcached
   node2: 192.168.20.102tomcatmemcachednginx
  

  注意:两台node上的tomcat应用完全一致
  

  jdk-7u79-linux-x64.tar.gzapache-tomcat-7.0.64.tar.gz
  

  在node2上安装nginx:
  1.安装Nginx
  Nginx官网:http://nginx.org/
  下载最新稳定版本。在安装Nginx之前,需要先安装gcc、 openssl、 pcre和zlib软件库。
  

  1.1 安装gcc、gcc-c++
  #yum install gcc gcc-c++
  

  1.2安装openssl
  openssl官网:http://www.openssl.org/
  安装版本:openssl-1.0.0s.tar.gz
  # tar -zxvf openssl-1.0.0s.tar.gz
  # cd openssl-1.0.0s
  # ./config --prefix=/usr/local/openssl
  # make
  # make install
  

  1.3安装pcre
  pcre官网:http://www.pcre.org/
  安装版本:pcre-8.37.tar.gz
  # tar -zxvf pcre-8.37.tar.gz
  # cd pcre-8.37
  # ./configure --prefix=/usr/local/pcre
  # make
  # make install
  

  1.4安装zlib
  zlib官网:http://www.zlib.net/
  安装版本:zlib-1.2.8.tar.gz
  # tar -zxvf zlib-1.2.8.tar.gz
  # cd zlib-1.2.8
  # ./configure --prefix=/usr/local/zlib
  # make
  # make install
  

  1.5安装Nginx
  安装版本:nginx-1.6.2.tar.gz
  # tar -zxvf nginx-1.6.2.tar.gz
  # cd nginx-1.6.2
  # ./configure --prefix=/home/www/nginx
  --with-openssl=/home/soft/openssl-1.0.0s #指的是openssl源码路径
  --with-pcre=/home/soft/pcre-8.37 #指的是pcre源码路径
  --with-zlib=/home/soft/zlib-1.2.8 #指的是zlib源码路径
  --with-http_ssl_module
  

  # make
  # make install
  

  

  

  在node1和node2上分别安装JDK,然后配置环境变量
  #vi /etc/profile
  

  # jdk7 settings
  JAVA_HOME=/usr/java/jdk1.7.0_79
  JRE_HOME=$JAVA_HOME/jre
  PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
  CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
  export JAVA_HOME JRE_HOME PATH CLASSPATH
  

  #source /etc/profile
  

  # ln -s /usr/java/jdk1.7.0_79/bin/java /sbin/java
  

  

  # which java
  

  #vi test.java
  public class test{
  public static void main(String[] args)
  {System.out.println("Hello!");  }
  }
  

  #javac test.java          编译
  #java test                   执行后出现Hello!说名java环境配置好
  

  

  分别在node1和node2安装tomcat服务器
  这里只列出node1上的操作:
  # tar -zxvf apache-tomcat-7.0.64.tar.gz -C /home/www/
  # mv /home/www/apache-tomcat-7.0.64 /home/www/tomcat
  

  为普通用户设置tomcat的java环境:
  $ vi /home/www/tomcat/bin/setclasspath.bat
  export JAVA_HOME=/usr/java/jdk1.7.0_79
  export JRE_HOME=/usr/java/jdk1.7.0_79/jre
  

  

  创建网站目录
  # mkdir -pv /home/www/ROOT
  

  修改配置文件
  # vi /home/www/tomcat/conf/server.xml
  

  在下面的内容(大概在126行)后面添加
  

  修改后的内容如下:
  
  
  

  

  修改tomcat端口:
  
  

  
  
  
  
  

  

  使用同样的方法在node2上安装tomcat服务器,端口不要与node1上的tomcat端口相同即可。
  

  

  #cd /home/www/ROOT/            自写测试页
  #vi index.jsp
  
  
  

  
  
  
  
  My JSP 'index.jsp' starting page
  
  
  
  
  
  
  
  
  This is my JSP page.
  
  
  

  要想用普通用户运行tomcat,并能成功访问,还需修改tomcat的work目录权限,否则会报HTTP 500错误。
  # chown -R btcweb:www /home/www/tomcat/work/Catalina/
  

  

  测试访问;http://192.168.20.101:8080
  

  

  tomcat访问每次得8080端口,使用nginx反向代理一下。
  

  使用nginx发布jsp动态网页:
  修改nginx配置文件:vim /usr/local/lnmp/nginx/conf/nginx.conf
  

  location ~ \.jsp$ {
  proxy_pass http://127.0.0.1:8080;
  }
  

  $ ./nginx/sbin/nginx -t
  $ ./nginx/sbin/nginx -s reload
  

  访问:http://192.168.20.102
  

  

  在node2上的nginx环境中发布网页
  

  使用nginx的负载均衡功能,在http块中加
  

  upstream linux {
  server 192.168.20.101:8080;
  server 192.168.20.102:8080;
  }
  location ~ \.jsp$ {
  proxy_pass http://linux;
  }
  

  $ ./nginx/sbin/nginx -t
  $ ./nginx/sbin/nginx -s reload
  

  测试:http://linux实现两台主机的负载均衡
  

  linux对应的是nginx的主机,客户端测试用域名访问时,做下linux到192.168.20.102的hosts绑定即可。
  

  问题:在后台实现了nginx的负载均衡,但是当一个用户刷新数据时,数据总是变化的,试想,在动态页面,如果用户提交数据刷新后会换成另外一个空面,这样会造成一定的损失
  

  解决:给nginx增加一个sticky模块.(需要重新编译nginx)
  

  重新在nginx在进行模块化编译:
  download:nginx-sticky-modules.tar.gz(解压就行)
  下载地址:http://code.google.com/p/nginx-sticky-module/downloads/list
  # cd /home/soft/
  # tar -zxvf nginx-sticky-module-1.1.tar.gz
  

  # cd nginx-1.6.2
  # ./configure --prefix=/home/www/nginx --with-openssl=/home/soft/openssl-1.0.0s --with-pcre=/home/soft/pcre-8.37 --with-zlib=/home/soft/zlib-1.2.8 --with-http_ssl_module --add-module=/home/soft/nginx-sticky-module-1.1
  

  # yum -y install openssl-devel
  # make && make install
  

  在执行make && make install时报如下错误
  /tmp/soft/nginx-sticky-module-1.1/ngx_http_sticky_misc.c:281: error: too few arg
  uments to function ‘ngx_sock_ntop’
  make[1]: *** [objs/addon/nginx-sticky-module-1.1/ngx_http_sticky_misc.o] Error 1
  make[1]: Leaving directory `/tmp/soft/nginx-1.6.2'
  make: *** [build] Error 2
  

  根据资料 把ngx_http_sticky_misc.c 的281行修改如下即可解决问题
  原digest->len = ngx_sock_ntop(in,digest
  ->data, len, 1);
  改后digest->len = ngx_sock_ntop(in,sizeof(struct sockaddr_in),digest
  ->data, len, 1);
  

  

  

  # vi /home/www/nginx/conf/nginx.conf
  

  upstream linux {
  

  sticky;#装了nginx-sticky后的功能
  

  server 192.168.20.101:8080 ;
  server 192.168.20.102:8080 ;
  }
  

  测试:http://linux 后发现刷新不会来回负载(每个用户看到的其实不是一个tomcat上的数据,但是对用户是透明的)
  

  

  

  

  4.nginx负载tomcat的jsp时,需要解决session共享:
  使用memcache进行缓存(用户)后端数据,但是又要想到解决单点故障问题,因而可以采用两台memcache作为后端负载.
  

  memcached 11211 后端使用交叉式存储(tomcat会将session同步,session自动寻找存储的memcached,但是默认是交叉存储,当m坏掉,tomcat都会存到存活的m上)
  只要tomcat不会宕掉,一切数据都还ok
  但是当memcached宕掉,tomcat会向存活的mem上存取。
  

  session 的序列化方案官方推荐的有 4 种:
  1. java serialization
  2. msm-kryo-serializer
  3. msm-javolution-serializer
  4. msm-xstream-serializer
  其中性能最好的数Kryo,我们使用kryo来做session
  

  mecached服务器node1 和 node2
  

  Memcached安装
  Memcached官网:http://memcached.org/
  安装memcached需要先安装libevent,libevent官网:http://libevent.org/
  本次安装版本:
  memcached-1.4.24.tar.gz
  libevent-2.0.22-stable.tar.gz
  

  4.1 安装livevent
  查看是否已安装:# rpm qa | grep libevent
  如果已安装且版本低于1.3,则先通过:
  #rpm -e libevent --nodeps 进行卸载。
  

  # tar -zxvf libevent-2.0.22-stable.tar.gz
  # cd libevent-2.0.22-stable
  # ./configure --prefix=/usr/local/libevent
  # make
  # make install
  

  4.2 安装Memcached
  # tar -zxvf memcached-1.4.24.tar.gz
  # cd memcached-1.4.24
  # ./configure --prefix=/home/www/memcached --with-libevent=/usr/local/libevent
  # make
  # make install
  

  编写启动脚本:
  # cd /home/www/memcached
  # vi start.sh
  start.sh内容如下:
  

  bin/memcached -d -m 10240 -p 11211 -l 192.168.20.102  -c 1024 -u root -P /home/www/memcached/memcached.pid
  

  #chmod 755 start.sh
  

  启动memcached
  # cd /home/www/memcached
  # ./start.sh
  

  查看进程:ps -ef |grep memcached
  

  参数选项说明:
  -p     监听的TCP端口 (缺省: 11211)
  -d    以守护进程方式运行memcached
  -u     运行memcached的账户,非root用户
  -m     最大的内存使用,单位是MB,缺省是 64 MB
  -c     软连接数量,缺省是1024(最大并发连接数)
  -v    输出警告和错误信息
  -vv    打印客户端的请求和返回信息
  -h    打印帮助信息
  -i    打印memcached和libevent的版权信息
  

  测试访问:telnet localhost 11211
  stats                   查看状态
  

  

  将以下jar包复制到tomcat的lib目录(如/home/www/tomcat/lib)
  javolution-5.5.1.jar
  kryo-1.03.jar
  kryo-serializers-0.10.jar
  memcached-2.5.jar
  memcached-session-manager-1.5.1.jar
  memcached-session-manager-tc7-1.5.1.jar
  minlog-1.2.jar
  msm-javolution-serializer-1.5.1.jar
  msm-kryo-serializer-1.6.4.jar
  reflectasm-0.9.jar
  spymemcached-2.7.3.jar
  

  

  #vi /home/www/tomcat/conf/context.xml
  

  
  

  

  重启tomcat,以识别memcached-session-manager
  

  #tail -f tomcat/logs/catalina.out#默认日志
  INFO: MemcachedSessionService finished initialization, sticky true, with node ids [n1] and failover node ids [n2]
  

  正常启动
  

  

  

  编辑测试文件:
  (动态效果的jsp网页)
  #vi /home/www/ROOT/index.jsp
  

  
  
  Cluster App Test
  
  Server Info:
  
   0) {
  String dataValue = request.getParameter("dataValue");
  session.setAttribute(dataName, dataValue);
  }
  out.print("Session list");
  Enumeration e = session.getAttributeNames();
  while (e.hasMoreElements()) {
  String name = (String)e.nextElement();
  String value = session.getAttribute(name).toString();
  out.println( name + " = " + value+"");
  System.out.println( name + " = " + value);
  }
  %>
  
  name:
  
  key:
  
  
  
  
  
  

  

  session共享完成:两台tomcat和memcached机子做相同的配置(jdk,memcache,tomcat)
  

  测试:
  http://linux     使用一台tomcat和另外一台的memcached进行session共享
  

  当任何一台tomcat或者memcached挂了都无所谓
  

  session会记录并且保持用户的数据信息




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-643265-1-1.html 上篇帖子: Tomcat多实例运行配置 下篇帖子: Tomcat 8.0+Java开发WebSokcet
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表