45、tomcat+课后实验
tomcat
1、tomcat
·tomcat和
php`一样,都是用来处理动态页面的。
tomcat也可以作为web应用服务器,开源的。
php .php
tomcat .jsp
nginx .html
tomcat 是用Java代码写的程序,运行的是Java的web应用程序。
tomcat的特点和功能:
1、servlet
容器:执行java servlet
,服务端的java程序,处理客户端的http请求,以及响应。
2、jsp
容器,Javaserver page
这是一种动态页面的技术,可以在html的页面里面嵌入Java代码。
3、自身也是一个http的服务器。
4、tomcat
是一个轻量级的动态页面的处理程序,高并发场景不使用。
优化,tomcat自身的优化,以及系统的内核优化,jvm的优化。
servlet
:
-
是java语言中用来开发web应用程序的关键组件。处理http请求,生成动态内容,以及响应客户端的请求。
-
处理http请求
-
生成动态内容
-
处理Java的业务逻辑
-
会话管理,保持用户的状态信息,购物车同步,用户登录等等。
-
也可以转发nginx的动态请求到数据库。
jsp
-
web应用程序的界面,这个界面的语言是用Java实现的。
-
.jsp为结尾的文件
-
index.jsp
2、tomcat
的组件:
-
connector
:负责对外接受和响应请求,它是tomcat于客户端沟通的一个枢纽,监听端口接受外界请求。 -
端口:8080
-
接收到请求之后,传递给其他组件进行处理,处理完成之后回到connector,再响应客户端。
-
container
:负责处理业务逻辑,engin host contxt wrapper
四个功能组成 -
engine:用来管理多个虚拟主机host,一个service只能有一个engine。
-
host:一个host就是一个主机,也可以叫站点,通过配置host,可以添加多个站点。
-
context :一个context代表一个web应用。
-
wrapper:封装器,负责处理最底层的逻辑。
service:对外提供外部服务,包含connector和container
tomcat可以有多个service,每个service之间是互相独立的。
3、tomcat目录的作用:
bin
:存放启动和关闭tomcat脚本的文件。startup.sh
shutdow.sh
conf
存放tomcat的主配置文件,server.xml主配置文件
context.xml
:host的默认配置信息
tomcat-user.xml
登录时认证用户和密码的相关信息,manager文件必须要赋权修改之后才能打开。
lib
:tomacat运行时需要的jar包。一般不动
logs
:日志文件,catalina.out主日志文件。
temp
:存放tomcat运行时产生的文件。
webapps
:部署web应用的目录,类似于nginx的html。
4、tomcat服务部署
---------------------Tomcat 服务部署-------------------------
在部署 Tomcat 之前必须安装好 jdk,因为 jdk 是 Tomcat 运行的必要环境。
1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gzsystemctl stop firewalld
systemctl disable firewalld
setenforce 02.安装JDK
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm
java -version3.设置JDK环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH##解释:
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64:
这个命令设置了一个名为JAVA_HOME的环境变量,它指向Java JDK的安装路径。
这对于告诉系统和其他应用程序Java的安装位置非常重要。你需要将路径替换为你实际安装Java的路径。export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:
这个命令设置了一个名为CLASSPATH的环境变量,它用于指定Java类的搜索路径。
在这个命令中,.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 表示当前目录(.)
以及Java工具库(tools.jar)和Java远程调试库(dt.jar)的路径。这些库通常包含一些Java开发所需的类。export PATH=$JAVA_HOME/bin:$PATH:
这个命令将Java可执行文件的路径添加到系统的PATH环境变量中。
这使得你可以在终端中直接运行Java工具,而不需要输入完整的路径。
这将Java的bin目录添加到了PATH中,使得java、javac等命令可以直接运行。source /etc/profile.d/java.sh
java -version----------------------------------------------------------------------------------------------------------CLASSPATH:编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件。
dt.jar:是关于运行环境的类库,主要是可视化的 swing 的包。
tools.jar:主要是一些jdk工具的类库,包括javac、java、javap(jdk自带的一个反编译工具)、javadoc等。
JDK (Java Development Kit):JDK是Java开发工具包,它是用于开发Java应用程序的软件包。
JDK包括了编译器(javac)、调试器、各种工具、Java标准类库(Java API)、以及Java文档等。
JDK是开发者用来创建、编译和运行Java应用程序的重要组件。JRE (Java Runtime Environment):JRE是Java运行时环境,它是用于执行Java应用程序的部分。
JRE包括了Java虚拟机(JVM)以及Java类库(Java API),这使得用户能够在计算机上运行已编译的Java程序,
而不需要进行开发。JRE是终端用户需要安装的部分,以便能够运行Java应用程序。JVM (Java Virtual Machine):JVM是Java虚拟机,它是Java应用程序在计算机上运行的核心组件。
JVM负责将编译后的Java字节码(.class文件)解释或编译成本地机器码,以便计算机能够执行它。JVM提供了内存管理、垃圾回收、线程管理等功能,以确保Java程序在不同平台上具有相似的行为。首先使用文本工具编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac
5、tomacat安装
1、安装启动Tomcat
安装启动Tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat ##
#后台启动
/usr/local/tomcat/bin/startup.sh
或
/usr/local/tomcat/bin/catalina.sh start#前台启动
/usr/local/tomcat/bin/catalina.sh run netstat -natp | grep 8080浏览器访问Tomcat的默认主页 http://192.168.233.21:80805.优化tomcat启动速度
第一次启动tomcat可能会发现 Tomcat 启动很慢,默认情况下可能会需要几十秒,可以修改jdk参数进行改。
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
--117行--修改securerandom.source=file:/dev/urandom/dev/urandom是/dev/random的非阻塞版本,/dev/random的 random pool 依赖于系统中断,因此在系统的中断数不足时,
/dev/random 设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用,
/dev/random设备可以保证数据的随机性。 /dev/urandom不依赖系统的中断,也就不会造成进程忙等待,
但是数据的随机性也不高,所以该随机数的安全性理论上不高。如果应用对安全性要求很高,那么应该使用/dev/random。
------主要目录说明----------------------------------------------------------------------------------------------
●bin:存放启动和关闭Tomcat的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh三个文件
●conf:存放Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
① server.xml: Tomcat的主配置文件,包含Service,Connector,Engine,Realm,Valve,Hosts主组件的相关配置信息;
② context.xml:所有host的默认配置信息;
③ tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息,Tomcat自带的manager默认情况下会用到此文件,在Tomcat中添加/删除用户,为用户指|定角色等将通过编辑此文件实现;
④ web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的web应用程序提供包括MIME映射等默认配置信息;
●lib:存放Tomcat运行需要的库文件的jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的jar 包
●logs:存放 Tomcat 执行时的日志
●temp:存放 Tomcat 运行时产生的文件
●webapps:存放 Tomcat 默认的 Web 应用部署目录
●work:Tomcat工作日录,存放jsp编译后产生的class文件,一般清除Tomcat缓存的时候会使用到
●src:存放Tomcat 的源代码●doc:存放Tomcat文档
----------------------------------------------------------------------------------------------------------查看manager文件:
cd /usr/local/tomcat/webapps/manager/META-INF
vim context.xml<Context antiResourceLocking="false" privileged="true" ><Valve className="org.apache.catalina.valves.RemoteAddrValve"allow=".*" /> #允许所有主机访问。cd /usr/local/tomcat/conf##设置登录页面:
在conf,tomcat-users.xml中,添加账户密码
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>cd ..
cd bin
[root@test4 bin]# ./shutdown.sh
[root@test4 bin]# ./startup.sh
[root@test4 bin]# ss -antp | grep 8080
6、配置tomcat的虚拟主机
---------------------Tomcat 虚拟主机配置-------------------------
很多时候公司会有多个项目需要运行,一般不会是在一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时, 就需要使用到 Tomcat 虚拟主机。
例如现在新增两个域名 www.kgc.com 和 www.benet.com, 希望通过这两个域名访问到不同的项目内容。1.创建 kgc 和 benet 项目目录和文件
mkdir /usr/local/tomcat/webapps/kgc
mkdir /usr/local/tomcat/webapps/benet
echo "This is kgc page\!" > /usr/local/tomcat/webapps/kgc/index.jsp
echo "This is benet page\!" > /usr/local/tomcat/webapps/benet/index.jsp2.修改 Tomcat 主配置文件 server.xml ##等于是nginx.conf
vim /usr/local/tomcat/conf/server.xml
--165行前--插入
<Host name="www.kgc.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true" />
</Host> <Host name="www.benet.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
</Host>
##添加网站
----------------------------------------------------------------------------------------------------------Host name:主机名
appBase:Tomcat程序工作目录,即存放web应用程序的目录;相对路径为webapps,绝对路径为 /usr/local/tomcat/webapps
unpackWARs:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true
autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true
xmlValidation:是否验证xml文件执行有效性检验的标志
xmlNamespaceAware:是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验docBase:相应的Web应用程序的存放位置;也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径;
path:相对于Web服务器根路径而言的URI;如果为空“”,则表示为此webapp的根路径 / ;
reloadable:是否允许重新加载此context相关的Web应用程序的类;默认为false
首先使用文本工具编写java源代码,比如 Hello.java ;
在命令行中,输入命令:javac Hello.java,对源代码进行编译,生成 class 字节码文件;
编译完成后,如果没有报错信息,输入命令:java Hello,运行 class 字节码文件,由 JVM 对字节码进行解释和运行,
打印 “Hello World”。vim Hello.javapublic class Hello { public static void main(String[] args){System.out.println("Hello world!");}
}javac Hello.java
java Hellopublic: 这是一个访问修饰符,表示类是公共的,可以从其他地方访问。
class: 关键字用于定义一个类。
Hello: 这是类的名称,这里是一个叫做 "Hello" 的类。public static void main(String[] args){
public: 访问修饰符,表示这个方法是公共的,可以从其他地方访问。
static: 静态修饰符,表示这个方法属于类而不是实例,可以通过类名直接调用。
void: 这是方法的返回类型,void 表示方法没有返回值。
main: 这是方法的名称,是程序的入口点,当程序运行时会从这里开始执行。
(String[] args): 这是方法的参数列表,args 是一个字符串数组,可以在命令行传递参数给程序。System.out.println("Hello world!");
System.out: System 是一个类,out 是这个类的一个静态成员,它代表标准输出流。
println: 这是输出方法的名称,它会在控制台输出一行内容。
"Hello world!": 这是要输出的内容,是一个字符串。
7、tomcat的优化:
tomcat自身的优化
内核优化
jvm优化
tomcat的并发处理能力不强,大项目不使用tomcat作为转发动态的中间件(k8s集群,python,rubby),小项目会使用(内部使用)。动静分离。
7.1、优化tomcat的启动速度
file:/dev/urandom,—非阻塞的版本,不依赖系统的终端,进程忙也不会进入等待状态。所以处理速度相对比较快。
如果对应用的安全性要求比较高,/dev/random
默认配置不适合生成环境,可能频繁的出现假死,需要不停的重启。
根据生产环境的实际情况,自行测试。
port 8080 http
8443 https 443
接受客户端https的请求
<Connector port="8080" protocol="HTTP/1.1"70 connectionTimeout="20000"71 redirectPort="8443"72 maxThreads="500"73 />
- maxThreads:tomcat使用线程来处理接收请求的个数。tomcat最多可以创建多少个线程。默认200个,500,1000。
- minSpareThreads:最小空闲数线程,就是有没有使用,最少开启线程数,tomcat开启之后,没人使用也会有进程待命,默认值10。
- maxSpareThreads:最大空闲数线程,一旦线程总数超过这个值,tomcat就会关闭不再需要的线程,默认就是-1,不限制,一般不设置。
- connectionTimeout="20000"网络连接超时时间,单位是亳秒,设置为0,永不超时。默认即可200000ms。
- enableLookups:是否支持反向解析,true,false。
- 提高处理速度。
- disableUplaodTimeout:上传时是否使用超时时间机制,10s,true和false。true关闭,false开启。
- connectionUplaodTimeout:上传的超时时间。先得打开超时限制,再设置时间。
- acceptCount:当所有可用的请求的线程都被使用时,可用接入请求的最大队列长度,超过了这个数字的请求将不予处理(直接丢弃),默认100个
- compression:是否对响应数据进行压缩,on开启,off就是关闭。
- 开启压缩之后,可以有效减少页面的大小(文本无效。图片,音频,视频)一般可用减少1/3,节省带宽,默认off。
- compression=“on”
- compressionMinSize=“”:表示响应压缩的最小值,只有响应报文大于这个值才会压缩。如果开启了压缩,默认值时2048。
- noCompressionUserAgents="浏览器名称"对于这些浏览器,不启用压缩。
- compressableMimeType="text/plain,video/mp4"压缩类型,指定对哪些类型的文件进行压缩。
7.2、常用的页面类型:
- 文本类型:text/plain,text/html,text/css,text/javascript
- 图片类型:image/jpg,image/jpeg,img/gif
- 音频:audio/ogg,wav,mpeg
- 视频:video/mp4,webm,rmvb,quicktime。
- 应用程序:application/pdf、json、xml。
7.3、内核优化:
系统安全的优化补齐。
内核优化的配置文件:
1、打开文件数的限制,系统初始化的第一步要做的事情--------vim /etc/security/limits.conf。
2、内核参数文件---------vim /etc/sysctl.conf
sysctl -a
sysctl -c
net.ipv4.ip_forward=0/1 禁用或者开启数据包的转发功能,要做路由器必须打开,0是关,1是开。net.ipv4.tcp_max_tw_buckets=2000 允许timewait的最大数量2000。net.ipv4.tcp_sack=1启用有选择的应答,提高tcp的处理性能。net.core.netdev_max_backlog=262144 (字节) 网络接收数据包队列的最大的大小。vm.swappiness=0 ,关闭内存的交换行为,不使用交换分区,k8s默认就不能使用交换分区,否则会报错。net.ipv4.tcp_max_orphans:系统允许的最大的tcp连接数量。net.ipv4.ip_local_port_range=1024 650001024-65000设定系统的端口范围。net.ipv4.tcp_fin_timeout=10 设置tcp关闭连接的超时时间。net.ipv4.tcp_keepalive_time:设置tcp的keepalive包探测包的发送频率,以检测连接状态。
记住上面的,下面了解
kernel.sysrq = 0: 禁用了内核的SysRq功能,SysRq允许在系统崩溃或出现问题时执行一些调试操作。kernel.core_uses_pid = 1: 设置核心转储文件名中包含进程ID,有助于标识是哪个进程导致了核心转储。kernel.msgmnb 和 kernel.msgmax: 增加IPC消息队列的默认和最大大小,用于进程间通信。kernel.shmmax 和 kernel.shmall: 调整共享内存的最大大小和分配页面数。net.ipv4.ip_forward = 0: 禁用IP数据包的转发功能,通常用于不充当路由器的系统。net.ipv4.conf.default.rp_filter 和 net.ipv4.conf.all.rp_filter: 控制反向路径过滤,提高网络安全性。net.ipv4.icmp_echo_ignore_all: 允许或禁止系统响应ping请求。net.ipv4.icmp_echo_ignore_broadcasts: 禁止系统对广播和多播地址的ICMP回显和时间戳请求作出响应。net.ipv4.conf.default.accept_source_route: 不接受源路由,增加网络安全性。net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,保护系统免受TCP SYN 攻击。net.ipv4.tcp_max_tw_buckets = 6000: 设置允许的TIME_WAIT套接字最大数量,避免服务器性能下降。net.ipv4.tcp_sack = 1: 启用有选择的应答(SACK)来提高TCP性能。net.ipv4.tcp_window_scaling = 1: 启用TCP窗口缩放功能,允许大窗口的TCP传输。net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 调整TCP套接字读取和写入缓冲区大小。net.ipv4.tcp_mem: 设置TCP缓冲区的最小、默认和最大值。net.core.wmem_default, net.core.rmem_default, net.core.rmem_max, net.core.wmem_max: 调整网络核心
缓冲区的大小。net.core.netdev_max_backlog: 控制网络接口接收数据包的排队队列大小。net.ipv4.tcp_max_orphans: 设置系统允许的孤立TCP连接最大数量。net.ipv4.tcp_max_syn_backlog: 控制系统允许的三次握手队列长度。net.ipv4.tcp_synack_retries 和 net.ipv4.tcp_syn_retries: 设置SYN-ACK和SYN请求的重试次数。net.ipv4.tcp_tw_recycle 和 net.ipv4.tcp_tw_reuse: 启用TIME_WAIT套接字快速回收和重用。net.ipv4.tcp_fin_timeout: 设置TCP连接FIN(关闭连接)的超时时间。net.ipv4.tcp_keepalive_time: 设置TCP keepalive探测包发送频率,以检测连接状态。net.ipv4.ip_local_port_range: 设置本地端口范围,用于分配本地应用程序端口。net.ipv6.conf.all.disable_ipv6 和 net.ipv6.conf.default.disable_ipv6: 禁用IPv6。net.netfilter.nf_conntrack_max 和其他 net.netfilter.nf_conntrack_*: 控制连接跟踪和防火墙相关设置。net.nf_conntrack_max: 设置最大连接跟踪项数。vm.overcommit_memory = 0: 控制内存超额分配策略,避免OOM killer杀掉进程。vm.swappiness = 0: 设置内存交换行为,降低内存交换。fs.file-max = 999999: 设置进程可以同时打开的最大文件句柄数。net.ipv4.tcp_max_tw_buckets = 6000: 设置操作系统允许的TIME_WAIT套接字最大数量。net.ipv4.ip_local_port_range = 1024 65000: 设置系统允许的本地端口范围。net.ipv4.tcp_tw_recycle = 1: 启用TIME_WAIT套接字快速回收。net.ipv4.tcp_tw_reuse = 1: 允许TIME-WAIT套接字重用。net.ipv4.tcp_syncookies = 1: 启用SYN Cookies,防止TCP SYN 攻击。net.core.somaxconn = 40960: 设置最大监听队列长度,用于控制最大并发连接数。net.core.netdev_max_backlog = 262144: 设置每个网络接口接收数据包队列的最大大小。net.ipv4.tcp_max_syn_backlog = 262144: 设置接受SYN请求队列的最大长度。net.ipv4.tcp_rmem, net.ipv4.tcp_wmem: 设置TCP套接字读取和写入缓冲区的最小、默认和最大大小。net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max: 设置内核套接字接收和
发送缓冲区大小。net.ipv4.tcp_syncookies = 1: 设置启用SYN Cookies,用于解决TCP SYN 攻击。
7.4、jvm的优化
JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -Xmn768m -XX:ParallelGCThreads=2 -XX:PermSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true -XX:+DisableExplicitGC"
cygwin=false
解释:面试会问
-Xms2048m:java初始化堆的大小,分配jvm的最小内存,cpu的性能比较高,可以分配的高一点。-Xmx2048m:java堆的最大值,也就是jvm的最大内存,取决于物理内存的大小,官方建议设置成和xms一样的值,设置成物理内存的一半-Xmn768m:新生代内存的大小,官方推荐,设置成jvm内存最大值的3/8.java自带垃圾回收机制,java进行垃圾回收之后不需要重新计算堆区的大小。堆区:新生代,中生代,老年代。每生成有一个新的对象,对象占用的内存空间就是新生代空间。垃圾回收对堆区当中的资源进行回收之后,新生代没有被回收,就会变成中生代,中生代的就会转移到老年代。整个jvm堆的大小:新生代+中生代+老生代+永久代(系统自带的)-XX:ParallelGCThreads=2配置并行收集器的线程数,同时有多少个线程数一起进行来及时回收,配置成cpu的一半。-XX:PermSize=1024m设置非堆内存的初始值,持久代内存的大小,默认是物理内存的1/4,建议设置成整个jvm内存的一半,非堆内存是不会被Java的垃圾回收机制处理的。-XX:MaxPermSize=1024m 非堆内存的最大值,和初始值一致即可。-Djava.awt.headless=true:防止在linux访问的情况下,web页面的图片不能打开。-XX:+DisableExplicitGC:老年代的收集算法,缩短垃圾回收机制的回收时间。
- PS Eden Space 堆内存 创建一个新对象都在堆内存当中。
- PS Old Gen 堆内存,长期存活的对象,永生代。
- PS Survivor space 堆内存,PS Eden space和Ps Old Gen之间的存活对象,中生代。
- Code Cache 非堆内存,存储以及编译的代码。
- Compressed Class Space 非对内存,存储以及压缩过的类定义。
- Metaspace 非堆内存,存储元数据的区域
- ajp-nio-8009
- ajp-nio:连接器的类型,ajp是协议,nio:异步非阻塞的通信方式。
- ajp协议:tomcat服务器和web服务器之间进行连接的协议,可以提供负载均衡和高效转发。nio可以提高并发的处理能力。
- 8009就是ajp的端口
8、tomcat和nginx实现动静分离:
访问nginx就是静态页面,nginx代理实现index.jsp,可以访问tomcat的动态页面。
课后实验
思路
nginx1:192.168.168.10纯代理nginx2、3:192.168.168.20代理+静态页面192.168.168.30代理+静态页面tomcat:192.168.168.40动态页面192.168.168.90动态页面
nginx1、2、3,tomcat4、5配置:关闭防火墙,安全机制
nginx1配置
vim /usr/local/nginx/conf/nginx.conf
#keepalive_timeout 0;keepalive_timeout 65;#gzip on;
upstream nginx {server 192.168.168.20 weight=2;server 192.168.168.30 weight=1;}
server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location ~ .*\.(html|jsp)$ {proxy_pass http://nginx;}
nginx2配置
vim /usr/local/nginx/html/index.html
this is test2
vim /usr/local/nginx/conf/nginx.conf
#keepalive_timeout 0;keepalive_timeout 65;#gzip on;
upstream tomcat {server 192.168.168.40:8080 weight=2;server 192.168.168.90:8080 weight=1;}server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location ~ .*\.jsp$ {proxy_pass http://tomcat;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
nginx3配置
vim /usr/local/nginx/html/index.html
this is test3
vim /usr/local/nginx/conf/nginx.conf
#keepalive_timeout 0;keepalive_timeout 65;#gzip on;
upstream tomcat {server 192.168.168.40:8080 weight=2;server 192.168.168.90:8080 weight=1;}
server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location ~ .*\.jsp$ {proxy_pass http://tomcat;proxy_set_header HOST $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
tomcat4:
配置文件设置动态网页打开页面位置
vim /usr/local/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test4" path="" reloadable="true" />
动态页面内容设置
mkdir -p /usr/local/tomcat/webapps/test4
vim /usr/local/tomcat/webapps/test5/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html><head>
<title>JSP test2 page</title>
</head><body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
tomcat5:
配置文件设置动态网页打开页面位置
vim /usr/local/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test5" path="" reloadable="true" />
动态页面内容设置
mkdir -p /usr/local/tomcat/webapps/test5
vim /usr/local/tomcat/webapps/test5/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html><head>
<title>JSP test2 page</title>
</head><body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
相关文章:
![](https://i-blog.csdnimg.cn/direct/2ffaf52ba29f4384b21bd7b0a985ba2e.png#pic_center)
45、tomcat+课后实验
tomcat 1、tomcat tomcat和php一样,都是用来处理动态页面的。 tomcat也可以作为web应用服务器,开源的。 php .php tomcat .jsp nginx .html tomcat 是用Java代码写的程序,运行的是Java的web应用程序。 tomcat的特点和功能:…...
![](https://i-blog.csdnimg.cn/direct/b95a47f6cccc4a24ad75f5fb94097522.png)
设计模式的七大原则
1.单一职责原则 单一职责原则(Single responsibility principle),即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1、…...
![](https://i-blog.csdnimg.cn/direct/59204d914c1a44859c8236cac86ffd01.png#pic_center)
ThreeJS-3D教学十五:ShaderMaterial(noise、random)
ThreeJS-3D教学十四:ShaderMaterial(length、fract、step) 上面这篇主要是操作 fragmentShader 片元着色器,实现对物体颜色的修改,这次咱们来看下修改 vertexShader 顶点着色器,这个其实就是位移各个顶点的位置。 接下来我们先介绍下 noise 噪声函数(Perlin Noise、Sim…...
![](https://www.ngui.cc/images/no-images.jpg)
LeetCode 2974.最小数字游戏:排序+交换奇偶位
【LetMeFly】2974.最小数字游戏:排序交换奇偶位 力扣题目链接:https://leetcode.cn/problems/minimum-number-game/ 你有一个下标从 0 开始、长度为 偶数 的整数数组 nums ,同时还有一个空数组 arr 。Alice 和 Bob 决定玩一个游戏ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
使用vllIm部署大语言模型
使用vllm部署大语言模型一般需要以下步骤: 一、准备工作 1. 系统要求 - 操作系统:常见的 Linux 发行版(如 Ubuntu、CentOS)或 Windows(通过 WSL)。 - GPU 支持:NVIDIA GPU 并安装了适当的驱动程…...
![](https://www.ngui.cc/images/no-images.jpg)
静态搜索iOS动态链接函数的调用位置
静态搜索iOS动态链接函数的调用位置 可执行文件格式mach-O,是在苹果的操作系统 macOS 和 iOS 上使用的一种二进制文件格式。 在一些iOS安全扫描中,可能存在需要获取函数具体调用位置的需求,能指导用户更精确的定位漏洞。 现在以NSLog函数为例ÿ…...
![](https://i-blog.csdnimg.cn/direct/8f4016401b634be595ec6eb978371a25.png)
【鸿蒙学习笔记】尺寸设置・layoutWeight・对子组件进行重新布局
官方文档:尺寸设置 目录标题 layoutWeight:对子组件进行重新布局 layoutWeight:对子组件进行重新布局 设置了layoutWeight属性的子元素与兄弟元素占主轴尺寸按照权重进行分配,忽略元素本身尺寸设置。 // 引入包名 import { http…...
![](https://www.ngui.cc/images/no-images.jpg)
vue实现表单输入框数字类型校验功能
vue实现表单输入框数字类型校验功能 1. 样式代码 <el-form-item label"订单总价"><el-input size"small" v-model"form.totalPrice" placeholder"请输入订单总价 正整数或者2位数小数" input"check(form.totalPric…...
![](https://i-blog.csdnimg.cn/direct/1011048482584bc3a4475d0a6fe8648e.gif)
JS登录页源码 —— 可一键复制抱走
前期回顾 https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501 登录页预览效果 <!DOCTYPE html> <html lang"en"><head…...
![](https://i-blog.csdnimg.cn/direct/c62e47ff488f4f1f90d4de1b230f0548.png)
Kithara与OpenCV (一)
Kithara使用 OpenCV 库 目录 Kithara使用 OpenCV 库简介需求和支持的环境构建 OpenCV 库使用 CMake 进行配置以与 Kithara 一起工作 使用 OpenCV 库设置项目运行 OpenCV 代码图像采集和 OpenCV自动并行化限制和局限性1.系统建议2.实时限制3.不支持的功能和缺失的功能4.显示 Ope…...
![](https://www.ngui.cc/images/no-images.jpg)
什么是软件定义安全SDSec
一、软件定义安全SDSec产生的背景 软件定义安全(Software Defined Security,SDSec)的产生背景主要源于传统网络安全防护方法在面对复杂网络环境时的不适应性,以及软件定义网络(SDN)技术的发展和应用。 SD…...
![](https://www.ngui.cc/images/no-images.jpg)
【C语言】C语言可以做什么?
目录 1. 操作系统开发1.1 操作系统内核1.2 设备驱动程序1.3 系统工具和实用程序 2. 嵌入式系统2.1 微控制器编程2.2 传感器和执行器控制2.3 消费电子产品 3. 应用程序开发3.1 图形用户界面应用3.2 游戏开发3.3 多媒体处理 4. 网络编程4.1 网络协议实现4.2 服务器和客户端程序4.…...
![](https://i-blog.csdnimg.cn/direct/1279008ef45c4476b0aa9bea7f9d6a63.png)
WordPress 主题技巧:给文章页增加“谁来过”模块。
模块功能: 我个人目前在做一个电影类的网站,在开发文章页的模版时候,突然觉得给文章页增加一个“谁对本电影感兴趣”的功能模块可能会比较有趣,这个功能有点类似于‘足迹’的感觉,用户可以通过这个功能,发…...
![](https://i-blog.csdnimg.cn/direct/0d40178b65ed42d6aba7b2d47ad6f1f3.png)
【vue组件库搭建07】Vitest单元测试
vitest官网 vue-test-utils 我们的测试框架选择的是 Vitest 和 vue-test-utils。两者的关系为: Vitest 提供测试方法:断言、Mock 、SpyOn 等方法。vue-test-utils: 挂载和渲染组件: Vue Test Utils 允许您在隔离中挂载组件,这意…...
![](https://i-blog.csdnimg.cn/direct/4f66dee0d9b14783a42d7aeac7399b39.png)
JSONObject和Map<String, Object>的转换
一、前言 Java开发中出参返回和入参传入更灵活的方法是使用Map<String, Object>入参或出参,或者使用JSONObject。 1、好处,参数可变,对接口扩展性很友好。 public ResponseData<WXModelDTO> getUserInfo(RequestBody Map<…...
![](https://www.ngui.cc/images/no-images.jpg)
C# 建造者模式(Builder Pattern)
建造者模式(Builder Pattern),也被称为生成器模式,是一种对象构建模式,旨在将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。这种模式特别适用于构建具有多个组成部分的复杂对象&am…...
![](https://i-blog.csdnimg.cn/direct/38a984034e8646de88129d741879ad5a.jpeg)
初阶数据结构速成
本篇文章算是对初阶数据结构的总结,内容较多,请耐心观看 基础概念部分 顺序表 线性表( linear list )是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的数据结构,常⻅的线性表:…...
![](https://i-blog.csdnimg.cn/direct/5f9a0b245e39437e918ead12a4804b5a.gif)
nx上darknet的使用-目标检测-在python中的使用
1 内置的代码 在darknet中已经内置了两个py文件 darknet_video.py与darknet_images.py用法类似,都是改一改给的参数就行了,我们说一下几个关键的参数 input 要预测哪张图像weights 要使用哪个权重config_file 要使用哪个cfg文件data_file 要使用哪个da…...
![](https://www.ngui.cc/images/no-images.jpg)
Python高级(四)_内存管理
Python高级-内存管理 第四章 内存管理 1、对象池 小整数池 系统默认创建好的,等着你使用 概述:整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是 [-5, 256] ,这些整数对象是提前建立好的…...
![](https://i-blog.csdnimg.cn/direct/48be0bf8f1f84d1b91bae652d7675ef7.png)
关键路径-matlab
路径上边的数目称为路径长度 图的基本知识 求最短路径(Dijkstra算法) 2. 待继续尝试 ①Dijkstra ②floyd_all.m 一 二 ③ LeetCode [329. 矩阵中的最长递增路径]...
![](https://i-blog.csdnimg.cn/direct/03197101d1e34eddaa05101569fdfa1e.png)
JavaDS —— 单链表 与 LinkedList
顺序表和链表区别 ArrayList : 底层使用连续的空间,可以随机访问某下标的元素,时间复杂度为O(1) 但是在插入和删除操作的时候,需要将该位置的后序元素整体往前或者向后移动,时间复杂度为O&…...
![](https://www.ngui.cc/images/no-images.jpg)
LangChain —— Message —— how to filter messages
文章目录 一、概述二、基本使用三、连成链 一、概述 在更复杂的链和代理中,我们可能会使用消息列表跟踪状态。此列表可以开始累积来自多个不同模型、说话者、子链等的消息,我们可能只想将此完整消息列表的子集传递给链/代理中的每个模型调用。 filter_me…...
![](https://i-blog.csdnimg.cn/direct/1af262fcc80a4e4c903c636aca8857a2.png)
conda install问题记录
最近想用代码处理sar数据,解放双手。 看重了isce这个处理平台,在安装包的时候遇到了一些问题。 这一步持续了非常久,然后我就果断ctrlc了 后面再次进行尝试,出现一大串报错,不知道是不是依赖项的问题 后面看到说mam…...
![](https://www.ngui.cc/images/no-images.jpg)
【python】IPython的使用技巧
IPython使用技巧 一、魔法命令 %timeit 用途:用于测量一段代码的执行时间,这对于评估代码的性能非常有帮助,尤其适用于需要进行性能优化和比较不同实现方式效率的场景。示例:%timeit [x**2 for x in range(1000)]扩展…...
![](https://www.ngui.cc/images/no-images.jpg)
常用知识点问答
kafka如何部署? 先说明kafka的版本如果是 2.X 版本,则要先部署 3或5 个服务器的zookeeper集群,然后在每个zookeeper服务器上部署kafka应用。如果是 3.X 版本,kafka不再依赖zookeeper,所以可以直接在java17的环境上部署…...
![](https://www.ngui.cc/images/no-images.jpg)
paddlenlp cpu windows 下测试gpt
paddlenlp 安装python3.11版本 conda create -n python311 python3.11 激活python conda activate python311 安装paddlepaddle conda install paddlepaddle3.0.0b0 -c paddle pip install paddlenlp3.0.0b0 -U -i https://pypi.tuna.tsinghua.edu.cn/simple windows下…...
![](https://www.ngui.cc/images/no-images.jpg)
uboot的功能
uboot裸机程序,uboot的核心功能是启动内核 uboot启动流程 XIP设备: 1、硬件初始化 2、读flash上面的内核,拷贝进内存 3、启动内核 非XIP设备 1、BROM程序拷贝uboot到RAM 2、执行uboot 3、硬件初始化 4、读flash上面的内核,拷贝进…...
![](https://www.ngui.cc/images/no-images.jpg)
java导出word实现
参考:Poi-tl Documentation...
![](https://i-blog.csdnimg.cn/direct/8ad93461beb149499c80c9e563665b58.png)
Flink 提交作业的方式
首先我进行了flink单机部署,个人建议不管是学习还是开发尽量不使用 然后开始了flink自带集群部署,部署在三台服务器上,资源管理由flink集群自己管理,然后为了解决集群的单点故障问题,使用zookeeper监听事件࿰…...
![](https://i-blog.csdnimg.cn/direct/207573090cb64547bb2117e7ec2f39fe.png#pic_center)
JVM系列 | 垃圾收集算法
JVM系列 | 垃圾收集算法 文章目录 前言如何判断对象已"死"?引用计数法可达性分析算法可达性分析2.0版 | 引用的增强对象的消亡过程回收方法区主要回收目标:回收操作 垃圾收集算法分代收集理论 与 跨代引用假说分代收集理论跨带引用假说 垃圾收…...
![](/images/no-images.jpg)
怎么进入公众号后台/百度seo优化分析
静态JS和POSTMAN下可直接使用的SM2签名验签功能。 0. 目录1. 前言2. JS工具脚本3. 测试用例4. Links1. 前言 相较于笔者的大部分博文,本文只是提供一个现成的工具,因此废话少说,直入主体。 2. JS工具脚本 将以下内容拷贝到 POSTMAN的 pre-…...
![](https://img2018.cnblogs.com/blog/1478219/201809/1478219-20180921175801603-1300647502.png)
沈阳建网站企业/怎样做一个网站
Link: 原型模型设计工具:墨刀。(在学长的推荐下发现有这一款十分好用的原型模型设计工具呢。^_^.) 小伙伴链接:http://www.cnblogs.com/mingsonic/p/9683453.html 原型链接:(如果小樱同学看不懂…...
![](/images/no-images.jpg)
广州市研发网站建设价格/免费推广的平台都有哪些
CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。 web server(比如说nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件…...
![](/images/no-images.jpg)
wordpress 淘宝客放置root文件/百度一下就知道官网
CSS3 文本效果 1. text-shadow2. word-wraptext-shadow属性使用方法 text-shadow属性使用方法如下所示。 text-shadow:length length length color其中,前面三个length分别指阴影离开文字的横方向距离、阴影离开文字的纵方向距离和阴影的模糊半径,color指…...
![](/images/no-images.jpg)
网站建设做的人多吗/优化大师网页版
问题 C: 八皇后 时间限制: 1 Sec 内存限制: 128 MB 提交: 54 解决: 48 [提交][状态][讨论版][命题人:quanxing] 题目描述 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 8个方格&#x…...
![](/images/no-images.jpg)
帮别人做网站多少钱/网络营销方案的制定
总体的感觉:在家打比赛的感觉真的不如有人看着。 水了俩小时码完代码后,就没心情继续码下去了,感觉前三题都是纯知识点,掌握得熟练便能轻松拿下。就是T4还有点考验思维,但推了个式子,码了一下,就…...