Apache Tomcat与反向代理
Apache Tomcat 是一个开源的 Java Servlet 容器,主要用于部署和运行基于 Java 的 Web 应用程序。Tomcat 提供了一个环境,让开发者能够使用 Java 编写的 Web 应用程序在 Web 服务器上运行。下面是对 Tomcat 的详细介绍:
Tomcat 的历史
- Tomcat 最初是由 James Duncan Davidson 在 Sun Microsystems 开发的。
- 随着 Java 社区的发展,Tomcat 成为了 Apache Software Foundation 下的一个项目,并由 Apache 软件基金会维护。
- Tomcat 最初是为了支持 Java Servlet 规范而创建的,随着 Java EE 平台的发展,Tomcat 也逐渐支持了更多的 Java EE 规范,如 JSP (Java Server Pages) 和部分 EJB (Enterprise JavaBeans)。
Tomcat 的主要功能
- Servlet 容器:Tomcat 提供了一个符合 Servlet 规范的环境,支持 Java Servlets 的执行。
- JSP 引擎:除了 Servlets 之外,Tomcat 还内建了对 JSP 的支持,能够将 JSP 页面转换为 Servlets 并执行。
- HTTP 服务器:虽然 Tomcat 主要作为一个 Servlet 容器,但它也包含了一个轻量级的 HTTP 服务器,用于接收 HTTP 请求并将它们传递给 Servlet 容器处理。
- 安全性和认证:Tomcat 提供了基本的安全机制,包括用户认证和授权,以保护 Web 应用程序。
- 管理工具:Tomcat 自带一套管理工具,允许管理员远程管理和监控 Tomcat 服务器的状态。
Tomcat 的架构
- Catalina:这是 Tomcat 的核心组件,实现了 Servlet 容器的功能。
- Connector:负责处理与客户端的通信,包括 HTTP 和 AJP 协议。
- Host Manager:用于管理不同的虚拟主机和上下文。
- Manager:提供了 Web 界面和命令行界面,用于管理部署的应用程序和其他设置。
Tomcat 的版本
- Tomcat 有不同的版本,每个版本对应于不同的 Java EE 规范版本。例如,Tomcat 8 对应 Java EE 7,而 Tomcat 9 对应 Java EE 8。
- Tomcat 10 和更高版本开始支持 Jakarta EE 规范,因为 Java EE 名称已经改为 Jakarta EE。
Tomcat 的安装和配置
- 下载:从官方网站下载最新的 Tomcat 发布版。
- 解压:将下载的文件解压到一个目录中。
- 配置:编辑
conf/server.xml
和其他配置文件来调整 Tomcat 的设置。 - 启动和停止:通过
bin/startup.sh
和bin/shutdown.sh
脚本来启动和停止 Tomcat。
Tomcat 的使用场景
- 开发环境:由于其简单性和易用性,Tomcat 经常被用作开发环境中的 Servlet 容器。
- 小型到中型项目:对于不需要全部 Java EE 特性的项目,Tomcat 提供了一个轻量级的选择。
- 云环境:Tomcat 可以轻松地部署在云端,用于扩展和缩放应用程序。
Tomcat 的限制
- 不支持全部 Java EE 规范:虽然 Tomcat 支持 Servlet 和 JSP,但并不完全支持所有的 Java EE 规范,如 JMS 和 EJB。
- 安全性有限:相比于全面的企业级应用服务器,Tomcat 的内置安全特性较为有限。
Tomcat实例
安装Tomcat
推荐从apache官网下载源码包安装启动
[root@tomcat ~]# yum install java-1.8.0-openjdk.x86_64 -y
#安装java环境
安装并启动Tomcat
[root@tomcat ~]# tar zxf apache-tomcat-9.0.91.tar.gz -C /usr/local/
[root@tomcat ~]# ln -s /usr/local/apache-tomcat-9.0.91/ /usr/local/tomcat
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh
查看端口
[root@tomcat ~]# netstat -antlupe | grep java
tcp6 0 0 :::8080 :::* LISTEN 0
68636 32887/java
访问Tomcat
tomcat的文件结构与组成
目录结构
目录 说明
bin 服务启动、停止等相关程序和文件
conf 配置文件
lib 库目录
logs 日志目录
webapps 应用程序,应用部署目录,相当于nginx的默>认发布目录
work jsp 编译后的结果文件,建议提前预热访问
查看tomcat相关目录与文件
[root@tomcat ~]# ls /usr/local/tomcat/
bin conf lib logs README.md RUNNING.txt
webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
生成tomcat启动文件
[root@tomcat ~]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk
[root@tomcat ~]# vim /lib/systemd/system/tomcat.service
[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@tomcat ~]# systemctl daemon-reload
[root@tomcat ~]# systemctl enable --now tomcat
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- 多级代理
LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat
利用nginx反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个tomcat主机
利用nginx指令proxy_pass 可以向后端服务器转发请求报文,并且在转发时会保留客户端的请求报文中的
host首部
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
location ~ \.jsp$ {
proxy_pass http://172.25.254.10:8080;
}
实现tomcat负载均衡
动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压
力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance负载
均衡。
当单机Tomcat,演化出多机多级部署的时候,一个问题便凸显出来,这就是Session。而这个问题的由
来,都是由于HTTP协议在设计之初没有想到未来的发展
tomcat负载均衡配置
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream tomcat {
ip_bash;
#hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name www.example.org;
root /webdataw/nginx/example.org/lee;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
测试示例: