nginx+tomcat负载均衡集群

2023年8月13日13:07:20

首先祝大家端午快乐

相信大家能来看这篇文章,说明对nginx和tomcat是有一定了解的,所以这里就不浪费大家时间了,不再过多的介绍nginx和tomcat了

大家要是不懂或者对nginx感兴趣可以去看我之前的博客。但是我对tomcat也不是很了解,但是我会在接下来的内容种尽我所能给大家讲一下tomca。

1. tomcat简介

jdk下载地址
tomca下载地址

Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目由Apache、Sun 和其他一些公司及个人共同开发而成。

由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。

因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

2. tomcat名称的由来

Tomcat最初是由Sun的软件架构师詹姆斯·邓肯·戴维森开发的。后来他帮助将其变为开源项目,并由Sun贡献给了apache软件基金会。由于大部分开源软件项目O’Reilly都会出一本相关的书,并且将其封面设计成某个动物的素描,因此他希望将此项目以一个动物的名字命名。因此他希望这种动物能够自己照顾自己,最终他将其命名为tomcat。
O’Reilly出版的介绍Tomcat的书籍的封面也被设计成了一个公猫的形象。而tomcat的logo兼吉祥物也被设计为一只公猫。

3. nginx+tomcat负载均衡部署

环境说明

主机名 IP地址 系统 软件版本
nginx 192.168.182.142 redhat8.2 nginx-1.20.1
tomcat1 192.168.182.143 redhat8.2 tomcat-9.0.54
tomcat2 192.168.182.144 redhat8.2 tomcat-9.0.54

环境准备
// 以下操作三台主机都要做

[root@nginx ~]# systemctl disable --now firewalld  //关闭防火墙

[root@nginx ~]# systemctl status firewalld.service   //确认防火墙为关闭状态
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

[root@nginx ~]# vim /etc/selinux/config  //修改selinux状态

[root@nginx ~]# tail -8 /etc/selinux/config //关闭selinux
SELINUX=disabled  //此处为disabled即可
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

3.1 部署nginx

nginx下载地址

// 这里我就使用脚本部署nginx,下面是脚本

[root@nginx opt]# pwd
/opt

[root@nginx opt]# mkdir packages

[root@nginx packages]# ls
nginx-1.20.1.tar.gz

[root@nginx opt]# tree /opt/  //上传nginx脚本
/opt/
├── nginx.sh
└── packages
    └── nginx-1.20.1.tar.gz

1 directory, 2 files

// 执行nginx脚本
#!/bin/bash
route=/usr/local
server=/usr/lib/systemd/system

id nginx &>/dev/null
if [ $? -ne 0 ];then
 useradd -r -M -s /sbin/nologin nginx
fi

yum -y install pcre-devel pcre gcc gcc-c++ openssl-devel zlib zlib-devel make vim wget openssl openssl-devel gd-devel
mkdir /var/log/nginx
chown -R nginx.nginx /var/log/nginx
if [ ! -d $route/nginx-1.20.1 ];then
    tar xf packages/nginx-1.20.1.tar.gz -C $route
fi

cd $route/nginx-1.20.1
if [ ! -d $route/nginx ];then
    ./configure --prefix=/usr/local/nginx \
        --user=nginx \
        --group=nginx \
        --with-debug \
        --with-http_ssl_module \
        --with-http_realip_module \
        --with-http_image_filter_module \
        --with-http_gunzip_module \
        --with-http_gzip_static_module \
        --with-http_stub_status_module \
        --http-log-path=/var/log/nginx/access.log \
        --error-log-path=/var/log/nginx/error.log
    make && make install
fi

cd $server
cat > nginx.service << EOF
[Unit]
Description=Nginx server daemon
After=network.target 

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx 
ExecStop=/usr/local/nginx/sbin/nginx -s quit
ExecReload=/bin/kill -HUP \$MAINPID

[Install]
WantedBy=multi-user.target
EOF

echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
source /etc/profile.d/nginx.sh

systemctl daemon-reload
systemctl enable --now nginx.service
if [ $? -eq 0 ];then
    echo "nginx is ok"
else
    echo "nginx is error"
fi

[root@nginx nginx]# systemctl status nginx.service   //查看nginx状态为开启状态
● nginx.service - Nginx server daemon
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-06-03 12:54:06 CST; 4min 45s ago
  Process: 33707 ExecStart=/usr/local/nginx/sbin/nginx (code=exited, status=0/SUCCESS)
 Main PID: 33708 (nginx)
    Tasks: 2 (limit: 11301)
   Memory: 2.7M
   CGroup: /system.slice/nginx.service
           ├─33708 nginx: master process /usr/local/nginx/sbin/nginx
           └─33709 nginx: worker process

