上学的时候一直有个梦想,就是拥有自己的网站,这个梦想在2015年10份经过自己的学习和在同事的帮助下已经实现了,同时部署阿里云ECS服务器完成备案,现在已经正式上线,后来一直听同事说nginx负载均衡能实现高并发。 于是利用下班时间搭建了Nginx和tomcat集群服务器,利用Memcached实现session共享,同时支持HTTP请求和HTTPS请求,整理了一下,分享给大家,如果存在问题,希望大家多多指点。( nginx指向两个tomcat )
一.搭建服务器环境前期准备:
1.1 安装jdk(如果没有安装包自己可以在网上下载)。
1.2需要下载 Tomcat7(win64位) 《点击下载》
1.3 需要下载 Nginx1.8.0(win64位) 《点击下载》
1.4 需要下载 Memcached1.4 (win64位) 《点击下载》
二.jdk配置环境变量 :
2.1 把jdk安装在 C:\Java\jdk1.7.0
2.1.1.新建环境变量 JAVA_HOME 值 C:\Java\jdk1.7.0
2.1.2.新建环境变量 classpath 值 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar (注意不要丢失" . " 符号)
2.1.3.在path环境变量后面加 ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin
2.1.2.新建环境变量 classpath 值 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar (注意不要丢失" . " 符号)
2.1.3.在path环境变量后面加 ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\bin
三.tomcat7配置安装 :
3.1 对于tomcat大家都很熟悉,只需要修改server.xml配置文件即可,这里我们以apache-tomcat-7.0.40为例,分别在server目录,解压缩并命名为:apache-tomcat-7.0.40_1、apache-tomcat-7.0.40_2。
第一处端口修改:
<!-- 修改port端口:18002 俩个tomcat不能重复,端口随意,别太小- -->
<Server port="18002" shutdown="SHUTDOWN">
第二处端口修改:
<!-- port="8082" tomcat监听端口,随意设置,别太小 -->
<Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
第三处端口修改:
<Connector port="28002" protocol="AJP/1.3" redirectPort="8443" />
第四处 Engine元素增加jvmRoute属性:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
两个tomcat的端口别重复,保证能启动起来,tomcat端口分别位 8082(jvm2) 和8081(jvm1)
访问8082端口 如下图
访问8081端口如下图
3.2使用memcached-session-manager这个开源项目(http://download.csdn.net/detail/lhl18330580828/9502743,下面简称msm) 配置Tomcat和memcached实现session共享。
首先将下面的包下载到Tomcat的lib目录下,这些包都是msm所依赖的包。
首先将下面的包下载到Tomcat的lib目录下,这些包都是msm所依赖的包。
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
把上述jar包放到tomcat/lib 目录下,修改每个tomcat的配置文件tomcat\conf\context.xml
<!-- 在<context>...</context>标签之间加入如下代码: -->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211"
sticky="false"
sessionBackupAsync="false"
lockingMode="uriPattern:/path1|/path2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />
说明:
这里的memcachedNodes是填写memcached节点,多个节点时可以以空隔分开,如:
n1:localhost:11211 n2:localhost:11212
/localhost改为安装memcached的服务器的IP
四.Memcached 配置安装 :
4.1 在cmd控制台切换到memcached.exe所在目录,我的是在C:\memcached
4.2 输入命令memcached.exe -d install,enter后,即可完成memcached 安装 如下图:
4.3 我习惯在服务里启动并把memcached 设为手动
4.4 右键开启 memcached 后重新启动两个 tomcat,至此tomcat+memcached 搭建完毕。
五.Nginx1.8.0 配置 :
5.1通过我的域名指定到nginx 端口上,分发到上面配置好的两个tomcat 端口
8081和8082上实现负载均衡
5.2 实现https 需要开启 nginx 的443端口,我实现的是域名证书单向认证,如果是为了学习可以在沃通可以申请免费 域名证书 ,如果你想申请的话,我可以帮你(前提是自己得购买域名和服务器)。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream localhost {
#根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。
#同一机器在多网情况下,路由切换,ip可能不同
# ip_hash;
server localhost:8081 ;
server localhost:8082 ;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root html;
# index index.html index.htm;
#}
rewrite ^(.*$) https://$host$1 permanent;
location /ngx_status
{
stub_status on;
access_log off;
#allow 127.0.0.1;
#deny all;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate sslkey/1_www.tslhl.com_bundle.crt;
ssl_certificate_key sslkey/2_www.tslhl.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:-LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
proxy_connect_timeout 1;
proxy_send_timeout 30;
proxy_read_timeout 30;
proxy_pass http://localhost;
}
}
}
5.2
该项目下新建一个index.jsp文件,编辑该文件内容如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'session.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
System.out.println(session.getId());
out.println("<br> This is (TOMCAT1|TOMCAT2), SESSION ID:" + session.getId()+"<br>");
%>
</body>
</html>
5.3 双击nginx.exe 开启nginx 服务,这时我可以访问我的 域名
5.4 重复刷新发现session的值不变如下所示,session共享成功
5.5 我把关闭nginx做成了批处理closeNginx.bat 这样更方便内容为 ( taskkill /f /im nginx.exe)。
如果你学到了知识请为我点赞!
最后谢谢大家欣赏我的 博客,如果哪里 你发现了 问题,请多多指出,我也是菜鸟,我们共同进步!!!