企业级web应用服务器

tomcat

一 介绍

前端三大核心技术:

HTML(HyperText Markup Language)超文本标记语言

CSS(Cascading Style Sheets)层叠样式表
Javascript 简称 JS ,是一种动态的弱类型脚本解释性语言
同步:即要更新网页中一小部分(如提交账号密码等)缺将整个网页一起更新
异步:只更新要更新的部分,其他部分不便

WEB框架

web访问流程:

后台应用框架
单体架构:

传统架构(单机系统),一个项目一个工程,统一部署,一个进程
all in one 的架构方式,把所有的功能单元放在一个应用里。然后把整个应用部署到一台服务器上。
如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问。
Java 实现: JSP 、 Servlet ,打包成一个 jar 、 war 部署
优点:易于开发和测试 : 也十分方便部署 ; 当需要扩展时,只需要将 war 复制多份,然后放到多个服务器上, 再做个负载均衡就可以了。
缺点:如果某个功能模块出问题,有可能全站不可访问,修改 Bug 后、某模块功能修改或升级后,需要停 掉整个服务,重新整体重新打包、部署这个应用war 包,功能模块相互之间耦合度高 , 相互影响 , 不适 合当今互联网业务功能的快速迭代。 特别是对于一个大型应用,我们不可能吧所有内容都放在一个应用里面,我们如何维护、如何分工
合作都是问题。如果项目庞大,管理难度大

微服务

属于 SOA ( Service Oriented Architecture )的子集
将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一
个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能
够被独立地部署到生产环境、类生产环境等。
服务之间采用轻量级的通信机制(通常是基于 HTTP 的 RESTful API )。

web应用服务器

开源的 tomcat 、 jetty 、 glassfish
商用的有 weblogic 、 websphere 、 Jboss

tomcat是免费开源的web应用服务器

官网:https://tomcat.apache.org/
官网文档 :
https://tomcat.apache.org/tomcat-8.5-doc/index.html
帮助文档 :
https://cwiki.apache.org/confluence/display/tomcat/
https://cwiki.apache.org/confluence/display/tomcat/FAQ

二 安装

实验环境:两个web应用服务器,一个nginx服务器

1.下载安装包

bash 复制代码
 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.115/bin/apache-tomcat-9.0.115.tar.gz

2.部署tomcat

检查是否开启httpd服务,开启要关闭

bash 复制代码
[root@RS1 ~]# systemctl status httpd

[root@RS1 ~]# systemctl disable --now httpd
Removed "/etc/systemd/system/multi-user.target.wants/httpd.service".

[root@RS1 ~]# 
bash 复制代码
安装运行所需的java
[root@RS1 ~]# yum install java-1.8.0-openjdk.x86_64 -y
[root@RS1 ~]# tar zxf apache-tomcat-9.0.115.tar.gz -C /usr/local
z	识别并处理 gzip 格式的压缩包(对应 .tar.gz/.tgz 后缀),自动调用 gzip 解压
x	执行解压操作(extract),是解压场景的核心参数
f	指定要处理的压缩包文件(file),f 后必须紧跟压缩包文件名(不能分开)
-C /usr/local	C 是 Change directory 的缩写,指定解压后的文件放到 /usr/local 目录(而非当前目录)
[root@RS1 ~]# cd /usr/local/
[root@RS1 local]# ls
apache-tomcat-9.0.115  bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@RS1 local]# mv apache-tomcat-9.0.115/ tomcat
[root@RS1 local]# cd tomcat/
[root@RS1 tomcat]# ls
bin  BUILDING.txt  conf  CONTRIBUTING.md  lib  LICENSE  logs  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  temp  webapps  work
[root@RS1 tomcat]# 
[root@RS1 tomcat]# cd bin
[root@RS1 bin]# ./startup.sh
// #startup.sh服务启动脚本
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
[root@RS1 bin]# netstat -antlupe | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      0          40232      3833/java           
[root@RS1 bin]# 

3.制作tomcat的启动脚本

bash 复制代码
[root@RS1 bin]# vim /usr/local/tomcat/conf/tomcat.conf
   1 JAVA_HOME=/etc/alternatives/jre

定义 Tomcat 运行依赖的JAVA_HOME环境变量,指向系统中 JRE(Java 运行环境)的软链接路径(/etc/alternatives/jre是 Linux 系统中 Java 的统一替代路径,避免手动指定具体 JRE 版本),Tomcat 必须通过这个变量找到 Java 环境才能启动。

