目录
1.2.2 CSS(Cascading Style Sheets)层叠样式表
一 、WEB技术
1.1 HTTP协议和B/S 结构
- 操作系统有进程子系统,使用多进程就可以充分利用硬件资源。进程中可以多个线程,每一个线程可以被CPU调度执行,这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提供计算服务。
- 客户端和服务端往往处在不同的物理主机上,它们分属不同的进程,这些进程间需要通信。跨主机的进程间通信需要使用网络编程。最常见的网络编程接口是Socket。
- Socket称为套接字,本意是插座。也就是说网络通讯需要两端,如果一端被动的接收另一端请求并提供计算和数据的称为服务器端,另一端往往只是发起计算或数据请求,称为客户端。
- 这种编程模式称为Client/Server编程模式,简称C/S编程。开发的程序也称为C/S程序。C/S编程往往使用传输层协(TCP/UDP),较为底层,比如:QQ,迅雷, 云音乐, 云盘, foxmail,xshell等
- 1990年HTTP协议和浏览器诞生。在应用层使用文本跨网络在不同进程间传输数据,最后在浏览器中将服务器端返回的HTML渲染出来。由此,诞生了网页开发。
- 网页是存储在WEB服务器端的文本文件,浏览器发起HTTP请求后,到达WEB服务程序后,服务程序根据URL读取对应的HTML文件,并封装成HTTP响应报文返回给浏览器端。
- 起初网页开发主要指的是HTML、CSS等文件制作,目的就是显示文字或图片,通过超级链接跳转到另一个HTML并显示其内容。
- 后来,网景公司意识到让网页动起来很重要,傍着SUN的Java的名气发布了JavaScript语言,可以在浏览器中使用JS引擎执行的脚本语言,可以让网页元素动态变化,网页动起来了。
- 最早出现了CGI(Common Gateway Interface)通用网关接口,通过浏览器中输入URL直接映射到一个服务器端的脚本程序执行,这个脚本可以查询数据库并返回结果给浏览器端。这种将用户请求使用程序动态生成的技术,称为动态网页技术。先后出现了ASP、PHP、JSP等技术,这些技术的使用不同语言编写的程序都运行在服务器端,所以称为WEB后端编程。有一部分程序员还是要编写HTML、CSS、JavaScript,这些代码运行在浏览器端,称为WEB前端编程。合起来称为Browser/Server编程,即B/S编程。
1.2 前端三大核心技术
1.2.1 HTML
HTML(HyperText Markup Language)超文本标记语言,它不同于一般的编程语言。超文本即超出纯文本的范畴,例如:描述文本颜色、大小、字体等信息,或使用图片、音频、视频等非文本内容。
HTML由一个个的标签(标记)组成,这些标签各司其职,有的提供网页信息,有的负责文字,有的负责图片,有的负责网页布局,所以一个HTML文件,是由格式标签和数据组成
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>云原生</h1>
</body>
</html>
-
超文本需要显示,就得有软件能够呈现超文本定义的排版格式,例如显示:图片、表格,显示字体的大小、颜色,这个软件就是浏览器。
-
超文本的诞生是为了解决纯文本不能格式显示的问题,是为了好看,但是只有通过网络才能分享超文本的内容,所以制定了HTTP协议.
1.2.2 CSS(Cascading Style Sheets)层叠样式表
- HTML本身为了格式化显示文本,但是当网页呈现大家面前的时候,需求HTML提供更多样式能力。这使得HTML变得越来越臃肿。这促使了CSS的诞生。
- 1994年,W3C成立,CSS设计小组所有成员加入W3C,并努力研发CSS的标准,微软最终加入。
- 1996年12月发布CSS 1.0;1998年5月发布CSS 2.0
- CSS 3采用了模块化思想,每个模块都在CSS 2基础上分别增强功能。所以,这些模块是陆续发布的。
- 不同厂家的浏览器使用的引擎,对CSS的支持不一样,导致网页布局、样式在不同浏览器不一样。因此,想要保证不同用户使用不同浏览器看到的网页效果一直非常困难。
1.2.3 JavaScript
Javascript 简称JS,是一种动态的弱类型脚本解释性语言,和HTML、CSS并称三大WEB核心技术,得到了几乎主流浏览器支持。
二、WEB框架
2.1 web 资源和访问
PC 端或移动端浏览器访问
-
从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务器请求图片资源显示
-
从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端
手机 App 访问
-
内置了HTML和JS文件,不需要从静态WEB服务器下载 JS 或 HTML。为的就是减少文件的发送,现代前端开发使用的JS文件太多或太大了
-
有必要就从图片服务器请求图片,从业务服务器请求动态数据
-
客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。
三 、tomcat的功能介绍
-
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和JSP容器
-
起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson,在1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目
-
Tomcat 仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。
-
1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 和 JSP 1.1规范。
-
Tomcat 4.x发布时,内建了Catalina(Servlet容器)和 Jasper(JSP engine)等
-
当前 Tomcat 的正式版本已经更新到 9.0.x 版本,但当前企业中主流版本为 8.x 和 7.x
-
官网:
-
官网文档:
Apache Tomcat 8 (8.5.100) - Documentation Index
-
帮助文档:
Apache Tomcat Home - Apache Tomcat - Apache Software Foundation
FAQ - Apache Tomcat - Apache Software Foundation
3.1 安装 Tomcat
3.1. 环境搭建准备
-
主机配置
准备三台主机
tomcat1-txy 172.25.254.10
tomcat2-txy 172.25.254.20
一台Nginx作为调度器 172.25.254.115 nginx- node1
-
环境安装
安装java环境 ----jdk
#查看jdk版本
[root@tomcat1-txy ~]# dnf search java
#安装
[root@tomcat1-txy ~]# dnf install java-1.8.0-openjdk.x86_64 -y
#查看环境
[root@tomcat1-txy ~]# ll /etc/alternatives/jre_openjdk/
总用量 184
-rw-r--r-- 1 root root 1522 1月 13 2024 ASSEMBLY_EXCEPTION
drwxr-xr-x 2 root root 188 8月 22 13:37 bin
drwxr-xr-x 9 root root 4096 8月 22 13:37 lib
-rw-r--r-- 1 root root 19274 1月 13 2024 LICENSE
-rw-r--r-- 1 root root 158253 1月 13 2024 THIRD_PARTY_README
[root@tomcat1-txy ~]#
#官网下载
https://tomcat.apache.org/download-90.cgi
- 装tomcat
#安装tomcat
#导入安装包到虚拟主机
[root@tomcat1-txy ~]# ls
anaconda-ks.cfg apache-tomcat-9.0.93.tar.gz
#解压安装
[root@tomcat1-txy ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@tomcat1-txy ~]# cd /usr/local/
[root@tomcat1-txy local]# ls
apache-tomcat-9.0.93 bin etc games include lib lib64 libexec sbin share src
#设置软连接,方便后续操作
[root@tomcat1-txy local]# ln -s apache-tomcat-9.0.93 tomcat1
[root@tomcat1-txy local]# ls
apache-tomcat-9.0.93 bin etc games include lib lib64 libexec sbin share src tomcat
[root@tomcat1-txy local]# cd tomcat/
[root@tomcat1-txy tomcat]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
[root@tomcat1-txy tomcat]#
#运行
[root@tomcat1-txy ~]# cd /usr/local/tomcat/bin/
[root@tomcat1-txy bin]# ls -n
[root@tomcat1-txy bin]# ./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-jul i.jar
Using CATALINA_OPTS:
Tomcat started.
#查看端口
[root@tomcat1-txy bin]# netstat -anltupe | grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 0 82 442 30166/java
tcp6 0 0 :::8080 :::* LISTEN 0 82 430 30166/java
[root@tomcat1-txy bin]#
#访问
3.2tomcat的文件结构和组成
目录结构
#目录 说明
-----------------------------------------
bin 服务启动、停止等相关程序和文件
conf 配置文件
lib 库目录
logs 日志目录
webapps 应用程序,应用部署目录,相当于nginx的默认发布目录
work jsp 编译后的结果文件,建议提前预热访问
#查看tomcat相关目录和文件
[root@tomcat1-txy bin]# ls /usr/local/tomcat1/
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
3.3生成tomcat的启动文件
#生成tomcat的主配置文件
[root@tomcat1-txy conf]# vim tomcat.conf
[root@tomcat1-txy conf]# cat tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk
#启动文件
[root@tomcat1-txy ~]# 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@tomcat1-txy ~]# vim /usr/bin/tomcat
#!bin/bash
case $1 in
start)
/usr/local/tomcat1/bin/startup.sh
;;
stop)
/usr/local/tomcat/bin/shutdown.sh
;;
esac
[root@tomcat1-txy conf]# chmod +x /usr/bin/tomcat
[root@tomcat1-txy conf]# vim /lib/systemd/system/tomcat.service ExecStart=/usr/local/tomcat start ExecStop=/usr/local/tomcat stop
[root@tomcat1-txy ~]# useradd -s /sbin/nologin -M tomcat1
[root@tomcat1-txy ~]# systemctl daemon-reload
[root@tomcat1-txy ~]# ps aux | grep tomcat1
root 1726 0.0 0.1 6636 2304 pts/0 S+ 13:32 0:00 grep --color=auto tomcat1
[root@tomcat1-txy ~]# cd
[root@tomcat1-txy ~]# ls /usr/local/tomcat/ -ld
drwxrwxrwx 9 root root 220 8月 22 20:04 /usr/local/tomcat/
[root@tomcat1-txy ~]# chown -R tomcat.tomcat /usr/local/tomcat/
[root@tomcat1-txy ~]# systemctl daemon-reload
[root@tomcat1-txy ~]# systemctl enable --now tomcat
[root@tomcat1-txy ~]# systemctl status tomcat.service
#在主机20上完成10的操作
四、结合反向代理实现tomcat部署
4.1 常见部署方式介绍
-
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
-
4.2 利用 nginx 反向代理实现
-
利用nginx反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个tomcat主机
-
利用nginx指令proxy_pass 可以向后端服务器转发请求报文,并且在转发时会保留客户端的请求报文中的host首部
- 默认发文件
[root@tomcat1-txy ~]# ls
anaconda-ks.cfg apache-tomcat-9.0.93.tar.gz test.jsp
[root@tomcat1-txy ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@tomcat1-txy ~]#
[root@tomcat2-txy ~]# ls
anaconda-ks.cfg apache-tomcat-9.0.93.tar.gz test.jsp
[root@tomcat2-txy ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@tomcat2-txy ~]#
[root@nginx conf.d]# vim vhost.conf
[root@nginx conf.d]# cat vhost.conf
upstream tomcat {
ip_bash;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen *:80;
server_name www.txy.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
#proxy_pass http://172.25.254.10:8080;
#proxy_pass http://172.25.254.20:8080;
proxy_pass http://tomcat
}
}
[root@nginx conf.d]#
[root@nginx conf.d]# vim vhost.conf
[root@nginx conf.d]# cat vhost.conf
server {
listen *:80;
server_name www.txy.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
proxy_pass http://172.25.254.10:8080;
proxy_pass http://172.25.254.20:8080;
}
}
[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
4.3 实现tomcat中的负载均衡
- 动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压 力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance负载 均衡。
- 当单机Tomcat,演化出多机多级部署的时候,一个问题便凸显出来,这就是Session。而这个问题的由 来,都是由于HTTP协议在设计之初没有想到未来的发展。
[root@nginx conf.d]# vim vhost.conf
[root@nginx conf.d]# cat vhost.conf
upstream tomcat {
ip_bash;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen *:80;
server_name www.txy.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
#proxy_pass http://172.25.254.10:8080;
#proxy_pass http://172.25.254.20:8080;
proxy_pass http://tomcat
}
}
五 、Memcached
5.1 Memcached简介
- Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统memcached 虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式, 让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样 的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢 失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并提供服务。
- Memcached 借助了操作系统的 libevent 工具做高效的读写。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能
- Memcached 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached 最适合保存用户的 session实现session共享
- Memcached存储数据时, Memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page
- Memcached 支持多种开发语言,包括:JAVA,C,Python,PHP,C#,Ruby,Perl等
- Memcached 官网:http://memcached.org
5.2 memcached 操作命令
五种基本 memcached 命令执行最简单的操作。
命令和操作包括: set add replace get delete
#前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
command <key> <flags> <expiration time> <bytes>
<value>
#参数说明如下:
command set/add/replace
key key 用于查找缓存值
flags 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes 在缓存中存储的字节数
value 存储的值(始终位于第二行)
#增加key,过期时间为秒,bytes为存储数据的字节数
add key flags exptime bytes
5.3 memcached的安装与启动
[root@tomcat1-txy ~]# yum install memcached -y
[root@tomcat1-txy ~]# vim /etc/sysconfig/memcached
[root@tomcat1-txy ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1" # 修改此处
[root@tomcat1-txy ~]# systemctl start memcached.service
[root@tomcat1-txy ~]# dnf install telnet -y
[root@tomcat1-txy ~]# telnet 172.25.254.20 11211
Trying 172.25.254.20...
Connected to 172.25.254.20.
Escape character is '^]'.
add key1 0 20 2
ll
STORED
get key1
VALUE key1 0 2
ll
END
quit
Connection closed by foreign host.
六、 session 共享服务器
- msm(memcached session manager)提供将Tomcat的session保持到memcached可以实现高可用。
- 项目早期托管在google code,目前在Github
- github网站链接: https://github.com/magro/memcached-session-manager
- 支持Tomcat的 6.x、7.x、8.x、9.x
- Tomcat的Session管理类,Tomcat版本不同
-
memcached-session-manager-2.3.2.jar
-
memcached-session-manager-tc9-2.3.2.jar
- Session数据的序列化、反序列化类
- 官方推荐kyro
- 在webapp中WEB-INF/lib/下
- 驱动类
- memcached(spymemcached.jar)
- Redis(jedis.jar)
6.1 msm安装配置
注意:
t1 和 m1 部署可以在一台主机上, t2 和 m2 部署也可以在同一台。当新用户发请求到 Tomcat1 时 , Tomcat1 生成 session 返回给用户的同时 , 也会同时发给 memcached2 备份。即Tomcat1 session 为主 session , memcached2 session 为备用 session ,使用 memcached 相当于备份了一份Session如果 Tomcat1 发现 memcached2 失败 , 无法备份 Session 到 memcached2, 则将 Sessoin 备份存放在memcached1 中
# 下载相关jar包
[root@tomcat1-txy ~]# cd jar/
[root@tomcat1-txy iar]# ls
asm-5.2.jar memcached-session-manager-tc9-2.3.2.jar reflectasm-1.11.9.jar
kryo-3.0.3.jar minlog-1.3.1.jar spymemcached-2.12.3.jar
kryo-serializers-0.45.jar msm-kryo-serializer-2.3.2.jar
memcached-session-manager-2.3.2.jar objenesis-2.6.jar
[root@tomcat1-txy iar]#
[root@tomcat1-txy iar]# cp *.jar /usr/local/tomcat/lib/
[root@tomcat1-txy iar]# cd /usr/local/tomcat/lib/
#修改tomcat配置
[root@tomcat1-txy ~]# vim /usr/local/tomcat/conf/context.xml
######添加######
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:172.25.254.10:11211,m2:172.25.254.20:11211"
failoverNodes="m1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
##############
#重启
[root@ka1 ~]# systemctl restart tomcat
# 修改nginx配置
[root@nginx conf.d]# vim vhost.conf
[root@nginx conf.d]# cat vhost.conf
upstream tomcat {
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen *:80;
server_name www.txy.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}