基于docker+nginx+tomcat容器+mysql容器部署Java web项目实现负载均衡实战

转自:  https://blog.csdn.net/liqz666/article/details/82222511

docker安装jdk与tomcat详细介绍: https://blog.csdn.net/qq_30764991/article/details/81874099

jenkins部署项目直接发布到远程tomcat中: https://blog.csdn.net/yuanyuan214365/article/details/81813386

jenkins gitlab maven tomcat实现自动集成、打包、远程部署:  https://mp.csdn.net/postedit

 

在docker里运行的tomcat容器+mysql容器部署Java web项目:  https://blog.csdn.net/liqz666/article/details/82253486

docker+jenkins+git自动打包部署(1): https://blog.csdn.net/u012922706/article/details/81027671

 

编译打包tomcat-redis-session-manager(包含Tomcat7和Tomcat8的两个版本):  https://blog.csdn.net/github_39577257/article/details/80833704

关于docker 基于一个tomcat镜像来部署多个tomcat容器并运行: https://blog.csdn.net/weixin_43052839/article/details/91990860

centos7安装docker创建tomcat并部署web项目: https://blog.csdn.net/weixin_43052839/article/details/91986930

 

docker搭建tomcat小型集群:  https://blog.csdn.net/qxianx/article/details/90750636

 

SSH 连接总是定期断掉的解决办法:   https://blog.csdn.net/kl28978113/article/details/91574914

使用jenkins实现自动化部署的案例记录:tomcat+svn+maven+ssh+jenkins: https://blog.csdn.net/y41992910/article/details/83055902

CentOS7下使用docker,完成Jenkins镜像、tomcat镜像制作和启动: https://blog.csdn.net/sdfiiiiii/article/details/82887922

docker部署tomcat及web应用全过程和三种实现方式。: https://blog.csdn.net/dataiyangu/article/details/82736875

docker下部署web项目到tomcat: https://blog.csdn.net/happy_bigqiang/article/details/82390019

vue项目打包后部署到云服务器tomcat ROOT下面: https://blog.csdn.net/qb170217/article/details/82185745

(转载)idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到: https://blog.csdn.net/lwwl12/article/details/82015682

SpringBoot 打包成war包,部署到tomcat: https://blog.csdn.net/douxingpeng1/article/details/81734921

Docker for Windows打包制作tomcat镜像并部署java web项目: https://blog.csdn.net/qq_34924407/article/details/81386031

windows环境下使用jenkins自动部署发布项目部署到tomcat webapps文件夹下: https://blog.csdn.net/u013278314/article/details/81179528

利用docker 平台部署tomcat项目: https://blog.csdn.net/baidu_38432732/article/details/81081819

gitlab+jenkins+tomcat实现代码自动部署: https://blog.csdn.net/kaikai0720/article/details/80997189

publish over ssh 实现 Jenkins 远程部署 / jenkins 远程执行shell 一键远程发布 tomcat / jenkins分别发布多个项目到多个远程主机: https://blog.csdn.net/zzzgd_666/article/details/80907749

oracle分页时排序问题: https://blog.csdn.net/jhfsdfs/article/details/88377650

tomcat 配置访问manager以及jenkins部署到tomcat: https://blog.csdn.net/fireofjava/article/details/80872308

推荐一个项目:数据结构和算法必知必会的 50 个代码实现: https://blog.csdn.net/kexuanxiu1163/article/details/91461215

人才网项目总结: https://blog.csdn.net/Jouzeyu/article/details/91614103

 

 

 

负载均衡原理:基于centOs-7的环境,安装nginx,运行docker里的两个以上的tomcat服务器,一般情况访问Java web项目的jsp页面,通过直接tomcat来访问的,但是我们现在不通过对tomcat进行访问页面,而是通过直接访问nginx进行访问,即你发出请求到nginx,nginx再request到tomcat,tomcat然后reponse到nginx,nginx 把接收到的服务转化为视图响应到客户端,这个过程,ngixn实行了拦截,或者说是代理,随机访问其中任何一个tomcat提供的服务,如果其中的一个tomcat无法提供服务,nginx就访问另一个tomcat.

 

