Redis管理Session+Nginx負載均衡+Docker+Tomcat

本文是一篇關於技術整合的文章,以一個Web應用爲例,使用Docker容器來部署咱們的應用,並將Session交給Redis來存儲和管理,涉 及到Docker/Redis/Tomcat/Nginx/Spring Web/Spirng Web MVC等技術。其中:
Docker——容器技術或虛擬化技術,能夠將咱們的application及相關依賴打包到一個容器內,方便移植、集羣部署,容器徹底使用沙箱機制,容 器之間互不影響徹底獨立。下文全部的server都是部署在Docker中,不瞭解Docker和相關操做的能夠先看看這篇文章。html

Redis——一種開源的,先進的 key-value 存儲數據庫,可用於構建高性能、可擴展的 Web 應用程序的解決方案。本文中用來存儲和管理Session。linux

Nginx——高性能的HTTP和反向代理服務器。本文中用來作負載均衡。nginx

部署結構以下圖所示:

環境信息

系統版本:CentOS 7
JDK版本:jdk1.8.0_60
Apache Tomcat版本:6.0.44
Docker版本:1.7.1
Redis版本:3.2.1
Nginx版本:1.10.1
本文中宿主機IP:192.168.111.128git

注:下文中相關技術的詳細信息不重複說明了,須要的能夠去官網查詢。
 github

Docker篇

1.安裝與配置web

