共计 11036 个字符,预计需要花费 28 分钟才能阅读完成。
一、简介
【Nginx】 大名鼎鼎, 麻雀虽小五脏俱全,它拥有小而稳且高效的特性。为目前大多数中小企业所使用。nginx 可以做以下几件事:
- 反向代理
- 负载均衡
- 动静分离
- 网页、图片缓存
【Tomcat】 是一个免费开放源代码的 Web 应用服务器,具有开源免费、容易安装、容易使
用、占用资源小、易于和其他软件集成等优点。
Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载
平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感
兴趣的程序员都可以更改它或在其中加入新的功能。
【N+ T 的负载均衡】
然而他们的组合将是一把无与伦比的利刃。首先说明一下它的请求原理(路径走向)
Nginx 作为反向代理服务器,实现负载均衡。首先浏览器发起请求,到达 Nginx,由 Nginx 将请求地址转发给相应的 tomcat 服务器,再由 tomcat 服务器将结果返回给 Nginx,Nginx 将结果再转发给浏览器。
下面上图:
图中的信息显而易见,以 nginx 服务器作为中转分发请求,以达到负载均衡的目的。
二、环境需求
【由于博主的主机(脸红~)配置低,所以只开一开虚拟机作为这次负载均衡的测试。一个 ip 三个端口既可实现上图所述的效果了】
主机 A:192.168.0.144/24
apache-tomcat-6.0.35.tar.gz tomcat 6 使用的主要端口:18080
apache-tomcat-7.0.82.tar.gz tomcat 7 使用的主要端口:28080
apache-tomcat-8.5.23.tar.gz tomcat 8 使用的主要端口:8088
nginx-1.0.12.tar.gz
jdk7u79linuxx64.tar.gz
(其他一些基础环境比如 gcc-c++ 的自己补全吧)
三、各个环境的搭建
3.1 Nginx 搭建
先把所有准备好的软件工具放到一个目录下(都先准备好必用软件,不然配置起来才去找软件是很烦人的)
[root@N+T lhl]# ll
total 175172
-rw-r--r-- 1 root root 9472492 Dec 1 2017 apache-tomcat-8.5.23.tar.gz
-rw-r--r-- 1 root root 153512879 Dec 7 2017 jdk7u79linuxx64.tar.gz
-rw-r--r-- 1 root root 691002 May 9 2012 nginx-1.0.12.tar.gz
-rw-r--r-- 1 root root 15692490 Nov 29 2017 Tomcat6-7.zip
接下来安装一下开发环境
[root@N+T lhl]# yum -y install gcc gcc-c++
在 /usr 目录下面创建一个 nginx 的目录,并把 nginx 包移动到该目录下,再解压到该目录下面
[root@N+T lhl]# mkdir -p /usr/nginx
[root@N+T lhl]# mv nginx-1.0.12.tar.gz /usr/nginx/ &&cd /usr/nginx/&&tar -zxvf nginx-1.0.12.tar.gz
最好进入 nginx-1.0.12 目录,再编译安装
[root@N+T nginx-1.0.12]# ./configure &&make &&make install
一般编译安装都默认在 /usr/local/nginx/ 目录下面,下面这个就是 nginx 的主程序。
[root@N+T sbin]# ll /usr/local/nginx/sbin/nginx
-rwxr-xr-x 1 root root 954836 Aug 16 04:43 /usr/local/nginx/sbin/nginx
本博文为了搭建的方便直接把这个主程序拉倒 /usr/bin/ 目录下了
[root@N+T sbin]# cp -a /usr/local/nginx/sbin/nginx /usr/bin/
下面是配置文件
[root@N+T sbin]# ll /usr/local/nginx/conf/nginx.conf
简单的配置了一下配置文件
#####nginx+3 T 负载均衡测试 ############
##### 最简化的配置文件了 --###############
user nobody; #对于用户有安全性限制的伙伴可以创建一个账户去使用
worker_processes 1;
events {
use epoll;
worker_connections 1024;
}
http
{
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 60; #简单文本显示格式编辑
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 8 128k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /dev/shm;
server{listen 80;
server_name localhost;
access_log /var/log/nginx/aeecss.log;
error_log /var/log/nginx/error.log;
location / {proxy_pass http://li7105.com;
proxy_redirect default;
}
}
}
下面运行 nginx,查看信息
[root@N+T sbin]# /usr/bin/nginx -c /usr/local/nginx/conf/nginx.conf
[root@N+T sbin]# ps -ef | grep nginx
root 1561 1 0 13:04 ? 00:00:00 nginx: master process /usr/bin/nginx -c /usr/local/nginx/conf/nginx.conf
www 1562 1561 0 13:04 ? 00:00:00 nginx: worker process
root 1709 1573 0 18:49 pts/1 00:00:00 grep --color nginx
注意:nginx 没有启动起来,麻烦去认真的检查一下 nginx 配置文件。
PS:开机机动启动的话,直接把启动代码丢进 rc.local 这个文件里面即可。
[root@N+T lhl]# echo "/usr/bin/nginx -c /usr/local/nginx/conf/nginx.conf" >> /etc/rc.d/rc.local
nginx 的基本部署完成!
3.2 Tomcat 的搭建
由于 tomcat 依赖于 jdk 环境下运行,所以先搭建 jdk 环境,配置变量环境
[root@N+T lhl]# mkdir /usr/Java/
[root@N+T lhl]# mv jdk7u79linuxx64.tar.gz /usr/java/ && cd /usr/java/ && tar -zxvf jdk7u79linuxx64.tar.gz
[root@N+T java]# ll
total 4
drwxr-xr-x 8 uucp 143 4096 Apr 11 2015 jdk1.7.0_79
[root@N+T java]# cd jdk1.7.0_79/
[root@N+T jdk1.7.0_79]# pwd #看清楚路径
/usr/java/jdk1.7.0_79
[root@N+T jdk1.7.0_79]#
PS: 关于软件依赖的变量环境
就目前来去为一个软件或者环境的运行去搭建变量环境主要用下面三种方法
1、在 /etc/profile 下配置,这属于大环境的配置了。不过管理上不灵活,属于点到面的管理(本博文由于只有这个 tomcat 用到,所以在这配置了)
2、在 /etc/profile.d/ 目录下面创建一个专属的变量环境如:tomcat.sh 在里面指的变量路径以及文件路径,这种方式管理很灵活,属于点到点的管理。
3、在软件的某个文本下面去直接添加指定的变量环境,如 tomcat 的。
[root@N+T bin]# pwd
/usr/tomcatG/tomcat6/bin
[root@N+T bin]# ll
total 612
-rw-r--r-- 1 root root 22705 Nov 28 2011 bootstrap.jar
-rw-r--r-- 1 root root 11830 Nov 28 2011 catalina.bat
-rwxr-xr-x 1 root root 17708 Nov 28 2011 catalina.sh
-rw-r--r-- 1 root root 2374 Nov 28 2011 catalina-tasks.xml
-rw-r--r-- 1 root root 24172 Nov 28 2011 commons-daemon.jar
-rw-r--r-- 1 root root 199623 Nov 28 2011 commons-daemon-native.tar.gz
-rw-r--r-- 1 root root 1342 Nov 28 2011 cpappend.bat
-rw-r--r-- 1 root root 2108 Nov 28 2011 digest.bat
-rwxr-xr-x 1 root root 1689 Nov 28 2011 digest.sh
-rw-r--r-- 1 root root 3150 Nov 28 2011 setclasspath.bat
-rwxr-xr-x 1 root root 4153 Aug 16 10:57 setclasspath.sh ### 在这个文件里面指定变量环境
-rw-r--r-- 1 root root 2108 Nov 28 2011 shutdown.bat
-rwxr-xr-x 1 root root 1628 Nov 28 2011 shutdown.sh
-rw-r--r-- 1 root root 2109 Nov 28 2011 startup.bat
-rwxr-xr-x 1 root root 2023 Nov 28 2011 startup.sh
-rw-r--r-- 1 root root 32277 Nov 28 2011 tomcat-juli.jar
-rw-r--r-- 1 root root 249259 Nov 28 2011 tomcat-native.tar.gz
-rw-r--r-- 1 root root 3479 Nov 28 2011 tool-wrapper.bat
-rwxr-xr-x 1 root root 3472 Nov 28 2011 tool-wrapper.sh
-rw-r--r-- 1 root root 2113 Nov 28 2011 version.bat
-rwxr-xr-x 1 root root 1632 Nov 28 2011 version.sh
[root@N+T bin]#
setclasspath.sh 里面指定。软件的不同在不同的文件指定吧,这个可以在度娘查到。第三种办法一般很少用到。
继续!下面在 /etc/profile 下配置变量环境
export JAVA_HOME=/usr/java/jdk1.7.0_79/ #路径别弄错
export JAVA_BIN=$JAVA_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
最后直接执行,使得文件 profile 生效
[root@N+T /]# source /etc/profile
接着执行 java -version 命令即可看到对应的版本号,说明已经生效了。(在这里有些小伙伴会时常出现一个问题,明明 tomcat 已经实在用这个
jdk 版本了,可是输入命令 java -version 显示出来的却不是目前 tomcat 在用的 jdk 版本,这时候该注意一下查看 tomcat 下面的 comment 目录下的 jdk 版本是否对应的,不是的话。就把 jdk 下的替换过去,另外我还有寻找另外一种解决办法,希望各位赐教。)
jdk 部署完毕!
3.3 tomcat 的搭建
在 /usr 下创建 tomcatG 的目录,并且把三个版本的 tomcat 拉到目录下分别改名为 tomcat6、tomcat7、tomcat8。最后分别解压,再修改 server.xml 文档的端口
[root@N+T tomcatG]# ll
total 12
drwxr-xr-x 9 root root 4096 Aug 16 10:27 tomcat6
drwxr-xr-x 9 root root 4096 Aug 16 10:49 tomcat7
drwxr-xr-x 9 root root 4096 Aug 16 11:11 tomcat8
[root@N+T tomcatG]#
下面修改 tomcat6 的 server.xml 文件:三处地方
1、
<Connector port="18080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
2、
<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />
3、
<Server port="18005" shutdown="SHUTDOWN">
剩下的 tomcat7 和 tomcat8 以此类推!
下面启动 tomcat6-8
启动 tomcat6:
[root@N+T bin]# pwd
/usr/tomcatG/tomcat6/bin
[root@N+T bin]# ll
total 612
-rw-r--r-- 1 root root 22705 Nov 28 2011 bootstrap.jar
-rw-r--r-- 1 root root 11830 Nov 28 2011 catalina.bat
-rwxr-xr-x 1 root root 17708 Nov 28 2011 catalina.sh
-rw-r--r-- 1 root root 2374 Nov 28 2011 catalina-tasks.xml
-rw-r--r-- 1 root root 24172 Nov 28 2011 commons-daemon.jar
-rw-r--r-- 1 root root 199623 Nov 28 2011 commons-daemon-native.tar.gz
-rw-r--r-- 1 root root 1342 Nov 28 2011 cpappend.bat
-rw-r--r-- 1 root root 2108 Nov 28 2011 digest.bat
-rwxr-xr-x 1 root root 1689 Nov 28 2011 digest.sh
-rw-r--r-- 1 root root 3150 Nov 28 2011 setclasspath.bat
-rwxr-xr-x 1 root root 4153 Aug 16 10:57 setclasspath.sh
-rw-r--r-- 1 root root 2108 Nov 28 2011 shutdown.bat
-rwxr-xr-x 1 root root 1628 Nov 28 2011 shutdown.sh #这是停止
-rw-r--r-- 1 root root 2109 Nov 28 2011 startup.bat
-rwxr-xr-x 1 root root 2023 Nov 28 2011 startup.sh #启动
-rw-r--r-- 1 root root 32277 Nov 28 2011 tomcat-juli.jar
-rw-r--r-- 1 root root 249259 Nov 28 2011 tomcat-native.tar.gz
-rw-r--r-- 1 root root 3479 Nov 28 2011 tool-wrapper.bat
-rwxr-xr-x 1 root root 3472 Nov 28 2011 tool-wrapper.sh
-rw-r--r-- 1 root root 2113 Nov 28 2011 version.bat
-rwxr-xr-x 1 root root 1632 Nov 28 2011 version.sh
[root@N+T bin]# ./startup.sh
如图所示!
tomcat 7- 8 以此类推!
再看一下三个 tomcat 启动的进程。
[root@N+T bin]# ps -ef |grep tomcat
root 1278 1 0 13:50 ? 00:00:10 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/tomcatG/tomcat7/endorsed -classpath /usr/tomcatG/tomcat7/bin/bootstrap.jar:/usr/tomcatG/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/tomcatG/tomcat7 -Dcatalina.home=/usr/tomcatG/tomcat7 -Djava.io.tmpdir=/usr/tomcatG/tomcat7/temp org.apache.catalina.startup.Bootstrap start start
root 1287 1 0 13:50 ? 00:00:13 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/tomcatG/tomcat8/bin/bootstrap.jar:/usr/tomcatG/tomcat8/bin/tomcat-juli.jar -Dcatalina.base=/usr/tomcatG/tomcat8 -Dcatalina.home=/usr/tomcatG/tomcat8 -Djava.io.tmpdir=/usr/tomcatG/tomcat8/temp org.apache.catalina.startup.Bootstrap start start
root 1301 1 0 13:50 ? 00:00:08 /usr/java/jdk1.7.0_79/jre/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat6//conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/tomcatG/tomcat6//endorsed -classpath /usr/tomcatG/tomcat6//bin/bootstrap.jar -Dcatalina.base=/usr/tomcatG/tomcat6/ -Dcatalina.home=/usr/tomcatG/tomcat6/ -Djava.io.tmpdir=/usr/tomcatG/tomcat6//temp org.apache.catalina.startup.Bootstrap start
root 1509 1418 0 15:02 pts/0 00:00:00 grep --color tomcat
[root@N+T bin]#
可以看到,各个端口以及运行的变量环境(jdk)这个排版比较长,需要往后面拉取才能看到所有内容。
3.4 配置负载均衡
在 nginx 里面添加几条代码即可,下面请看
#####nginx+3 T 负载均衡测试 ############
user nobody;
worker_processes 1;
events {
use epoll;
worker_connections 1024;
}
http
{
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 60;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 8 128k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path /dev/shm;
upstream li7105.com { #在此插入
server 127.0.0.1:18080 weight=1; #tomcat6 分流 weight=1 这是权重分配。server 127.0.0.1:28080 weight=2; #tomcat7 分流 weight=2 显然 2 更大,那么它被分配任务的几率也就更大
server 127.0.0.1:8088 weight=2; #tomcat8 分流
}
server{listen 80;
server_name localhost;
access_log /var/log/nginx/aeecss.log;
error_log /var/log/nginx/error.log;
location / {proxy_pass http://li7105.com;
proxy_redirect default;
}
}
}
【关于 nginx 的负载均衡的分配方式】
nginx 关于这个负载均衡方面的权重分配方式有 4 种:
1. 轮询,默认采取此方式,Nginx 会按照请求时间的先后顺序进行轮询分发,若某台 Web Server 宕机,Nginx 自动将其摘掉。
2.weight,权重,即轮询的几率,值越大,被分发的可能性越大,用于后端服务器性能不均的情况。
3.ip_hash, 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决共享 session 的问题。
4. 自定义规则
PS:
down 表示当前的 Web Server 暂时不参与负载
weight 默认为 1.weight 越大,负载的权重就越大。
backup:其它所有的非 backup Server down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻。
四、负载均衡的测试
为了是的测试的效果明了些,我把 /usr/tomcatG/tomcat6/webapps/ROOT 目录下的 index.jsp 文件的内容全部删除掉,直接改为 tomcat6,7- 8 一样如此。
[root@N+T ROOT]# cat index.jsp
I am Tomcat 6666666666666!
在测试之前需要检查一下,下面几个个问题。确保没问题了,就去测试,不然返回来做无用功了。
1、nginx、tomcat、jdk 正在运行
2、网页上能够哦正常访问 nginx 和 tomcat
3、防火墙
我就在本地主机上面的浏览器测试吧,因为跟物理机是连通的。
在浏览器输入:http://192.168.0.144/index.jsp 然后不停按 F5 刷新网页,接着网页会不停的在 tomcat6、tomcat7、tomcat8 的内容标识上面做跳转,显示的内容也会不一样。
如图:
不停的刷新,看着页面的变化。你会发现权重等于 1 的 tomcat6 出现的次数会比 tomcat7 和 tomcat8 的次数很多的。
上面只是个简单的测试,有兴趣的伙伴可以添加去修改这个 jsp 文档,哈哈。
上述图片说明了 nginx 的负载均衡是正在运行中的了。测试完毕!
五、总结
在搭建这个环境需要注意的几点:
1、tomcat 的端口,由于是在一台机器上面部署 3 个 tomcat,所以改的端口就有 9 个了。主机端口的范围,超出范围不然 tomcat 是无法启动的
2、jdk 变量环境的搭建,注意路径。
3、nginx 配置文档的参数、模块注意编写。不然无法启动
4、注意防火墙设置,对于需求安全性的伙伴们。当然测试你可以完全的关闭掉。
nginx 和 tomcat 的负载均衡,基本配置完毕,这类型的负载均衡目前在很多的企业被使用。然而这仅仅是企业网络架构中的一个小小的部分,我期待后面能够给大家讲述更多关于这方面的知识。
更多 Tomcat 相关教程见以下内容:
CentOS 6.6 下安装配置 Tomcat 环境 http://www.linuxidc.com/Linux/2015-08/122234.htm
RedHat Linux 5.5 安装 JDK+Tomcat 并部署 Java 项目 http://www.linuxidc.com/Linux/2015-02/113528.htm
Tomcat 权威指南(第二版)(中英高清 PDF 版 + 带书签) http://www.linuxidc.com/Linux/2015-02/113062.htm
Tomcat 安全配置与性能优化 http://www.linuxidc.com/Linux/2015-02/113060.htm
Linux 下使用 Xshell 查看 Tomcat 实时日志中文乱码解决方案 http://www.linuxidc.com/Linux/2015-01/112395.htm
CentOS 64-bit 下安装 JDK 和 Tomcat 并设置 Tomcat 开机启动操作步骤 http://www.linuxidc.com/Linux/2015-01/111485.htm
Ubuntu 16.04 下安装 Tomcat 8.5.9 http://www.linuxidc.com/Linux/2017-06/144809.htm
Ubuntu 16.04 安装 Tomcat 8 图解 http://www.linuxidc.com/Linux/2017-10/147773.htm
Tomcat 配置文件 server.xml 详解 http://www.linuxidc.com/Linux/2017-10/148003.htm
Tomcat 单机多实例部署 - 多项目部署 http://www.linuxidc.com/Linux/2017-10/147259.htm
Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149354.htm