首页 后端开发 php教程 nginx+tomcat+redis实现session共享

nginx+tomcat+redis实现session共享

Aug 08, 2016 am 09:24 AM
manager nbsp redis session tomcat

nginx 作为目前最流行的开源反向代理HTTP Server,用于实现资源缓存、web server负载均衡等功能,由于其轻量级、高性能、高可靠等特点在互联网项目中有着非常普遍的应用,相关概念网上有丰富的介绍。分布式web server集群部署后需要实现session共享,针对 tomcat 服务器的实现方案多种多样,比如 tomcat cluster session 广播、nginx IP hash策略、nginx sticky module等方案,本文主要介绍了使用 redis 服务器进行 session 统一存储管理的共享方案。

  相关应用结构参照下图:

二、环境配置

  测试环境基于 Linux CentOS 6.5,请先安装 tomcatredisnginx 相关环境,不作详细描述,本文测试配置如下:

 Version

 IP_Port

 nginx

 1.6.2

 10.129.221.70:80

 tomcat_1

 7.0.54

 10.129.221.70:8080

 tomcat_2

 7.0.54

 10.129.221.70:9090

 redis

 2.8.19

 10.129.221.70:6379

三、构建 tomcat-redis-session-manager-master

1、由于源码构建基于 gradle,请先配置 gradle 环境。

2、从 github 获取 tomcat-redis-session-manager-master 源码,地址如下:

view sourceprint?

1.https://github.com/jcoleman/tomcat-redis-session-manager

3、找到源码中的 build.gradle 文件,由于作者使用了第三方仓库(sonatype),需要注册帐号,太麻烦,注释后直接使用maven中央仓库,同时注释签名相关脚本并增加依赖包的输出脚本 copyJarsdist目录),修改后的 build.gradle 文件如下:

view sourceprint?

001.apply plugin: 'java'

002.apply plugin: 'maven'

003.apply plugin: 'signing'

004. 

005.group = 'com.orangefunction'

006.version = '2.0.0'

007. 

008.repositories {

009.mavenCentral()

010.}

011. 

012.compileJava {

013.sourceCompatibility = 1.7

014.targetCompatibility = 1.7

015.}

016. 

017.dependencies {

018.compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '7.0.27'

019.compile group: 'redis.clients', name: 'jedis', version: '2.5.2'

020.compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.2'

021.//compile group: 'commons-codec', name: 'commons-codec', version: '1.9'

022. 

023.testCompile group: 'junit', name: 'junit', version: '4.+'

024.testCompile 'org.hamcrest:hamcrest-core:1.3'

025.testCompile 'org.hamcrest:hamcrest-library:1.3'

026.testCompile 'org.mockito:mockito-all:1.9.5'

027.testCompile group: 'org.apache.tomcat', name: 'tomcat-coyote', version: '7.0.27'

028.}

029. 

030.task javadocJar(type: Jar, dependsOn: javadoc) {

031.classifier = 'javadoc'

032.from 'build/docs/javadoc'

033.}

034. 

035.task sourcesJar(type: Jar) {

036.from sourceSets.main.allSource

037.classifier = 'sources'

038.}

039. 

040.artifacts {

041.archives jar

042. 

043.archives javadocJar

044.archives sourcesJar

045.}

046. 

047.//signing {

048.//  sign configurations.archives

049.//}

050. 

051.task copyJars(type: Copy) {

052.from configurations.runtime

053.into 'dist' 

054.}

055. 

056.uploadArchives {

057.repositories {

058.mavenDeployer {

059.beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

060. 

061.//repository(url: 'https://oss.sonatype.org/service/local/staging/deploy/maven2/') {

062.//  authentication(userName: sonatypeUsername, password: sonatypePassword)

063.//}

064.//repository(url: 'https://oss.sonatype.org/content/repositories/snapshots') {

065.//  authentication(userName: sonatypeUsername, password: sonatypePassword)

066.//}

067. 

068.pom.project {

069.name 'tomcat-redis-session-manager'

070.packaging 'jar'

071.description 'Tomcat Redis Session Manager is a Tomcat extension to store sessions in Redis'

072.url 'https://github.com/jcoleman/tomcat-redis-session-manager'

073. 

074.issueManagement {

075.url 'https://github.com:jcoleman/tomcat-redis-session-manager/issues'

076.system 'GitHub Issues'

077.}

078. 

079.scm {

080.url 'https://github.com:jcoleman/tomcat-redis-session-manager'

081.connection 'scm:git:git://github.com/jcoleman/tomcat-redis-session-manager.git'

082.developerConnection 'scm:git:git@github.com:jcoleman/tomcat-redis-session-manager.git'

083.}

084. 

085.licenses {

086.license {

087.name 'MIT'

088.url 'http://opensource.org/licenses/MIT'

089.distribution 'repo'

090.}

091.}

092. 

093.developers {

094.developer {

095.id 'jcoleman'

096.name 'James Coleman'

097.email 'jtc331@gmail.com'

098.url 'https://github.com/jcoleman'

099.}

100.}

101.}

102.}

103.}

104.}