前提:基于centos-7环境,安装docker和nginx,在docker里搭建两个或两个以上tomcat集群(多个tomcat容器)和mysql容器,并成功地把web应用程序部署到docker里的tomcat集群里,如果这些你还没有做到,请参考我的博客,https://blog.csdn.net/liqz666/article/details/82253486;注意一定要把Java web应用程序部署到两台及两台以上地tomcat容器里,这样实现负载均衡才有意义。

常用命令简介:

ps -ef | grep xxx:查看某个进程是否存在。

kill pid:杀死已经启动的某个进程

docker ps:查看正在运行的容器(status为Up....)

docker exec -it NAMES(自定义容器名称) bash:进入某个容器内部

docker cp /xxx.war NAMES(自定义容器名称):/usr/local/tomcat/webapps:将打包后的java web项目部署到tomcat容器的webapp目录下。

exit:退出某个容器

vi /etc/sysconfig/iptables

nginx常用命令

cd /usr/local/nginx/sbin ./nginx:启动nginx服务
nginx服务启动后默认的进程号会放在/usr/local/nginx/logs/nginx.pid文件
cat nginx.pid 查看进程号

查看Nginx的版本号:nginx -V

启动Nginx:start nginx

快速停止或关闭Nginx:nginx -s stop

正常停止或关闭Nginx:nginx -s quit

配置文件修改重装载命令:nginx -s reload

1、可以看到我在docker里创建了两个tomcat容器,tomcat1和tomcat2,端口分别为8081,8082,作为tomcat服务器集群,和一个mysql容器,数据库我已经导进mysql容器里了;然后由nginx作为代理服务,首先要在centos-7宿主机里安装nginx,此过程我们就不重复了,然后把你的Java web项目打包成war文件后分别导入docker里地两个tomcat容器里,下次我们直接访问nginx,nginx再随机访问tomcat1和tomcat2提供的服务,响应给客户端。

[root@localhost ~]# docker run --name tomcat1 -p 8082:8080 -d tomcat

[root@localhost ~]# docker run --name tomcat2 -p 8082:8080 -d tomcat

[root@localhost ~]# docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWROD=123456 -d mysql
4b6d1f5af350526e8eb7baa5f2049a5858a9c869f22c671d985fa98e01510275
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                               NAMES
4b6d1f5af350        tomcat              "catalina.sh run"        3 seconds ago        Up 2 seconds        0.0.0.0:8082->8080/tcp              tomcat2
2cebf95eded9        tomcat              "catalina.sh run"        About a minute ago   Up About a minute   0.0.0.0:8081->8080/tcp              tomcat1
216c535c46c7        mysql:5.7           "docker-entrypoint..."   3 hours ago          Up 52 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

 

2、将宿主机里的根目录下的war文件(打包地Java web项目)分别导入到tomcat1和tomcat2容器里,war文件会自动解压,看到了么,我已经部署成功了。

[root@localhost ~]# ls /
bin   dev  first.war  lib    media  mytest1  nginx-1.6.2  proc  run   srv  tmp              two.war  var
boot  etc  home       lib64  mnt    mytest2  opt          root  sbin  sys  tracingfood.war  usr
[root@localhost ~]# docker cp /tracingfood.war tomcat1:/usr/local/tomcat/webapps
[root@localhost ~]# docker cp /tracingfood.war tomcat2:/usr/local/tomcat/webapps
[root@localhost ~]# docker exec -it tomcat1 bash
root@2cebf95eded9:/usr/local/tomcat# ls webapps
ROOT  docs  examples  host-manager  manager  tracingfood  tracingfood.war
root@2cebf95eded9:/usr/local/tomcat# exit
exit
[root@localhost ~]# docker exec -it tomcat2 bash
root@4b6d1f5af350:/usr/local/tomcat# ls webapps
ROOT  docs  examples  host-manager  manager  tracingfood  tracingfood.war
root@4b6d1f5af350:/usr/local/tomcat# exit

 

这个是tomcat2:8082提供的服务。 