6月 03 12:54:06 nginx systemd[1]: Starting Nginx server daemon...
6月 03 12:54:06 nginx systemd[1]: Started Nginx server daemon
// nginx的访问日志与错误日志的位置
[root@nginx nginx]# pwd
/var/log/nginx

[root@nginx nginx]# ls
access.log  error.log

// 除访问日志和错误日志外的其他文件位置
[root@nginx nginx]# pwd
/usr/local/nginx

[root@nginx nginx]# ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp

3.2 部署tomcat

// 下载jdk包
jdk下载地址 选择第六个下载


[root@tomcat1 opt]# ls
jdk-8u202-linux-x64.tar.gz
[root@tomcat1 opt]# tar zxf jdk-8u202-linux-x64.tar.gz -C /usr/local/  //解压到/usr/local目录

//配置jdk环境变量
[root@tomcat1 ~]# cat /etc/profile.d/jdk.sh 
export JAVA_HOME=/usr/local/jdk1.8.0_202
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH

[root@tomcat1 ~]# source /etc/profile.d/jdk.sh  //使用source使其生效

[root@tomcat1 ~]# java -version  //能看到版本号说明成功
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

tomcat9.0.54版本下载地址

// 下载tomcat包
[root@tomcat1 ~]# wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.54/bin/apache-tomcat-9.0.54.tar.gz -P /opt/

[root@tomcat1 opt]# tar zxf apache-tomcat-9.0.54.tar.gz -C /usr/local/

[root@tomcat1 local]# ln -s apache-tomcat-9.0.54/ tomcat9  //做个软链接方便后续的操作

3.2.1 编写service文件使用systemctl控制tomcat

在我写完service启动tomcat时报错了,报错内容如下
6月 03 16:49:10 tomcat1 catalina.sh[2629]: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined  //这个的意思时说没有JAVA_HOME和JRE_HOME这两个变量
6月 03 16:49:10 tomcat1 catalina.sh[2629]: At least one of these environment variable is needed to run this program  //这个的意思时说运行tomcat需要有这两个变量中的一个即可

// 解决措施如下
[root@tomcat1 bin]# pwd  
/usr/local/tomcat9/bin   //这个是tomcat的安装目录

[root@tomcat1 bin]# vim setclasspath.sh
#  Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
#  are valid and consistent with the selected start-up options and set up the
#  endorsed directory.
# -----------------------------------------------------------------------------
// 添加下面两行内容,这个是你的jdk的安装目录,根据自己的安装目录进行变化
export JAVA_HOME=/usr/local/jdk1.8.0_202
export JRE_HOME=/usr/local/jdk1.8.0_202/jre

这里建议,添加完环境变量后使用此命令[root@tomcat1 bin]# source setclasspath.sh重新读取一下

// 这个是service文件
[root@tomcat1 bin]# cat /usr/lib/systemd/system/tomcat.service 
[Unit]
Description=Tomcat server daemon
After=network.target sshd-keygen.target

[Service]
Type=forking
ExecStart=/usr/local/tomcat9/bin/catalina.sh start
ExecStop=/usr/local/tomcat9/bin/catalina.sh stop
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

// 使用下面的命令刷新一下配置信息
[root@tomcat1 bin]# systemctl daemon-reload
[root@tomcat1 bin]# systemctl enable tomcat  //设置开机自启

[root@tomcat1 bin]# systemctl status tomcat.service //启动成功
● tomcat.service - Tomcat server daemon
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-06-03 16:59:57 CST; 12min ago
  Process: 2813 ExecStart=/usr/local/tomcat9/bin/catalina.sh start (code=exited, status=0/SUCCESS)
 Main PID: 2819 (java)
    Tasks: 19 (limit: 11301)
   Memory: 101.0M

3.3 tomcat2的机器也做同样的操作

上面有下载jdk的地址这里就不写了

// 配置jdk的环境变量
[root@tomcat2 local]# cat /etc/profile.d/jdk.sh 
export JAVA_HOME=/usr/local/jdk1.8.0_202
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH

// 重新加载一下使其生效
[root@tomcat2 local]# source /etc/profile.d/jdk.sh

// 看到版本号说明成功
[root@tomcat2 local]# java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
// 下载tomcat包
[root@tomcat2 ~]# wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.54/bin/apache-tomcat-9.0.54.tar.gz -P /opt/

// 解压tomcat包
[root@tomcat2 opt]# tar zxf apache-tomcat-9.0.54.tar.gz -C /usr/local/

