前面一章我们介绍了Nginx的基础架构LNMP,今天我们将说说另外一款基础架构LNMT。说基础架构的主要原因是想通过一套整体的方案来回顾和巩固的Nginx的一些基础功能,比如location,server,upstream等等。
在说LNMT架构之前我们要先简单介绍下T(Tomcat)的功能和作用吧。
Tomcat 是 Apache 的扩展,是 Apache 的一个子项目,它具备 Web 服务器的所有功能,不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范的 Java 代码 Servlet,同时将执行的结果以 HTML 代码的形式返回客户端。
Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。
Nginx仅支持静态资源解析,而tomcat支持解析JAVA开发的web应用,还支持解析静态资源(效率不高)
Nginx适合做前端负载均衡,而Tomcat适合做后端应用服务处理。通常情况下,企业会用Nginx+Tomcat结合,由Nginx处理静态资源,Tomcat处理动态资源。
1)Web 容器:完成 Web 服务器的功能( 如 HTTP/HTTPS 请求的接受和响应 );
2) Servlet 容器:由名称为 catalina 的脚本来处理 Servlet 代码( 如从数据库中拿取数据给与前端 );
3) JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码( index.html index.php index.jsp )。
因此Tomcat是web应用服务器,也是一个Servlet/JSP容器。Tomcat作为 Servlet容器,负责处理客户请求,把请求传送给servlet,并将servlet的响应传送回给客户。
1) 用户点击网页内容,请求被发送到本机端口 8080,Service 作为一个进程支持 Tomcat,Connector 作为一个连接器(连接 nginx 或者外部请求),等着去监听 HTTP1.1 版本中的 8080 端口(Coyote:可以看做运行 Connector 连接器运行的环境);
2)交给后端 container 容器中的 Engine(支持容器正常运行的引擎);
3)在引擎所支持的 container 容器内会有一个项目 host,进行交互,借助于 context 做连接的服务,连接的是 java 的前端和后端;
4)交给 servlet 处理 java 后端数据与数据库交互;
5)servlet 处理完会返回给 context(连接器);
6)context 返回给 engine 引擎;
7)engine 引擎返回给端口,最终通过映射端口的方式将页面展现给客户
1. Tomcat官网下载软件包:Tomcat官网
2. 解压软件包到指定目录
root@web1:/solft# tar -xvf apache-tomcat-9.0.65.tar.gz -C /tomcat
root@web1:/solft#
3. 执行启动脚本
root@web1:/solft/tomcat/bin# ./startup.sh
Using CATALINA_BASE: /solft/tomcat
Using CATALINA_HOME: /solft/tomcat
Using CATALINA_TMPDIR: /solft/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /solft/tomcat/bin/bootstrap.jar:/solft/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
## 查看是否启动成功
root@web1:/solft/tomcat/bin# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::8080 :::* LISTEN 50954/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 50954/java
Tomcat的主要配置文件是/usr/share/tomcat9/etc/server.xml。
默认的server.xml配置如下:
配置文件的层级关系就是我们上面所说的Connector-->container-->Engine-->Host;但是这里没有我们所说的contest和servlet,这就是我们后续虚拟主机所要配置的。
配置文件图解:
1)一个server表示一个Tomcat实例(可以有多个实例);
2) 一个server中包含多个Connector连接器,Connector的主要功能是接受和响应用户请求;
3) service的作用就是将Connector关联至Engine引擎;
4) 一个Host就是一个站点,类似于Nginx中的多站点;
5) Context类似于Nginx中的Location。
编辑conf/server.xml文件
访问
server {
listen 80;
server_name zrlog.tomcat.com www.zrlog.tomct.com;
access_log /var/log/nginx/zrlog.access.log main;
location / {
return 301 http://192.168.65.130:8080;
}
}
由于我们在tomcat端的8080端口上存在多个虚拟主机,当我们直接return 301 http://192.168.65.130:8080的时候,访问可能会随机转发到一个虚拟主机上,此时简单的方法就是只剩一个zrlog的虚拟主机。
## 压缩130上的zrlog数据
root@web1:# tar -czf zrlog.tar.gz zrlog/
## 拷贝至131
root@web1:# scp zrlog.tar.gz [email protected]:/zrlog
## 按照上述步骤安装tomcat
upstream tomcat_server {
server 192.168.65.130:8080;
server 192.168.65.131:8080;
}
server {
listen 80;
server_name zrlog.tomcat.com www.zrlog.tomcat.com;
access_log /var/log/nginx/zrlog.access.log main;
location / {
proxy_pass http://tomcat_server;
include proxy_params; ###一定要配置
}
}
注意:include proxy_params一直要配置默认相关设置,在这个LNMT的磨课项目中不配置的话可能存在400的错误,经过排查可能是header超限超限制导致的,配置之后已解决。
root@nginx:/etc/nginx/conf.d# cat ../proxy_params
proxy_http_version 1.1; # 设置代理的HTTP协议版本
proxy_set_header Host $http_host; # 代理向后端主机请求时携带host域名
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 获取客户端真实IP以及全链路IP
proxy_connect_timeout 30; # 代理连接后端超时时间
proxy_send_timeout 60; # 后端传递数据至代理的超时时间
proxy_read_timeout 60; # 后端响应代理的超时时间
proxy_buffering on; # 代理会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传
proxy_buffer_size 32k; # 代理保存用户头信息的缓冲区大小
proxy_buffers 4 128k; # 设置代理的缓冲区大小
通过两个整体的方案我们应该对企业的web有了一定的基础了解。思考一个问题,上述的架构中我们都是通过Nginx做的负载均衡,要是Nginx负载均衡出现故障了我们怎么办呢?或者说我们如何保证Nginx负载均衡的高可用呢?思考一下,后续我们来处理这个问题。