[root@RS1 bin]# vim /lib/systemd/system/tomcat.service 
#systemd管理Tomcat服务的核心配置文件
   1 [Unit]
   2 Description=Tomcat
   3 #After=syslog.target network.target remote-fs.target nss-lookup.target
   4 After=syslog.target network.target
   5 
   6 [Service]
   7 Type=forking
   8 EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
   9 ExecStart=/usr/local/tomcat/bin/startup.sh
  10 ExecStop=/usr/local/tomcat/bin/shutdown.sh
  11 PrivateTmp=true
  12 User=tomcat
  13 Group=tomcat
  14 
  15 [Install]
  16 WantedBy=multi-user.target

[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target

[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat

[Install]
WantedBy=multi-user.target

[root@RS1 bin]# useradd -s /sbin/nologin -M tomcat
//创建tomcat系统用户:
- -s /sbin/nologin:禁止该用户通过 SSH / 终端登录(仅用于运行服务,提高安全性);
- -M:不创建该用户的家目录(无需登录,节省资源)
[root@RS1 bin]# chown tomcat.tomcat /usr/local/tomcat/ -R
递归修改 Tomcat 安装目录的属主和属组为tomcat:tomcat:
- -R:递归处理所有子文件 / 目录;
- 确保tomcat用户有读写执行权限,避免启动时权限不足。
[root@RS1 bin]# systemctl daemon-reload 
重新加载 systemd 的配置文件:因为修改了tomcat.service,需要让 systemd 识别新配置,否则服务管理命令会失效。
[root@RS1 bin]# systemctl enable --now tomcat.service 
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.
[root@RS1 bin]# netstat -antlupe | grep java
[root@RS1 bin]# systemctl enable --now tomcat.service 
[root@RS1 bin]# netstat -antlupe | grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       50603      4387/java           
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       50591      4387/java           

//查看系统网络连接,并过滤和 Java 相关的进程:
- -a:显示所有连接;
- -n:显示端口号(而非服务名);
- -t:显示 TCP 连接;
- -u:显示 UDP 连接;
- -l:显示监听状态的端口;
- -p:显示进程 ID 和进程名;
- -e:显示用户 ID 等扩展信息;

4.访问tomcat(服务器ip:8080)

三 nginx与tomcat的整合(结合反向代理部署)

常见的部署方式:


standalone 模式, Tomcat 单独运行,直接接受用户的请求,不推荐
单机反向代理,单机运行,提供了一个 Nginx 作为反向代理,可以做到静态由 nginx 提供响应,动态 jsp 代理给Tomcat
LNMT : Linux + Nginx + MySQL + Tomcat
LAMT: Linux + Apache ( Httpd ) + MySQL + Tomcat
反向代理多机:前置一台 Nginx ,给多台 Tomcat 实例做反向代理和负载均衡调度, Tomcat上部署的纯动态页面更适合LNMT : Linux + Nginx + MySQL + Tomcat
LNMT : Linux + Nginx + MySQL + Tomcat
多级代理:LNNMT : Linux + Nginx + Nginx + MySQL + Tomcat

1.单体架构

利用nginx反向代理实现,编辑子配置文件添加

bash 复制代码
nginx服务器上:
[root@nginx ~]# cd /usr/local/nginx/conf/conf.d/
[root@nginx conf.d]# ls
anti-leeching.conf.bak  proxy.conf.bak        ssl_https.conf.bak  vhosts_status.conf.bak
php.conf                setvariable.conf.bak  vhosts.conf.bak     WEBrewrite.conf.bak
[root@nginx conf.d]# mv php.conf p
php.conf        proxy.conf.bak  
[root@nginx conf.d]# mv php.conf php.conf.bak
[root@nginx conf.d]# vim tomcat.conf
   1 server {
   2     listen 80;
   3     server_name app.xier.org;
   4     location ~* \.jsp$ {
   5         proxy_pass http://172.25.254.10:8080;
   6         }
   7 }

tomcat服务器上:
先上传准备好的test.jsp文件到root的/usr/local/tomcat/webapps/ROOT/目录下
[root@nginx ~]# scp test.jsp root@172.25.254.10:/usr/local/tomcat/webapps/ROOT/
test.jsp                                                                                                          100%  968     2.1MB/s   00:00   
[root@nginx ~]# scp test.jsp root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/


[root@nginx ~]# 
[root@nginx ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx ~]# nginx -s reload
[root@nginx ~]# 

测试:

在windows中设定app.xier.org的解析并在浏览器中访问app.xier.org/test.jsp

即在C:\Windows\System32\drivers\etc\hosts中添加

2.tomcat负载均衡
bash 复制代码
[root@nginx ~]# cd /usr/local/nginx/conf/conf.d/
[root@nginx conf.d]# ll
总用量 36
-rw-r--r-- 1 root root 377  2月  6 19:00 anti-leeching.conf.bak
-rw-r--r-- 1 root root 568  2月  8 14:28 php.conf.bak
-rw-r--r-- 1 root root 620  2月  6 19:00 proxy.conf.bak
-rw-r--r-- 1 root root 233  2月  6 19:00 setvariable.conf.bak
-rw-r--r-- 1 root root 349  2月  6 19:00 ssl_https.conf.bak
-rw-r--r-- 1 root root 116  2月 13 23:58 tomcat.conf
-rw-r--r-- 1 root root 652  2月  6 19:00 vhosts.conf.bak
-rw-r--r-- 1 root root 205  2月  6 19:00 vhosts_status.conf.bak
-rw-r--r-- 1 root root 636  2月  6 19:00 WEBrewrite.conf.bak

[root@nginx conf.d]# vim tomcat.conf 
处理 /root/.vimrc 时发生错误:
第    3 行:
E488: Trailing characters: set relativenumber: #set relativenumber
请按 ENTER 或其它命令继续
   1 #server {
   2 #   listen 80;
   3 #   server_name app.xier.org;
   4 #   location ~* \.jsp$ {
   5 #       proxy_pass http://172.25.254.10:8080;
   6 #       }
   7 #}
   8 upstream tomcat {
   9     hash $cookie_JSESSIONID;
  10     server 172.25.254.10:8080;
  11     server 172.25.254.20:8080;
  12     }
  13 server {
  14     listen 80;
  15     server_name app.xier.org;
  16     location ~* \.jsp$ {
  17         proxy_pass http://tomcat;
  18         }
  19 }       
[root@nginx conf.d]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx conf.d]# nginx -s reload

测试

在windows中设定app.xier.org的解析并在两个浏览器中访问app.xier.org/test.jsp

四 tomcat+memcache实现session会话零丢失

Memcached介绍:
Memcached 只支持能序列化的数据类型,不支持持久化,基于 Key-Value的内存缓存系统,
可以通过做集群同步的方式, 让各memcached 服务器的数据进行同步,从而实现数据的一致性,即保证各 memcached 的数据是一样 的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候 , 可以自动从有数据的 memcached 当中自动获取数据并 提供服务。
Memcached 官网: http://memcached.org/

session共享服务器

msm介绍
msm ( memcached session manager )提供将 Tomcat 的 session 保持到 memcached 可以实现高可用。
项目早期托管在 google code, 目前在 Github
github 网站链接 : https://github.com/magro/memcached-session-manager

原理:交叉保存


t1 和 m1 部署可以在一台主机上, t2 和 m2 部署也可以在同一台。
当新用户发请求到 Tomcat1 时 , Tomcat1 生成 session 返回给用户的同时 , 也会同时发给 memcached2 备
份。即 Tomcat1 session 为主 session , memcached2 session 为备用 session ,使用 memcached 相当于
备份了一份 Session
如果 Tomcat1 发现 memcached2 失败 , 无法备份 Session 到 memcached2, 则将 Sessoin 备份存放在
memcached1 中
安装
参考链接 : https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
将 spymemcached.jar 、 memcached-session-manage 、 kyro 相关的 jar 文件都放到 Tomcat 的 lib 目录
中,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是 /usr/local/tomcat/lib

1.tomcat加载模块

先上传jar.zip到RS1

bash 复制代码
[root@RS1 ~]# 
[root@RS1 ~]# unzip jar.zip 
Archive:  jar.zip
   creating: jar/
  inflating: jar/asm-5.2.jar         
  inflating: jar/kryo-3.0.3.jar      
  inflating: jar/kryo-serializers-0.45.jar  
  inflating: jar/memcached-session-manager-2.3.2.jar  
  inflating: jar/memcached-session-manager-tc9-2.3.2.jar  
  inflating: jar/minlog-1.3.1.jar    
  inflating: jar/msm-kryo-serializer-2.3.2.jar  
  inflating: jar/objenesis-2.6.jar   
  inflating: jar/reflectasm-1.11.9.jar  
  inflating: jar/spymemcached-2.12.3.jar  
[root@RS1 ~]# cd jar/
[root@RS1 jar]# cp * /usr/local/tomcat/lib/
[root@RS1 jar]# scp * root@172.25.254.20:/usr/local/tomcat/lib/
asm-5.2.jar                                                                                                                                                     100%   52KB  37.8MB/s   00:00    
kryo-3.0.3.jar                                                                                                                                                  100%  279KB  62.2MB/s   00:00    
kryo-serializers-0.45.jar                                                                                                                                       100%  123KB  54.2MB/s   00:00    
memcached-session-manager-2.3.2.jar                                                                                                                             100%  163KB  80.4MB/s   00:00    
memcached-session-manager-tc9-2.3.2.jar                                                                                                                         100%   11KB  20.7MB/s   00:00    
minlog-1.3.1.jar                                                                                                                                                100% 5923     8.3MB/s   00:00    
msm-kryo-serializer-2.3.2.jar                                                                                                                                   100%   37KB  35.4MB/s   00:00    
objenesis-2.6.jar                                                                                                                                               100%   54KB  16.1MB/s   00:00    
reflectasm-1.11.9.jar                                                                                                                                           100%   71KB  56.1MB/s   00:00    
spymemcached-2.12.3.jar                                                                                                                                         100%  463KB 149.7MB/s   00:00    
2.安装 memcache
bash 复制代码
[root@RS2 ~]# dnf install memcached -y

[root@RS1 ~]# dnf install memcached -y

[root@RS1 ~]# vim /etc/sysconfig/memcached
[root@RS2 ~]# vim /etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
//127.0.0.1 ---0.0.0.0
[root@RS1 ~]# systemctl restart memcached.service 
[root@RS1 ~]# netstat -antluple | grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      987        40256      2298/memcached      
tcp6       0      0 ::1:11211               :::*                    LISTEN      987        40257      2298/memcached      
[root@RS1 ~]# 
[root@RS2 ~]# systemctl restart memcached.service 
[root@RS2 ~]# netstat -antluple | grep memcached
tcp        0      0 0.0.0.0:11211           0.0.0.0:*               LISTEN      988        45515      5004/memcached      
tcp6       0      0 ::1:11211               :::*                    LISTEN      988        45516      5004/memcached      
[root@RS2 ~]# 
3.tomcat配置

下载相关 jar 包 , 参考下面官方说明的下载链接(配置文件同样参考官方文档)
https://github.com/magro/memcached-session-manager/wiki/SetupAnd

bash 复制代码
vim /usr/local/tomcat/conf/context.xml

  29     <Manager pathname="" />
  30     -->
  31      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
  32     memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
  33     failoverNodes="n2"
  34     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
  35     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
  36     />
  37 
[root@RS1 ]#  vim /usr/local/tomcat/conf/context.xml

<Context>

    <!-- Default set of monitored resources. If one of these changes, the    -->
    <!-- web application will be reloaded.                                   -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />

</Context>
[root@RS2 ~]# vim /usr/local/tomcat/conf/context.xml
   3     <Manager pathname="" />
   2     -->
   1     <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
32       memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
   1     failoverNodes="n2"
   2     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
   3     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
   4     />
   5 </Context>
[root@RS2 ~]# systemctl restart tomcat.service

[root@RS1 ~]#  systemctl restart tomcat.service

测试

在一个浏览器中访问,提交数据后关闭当前服务器10,

bash 复制代码
[root@RS1 ~]# systemctl stop tomcat.service

跳转到20上后在提交查看数据是否还在

相关推荐
RunsenLIu2 小时前
智慧房屋租赁管理系统
前端·javascript·vue.js
凌云拓界2 小时前
TypeWell全攻略(四):AI键位分析,让数据开口说话
前端·人工智能·后端·python·ai·交互
明月_清风2 小时前
pwa 安装/离线/推送/后台同步 全套高级能力
前端·pwa
cyber_两只龙宝2 小时前
Tomcat--企业级web应用服务器详细介绍与整合Nginx配置流程
linux·运维·前端·nginx·云原生·tomcat·负载均衡
明月_清风2 小时前
Service Worker 和 Workbox 分别是什么?它们有什么区别?
前端·pwa
程序哥聊面试2 小时前
TypeScript 入门
前端·javascript·typescript
亿元程序员2 小时前
俄罗斯方块谁不会做......啊?流沙版?
前端
bai_lan_ya2 小时前
嵌入式linux学习--makefile的使用以及通用解析
开发语言·前端·javascript
dustcell.2 小时前
高性能web服务器
android·服务器·前端