// 做软连接,方便后面操作
[root@tomcat2 local]# ln -s apache-tomcat-9.0.54/ tomcat9

// 添加环境变量
[root@tomcat2 bin]# vim setclasspath.sh
#  Set JAVA_HOME or JRE_HOME if not already set, ensure any provided settings
#  are valid and consistent with the selected start-up options and set up the
#  endorsed directory.
# -----------------------------------------------------------------------------
export JAVA_HOME=/usr/local/jdk1.8.0_202
export JRE_HOME=/usr/local/jdk1.8.0_202/jre

// 编写service文件控制tomcat
[root@tomcat2 tomcat9]# cat /usr/lib/systemd/system/tomcat.service 
[Unit]
Description=Tomcat server daemon
After=network.target sshd-keygen.target

[Service]
Type=forking
ExecStart=/usr/local/tomcat9/bin/catalina.sh start
ExecStop=/usr/local/tomcat9/bin/catalina.sh stop
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

// 需要说明一下
执行完没问题之后请执行 source /etc/profile.d/nginx.sh //这样便可以使用nginx命令了
然后再执行下面两条命令
[root@tomcat2 bin]# systemctl daemon-reload 
[root@tomcat2 bin]# systemctl enable tomcat

3.4 Tomcat相关配置说明

// tomcat主目录
[root@tomcat2 tomcat9]# pwd
/usr/local/tomcat9

[root@tomcat2 tomcat9]# ll
总用量 128
drwxr-x--- 2 root root  4096 6月   3 17:50 bin  
-rw-r----- 1 root root 18970 9月  28 2021 BUILDING.txt
drwx------ 3 root root   254 6月   3 17:49 conf
-rw-r----- 1 root root  6210 9月  28 2021 CONTRIBUTING.md
drwxr-x--- 2 root root  4096 6月   3 17:38 lib
-rw-r----- 1 root root 57092 9月  28 2021 LICENSE
drwxr-x--- 2 root root   197 6月   3 17:49 logs
-rw-r----- 1 root root  2333 9月  28 2021 NOTICE
-rw-r----- 1 root root  3372 9月  28 2021 README.md
-rw-r----- 1 root root  6898 9月  28 2021 RELEASE-NOTES
-rw-r----- 1 root root 16507 9月  28 2021 RUNNING.txt
drwxr-x--- 2 root root    30 6月   3 17:38 temp
drwxr-x--- 7 root root    81 9月  28 2021 webapps
drwxr-x--- 3 root root    22 6月   3 17:49 work
目录 作用
bin 存放linux或windows平台上启动和关闭tomca的脚本文件
conf 存放tomcat服务器的各种全局配置文件,其中最重要的是server.xml和web.xml
lib 存放tomcat运行时所需要的库文件(JARS)
logs 存放tomcat执行时的LOG文件
webapps tomcat的主要web发布目录(包括应用程序示例)
work 存放jsp编译后产生的class文件
temp 用来存放Tomcat执行过程中产生的临时文件。清除此文件不会影响Tomcat服务器。

3.5 tomcat配置文件说明

[root@tomcat2 conf]# ll
总用量 232
drwxr-x--- 3 root root     23 6月   3 17:49 Catalina
-rw------- 1 root root  13052 9月  28 2021 catalina.policy
-rw------- 1 root root   7276 9月  28 2021 catalina.properties
-rw------- 1 root root   1400 9月  28 2021 context.xml
-rw------- 1 root root   1149 9月  28 2021 jaspic-providers.xml
-rw------- 1 root root   2313 9月  28 2021 jaspic-providers.xsd
-rw------- 1 root root   4144 9月  28 2021 logging.properties
-rw------- 1 root root   7589 9月  28 2021 server.xml
-rw------- 1 root root   2756 9月  28 2021 tomcat-users.xml
-rw------- 1 root root   2558 9月  28 2021 tomcat-users.xsd
-rw------- 1 root root 172359 9月  28 2021 web.xm
目录或文件 作用
catalina.policy 权限控制配置文件
catalina.properties tomcat属性配置文件
context.xml 上下文配置文件
logging.properties 日志log相关配置文件
server.xml 主配置文件
tomcat-users.xml manager-gui管理用户配置文件(tomcat安装后提供一个manager-gui的管理界面,通过配置该文件可以开启访问)
web.xml tomcat的servlet、servlet-mapping、filter、MIME等相关配置

3.6 tomcat主配置文件说明