4、执行gradle命令构建源码,编译输出tomcat-redis-session-manager-master 及依赖jar

view sourceprint?

1.gradle build -x test  copyJars

  所有输出列表文件如下:

四、tomcat 配置

  安装配置两台 tomcat web服务器,分别修改 Connector 端口号为80809090,并确保都能正常工作,当然如果分布在不同的主机则可以使用相同端口号。

五、编写测试页面

  为了区别2tomcat的访问,分别编写页面并打包部署:

1、为tomcat_1编写测试页面,显示 “ response from tomcat_1 ”,同时页面提供按钮显示当前session值,打包并发布到 tomcat_1 服务器;

2、为tomcat_2编写测试页面,显示 “ response from tomcat_2 ”,同时页面提供按钮显示当前session值,打包并发布到 tomcat_2 服务器;

  此时分别访问 http://10.129.221.70:8080 和 http://10.129.221.70:9090 地址,因为访问的是不同web服务器,所以各自显示不同的页面内容及session值肯定不同。

六、tomcat session manager 配置

  修改配置使用 tomcat-redis-session-manager-master 作为 tomcat session 管理器

1、分别将第三步生成的 tomcat-redis-session-manager-master 及依赖jar包覆盖到 tomcat 安装目录的 lib 文件夹

2、分别修改2台 tomcat 的 context.xml 文件,使 tomcat-redis-session-manager-master 作为session管理器,同时指定redis地址和端口。

context.xml 增加以下配置:

view sourceprint?

1.

2.

3.

4.host='localhost'

5.port='6379'

6.database='0'

7.maxInactiveInterval='60' />

8.

3、分别重启2台 tomcat 服务器。

七、nginx 配置

1、修改 default.conf 配置文件,启用 upstream 负载均衡 tomcat Cluster,默认使用轮询方式。

view sourceprint?

01.upstream site { 

  ip_hash;               //基于ip_hash分发

02.server localhost:8080;

03.server localhost:9090;

04.} 

05. 

06.server {

07.listen       80;

08.server_name  localhost;

09. 

10.#charset koi8-r;

11.#access_log  /var/log/nginx/log/host.access.log  main;

12. 

13.location / {

14.#root   /usr/share/nginx/html;

15.#index  index.html index.htm;

16.index  index_tel.http://www.it165.net/pro/webjsp/" target="_blank"class="keylink">jsp index.http://www.it165.net/pro/webjsp/"target="_blank" class="keylink">jsp index.html index.htm ; 

17.proxy_redirect          off;   

18.proxy_set_header        Host            $host;   

19.proxy_set_header        X-Real-IP       $remote_addr;   

20.proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;   

21.client_max_body_size    10m;   

22.client_body_buffer_size 128k;   

23.proxy_buffers           32 4k; 

24.proxy_connect_timeout   3;   

25.proxy_send_timeout      30;   

26.proxy_read_timeout      30;  

27.proxy_pass http://site;

28. 

29.}

30. 

31.#error_page  404              /404.html;

32. 

33.# redirect server error pages to the static page /50x.html

34.#

35.error_page   500 502 503 504  /50x.html;

36.location = /50x.html {

37.root   /usr/share/nginx/html;

38.}

39. 

40.# proxy the PHP scripts to Apache listening on 127.0.0.1:80

41.#

42.#location ~ .php$ {

43.#    proxy_pass   http://127.0.0.1;

44.#}

45. 

46.# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

47.#

48.#location ~ .php$ {

49.#    root           html;

50.#    fastcgi_pass   127.0.0.1:9000;

51.#    fastcgi_index  index.php;

52.#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

53.#    include        fastcgi_params;

54.#}

55. 

56.# deny access to .htaccess files, if Apache's document root

57.# concurs with nginx's one

58.#

59.#location ~ /.ht {

60.#    deny  all;

61.#}

62.}

2nginx 重新加载配置

view sourceprint?

1.nginx -s reload

八、配置Tomcat

保存的session实体是放到redis中,tomcat可以记录session-id值与redis进行对比,session-id是从cookie中取得的,不同的tomcat存储sessioncookie的位置是不同的,所以必须修改所有tomcatconf/context.xml,修改内容如下:

 sessionCookiePath="/">

九、测试结果

1、访问 http://10.129.221.70:8080 直接请求到tomcat_1服务器,

    显示 “ response from tomcat_1 ”, session 值为 ‘56E2FAE376A47F1C0961D722326B8423’

2、访问 http://10.129.221.70:9090 直接请求到tomcat_2服务器,

    显示 “ response from tomcat_2 ” session 值为 ‘56E2FAE376A47F1C0961D722326B8423’