这个tomcat1:8081端口提供的服务

 输入用户密码后,成功登入了由tomcat1:8081提供的服务,如果你没有连接mysql容器的数据库登陆的话,肯定404错误。

 输入用户密码后,成功登入了由tomcat2:8082提供的服务,如果你没有连接docker里的mysql容器的数据库登陆的话,到不了这里的。

 3、更改nginx的配置文件实现负载均衡

[root@localhost ~]# ps -ef | grep ngixn
root       8910   6389  0 14:46 pts/0    00:00:00 grep --color=auto ngixn//说明服务还未启动
[root@localhost ~]# ^C
[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
 

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream myweb{//名称要一致,我部署两台容器,两个tomcat服务器集群来服务,任何客户端向nginx发出的请求,这两台tomcat会随机响应,weight值越大,让它去访问的机率就大。
        server 192.168.159.130:8082 weight=2;
        server 192.168.159.130:8081 weight=1;
    }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
          proxy_pass http://myweb;//实现nginx代理,随机访问tomcat1和tomcat2
          proxy_redirect default;//设置默认的nginx代理,而不是访问下面的默认的nginx的index.html页面
         #root   /usr/local/nginx/html;
          #index  index.html index.htm;
        }

4、启动nginx的代理服务,每配置一次,就要重启一次,重启之后,需要编辑编辑防火墙的设置,这里一定要注意,你要配置80的端口,你只能问nginx了,nginx代理去随机访问任意docker里的tomcat容器,你再通过http://192.168.159.130:8082/tracingfood/userlogin.jsp或者http://192.168.159.130:8081/tracingfood/userlogin.jsp 就不能访问到tomcat响应的页面了,你要先去访问nginx,nginx再去访问tomcat,然后把相应的页面响应给客户端。

[root@localhost sbin]# cd /
[root@localhost /]# cd /usr/local/nginx/sbin ./nginx//启动nginx的服务
[root@localhost sbin]# ps -ef |grep nginx
root       9018   6389  0 15:31 pts/0    00:00:00 grep --color=auto nginx
[root@localhost sbin]# cd /usr/local/nginx/sbin
[root@localhost sbin]# ./nginx
[root@localhost sbin]# ps -ef |grep nginx
root       9020      1  0 15:31 ?        00:00:00 nginx: master process ./nginx//服务已启动
nobody     9021   9020  0 15:31 ?        00:00:00 nginx: worker process
root       9023   6389  0 15:31 pts/0    00:00:00 grep --color=auto nginx

[root@localhost ~]# vi /etc/sysconfig/iptables
[root@localhost ~]# service iptables restart
Redirecting to /bin/systemctl restart iptables.service 

# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
~
~
~
看到没,防火墙里有nginx的80端口,mysql的3306端口,你都可以通过ip地址对其进行远程访问,如果你还想直接访问tomcat提供的服务,好办,在3306下面添加一个8080的端口就ok了

你只能通过nginx访问tomcat的服务了,它实现了代理,你不能直接访问tomcat的服务,如果想访问可以在iptables里面添加一个8080的端口(-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT )

 你只能通过nginx访问tomcat的服务了,它实现了代理,你不能直接访问tomcat的服务,如果想访问可以在iptables里面添加一个8080的端口(-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT )

5、下面是客户端向nignx发出请求,nginx向tomcat1或tomcat2发出请求,weight值越大,分配到哪个服务器的概率就大,下面的页面可能是tomcat1也可能是tomcat2相应的的,而不是直接对tomcat服务器进行访问,负载均衡说的就是,假设有多台tomcat服务器,如果其中的有一台坏掉了,这台无法提供服务,其他的服务器依然可以提供服务,这个时候nginx负载均衡的作用就体现了。

 

 

结束语:另外大家注意,我没有在docker里搭建nginx容器,我直接用的centos里nginx,大家可以尝试自己在docker里创建nginx容器,tomcat集群,mysql容器实现负载均衡。

博主寄语:由于我水平有限,理解、编写能力等限制,有些疏漏在所难免,希望大家喜欢,如有错误,欢迎指出——》

                                                                                                                                                    公元2018年8月31日下午17:56写


--------------------- 
作者:李庆照 
来源:CSDN 
原文:https://blog.csdn.net/liqz666/article/details/82222511 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值