负载均衡原理:基于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写