高负载WEB服务器--Tomcat
高负载WEB服务器–Tomcat
Tomcat介绍
Tomcat 是一个开源的轻量级应用服务器,在 Java Web 应用开发中被广泛使用。
- 发展历程:Tomcat 最初由 Sun Microsystems 开发,后来成为 Apache 软件基金会的一个项目。它的发展与 Java 技术的发展密切相关,随着 Java EE 规范的不断更新,Tomcat 也在不断升级和完善,以支持新的技术和特性。
- 功能特点
- 支持 Servlet 和 JSP:这是 Tomcat 的核心功能。Servlet 是 Java 编写的服务器端程序,用于生成动态 Web 内容;JSP 则是在 HTML 页面中嵌入 Java 代码的技术,方便开发人员创建动态网页。Tomcat 为 Servlet 和 JSP 提供了运行环境,能够高效地处理客户端请求并生成相应的动态内容。Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。
- 轻量级:与一些大型的应用服务器相比,Tomcat 的体积较小,启动速度快,资源占用少。这使得它非常适合在开发环境和小型生产环境中使用,可以快速搭建和部署 Web 应用。
- 可扩展性:Tomcat 具有良好的可扩展性,通过各种插件和扩展机制,可以方便地添加新的功能。例如,可以通过添加自定义的 Servlet 过滤器来实现对请求和响应的预处理和后处理,还可以通过扩展 Tomcat 的 JNDI(Java Naming and Directory Interface)功能来集成外部的资源和服务。
- 跨平台性:由于 Tomcat 是基于 Java 语言开发的,而 Java 具有 “一次编写,到处运行” 的特性,所以 Tomcat 可以在不同的操作系统上运行,如 Windows、Linux、Mac OS 等。开发人员可以在自己喜欢的操作系统上进行开发和测试,然后将应用部署到不同的生产环境中,而无需担心兼容性问题。
- 应用场景
- Web 应用开发与部署:在 Java Web 应用的开发过程中,开发人员通常会使用 Tomcat 作为开发服务器,方便进行代码调试和测试。在项目部署阶段,也可以将经过测试的 Web 应用部署到 Tomcat 服务器上,使其能够对外提供服务。许多小型企业级应用、个人网站、博客等都可以使用 Tomcat 来部署。
- Java EE 应用的基础容器:虽然 Tomcat 本身不完全符合 Java EE 的全部规范,但它提供了 Servlet 和 JSP 的运行环境,是构建 Java EE 应用的重要基础。许多 Java EE 应用服务器实际上也包含了 Tomcat 的核心功能,用于处理 Web 层的请求。例如,JBoss、WebLogic 等应用服务器在内部都使用了类似 Tomcat 的 Servlet 容器来处理 Web 相关的业务。
Tomcat安装
tomcat官网:https://tomcat.apache.org/
安装Tomcat和JDK
JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
机器 | IP | 说明 |
---|---|---|
openEuler-1 | 172.25.254.100 | tomcat服务器 |
openEuler-2 | 172.25.254.200 | 客户端 |
使用RPM安装JDK环境
## 在官网中找到jdk的rpm包并上传到虚拟机中
[root@openEuler-1 ~]# ll
-rw-r--r-- 1 root root 122M Apr 7 13:51 jdk-8u261-linux-x64.rpm
[root@openEuler-1 ~]# java -version
-bash: java: command not found
[root@openEuler-1 ~]# yum install jdk-8u261-linux-x64.rpm -y
[root@openEuler-1 ~]# java -version
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)
安装Tomcat
## 在Tomcat官网中找到想要下载版本,复制链接下载
[root@openEuler-1 ~]# wget -c https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.87/bin/apache-tomcat-9.0.87.tar.gz
[root@openEuler-1 ~]# tar xf apache-tomcat-9.0.87.tar.gz -C /usr/local
[root@openEuler-1 ~]# ll /usr/local
drwxr-xr-x 9 root root 4.0K Apr 7 14:08 apache-tomcat-9.0.87
......
[root@openEuler-1 ~]# ln -sv /usr/local/apache-tomcat-9.0.87/ /usr/local/tomcat
'/usr/local/tomcat' -> '/usr/local/apache-tomcat-9.0.87/'
bin
目录: 该目录包含了 Tomcat 的各种脚本文件,如启动脚本startup.sh
(在 Linux 系统下)、startup.bat
(在 Windows 系统下),用于启动 Tomcat 服务器;停止脚本shutdown.sh
(Linux 系统)、shutdown.bat
(Windows 系统)用于关闭 Tomcat 等。conf
目录:存放 Tomcat 的配置文件,像server.xml
是 Tomcat 的主要配置文件,用于配置服务器的各种参数,例如端口号、连接器、虚拟主机等;web.xml
是 Web 应用的部署描述符的默认配置文件等。lib
目录: 包含了 Tomcat 运行时所依赖的各种 Java 类库(JAR 文件),比如支持 Servlet 和 JSP 运行的相关库等,这些库是 Tomcat 正常运行和处理 Web 请求所必需的。logs
目录:用于存储 Tomcat 运行时产生的日志文件,例如访问日志记录了客户端对服务器的访问情况,错误日志记录了服务器运行过程中出现的错误信息等,通过查看这些日志可以帮助诊断和解决问题。temp
目录: 临时文件目录,Tomcat 在运行过程中产生的一些临时文件会存放在这里,比如在处理某些请求时可能会生成临时数据等。webapps
目录:这是部署 Web 应用的主要目录,将开发好的 Web 应用(通常是 WAR 包或者解压缩后的应用目录结构)放置到该目录下,Tomcat 启动时会自动部署这些应用,使其可以对外提供服务。work
目录: Tomcat 会将 JSP 页面编译成 Servlet 类的字节码文件,并将这些编译后的文件存放在work
目录下,此外还可能包含一些其他与 JSP 编译和运行相关的临时文件。
Tomcat启动服务
使用Tomcat自带的启动脚本
[root@openEuler-1 ~]# /usr/local/tomcat/bin/startup.sh
[root@openEuler-1 ~]# ss -nutlp |grep java
tcp LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* users:(("java",pid=9678,fd=65))
tcp LISTEN 0 100 *:8080 *:* users:(("java",pid=9678,fd=57))
##停止
[root@openEuler-1 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@openEuler-1 ~]# ss -nutlp |grep java
配置systemctl
方式启动
## 可以模仿nginx进行配置
[root@Rocky ~]# systemctl cat nginx
# /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true[Install]
WantedBy=multi-user.target## 模仿nginx配置tomcat
[root@openEuler-1 ~]# vim /usr/lib/systemd/system/tomcat.service
# /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
ExecRetart=/usr/local/tomcat/bin/startup.sh && sleep2 && /usr/local/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
[root@openEuler-1 ~]# systemctl daemon-reload
[root@openEuler-1 ~]# systemctl start tomcat
[root@openEuler-1 ~]# systemctl status tomcat
● tomcat.service - Apache Tomcat ServerLoaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)Active: active (running) since Mon 2025-04-07 14:52:36 CST; 7s agoProcess: 9910 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)Main PID: 9924 (java)Tasks: 17 (limit: 8950)Memory: 68.7MCGroup: /system.slice/tomcat.service└─9924 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.Cla>Apr 07 14:52:36 openEuler-1 systemd[1]: /usr/lib/systemd/system/tomcat.service:9: Unknown key name 'ExecRetart' in section 'Service', ignoring.
Apr 07 14:52:36 openEuler-1 systemd[1]: Starting Apache Tomcat Server...
Apr 07 14:52:36 openEuler-1 startup.sh[9910]: Tomcat started.
Apr 07 14:52:36 openEuler-1 systemd[1]: Started Apache Tomcat Server.
[root@openEuler-1 ~]# ss -lnput | grep java
tcp LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* users:(("java",pid=9924,fd=65))
tcp LISTEN 0 100 *:8080 *:* users:(("java",pid=9924,fd=57))
Tomcat测试
-
创建静态页面
[root@openEuler-1 ~]# echo "tomcat test" > /usr/local/tomcat/webapps/ROOT/test01.html [root@openEuler-1 ~]# curl 172.25.254.100:8080/test01.html tomcat test ## 或者浏览器访问http://172.25.254.100:8080/test01.html
-
测试jsp页面
[root@openEuler-1 ~]# vim /usr/local/tomcat/webapps/ROOT/test02.jsp <html> <body> <center> Now time is: <%=new java.util.Date()%> </center> </body> </html>[root@openEuler-1 ~]# curl 172.25.254.100:8080/test02.jsp <html> <body> <center> Now time is: Mon Apr 07 15:02:11 CST 2025 </center> </body> </html> ## 或者浏览器访问http://172.25.254.100:8080/test02.jsp
Tomcat目录结构
tomcat主目录
[root@openEuler-1 ~]# tree -d -L 1 /usr/local/tomcat/
/usr/local/tomcat/
├── bin
├── conf
├── lib
├── logs
├── temp
├── webapps
└── work
bin
目录: 该目录包含了 Tomcat 的各种脚本文件,如启动脚本startup.sh
(在 Linux 系统下)、startup.bat
(在 Windows 系统下),用于启动 Tomcat 服务器;停止脚本shutdown.sh
(Linux 系统)、shutdown.bat
(Windows 系统)用于关闭 Tomcat 等。conf
目录:存放 Tomcat 的配置文件,像server.xml
是 Tomcat 的主要配置文件,用于配置服务器的各种参数,例如端口号、连接器、虚拟主机等;web.xml
是 Web 应用的部署描述符的默认配置文件等。lib
目录: 包含了 Tomcat 运行时所依赖的各种 Java 类库(JAR 文件),比如支持 Servlet 和 JSP 运行的相关库等,这些库是 Tomcat 正常运行和处理 Web 请求所必需的。logs
目录:用于存储 Tomcat 运行时产生的日志文件,例如访问日志记录了客户端对服务器的访问情况,错误日志记录了服务器运行过程中出现的错误信息等,通过查看这些日志可以帮助诊断和解决问题。temp
目录: 临时文件目录,Tomcat 在运行过程中产生的一些临时文件会存放在这里,比如在处理某些请求时可能会生成临时数据等。webapps
目录:这是部署 Web 应用的主要目录,将开发好的 Web 应用(通常是 WAR 包或者解压缩后的应用目录结构)放置到该目录下,Tomcat 启动时会自动部署这些应用,使其可以对外提供服务。work
目录: Tomcat 会将 JSP 页面编译成 Servlet 类的字节码文件,并将这些编译后的文件存放在work
目录下,此外还可能包含一些其他与 JSP 编译和运行相关的临时文件。
Tomcat的webapps目录
[root@openEuler-1 ~]# tree -d -L 1 /usr/local/tomcat/webapps
/usr/local/tomcat/webapps
├── docs
├── examples
├── host-manager
├── manager
├── ROOT
docs
目录:通常存放 Tomcat 的相关文档,比如一些使用说明、配置示例等帮助用户了解和使用 Tomcat 的资料。examples
目录:包含了许多 Tomcat 的示例 Web 应用,这些示例可以帮助开发者学习和理解如何在 Tomcat 上开发和部署不同类型的 Web 应用,例如 Servlet、JSP 等示例。host-manager
目录:这是 Tomcat 提供的一个用于管理虚拟主机的 Web 应用。通过它,管理员可以配置和管理 Tomcat 中的虚拟主机相关设置,比如创建、删除虚拟主机等操作。不过为了安全起见,通常需要配置用户权限才能访问。manager
目录:Tomcat 的 Web 应用管理器,用于管理部署在 Tomcat 上的 Web 应用。可以通过这个管理器进行应用的部署、启动、停止、重载等操作。同样,也需要合理配置访问权限以保证安全性。ROOT
目录:这是 Tomcat 的默认 Web 应用目录。当访问http://yourserver:port/
(不指定具体应用名)时,Tomcat 会尝试加载ROOT
目录下的应用。如果这个目录下部署了 Web 应用,那么它就会作为默认应用被访问。
Tomcat的conf配置文件
[root@openEuler-1 ~]# tree -L 1 /usr/local/tomcat/conf
/usr/local/tomcat/conf
├── Catalina
├── catalina.policy
├── catalina.properties
├── context.xml
├── jaspic-providers.xml
├── jaspic-providers.xsd
├── logging.properties
├── server.xml
├── tomcat-users.xml
├── tomcat-users.xsd
└── web.xml
Catalina
目录:用于存放特定于Catalina
(Tomcat 的内核名称) 的配置文件,一般里面会包含每个虚拟主机的配置文件,当你在server.xml
中配置了虚拟主机时,与虚拟主机相关的一些详细配置可能会放在这个目录下对应主机名的文件中。catalina.policy
:这是 Tomcat 的安全策略文件,用于定义 Tomcat 运行时的安全权限,比如指定哪些代码可以访问系统资源,哪些类库具有特定的权限等。catalina.properties
:包含了 Tomcat 的一些属性配置,例如日志记录相关的属性、默认的类加载器配置等,它对 Tomcat 的整体运行环境有一定的影响。context.xml
:全局的Context
配置文件,用于配置 Web 应用的默认上下文参数等信息。可以在这个文件中设置一些应用通用的配置,这些配置会应用到所有部署在 Tomcat 上的 Web 应用。jaspic-providers.xml
:与 Java Authentication and Authorization Service Provider Configuration (JASPIC) 相关的配置文件,用于配置认证和授权提供程序。jaspic-providers.xsd
:是jaspic-providers.xml
的 XML 模式定义文件,用于验证jaspic-providers.xml
文件的格式是否正确。logging.properties
:Tomcat 的日志配置文件,在这里可以设置日志的级别、输出位置、日志格式等相关参数,控制 Tomcat 运行时的日志记录行为。server.xml
:Tomcat 的核心配置文件,用于配置整个服务器的架构,包括连接器(如 HTTP 连接器的端口等)、虚拟主机、全局命名资源等关键设置,对 Tomcat 的运行起着决定性作用。tomcat-users.xml
:用于配置 Tomcat 的用户和角色,定义了哪些用户可以访问 Tomcat 的管理界面(如manager
和host-manager
应用)以及这些用户具有的角色和权限。tomcat-users.xsd
:是tomcat-users.xml
的 XML 模式定义文件,用于验证tomcat-users.xml
文件的格式是否符合要求。web.xml
:这是 Web 应用的部署描述符的全局配置文件,定义了一些全局的 Servlet、过滤器、监听器等 Web 应用组件的配置信息,这些配置对所有部署在 Tomcat 上的 Web 应用都起作用 。
Tomcat配置文件server.xml
在 Tomcat 的 server.xml
配置文件里,不同组件有着不同的功能和层级关系。下面为你详细介绍各类组件:
顶级组件
Server
:这是server.xml
里的顶级组件,代表整个 Tomcat 服务器实例。一个server.xml
文件仅能有一个Server
元素,它充当所有其他组件的容器。
<Server port="8005" shutdown="SHUTDOWN"><!-- 其他组件 -->
</Server>
port
属性指定了用于关闭服务器的端口,shutdown
属性则规定了关闭服务器所需的命令。
容器类组件
1. Service
组件
Service
组件用于关联 Connector
和 Engine
。一个 Server
可包含多个 Service
,每个 Service
只能有一个 Engine
,但能有多个 Connector
。
参数 | 说明 |
---|---|
name | 用于标识 Service 的名称,在日志和配置引用时使用。 |
示例代码:
<Service name="Catalina"><!-- 嵌套 Connector 和 Engine 组件 -->
</Service>
2. Engine
组件
Engine
代表整个 Servlet 引擎,负责处理所有传入的请求。它是 Service
组件的子元素,一个 Service
仅能有一个 Engine
。
参数 | 说明 |
---|---|
name | Engine 的名称,用于标识,在日志和配置引用中使用。 |
defaultHost | 指定默认的虚拟主机名,当请求的主机名未在 Host 组件中明确定义时,使用该默认主机处理请求。 |
示例代码:
<Engine name="Catalina" defaultHost="localhost"><!-- 嵌套 Host 组件 -->
</Engine>
3. Host
组件
Host
代表虚拟主机,一个 Engine
可以包含多个 Host
元素,每个 Host
对应一个域名或 IP 地址。
参数 | 说明 |
---|---|
name | 虚拟主机的名称,通常是域名或 IP 地址,客户端通过该名称访问虚拟主机。 |
appBase | 指定该虚拟主机下 Web 应用程序的基础目录,Tomcat 会在此目录下查找和部署 Web 应用。 |
unpackWARs | 指示是否自动解压 WAR 文件。设置为 true 时,Tomcat 会自动将 WAR 文件解压到指定目录;设置为 false 则不解压。 |
autoDeploy | 指示是否在运行时自动部署新的 Web 应用或更新已部署的应用。设置为 true 时,Tomcat 会定期检查 appBase 目录,发现新的 WAR 文件或应用更新时自动部署。 |
示例代码:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"><!-- 嵌套 Context 组件 -->
</Host>
4. Context
组件
Context
代表一个 Web 应用程序,一个 Host
可以包含多个 Context
元素,每个 Context
定义了一个 Web 应用的部署信息。
参数 | 说明 |
---|---|
path | 该 Web 应用的上下文路径,客户端通过该路径访问 Web 应用。若设置为空字符串 "" ,则表示该应用为默认应用,可通过根路径访问。 |
docBase | 指定该 Web 应用的文档基础目录,即 Web 应用的实际文件存放位置,可以是相对路径或绝对路径。 |
reloadable | 指示是否在类文件发生变化时自动重新加载该 Web 应用。设置为 true 时,Tomcat 会监控类文件的变化,发现变化后自动重新加载应用;设置为 false 则不监控。 |
示例代码:
<Context path="/myapp" docBase="/path/to/myapp" reloadable="true" />
连接器组件
Connector
组件
Connector
负责接收客户端的请求并将其转发给 Engine
进行处理。一个 Service
可以有多个 Connector
,每个 Connector
可以监听不同的端口和协议。
参数 | 说明 |
---|---|
port | 指定 Connector 监听的端口号,客户端通过该端口向 Tomcat 发送请求。 |
protocol | 指定 Connector 使用的协议,常见值有 HTTP/1.1 、AJP/1.3 等。 |
connectionTimeout | 指定客户端与服务器建立连接后,在无数据传输情况下,连接保持打开的最长时间(以毫秒为单位)。超过该时间,连接将被关闭。 |
maxThreads | 指定 Connector 可创建的最大线程数,限制同时处理请求的最大数量。 |
minSpareThreads | 指定 Connector 启动时创建的最小空闲线程数,预先创建以提高响应速度。 |
redirectPort | 当客户端发起 HTTP 请求,但服务器需用 HTTPS 处理时,将请求重定向到该端口。 |
SSLEnabled | 启用或禁用 SSL/TLS 加密,设置为 true 时,Connector 使用 SSL/TLS 协议处理请求。 |
URIEncoding | 指定处理请求 URI 时使用的字符编码,确保非 ASCII 字符正确解析。 |
acceptCount | 当所有线程都在处理请求时,允许在队列中等待处理的最大请求数,超过数量的请求将被拒绝。 |
示例代码:
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"maxThreads="200"minSpareThreads="25"redirectPort="8443"URIEncoding="UTF-8"acceptCount="100" />
被嵌套类组件
Valve
:Valve
是一个过滤器组件,可在请求处理的不同阶段执行特定的操作,像访问日志记录、请求过滤等。Valve
可以嵌套在Engine
、Host
或Context
中。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" />
Logger
:Logger
用于记录 Tomcat 的日志信息,可嵌套在Engine
、Host
或Context
中。
<Logger className="org.apache.catalina.logger.FileLogger"prefix="localhost_log." suffix=".txt"timestamp="true"/>
完整示例
下面是一个完整的 server.xml
配置文件示例,展示了这些组件如何相互嵌套和协作:
<Server port="8005" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"maxThreads="200"minSpareThreads="25"redirectPort="8443"URIEncoding="UTF-8"acceptCount="100" /><Engine name="Catalina" defaultHost="localhost"><Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><Context path="/myapp" docBase="/path/to/myapp" reloadable="true" /></Host></Engine></Service>
</Server>
这个示例呈现了一个基本的 Tomcat 配置,包含了一个 Service
、一个 Engine
、一个 Host
、一个 Context
以及一个 Connector
用于接收客户端请求。
Tomcat虚拟主机
- 修改server.xml文件
[root@openEuler-1 ~]# cd /usr/local/tomcat/conf/
[root@openEuler-1 conf]# cp server.xml{,.bak}
## 添加虚拟主机配置
......<Host name="www.a.com" appBase="webapps"unpackWARs="true" autoDeploy="true"><Context docBase="/web/a" path="" reloadable="false" /><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host><Host name="www.b.com" appBase="webapps"unpackWARs="true" autoDeploy="true"><Context docBase="/web/b" path="" reloadable="false" /><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host>
[root@openEuler-1 conf]# mkdir -p /web/{a,b}
[root@openEuler-1 conf]# tree /web
/web
├── a
└── b
[root@openEuler-1 conf]# vim /web/a/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html><head><title>JSP a page</title></head><body><% out.println("Welocome to test site,http://www.a.com");%></body>
</html>
[root@openEuler-1 conf]# vim /web/b/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html><head><title>JSP b page</title></head><body><% out.println("Welocome to test site,http://www.b.com");%></body>
</html>## 在windows上配置host解析C:\WINDOWS\System32\drivers\etc\hosts
[root@openEuler-1 conf]# curl www.a.com:8080
<html><head><title>JSP a page</title></head><body>Welocome to test site,http://www.a.com</body>
</html>
[root@openEuler-1 conf]# curl www.b.com:8080
<html><head><title>JSP b page</title></head><body>Welocome to test site,http://www.b.com</body>
</html>
Tomcat站点部署
两种方式
- 第一种方式是直接将程序目录放在webapps目录下面
- 第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面。
- ZrLog 博客程序
## 恢复默认配置
[root@openEuler-1 conf]# cp server.xml.bak server.xml
[root@openEuler-1 conf]# cd ../webapps/
## 将开发好的war包放入该目录,自动解压
[root@openEuler-1 webapps]# ll
......
-rwxr-x--- 9 root root 4.0K Apr 7 16:19 zrlog
-rw-r--r-- 1 root root 11M Apr 7 16:18 zrlog.war
-
浏览器访问:http://172.25.254.100:8080/zrlog/
-
在172.25.254.101上创建数据库相关配置
[root@Rocky ~]# systemctl start mysqld [root@Rocky ~]# mysql mysql> create database zrlog; mysql> create user zrlog@'%' identified with mysql_native_password by '123456'; mysql> grant all on zrlog.* to zrlog@'%';
-
填写数据库信息
-
安装
Tomcat管理页面
Tomcat自带的管理页面有管理功能和监控功能
1、所有的管理页面,都将权限赋予了角色,而角色的名称是固定的:manager-gui,admin-gui
2、需要添加一个用户,将用户捆绑至对应的角色,这样用户就可以访问到对应的管理页面
[root@openEuler-1 ~]# cd /usr/local/tomcat/conf
[root@openEuler-1 conf]# cp tomcat-users.xml{,.bak}
[root@openEuler-1 conf]# vim tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>
3、由于项目默认允许127.0.0.1访问,所以配置好了角色和用户也无法正常访问
将127改成自己的网段
[root@openEuler-1 conf]# vim ../webapps/host-manager/META-INF/context.xml
......
<Valve className="org.apache.catalina.valves.RemoteAddrValve"allow="172\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
[root@openEuler-1 conf]# vim ../webapps/manager/META-INF/context.xml
......
<Valve className="org.apache.catalina.valves.RemoteAddrValve"allow="172\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
4、重启tomcat并访问172.25.254.100:8080
Tomcat服务管理脚本
-
创建用户和用户组
[root@openEuler-1 ~]# groupadd -r -g 53 tomcat [root@openEuler-1 ~]# useradd -r -u 53 -g 53 -c "Apache Tomcat" -d /usr/local/tomcat -s /sbin/nologin tomcat
-
修改权限
[root@openEuler-1 ~]# chown -R tomcat.tomcat /usr/local/tomcat/*
-
编写服务脚本
[root@openEuler-1 ~]# vim /usr/lib/systemd/system/tomcat.service [Unit] Description=Apache Tomcat Server After=network.target remote-fs.target nss-lookup.target[Service] Type=forking Environment=CATALINA_HOME=/usr/local/tomcat ExecStart=/usr/local/tomcat/bin/startup.sh ExecStop=/usr/local/tomcat/bin/shutdown.sh ExecReload=/bin/kill -s HUP $MAINPID USER=tomcat Group=tomcat PrivateTmp=true[Install] WantedBy=multi-user.target[root@openEuler-1 ~]# systemctl daemon-reload [root@openEuler-1 ~]# systemctl restart tomcat
-
测试:浏览器访问:172.25.254.100:8080
Tomcat监控
开发java监控页面
[root@openEuler-1 ~]# vim /usr/local/tomcat/webapps/ROOT/meminfo.jsp
<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;
out.println("JVM memory detail info :<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Total memory:"+tm+"MB"+"<br>");
out.println("Free memory:"+fm+"MB"+"<br>");
out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
%>
浏览器访问:http://172.25.254.100:8080/meminfo.jsp
使用jps命令进行监控
[root@openEuler-1 ~]# vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=你的服务器实际IP"
windwos安装jdk环境,运行jconsole.exe进行监控
Tomcat 安全优化
- telnet 管理端口保护(强制)
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
telnet 管理端口 | 1. 建议关闭 telnet 管理端口; 2. 如无法关闭,修改端口为非 8005 端口,且设置 SHUTDOWN 命令为复杂字符串 | - | 关闭或修改端口,可防止利用该端口进行远程操作,避免服务器被恶意控制 |
- ajp 连接端口保护(推荐)
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
ajp 连接端口 | 1. 建议关闭 AJP 8009 端口; 2. 如无法关闭,修改端口为非 8009 端口,并将连接协议修改为 org.apache.coyote.http11.Http11NioProtocol | <Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8009" /> (示例,端口按需修改) | 关闭或修改端口,能防止攻击者通过 AJP 协议漏洞攻击服务器 |
-
禁用管理端(强制)
-
操作一:删除默认的 {Tomcat 安装目录}/conf/tomcat - users.xml 文件,重启 Tomcat 后自动生成新文件。
-
操作二:删除 {Tomcat 安装目录}/webapps 下默认的所有目录和文件。
-
操作三:将 tomcat 应用根目录配置为 tomcat 安装目录以外的目录,如
<Context path="" docBase="/home/work/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true"/>
。
-
-
降权启动
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
启动用户权限 | 1. Tomcat 启动用户权限为非 root 权限,降低目录访问权限; 2. 如需使用 80 端口,普通账号启动后配置 iptables 规则转发 | - | 避免 Tomcat 被入侵后黑客获取高级权限危及服务器安全 |
- 文件列表访问控制
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
文件列表访问 | 在 conf/web.xml 文件中 default 部分,将 listings 配置设为 false | listings = false | false 表示不列出目录文件,防止攻击者通过目录列表获取敏感信息 |
- 版本信息隐藏
类别 | 配置项及说明 | 标准配置 | 备注 |
---|---|---|---|
错误页面重定向 | 1. 修改 conf/web.xml,将 403、404、500 等错误重定向到指定页面; 2. 也可修改应用程序目录下 WEB - INF/web.xml 配置进行重定向 | 如 <error - page error - code="403" location="/forbidden.jsp"/> <error - page error - code="404" location="/notfound.jsp"/> <error - page error - code="500" location="/systembusy.jsp"/> | 避免错误页面暴露服务器和版本信息,需确保程序根目录下对应错误页面存在 |
Tomcat 性能优化
-
增加 Tomcat 处理线程数
-
操作方式:编辑 Tomcat 目录下
conf
子目录的server.xml
文件。 -
关键参数说明
maxThreads
:Tomcat 使用线程处理每个请求,此值代表 Tomcat 可创建的最大线程数。acceptCount
:当所有可用处理请求的线程都被占用时,可放入处理队列中的请求数,超过该数量将不予处理。connectionTimeout
:网络连接超时时间(单位:毫秒),设为0
表示永不超时,但此设置有隐患,一般设为 30000 毫秒。
minSpareThreads
:Tomcat 初始化时创建的线程数。maxSpareThreads
:一旦创建的线程超过此值,Tomcat 会关闭不再需要的 socket 线程 。
-
-
配置示例
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150"minSpareThreads="30" maxSpareThreads="75" enableLookups="false"redirectPort="8443" acceptCount="100" disableUploadTimeout="true" />
-
Tomcat 内存空间设置
-
常见内存错误及原因
- java.lang.OutOfMemoryError: java heap space:Java 程序从数据库查询大量数据时易出现。当 98% 的时间用于垃圾回收(GC)且可用堆大小不足 2% 时抛出此异常。
- java.lang.OutOfMemoryError: PermGen space :
PermGen space
即Permanent Generation space
,是内存的永久保存区域,主要被加载的类和静态对象占用。若 WEB 应用部署大量第三方 jar 且大小超过默认的 4M ,会产生此错误。 - OutOfMemoryError: unable to create new native thread:无法创建新线程。
- java.lang.Unable to create initial heap :初始堆设置问题。
-
解决方法:在生产环境下,若内存空间为 8G ,在
catalina.sh
文件头部注释下方,添加如下内容 :export JAVA_OPTS='-server -Xms4096m -Xmx4096m -Xmn256m -XX:PermSize=256m -XX:MaxNewSize=512m -XX:MaxPermSize=512m'
-
提示:使用 64 位 Tomcat 版本。
相关文章:
高负载WEB服务器--Tomcat
高负载WEB服务器–Tomcat Tomcat介绍 Tomcat 是一个开源的轻量级应用服务器,在 Java Web 应用开发中被广泛使用。 发展历程:Tomcat 最初由 Sun Microsystems 开发,后来成为 Apache 软件基金会的一个项目。它的发展与 Java 技术的发展密切相…...
分页查询列表每页1000条的优化
项目中有一个客户列表,要求每页显示1000条,并且字段很多,接口返回大概要10秒钟,进行优化. 原本逻辑:使用mybatisplus构建查询条件,分页查询客户表,查出数据库DO对象,然后for循环转化成回显的VO对象.在转化的过程中出现了查库代码,导致当每页条数1000时,每一个客户转化都需要查询…...
深入浅出一下Python面向对象编程的核心概念与实践应用
本篇技术博文摘要 🌟 本文系统讲解了Python面向对象编程的核心概念与实践应用。通过电商系统用户订单模拟、动态权限账户系统等案例,深入剖析了类与对象、属性方法、实例方法等基础要素。重点解析了__init__构造方法、__str__对象描述、__lt__比较运算符…...
2025阿里云AI 应用-AI Agent 开发新范式-MCP最佳实践-78页.pptx
2025阿里云AI 应用-AI Agent 开发新范式-MCP最佳实践,包含以下内容: 1、AI 应用架构新范式 2、云原生API网关介绍 3、云原生API网关底座核心优势 4、流量网关最佳实践 5、AI 网关代理 LLM 最佳实践 6、MCP网关最佳实践 7、MSE Nacos MCP Server 注册中心…...
github进阶使用教程
目录索引 一、基本内容 repository fork star codespaces issue 在一个仓库创建话题讨论,可以由仓库主人选择开始和结束话题的讨论 pull request(也称 pr) 协同其他仓库开发,请求仓库主人拉取自己的代码合并到仓库的主分支&…...
【C++】 —— 笔试刷题day_16
刷题_day16,继续加油啊 一、字符串替换 题目解析 这道题是一道简单的字符题目,题目给我们一个字符串A,和n表示A字符串的长度,再给出一个字符数组arg,m表示arg中是数据个数。 然我们在字符串A中找到%s然后替换成arg中的…...
5.3 GitHub订阅系统核心架构解密:高并发设计与SQLite优化实战
GitHub Sentinel 分析报告功能实现:订阅管理核心逻辑解析 关键词:GitHub API 订阅管理, SQLite 数据库设计, RESTful API 开发, 原子操作封装, 异常处理机制 1. 订阅管理功能架构设计 订阅管理模块采用分层架构设计,通过清晰的接口隔离实现高内聚低耦合: #mermaid-svg-bW…...
P5738 【深基7.例4】歌唱比赛
P5738 【深基7.例4】歌唱比赛 题目描述 n ( n ≤ 100 ) n(n\le 100) n(n≤100) 名同学参加歌唱比赛,并接受 m ( m ≤ 20 ) m(m\le 20) m(m≤20) 名评委的评分,评分范围是 0 0 0 到 10 10 10 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 …...
从三次方程到复平面:复数概念的奇妙演进(三)
注:本文为 “复数 | 历史 / 演进” 相关文章。 因 csdn 篇幅限制分篇连载,此为第三篇。 生料,不同的文章不同的点。 机翻,未校。 Complex Numbers History: Complex numbers were first introduced by G. Cardano (1501-1576)…...
2025年七星棋牌跨平台完整源码解析(200+地方子游戏+APP+H5+小程序支持,附服务器镜像导入思路)
目前市面上成熟的棋牌游戏源码很多,但能做到平台全覆盖、地方玩法丰富、交付方式标准化的系统却不多。今天这套七星棋牌2023完整源码具备安卓/iOS/H5/微信小程序端四端互通能力,附带200多款地方子游戏,还配备了后台管理与自动热更系统&#x…...
从三次方程到复平面:复数概念的奇妙演进(四)
注:本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载,此为第四篇。 生料,不同的文章不同的点。 机翻,未校。 Complex number and its discovery history 复数及其发现历史 Wenhao Chen, †, Dazheng …...
UE5角色状态机中跳跃落地移动衔接问题
UE5系列文章目录 文章目录 UE5系列文章目录前言一、状态机设置二、主要蓝图 前言 先说说遇到的问题,在我按空格键跳跃落地以后,角色落地再按WSAD键移动就出现了画面中角色抽搐的情况 一、状态机设置 在Unreal Engine 5中创建角色时,处理跳…...
25软考中级*高项网课+历年真题+笔记+电子书+刷题【计算机软考】
两个月逆袭25年软考程序员?这份高效备考指南请收好 25软考中级*高项网课download 📂 软考中级科目备考资料介绍 ✅ 【01】2025 年软件测评师 聚焦软件测试全流程,涵盖 需求分析、测试设计、用例编写、缺陷管理 等核心技能。 📘 备…...
C++STL——容器-list(含模拟实现,即底层原理)(含迭代器失效问题)(所有你不理解的问题,这里都有解答,最详细)
目录 1.迭代器的分类 2.list的使用 2.1 list的构造 2.2 list iterator 2.3 list capacity 2.4 list element access 编辑 2.5 list modifiers 编辑2.5.1 list插入和删除 2.5.2 insert /erase 2.5.3 resize/swap/clear 编辑 2.6 list的一些其他接口…...
Linux系统编程之虚拟内存
概述 计算机内存是临时存储数据的地方,它比硬盘快得多,但容量有限。现代操作系统通过虚拟内存技术,使得每个进程都感觉自己独占整个地址空间,这不仅提高了安全性,也简化了内存管理。 物理内存:实际安装在计…...
笔试专题(八)
文章目录 平方数(数学)题解代码 DNA序列(固定长度的滑动窗口)题解代码 压缩字符串 (双指针 模拟)题解代码 chika和蜜柑 (top k问题 排序 pair)题解代码 平方数(数学&a…...
Linux:基础IO---软硬链接动静态库前置知识
序:上一个章节,我从硬件出发,由宏观到微观,由具体到抽象,围绕研究对象未被打开的文件来讲解,操作系统是如何对一个大块的磁盘进行管理的,从而引进inode的概念,加深了对文件的理解&am…...
Arm CPU安全通告:基于TrustZone的Cortex-M系统面临多重故障注入攻击
安全之安全(security)博客目录导读 目录 一、概述 二、致谢 三、参考文献Black Hat USA 2022 | Briefings Schedule 四、版本历史 一、概述 Arm注意到BlackHat 2022大会官网发布的演讲摘要《糟糕..!我又一次故障注入成功了!——如何突…...
测试第二课-------自动化测试
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
深入探索Linux开发工具:Vim与Yum
目录 引言 Vim:强大的文本编辑利器 Vim的基本概念 Vim的基本操作 Vim正常模式命令集 Vim末行模式命令集 Vim的配置 使用插件拓展Vim功能 Yum:便捷的Linux软件包管理器 注意事项 结语 引言 在Linux的世界里,高效的开发工具是提升生…...
玩转ChatGPT:使用深入研究功能梳理思路
一、写在前面 前我尝试用ChatGPT的Deep Research(深入研究)功能来梳理文献,效果相当不错。最近,谷歌的Gemini 2.5 Pro也推出了类似功能,从网络测评来看,其表现与ChatGPT不相上下,而且还可以免费…...
UE5蓝图实现打开和关闭界面、退出
Button_Back 和Button_Exit是创建的两个按钮事件。 1.Create Widget 创建界面(打开界面) 2.Add to Viewport 添加到视图 3.remove form Parent,Target:self 从父节点移除当前界面(关闭界面) 4.Quit Game 退…...
实现vlan间的通信
这是第一种方法(更推荐第三种) PC1划分为vlan10,PC2划分为vlan20,实现PC1和PC2之间通信很简单,我们只需将网关都设置好,将交换机的0/0/1、0/0/3设置成vlan10,0/0/2、0/0/4设置成vlan20…...
Linux上位机开发实践(opencv算法硬件加速)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 图像处理里面,opencv基本是一个标准模块。但是由于图像处理的特点,如果所有的算法都是cpu来做的话,效率会很低。…...
智慧社区数据可视化中枢平台——Axure全场景交互式大屏解决方案
在数字化治理的时代浪潮中,社区管理正面临数据碎片化、响应滞后、决策盲区等核心挑战。如何将分散的安防、环境、能源、民生服务等数据整合为可操作的智慧洞察?如何让冰冷的数字转化为社区管理者手中的决策利器?Axure智慧社区可视化大屏原型模…...
动态路由, RIP路由协议,RIPv1,RIPv2
动态路由 1、回顾 路由:从源主机到目标主机的过程 源主机发送数据给目标主机,源主机会查看自身的路由信息 如果目标主机是自己同网段,源主机查看的是直连路由 如果目标主机和自己不同网段,源主机查看的是静态路由、动态路由、默…...
C++:STL的常用容器(string/vector/deque/stack/queue/list/set/multiset/map/multimap)
程序员Amin 🙈作者简介:练习时长两年半,全栈up主 🙉个人主页:程序员Amin 🙊 P S : 点赞是免费的,却可以让写博客的作者开心好久好久😎 📚系列专栏:Java全…...
【unity游戏开发入门到精通——UGUI】Canvas画布组件
注意:考虑到UGUI的内容比较多,我将UGUI的内容分开,并全部整合放在【unity游戏开发——UGUI】专栏里,感兴趣的小伙伴可以前往逐一查看学习。 文章目录 一、Canvas画布组件1、Canvas组件用来干啥2、场景中可以有多个Canvas对象 二、…...
MyBatis 中 Mapper 传递参数的多种方法
# MyBatis Mapper 传递参数的多种方法及其优势 在使用 MyBatis 进行数据库操作时,Mapper 接口的参数传递是一个非常基础但又十分重要的部分。不同的参数传递方式适用于不同的场景,合理选择可以大大提高代码的可读性和维护性。本文将详细介绍几种常见的 …...
学习海康VisionMaster之平行线计算
一:进一步学习了 今天学习下VisionMaster中的平行线计算,这个是拟合直线的扩展应用,针对需要计算平行线的应用场合,可以方便的生成对应的另外一条平行线 二:开始学习 1:什么是平行线计算? 如果…...
MyBatis Mapper 传递参数的多种方法
1. 使用顺序传参法(不推荐) 方法描述 直接通过位置来引用参数,例如 ( arg0 arg1 … ) 或者 (param1, param2…)。 示例代码 List<User> selectUsers(String name, Integer age); <...
探索 Vue 3 响应式系统:原理与实践
Vue 3 响应式系统凭借 Proxy 的优势,提供更强大、灵活的响应式方案。理解其原理与 API,能写出更高效、可维护的 Vue 应用。不断探索其细节,是进阶 Vue 开发的关键。 探索 Vue 3 响应式系统:原理与实践 Vue 3 的响应式系统是其核…...
【LeetCode 热题100】二叉树构造题精讲:前序 + 中序建树 有序数组构造 BST(力扣105 / 108)(Go语言版)
🌱 二叉树构造题精讲:前序 中序建树 & 有序数组构造 BST 本文围绕二叉树的两类构造类题目展开解析: 从前序与中序遍历序列构造二叉树 将有序数组转换为二叉搜索树 我们将从「已知遍历构造树」和「平衡构造 BST」两个角度,拆…...
开源语音文本自动对齐模型:Llama-OuteTTS-1.0-1B
OuteTTS 1.0 介绍与使用指南 1. 重要采样考虑 重复惩罚机制:OuteTTS 1.0 要求对最近的64个token应用重复惩罚,而不是对整个上下文窗口。对整个上下文窗口进行惩罚会导致输出质量下降。推荐工具:llama.cpp 和 EXL2 提供了可靠的输出质量&…...
基于SpringBoot的电影订票系统(源码+数据库+万字文档+ppt)
504基于SpringBoot的电影订票系统,系统包含两种角色:管理员、用户主要功能如下。 【用户功能】 首页:浏览系统电影动态。 资讯信息:获取有关电影行业的新闻和资讯。 电影信息:查看电影的详细信息和排片情况。 公告信…...
基于SpringBoot汽车零件商城系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
Python数据可视化:从脚本到海报级图表
Python数据可视化:从脚本到海报级图表 引言 在数据分析和科学计算领域,Python 是一种强大且灵活的工具。本文将带您了解如何使用 Python 进行数据可视化,从简单的脚本到生成高质量的海报级图表。我们将重点介绍如何使用 Matplotlib 库来创建、保存和优化图表,以便在各种场…...
使用Java截取MP4文件图片的技术指南
在多媒体处理中,从视频文件中截取图片是一个常见的需求。本文将详细介绍如何使用Java结合FFmpeg实现从MP4文件中截取图片的功能。我们将通过几种不同的方法来实现这一目标,包括直接调用FFmpeg命令行工具、使用JavaCV库以及使用JAVE库。 环境准备 在开始…...
C++(初阶)(十一)——list
十一,list 带头循环双向链表。 遍历方式:迭代器,不再支持operate[],operate[]适用于底层是数组的结构。 remove删除值,如果有多个相同的值,都会删除。 接口介绍 下面会介绍list的一些接口 构造 构造…...
leetcode 139. Word Break
这道题用动态规划解决。 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet;for(string& word:wordDict){wordSet.insert(word);}int s_len s.size();//s的下标从1开始起算,dp[j]…...
5.1、深度剖析 docker run 命令:原理阐释与数据持久化实践探究
5.1、深度剖析 docker run 命令:原理阐释与数据持久化实践探究 1、更换国内yum源2、更换国内docker源3、卸载旧版docker4、docker安装5、镜像加速器6、镜像下载7、docker run命令交互式启动-it非交互式后台运行其他参数8、持久化存储目录挂载数据卷挂载数据同步1、更换国内yum…...
【AI大模型】大模型RAG技术Langchain4j 核心组件深入详解
目录 一、前言 二、Langchain4j概述 2.1 Langchain4j 是什么 2.2 Langchain4j 主要特点 2.3 Langchain4j 核心组件 2.4 Langchain4j 核心优势 三、Langchanin4j组件应用实战 3.1 前置准备 3.1.1 导入如下依赖 3.1.2 获取apikey 3.1.3 获取官方文档 3.2 聊天组件 3.…...
【Flink运行时架构】重要概念
前面我们讲了Flink运行时的核心组件和提交流程,但有些细节需要进一步的思考,一个具体的作业是怎样从编写的代码转换成TaskManager可以执行的任务的呢?JobManager在收到提交的作业之后,又是如何确定总共有多少任务、需要配置多少资…...
oracle命令上下左右键无法使用如何解决?
1、问题如图 2、解决办法 (1) 安装readline yum -y install readline* (2)安装 rlwrap ##下载 wget http://files.cnblogs.com/files/killkill/rlwrap-0.30.tar.gz.zip ##解压 tar -xzvf rlwrap-0.30.tar.gz.zip ##编译安装 ./configure make &&…...
[文献阅读] chinese-roberta Pre-Training With Whole Word Masking for Chinese BERT
文献信息:Pre-Training With Whole Word Masking for Chinese BERT | IEEE Journals & Magazine | IEEE Xplore 哈工大和科大讯飞联合发表的用于中文NLP任务的基于BERT的改进模型,在中文NLP任务取得了最先进的性能。 摘要 原本的BERT使用随机掩蔽的…...
QML ListView 与 C++ 模型交互
在 Qt 中,QML 的 ListView 可以与 C 模型进行交互,这是实现复杂数据展示和业务逻辑的常见方式。以下是几种主要的交互方法: 1. 使用 QAbstractItemModel 派生类 这是最强大和灵活的方式,适合复杂数据结构。 C 端实现 cpp // …...
使用SSH解决在IDEA中Push出现403的问题
错误截图: 控制台日志: 12:15:34.649: [xxx] git -c core.quotepathfalse -c log.showSignaturefalse push --progress --porcelain master refs/heads/master:master fatal: unable to access https://github.com/xxx.git/: The requested URL return…...
MacOs下解决远程终端内容复制并到本地粘贴板
常常需要在服务器上捣鼓东西,同时需要将内容复制到本地的需求。 1-内容是在远程终端用vim打开,如何用vim的类似指令达到快速复制到本地呢? 假设待复制的内容: #include <iostream> #include <cstring> using names…...
修改idea/android studio等编辑器快捷注释从当前行开头的反人类行为
不知道什么时候开始,idea编辑的快捷注释开始从当前行开头出现了,显得实在是难受,我只想让在当前行代码的部份开始缩进两个字符开始,这样才会显得更舒服。不知道有没有强迫症的猴子和我一样,就像下面的效果:…...
密码加密方式
密码加密方式全面解析 密码安全是系统安全的第一道防线,以下是主流的密码加密技术分类和实现方式: 一、基础加密方式 1. 对称加密 特点:加密解密使用相同密钥 AES (Advanced Encryption Standard) 密钥长度:128/192/256位示例…...