server.xml为tomcat的主配置文件,通过配置该文件,可以修改tomcat的启动端口、网站目录、虚拟主机、开启https等常用功能。
server.xml主要由 <Server>、<Service>、<Connector/>、<Engine>、<Host>、<Context>、</Context>、</Host>、</Engine>、</service>、</Server>

<Server port="8005" shutdown="SHUTDOWN">
// tomcat关闭端口,默认只对本机地址开放,可以在本机通过telnet 127.0.0.1 8005的方式进行访问

 69     <Connector port="8080" protocol="HTTP/1.1"
 70                connectionTimeout="20000"
 71                redirectPort="8443" />
// tomcat启动的默认端口号8080,可以根据需要进行修改

115     <!-- Define an AJP 1.3 Connector on port 8009 -->
116     <!--
117     <Connector protocol="AJP/1.3"
118                address="::1"
119                port="8009"
120                redirectPort="8443" />
// tomcat启动AJP1.3连接器时默认的端口号,可以根据需要进行更改

152       <Host name="localhost"  appBase="webapps"
153             unpackWARs="true" autoDeploy="true">
155         <!-- SingleSignOn valve, share authentication between web applications
156              Documentation at: /docs/config/valve.html -->
157         <!--
158         <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
159         -->
160 
161         <!-- Access log processes all example.
162              Documentation at: /docs/config/valve.html
163              Note: The pattern used is equivalent to using pattern="common" -->
164         <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
165                prefix="localhost_access_log" suffix=".txt"
166                pattern="%h %l %u %t &quot;%r&quot; %s %b" />
167 
168       </Host>
169     </Engine>
170   </Service>
171 </Server>
// 以上内容为tomcat定义虚拟主机时的配置及日志配置

3.7 tomcat server的组成部分

server: server元素代表了整个Catalina的servlet容器

service: service是这样一个集合,它是由一个或者多个connector组成,以及一个engine,负责处理所有connector所获得的客户请求。

connector: 一个connector在某个指定的端口上侦听客户端请求,并将获得的请求交给engine来处理,从engine处获得回应并返回客户。

tomcat有两个典型的connector,一个直接侦听来自browser的http请求,一个监听来自其他的webserver的请求。

coyote http/1.1 connector在端口8080处监听来自browser的http请求。
coyote JK2 connector在端口8009处监听来自其他webserver(apache)的servlet/jsp代理请求

engine: engine可以配置多个虚拟主机(virtual host),每个虚拟主机都有一个域名,当engine获得一个请求时,他把该请求匹配到某个host上,然后把该请求交给该host来处理
engine有一个默认虚拟主机,当请求无法匹配带任何一个host上的时候,将交给该默认host处理

host: 一个host代表一个虚拟主机,每个虚拟主机和某个网络域名相匹配。
每个虚拟主机下都可以部署(deploy)一个或者多个web app,每个web app对应一个context,有一个context patj。
当host获得一个请求时,将把该请求匹配到某个context上,然后把该请求交给该context来处理,匹配的方法是"最长匹配",所以一个path==" "的context将成为该host的默认context
所有无法和其他context的路径名匹配的请求都将最终和该默认context匹配

context: 一个context对应一个web application,一个web application由一个或者多个servlet组成。

下面开始配置

// 为了区分做以下修改
[root@tomcat1 ~]# cat index.jsp 
<html>
<head>
        <title>test page</title>
</head>
<body>
        <%
        out.println("this is a tomcat1");
        %>
</body>
</html>

[root@tomcat1 ~]# mkdir /web
[root@tomcat1 ~]# mv index.jsp /web/
[root@tomcat1 ~]# systemctl restart tomcat.service

通过IP加端口号进行访问
nginx+tomcat负载均衡集群

nginx+tomcat负载均衡集群

// 在nginx上配置负载均衡

33     #gzip  on;
 34     upstream tomcat-server {
 35              server 192.168.182.143:8080;
 36              server 192.168.182.144:8080;
 37 }

47         location / {
 48             root   html;
 49             index  index.html index.htm;
 50             proxy-pass http://tomcat_server;
 51         }

// 配置完成之后,建议使用nginx -t检查语法错误
没有问题之后可以使用nginx -s reload //重新加载配置文件
也可以使用systemctl restart nginx.service  //重启nginx服务

测试,输入nginx主机的IP地址,通过不断刷新页面进行跳转。
nginx+tomcat负载均衡集群

nginx+tomcat负载均衡集群

  • 作者:汪泽文666
  • 原文链接:https://blog.csdn.net/qq_60387497/article/details/125111521
    更新时间:2023年8月13日13:07:20 ,共 12424 字。