3、访问 http://10.129.221.70 (默认80端口)请求到 nginx 反向代理到指定Web服务器,由于默认使用轮询负载方式,

    反复刷新页面显示的内容在“ response from tomcat_1 ”  “ response from tomcat_2 ”之间切换,但 session 值保持为 ‘56E2FAE376A47F1C0961D722326B8423’

4、使用 redis-cli 连接 redis 服务器,查看会显示有 “56E2FAE376A47F1C0961D722326B8423” key的 session 数据,value为序列化数据。

十、至此实现了基于nginx负载均衡下 tomcat 集群的 session 一致性。

启动顺序:redis——nginx——tomcat

redis启动脚本=/usr/locat/redis.2.0.1/src/redis-server

nginx+tomcat+redis实现session共享

以上就介绍了nginx+tomcat+redis实现session共享,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Windows11安装10.0.22000.100跳出0x80242008错误解决办法 Windows11安装10.0.22000.100跳出0x80242008错误解决办法 May 08, 2024 pm 03:50 PM

1、启动【开始】菜单,输入【cmd】,右键点击【命令提示符】,选择以【管理员身份】运行。2、依次输入下面命令(可小心复制贴上):SCconfigwuauservstart=auto,按回车SCconfigbitsstart=auto,按回车SCconfigcryptsvcstart=auto,按回车SCconfigtrustedinstallerstart=auto,按回车SCconfigwuauservtype=share,按回车netstopwuauserv,按回车netstopcryptS

剖析 PHP 函数瓶颈,提升执行效率 剖析 PHP 函数瓶颈,提升执行效率 Apr 23, 2024 pm 03:42 PM

PHP函数瓶颈导致性能低下,通过以下步骤解决:定位瓶颈函数,使用性能分析工具。缓存结果以减少重新计算。并行处理任务,提高执行效率。优化字符串连接,使用内建函数替代。利用内建函数代替自定义函数。

Golang API缓存策略与优化 Golang API缓存策略与优化 May 07, 2024 pm 02:12 PM

GolangAPI中的缓存策略可提升性能和减轻服务器负载,常用策略有:LRU、LFU、FIFO和TTL。优化技巧包括:选择合适的缓存存储、分级缓存、失效管理以及进行监控和调整。实操案例中,使用LRU缓存优化从数据库获取用户信息的API,可从缓存中快速检索数据,否则从数据库中获取后再更新缓存。

PHP开发中的缓存机制与应用实战 PHP开发中的缓存机制与应用实战 May 09, 2024 pm 01:30 PM

在PHP开发中,缓存机制通过将经常访问的数据临时存储在内存或磁盘中来提升性能,从而减少数据库访问次数。缓存类型主要包括内存、文件和数据库缓存。PHP中可以使用内置函数或第三方库实现缓存,如cache_get()和Memcache。常见的实战应用包括缓存数据库查询结果以优化查询性能,以及缓存页面输出以加快渲染速度。缓存机制有效改善网站响应速度,提升用户体验并降低服务器负载。

eclipse如何添加服务器 eclipse如何添加服务器 May 05, 2024 pm 07:27 PM

要将服务器添加到 Eclipse,请执行以下步骤:创建服务器运行时环境配置服务器创建服务器实例选择服务器运行时环境配置服务器实例启动服务器部署项目

PHP数组分页中如何使用Redis缓存? PHP数组分页中如何使用Redis缓存? May 01, 2024 am 10:48 AM

使用Redis缓存可以大幅优化PHP数组分页的性能。可通过以下步骤实现:安装Redis客户端。连接到Redis服务器。创建缓存数据,将每页数据存储到Redis哈希中,密钥为"page:{page_number}"。从缓存中获取数据,避免对大型数组进行昂贵的操作。

Win11英文21996怎么升级到简体中文22000_Win11英文21996升级到简体中文22000的方法 Win11英文21996怎么升级到简体中文22000_Win11英文21996升级到简体中文22000的方法 May 08, 2024 pm 05:10 PM

首先你需要将系统语言设置为简体中文显示并重启。当然,之前已经改为简体中文显示语言的直接跳过这一步即可。下面开始操作注册表,regedit.exe,左侧导航栏或上方地址栏直接定位到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsLanguage,然后将其中的InstallLanguage键值、Default键值全部修改为0804(如果想改为英文的en-us,需要先将系统显示语言设置为en-us,重启系统再全部修改为0409)进行到这里必须重启系

navicat能连接redis吗 navicat能连接redis吗 Apr 23, 2024 pm 05:12 PM

是的,Navicat 可以连接 Redis,它允许用户管理键、查看值、执行命令、监视活动和诊断问题。要连接 Redis,请在 Navicat 中选择“Redis”连接类型,并输入服务器详细信息。

See all articles