1. 程式人生 > >nginx 解決session一致性

nginx 解決session一致性

  1. session 粘滯性
  • 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。 
  • upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
    }
  • 但是有缺點,這存在單點風險,倘若我已經在192.168.0.14:88埠登入後,過段時間發現14伺服器掛了(session時間未過期),那麼這時候會訪問到15伺服器,那這時候需要重新登入,因為在拿14伺服器上的JsessionId去15伺服器請求發現不存在。

2、session 複製

  • 可以通過tomcat的server.xml檔案進行配置,這樣每個tomcat都會同步對應的session,那麼此時即使某個tomcat被宕機了,也不影響服務。
  • <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="auto"
                          port="4000"
                          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.MessageDispatchInterceptor"/>
              </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.ClusterSessionListener"/>
            </Cluster>

3、session 共享(springboot)

  •   對應的專案中pom檔案新增
  • <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-redis</artifactId>  
    </dependency>  
    <dependency>  
            <groupId>org.springframework.session</groupId>  
            <artifactId>spring-session-data-redis</artifactId>  
    </dependency>  
  • 在對應的application.properties中配置redis資訊
  • spring.redis.host=localhost  
    spring.redis.port=6379  
  • 新增開啟spring session支援的註解@EnableRedisHttpSession
  • @Configuration  
    @EnableRedisHttpSession  
    public class RedisSessionConfig {  
    } 
  • 新增驗證的介面
  • @Value("${server.port}")
        String port;
    
        @GetMapping("/session")
        public Object getSession(HttpServletRequest request){
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("SessionId", request.getSession().getId());
            map.put("ServerPort", "服務埠號為 "+port);
            return map;
        }
    
  • 我們看下redis快取的資料
  • 可以發現sessionId已經快取在redis資料庫中
  • 下面我們換個埠再訪問一次看看
  • 重新整理了redis資料庫,快取的資料也沒變
  • 結果中的SessionId是一致的,卻是由兩個不同專案工程來提供服務。這樣子,SpringSession 利用攔截器 Filter 幫我們在每個請求前進行了同步設定,達到了分散式系統中 session 共享。

4、session 共享(springmvc 版本)

首先在pom.xml檔案中新增對應的jar

 <dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>1.2.1.RELEASE</version>
  </dependency>
  <dependency>
     <groupId>redis.clients</groupId>
     <artifactId>jedis</artifactId>
      <version>2.8.1</version>
  </dependency>

在對應springmvc-context.xml檔案中配置

<bean id="redisHttpSessionConfiguration"
          class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <property name="maxInactiveIntervalInSeconds" value="600"/>
    </bean>

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="100" />
        <property name="maxIdle" value="10" />
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="connectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
        <property name="poolConfig" ref="jedisPoolConfig" />
        <property name="port" value="6379" />
        <property name="hostName" value="192.168.1.11" />
        <property name="password" value="xxx" />
        <property name="timeout" value="30000" ></property>
    </bean >

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="keySerializer">
            <bean  class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
        </property>
    </bean >

    <bean id="redisUtil" class="com.isea533.mybatis.service.RedisUtil" >
        <property name="redisTemplate" ref="redisTemplate" />
    </bean >

其次在web.xml中配置(非常重要,filter的名字必須是springSessionRepositoryFilter)

  <filter>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSessionRepositoryFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

訪問專案路徑呈現結果

223916_bL9y_2663968.jpg

相關推薦

nginx 解決session一致性

