reeze / msgpack-hhvm

Msgpack for HHVM (msgpack.org[HHVM])
MIT License
14 stars 16 forks source link

想问一下大神,nginx在做反向代理是,有多个upstream,如何保持session一致的问题 #13

Closed Jerry-goodboy closed 8 years ago

Jerry-goodboy commented 8 years ago

我现在的开发环境是这样子的,三个小型的web服务器,想做tomcat集群,后来想用nginx来做反向代理和负载均衡,但是session的问题就出来的,比如客户端A访问服务端A的session在服务端A中,但是nginx负载均衡后,当把客户端A的请求转发到服务端B的时候,又创建了一个session,并且强制客户端A登陆,我在网上找到了四种方法,但是,我还是不清楚,到底哪种方法更好,ip_hash,我感觉是这里面比较好的,大公司里使用nginx做反向代理和负载平衡的时候都是怎么做的?nginx在做反向代理和负载均衡的时候需要考虑的方面有哪些?大公司在实战中的最佳实践又有哪些,网上找到的都是方向代理和负载均衡如何配置的教程,引起的副作用或者说一个大型网站需要考虑的方方面面却没有提及,求大神指导。 还有一个现实驱动是,有一些项目我们这边是纯前端的开发,接口由另一方写,我们ajax调用,这就涉及到跨域,后来用nginx反向代理解决了,并且可以利用nginx来rewrite一些固定的需要传给接口的静态参数,可是,问题又来了,需要传给接口的参数有一些是需要动态变化并且又不想在前端暴露的参数,那么就需要nginx得有根据参数来做路由转发的能力,这方面我涉猎的少,这块该怎么做? 比如我ajax的请求链接是 http://api.backend.com/books/,我前端传的参数是 bookname=snow,但是在nginx做转发的时候,需要带上几个验证参数,比如是 sign=cdsdxxdsf900sdf&type=web,这种的前端浏览器通过开发者工具也看不到的参数,这些静态的参数好办,可以rewrite,但是,接口那边又要求传一个字段,copyright=free,或者copyright=purchase,等这样的需要通过书名来判断的动态参数,并且不能在前端做判断,并且在不用PHP,node等后端脚本语言的前提下, nginx如何做到,根据我前端传的 bookname=snow ,来动态的决定copyright是free 还是 purchase,请问这种代码在nginx里怎么写?

Jerry-goodboy commented 8 years ago

@reeze @steelbrain @mlmarinov

reeze commented 8 years ago

状态的问题一般的做法是把session状态存到持久存储服务里,一般是memcache或者MySQL中,这样服务就没有状态了,这样才能水平扩展。

On 2 October 2016 at 00:04, liucaidong notifications@github.com wrote:

@reeze https://github.com/reeze @steelbrain https://github.com/steelbrain @mlmarinov https://github.com/mlmarinov

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/reeze/msgpack-hhvm/issues/13#issuecomment-250920360, or mute the thread https://github.com/notifications/unsubscribe-auth/AAA5QuWktrbQ77I_NFZd5nAIVcsgokR8ks5qvoSlgaJpZM4KLyh0 .

Reeze Xia http://reeze.cn

Jerry-goodboy commented 8 years ago

@reeze 大神能给个nginx + PHP 相关的 session持久化问题的例子或者帖文么?我现在还是不太会弄,我再上一张我刚刚画的图来阐述一下我现在遇到的问题:

2016-10-03 22 15 51

首先说一下我们现在用的服务器的组织构成,第一个放在前端的是nginx服务器,其最主要的功能就是反向代理和负载均衡,其内部不运行任何PHP代码。

然后就是最关键的一点了,就是nginx转发过来的请求,无论其内部选用ip_hash也好还是其他的什么负载方式,现在就是在想,有什么好办法可以让nginx无论转发哪个URL请求,也无论是转到给哪个API server,都希望其所命中的 session 是正确的,举个例子:

这个过程就不对了,现在我遇到的就是这种情况,请问大神如何破?

Jerry-goodboy commented 8 years ago

@reeze 大神在么,求助啊

springwei commented 8 years ago

持续关注

reeze commented 8 years ago

应为session是一种状态,不能存储到单机上,要做的就是让这些server无状态,要检查用户是否登录的时候去中心的点(数据库或者其他存储,redis,memcache等)检查。Google下应该有很多的例子的: http://culttt.com/2013/02/04/how-to-save-php-sessions-to-a-database/ http://php.net/session_set_save_handler

evanwu66 commented 7 years ago

这个问题你解决了吗?我刚好也遇到需要这样做