前言
一個項目最開始可能都是通過一個war包開始萌芽,把這個war包放到tomcat裏面運行起來,整個項目就ok了;
But,隨着併發量,用戶量達到一定數目,一個tomcat就搞不定了,這個時候會用到Nginx,使用Nginx來做分流;
如果是一些查詢頁面沒什麼問題,可一旦項目要用到登陸,這就捅婁子了,用戶登陸的Session是存放在服務器上,而當用戶訪問另外一個服務器就會出現沒有登陸的情況;
不過在解決這問題之前,先講下Nginx的基本使用
1. Nginx多tomcat負載配置
Nginx可以提供當有多個服務器的時候可以提供負載均衡的功能,如果有某個服務器宕機可以提供故障轉移,當出現網絡波動的時候可以提供失敗重試機制,不管是什麼樣的機制,首先需要配置多個服務,這裏的服務使用Upstream進行配置
1.1. Upstream Server配置
upstream 主要配置如下:
IP地址和端口號:配置上游服務器的IP地址和端口
1.2. 負載均衡算法
1、輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務,如果後端某臺服務器死機,自動剔除故障系統,使用戶訪問不受影響。
2、weight(輪詢權值)
weight的值越大分配到的訪問概率越高,主要用於後端每臺服務器性能不均衡的情況下。或者僅僅爲在主從的情況下設置不同的權值,達到合理有效的地利用主機資源。
3、ip_hash
每個請求按客戶端P的哈希結果分配,使來自同一個IP的訪客固定訪問一臺後端服務器,並且可以有效解決動態網頁存在的session共享問題。俗稱IP綁定。
2. Session一致性解決方案
可以看到前面講負載均衡算法的時候可以使用ip_hash來實現session一致性的問題,因爲當有多個tomcat的時候,對於某個客戶端的登陸請求,由於其ip是固定的,所以最終一
還是會路由的固定的tomcat上;
實際除開上面的這種解決方案以外,還有另外一種SESSION一致性的解決方案,使用Redis來存放SESSION的內容,使用Spring Session框架,其底層其實就是重寫了HttpSession的獲取方式
2.1. pom文件修改
1. `<dependency>`
2. `<groupId>org.springframework.boot</groupId>`
3. `<artifactId>spring-boot-starter-data-redis</artifactId>`
4. `</dependency>`
5. `<dependency>`
6. `<groupId>org.springframework.session</groupId>`
7. `<artifactId>spring-session-data-redis</artifactId>`
8. `</dependency>`
2.2. 新增properties文件
application.properties文件內容如下,增加redis相關配置
1. `# Redis服務器地址`
2. `spring.redis.host=127.0.0.1`
3. `spring.redis.port=6379`
2.3. 新增啓動類
1. `package cn.enjoy.mt;`
2. `import org.springframework.boot.SpringApplication;`
3. `import org.springframework.boot.autoconfigure.SpringBootApplication;`
4. `import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;`
5. `@SpringBootApplication`
6. `@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)`
7. `publicclassApp{`
8. `publicstaticvoid main(String[] args) {`
9. `SpringApplication.run(App.class, args);`
10. `}`
11. `}`
2.4. 啓動Redis
啓動 /redis-serve redis.conf
2.5. 測試
用戶登陸後
這樣相應的登陸的session信息就存放到了Redis中