這個過程不說了,省略1000字……(看前面發的文章
http://my.oschina.net/buran/blog/657690redis

2.Docker設置代理——不須要設置代理的,能夠跳過docker

vi /etc/sysconfig/docker

添加以下配置,替換上你本身的代理地址便可:
# proxy setup
http_proxy="YOUR_PROXY_ADDR"
https_proxy="YOUR_PROXY_ADDR"shell

3.啓動Docker服務數據庫

service docker start
沒有報錯,說明啓動成了。

Redis篇

如何在docker容器中部署一個Redis服務呢?

1.得到一個包含Redis的鏡像

能夠本身製做一個包含Redis的鏡像。或者你能夠查找docker hub上是否有咱們須要的鏡像。

查找鏡像:

docker search redis

發現有一個,咱們能夠直接拿來用,而後拉取遠程鏡像到本地:

docker pull docker.io/redis

2.啓動鏡像並啓動Redis Server

運行並綁定端口到宿主機端口(本文以8888爲例),兩種方法:

方法1:
docker run -i -t --name redis-server-01 -p 8888:6379 -v /opt/conf/redis.conf:/usr/local/etc/redis/redis.conf docker.io/redis /bin/bash
再執行:
redis-server /usr/local/etc/redis/redis.conf &

我比較喜歡這種方式,由於比較方便,可讓redis啓動後在後臺運行,而後能夠作其餘的操做。方法2不能退出redis的shell,退出了redis就關閉了。

方法2:
docker run -i -t --name redis-server-01 -p 8888:6379 -v /opt/conf/redis.conf:/usr/local/etc/redis/redis.conf docker.io/redis redis-server /usr/local/etc/redis/redis.conf

注意:
Centos7中因爲selinux的問題,可能有權限問題,HOST目錄掛載到Container後沒法訪問,解決方法:
添加selinux安全規則,在host上執行chcon -Rt svirt_sandbox_file_t /hostdir

本例中爲:chcon -Rt svirt_sandbox_file_t /opt/conf

3.Redis容器啓動完成

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES

7cee5346b83a        docker.io/redis     "docker-entrypoint.s   2 minutes ago       Up 2 minutes        0.0.0.0:8888->6379/tcp   redis-server-01

能夠用telnet來驗證Redis是否啓動成功,執行一下SET/GET操做:
telnet 192.168.111.128 8888

相關telnet操做命令見這裏(http://blog.sina.com.cn/s/blog_62b832910100uvsu.html)。

Tomcat篇

要用Tomcat來存儲Session,咱們須要用到tomcat-redis-session-manager,Git主頁(https://github.com/jcoleman/tomcat-redis-session-manager.git),詳細的介紹本身去看吧,這裏很少說了。

1.編譯tomcat-redis-session-manager

下載Project到本地編譯,生成jar文件:
git clone https://github.com/jcoleman/tomcat-redis-session-manager.git


此外須要依賴jedis和commons-pool2,我用的版本分別是2.5.0和2.0,視狀況能夠依賴你本身須要的版本,若是遇到問題編譯不經過能夠修改Project的相應代碼,才5個Class,看了一下修改也不難。

2.配置Tomcat

要用Redis來存儲和管理Session,咱們須要修改content.xml,來改變Tomcat

的Session管理方式,以下:
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /><Manager className="com.radiadesign.catalina.session.RedisSessionManager"  
    host="172.17.0.3"
    port="6379"
    database="0"
    maxInactiveInterval="120" />

Redis服務器地址和端口、Session有效時間按本身須要配置。

3.在容器內部署Tomcat

主要如下幾個步驟:

2.1.   複製上面提到的jar文件到{Tomcat}/lib目錄

tomcat-redis-session-manager.jar
jedis-2.5.0.jar
commons-pool2-2.0.jar

2.2.   部署Tomcat到Docker容器內。

首先,把須要的文件準備好,並掛載倒容器裏去(參考:dock run -v)。
而後,複製Tomcat到容器裏面去。
最後,能夠把配置好的容器commit爲image,這樣方便之後使用。
    docker commit YOU_CONTAINER_ID IMAGE_NAME
    例如:docker commit 5954aa3698b2 webdc.with.redismanager

4.啓動容器和Tomcat

首先,以交互的方式啓動容器:
docker run --name application-server-01 -i -t -p 9001:8080 -v /root/webapps/:/opt/apache-tomcat-6.0.44/webapps/ webdc.with.redismanager /bin/bash

而後啓動Tomcat:
cd {Container Tomcat Path}/bin
./startup.sh.

OK了,看看Server是否是正常啓動了:

http://192.168.111.128:9001/registerandlogin
其中,-p 9001:8080 端口映射只是爲了方便操做而已,不是必須的。
 

5. 擴展

除了Redis外,你也能夠用MongoDB或者Memcached來存儲和管理Session:

MongoDB存儲Tomcat Session:
https://github.com/simplicityitself/Mongo-Tomcat-Sessions

Memcached存儲Tomcat Session
https://code.google.com/archive/p/memcached-session-manager/

Nginx篇

本文用Nginx來作負載均衡用,Nginx安裝在宿主機上。

1.安裝

下載對應當前系統版本的nginx包(package)

wget  http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

創建nginx的yum倉庫

rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm

下載並安裝nginx

yum install nginx

啓動nginx服務

systemctl start nginx
或者
service nginx start

2.測試,看看Nginx是否安裝正確

在瀏覽器地址欄中輸入部署nginx環境的機器的IP:
http://192.168.111.128/
不出意外的話,應該能看到以下字樣的內容:

Welcome to nginx!

若是不能的話看看有什麼錯誤,服務是否啓動,防火牆是否阻止了訪問等等。

3.負載均衡配置

本文用Nginx作負載均衡之用,下面來看看怎麼配置:
vi /etc/nginx/nginx.conf

在http段裏面加上以下配置:
# 設置負載均衡列表
upstream registerandlogin {

  server 172.17.0.6:8080;
  server 172.17.0.7:8080;
  server 172.17.0.8:8080;

}

server {

  listen  80;
  server_name 192.168.111.128; #我沒有用域名,因此直接寫IP了
  # /表示匹配任何請求,固然本例中你能夠寫/registerandlogin 
  location / {
    //將全部請求轉發到registerandlogin 負責均衡列表 配置的server中去
    proxy_pass http://registerandlogin;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
  access_log /var/log/nginx/registerandlogin.access.log main;
}
 

4. 驗證負載均衡配置是否正確
來,溜一個,看看是否配置正確,在瀏覽器訪問:
http://192.168.111.128/registerandlogin/
沒壓力,正常跑起來了(registerandlogin是爲了測試用,隨便寫的一個註冊登陸功能,會一塊兒上傳)。
192.168.111.128是Nginx server,請求最終會轉發到上面配置的3個application server去。

至此,整合過程已經完成,下面看看目前爲止咱們的各個容器的基本信息:
[root@localhost ~]# docker inspect -f 'Container IP :{{.NetworkSettings.IPAddress}}, and name is :{{.Name}}' `docker ps -q`

Container IP :172.17.0.8, and name is :/application-server-03
Container IP :172.17.0.7, and name is :/application-server-02
Container IP :172.17.0.6, and name is :/application-server-01
Container IP :172.17.0.3, and name is :/redis-server-01

整合配置過程的關鍵步驟上文都有記錄,各個模塊的詳細配置並無深刻,好比:
一、Redis的優化及集羣配置。
二、Tomcat的優化。
三、Nginx優化、靜態資源分離等等。

有時間再來詳細的扒拉扒拉這些吧

相關文章
相關標籤/搜索