session 粘滯性 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。  upstream backserver { ip_hash; server 192.168.0.14:88; serv

nginx 解決session一致性

session 粘滯性 每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解

Centos7下Nginx+Tomcat配置反向代理,使用memcached解決session一致性問題

新版本 desc secure conn prot 多臺 for body 我們 一、session一致性問題 使用集群方案解決網站高並發問題時,就會部署多臺應用服務器。當用戶第一次通過客戶端(如:瀏覽器)訪問服務器時,服務器會創建對應的session, 使用

Centos7下Nginx+Tomcat配置反向代理,使用redis解決session一致性問題

localhost 第一次 方案 days tom gin align title 瀏覽器 一、session一致性問題 使用集群方案解決網站高並發問題時,就會部署多臺應用服務器。當用戶第一次通過客戶端(如:瀏覽器)訪問服務器時,服務器會創建對應的sessio

如何解決Nginxsession一致性問題

【需求】 如下圖,當用戶傳送請求的時候,經過nginx伺服器,nginx使用負載均衡把請求分發到不同的機器tomcat1或者tomcat2裡,這個時候會話id 在客戶端是沒有問題的,但是如果使用者的兩次請求到了兩臺不同的機器,而它的session資料可能存在其

Nginx+iis 中搭建的站點解決session 一致性解決方案

模擬負載均衡站點已經搭建完畢,那麼問題來了,兩個站點也許在不同的機器下使用不同ip和埠號,即使部署在同一機器下面,埠號也肯定不同。現在有很多的資訊儲存在session中,那麼session資訊的一致性該如何解決呢? Session 儲存在伺服器中,

Nginxsession一致性問題

一、我們知道Session的常見形式是會話cookie,即為設定過期時間的cookie,它的預設的生命週期為瀏覽器會話期間,一旦瀏覽器關閉視窗,這個cookie就消失了。其實現機制為:當用戶發起一個請求的時候,伺服器會檢查該請求中是否包含sessionID,如果不包含,則伺服器會生成一個

Nginxsession一致性問題——memcached快取session共享

HTTP協議是無狀態的,即你連續訪問某個網頁100次和訪問1次對伺服器來說是沒有區別對待的,因為它記不住你。那麼,在一些場合,確實需要伺服器記住當前使用者怎麼辦?比如使用者登入郵箱後,接下來要收郵件、寫郵件,總不能每次操作都讓使用者輸入使用者名稱和密碼吧,為了解決這個問題,

nginxnginx + tomcat + redis 負載均衡且session一致性

權限 gzip 通過 del 跳轉 home val zhang ctp 說明: 本文描述的是 nginx + tomcat + redis 實現應用負載均衡且滿足session一致性,從安裝到配置的全部過程,供大家學習!nginx 代理服務器ip: 10.219.24.2

Nginx + Tomcat7 + redis session一致性問題

        Nginx 作負載均衡時,由於是每次都需要把請求分發到不同的機器,同一個使用者在一臺機器上建立了 session,下一次的請求很有可能會轉發到另外一臺機器,會造成 session 丟失。我們可以使用 Redis 來儲存 se

nginx簡單入門和redis+session解決session問題

nginx是什麼? nginx高效能的 Web和 反向代理 伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器,IMAP就是internet mail acceess protocol(郵件訪問協議),和POP3的區別是它不需要使用者把所有郵件下載,可以

(三)配置nginx負載tomcat,redis解決session共享

Nginx ("engine x") 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的。 何為反向代理呢?即以代理伺服器來接受internet上的連線請求,然後將請

關於專案中session一致性問題的解決

session 記憶體 tomcat建立。 session和cookie是一對一,cookie會儲存sessionId–>>>JsessionId 分散式下session一致性問題解決方案 方案1 基於ngnix的ip_hash策

Tomcat8+Nginx+redis組合解決session同步的相關問題

    最近幾天,由於專案需要使用Nginx反向代理多個Tomcat8伺服器。我的環境是Linux平臺,實現了Nginx反向代理,卻出了一點問題:網站時,由於Tomcat是多臺為我們服務,每過一會,就會出現Session發生變化的問題。session變化,會使我們的專案出問題

分布式Session一致性解決方案有哪些?

tomcat 反向 gin 推薦 cookie cat 哪些 存儲 session 1.使用cookie代替session(不安全,不推薦使用) 2.使用數據庫存儲session(效率低,不推薦使用) 3.使用nginx反向代理ip綁定方法,同一個ip只能在同一臺服務器

session一致性解決方案

更多內容,歡迎關注微信公眾號:全菜工程師小輝。公眾號回覆關鍵詞,領取免費學習資料。 什麼是session? 伺服器為每個使用者建立一個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同一個上下文,這個相關資訊就是session。這樣,當用戶在應用程式的Web頁之間跳轉時,儲存在session物件中的變數將不

nginx 解決css、js請求路徑無法加載問題

proxy dem jfinal pan oot usr bmp 兩個 cli location / { proxy_pass http://jfinaldemo; root /usr/share/nginx/html;

解決session共享的幾種思路

數據共享 解決 png coo img 內置 文件中 請求 方案 session與cookie的區別在於:session是保存在服務器端,cookie保存在客戶端。session怎麽樣保存的?以文件的形式保存。 第一種辦法:把原來存儲在服務器磁盤上的session數據存儲到

TP5解決session短時間過期問題

expire con php文件 art 開啟 exp fig coo tp5 在項目config.php文件中設置session和cookie ‘session‘ => [ // 是否自動開啟 SESSION ‘auto_start‘

nginx解決瀏覽器訪問http自動轉向https問題

etc oca pass toc col cer var proto blog nginx配置文件如下: server { listen 443 ssl http2; server_name zt.test.com; ssl on;