-
Tomcat的配置文件主要包括server.xml和web.xml,它们位于Tomcat安装目录下的conf文件夹中。今天的内容重点介绍 server.xml 文件的配置,V 哥会结合一些业务场景来介绍,希望可以帮助到你,以下是一些关键的配置项及其作用:server.xml中的配置项:<Server>: 根元素,定义了Tomcat服务器的配置。port: 用于设置Tomcat服务器的端口,默认是8005。<Service>: 定义服务的元素,包含一个或多个<Connector>和<Engine>。name: 服务的名称。port: 服务监听的端口。<Connector>: 定义HTTP连接的配置。port: HTTP连接的端口,默认是8080。protocol: 连接使用的协议,如HTTP/1.1。redirectPort: 当使用SSL时,非SSL请求被重定向到的端口。<Engine>: 定义引擎的配置,引擎是Tomcat的组件,用于路由请求到相应的<Host>。defaultHost: 默认主机名。<Host>: 定义虚拟主机的配置。name: 虚拟主机的名称,可以是域名或IP地址。appBase: 应用程序的基础目录。unpackWAR: 是否解压WAR文件。<Context>: 定义Web应用程序的上下文配置。path: Web应用程序的路径。docBase: Web应用程序的基础目录或WAR文件的路径。reloadable: 是否允许重新加载应用程序。<Listener>: 定义服务器监听器,用于执行启动和停止操作。<Realm>: 定义安全域,用于认证和授权。<Valve>: 定义请求处理过程中的阀门,可以拦截或处理请求。1. <server><Server>元素是Tomcat配置文件server.xml中的根元素,它包含了整个Tomcat服务器的配置信息。以下是一些具体的业务场景和相应的<Server>配置示例:场景1:开发环境在开发环境中,我们通常希望Tomcat服务器能够快速重启以便于开发和测试。因此,可以配置较短的JVM暂停时间,以便在发生错误时快速响应。<Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.startup.ContextConfig" /> <Listener className="org.apache.catalina.startup.UserDataConfig" /> <GlobalNamingResources> <!-- 配置资源 --> </GlobalNamingResources> </Server> 场景2:生产环境在生产环境中,稳定性和安全性是首要考虑的因素。因此,可能需要配置更长的JVM暂停时间来减少重启次数,同时配置SSL证书以支持HTTPS。<Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <!-- 其他监听器配置 --> <GlobalNamingResources> <!-- 配置SSL证书 --> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <!-- 配置SSL连接器 --> <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true" SSLEnabled="true" keystoreFile="/path/to/keystore.jks" keystorePass="password" /> </Server> 场景3:负载均衡如果Tomcat服务器作为负载均衡集群的一部分,可能需要配置特定的端口用于集群通信,例如使用Tomcat的集群部署协议。<Server port="8005" shutdown="SHUTDOWN"> <!-- 配置集群监听器 --> <Listener className="org.apache.catalina.ha.session.JvmRouteBinderListener" /> <GlobalNamingResources> <!-- 配置集群相关资源 --> </GlobalNamingResources> <!-- 配置服务和引擎 --> <Service name="CatalinaCluster"> <Engine name="clusterEngine" defaultHost="localhost" jvmRoute="jvm1"> <!-- 配置Connector和Host --> </Engine> </Service> </Server> 场景4:多实例部署在需要在同一台服务器上部署多个Tomcat实例的场景中,可以为每个实例配置不同的<Server>端口。<Server port="8006" shutdown="SHUTDOWN"> <!-- 配置第一个Tomcat实例的监听器和资源 --> </Server> <Server port="8007" shutdown="SHUTDOWN"> <!-- 配置第二个Tomcat实例的监听器和资源 --> </Server> 2. <Service><Service>元素在Tomcat的server.xml配置文件中定义了一个服务,它将一个或多个连接器(<Connector>)与一个引擎(<Engine>)关联起来。以下是根据不同业务场景的<Service>配置示例:场景1:单实例应用对于大多数基本应用,您可能只需要一个服务实例来处理所有的HTTP请求。以下是一个基本的<Service>配置:<Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <!-- 其他配置,如Host等 --> </Engine> </Service> 场景2:支持SSL的HTTPS服务如果您的应用需要通过HTTPS提供安全连接,您需要配置一个支持SSL的<Connector>:<Service name="Catalina"> <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" keystoreFile="/path/to/your.keystore" keystorePass="your_keystore_password" scheme="https" secure="true" /> <Engine name="Catalina" defaultHost="localhost"> <!-- 其他配置 --> </Engine> </Service> 场景3:负载均衡在负载均衡场景中,您可能需要多个服务实例来处理请求。每个服务可以绑定到不同的端口,并配置为处理不同类型的请求:<Service name="CatalinaCluster"> <Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" /> <Engine name="Catalina" defaultHost="loadbalancer" jvmRoute="node1"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" /> <Host name="loadbalancer" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 负载均衡器的配置 --> </Host> </Engine> </Service> 场景4:多个Web应用如果您需要在同一台服务器上运行多个Web应用,可以为每个应用配置不同的<Service>:<Service name="Catalina1"> <Connector port="8081" protocol="HTTP/1.1" /> <Engine name="Catalina1" defaultHost="app1.example.com"> <Host name="app1.example.com" appBase="webapp1" unpackWARs="true" autoDeploy="true"> <!-- 应用1的配置 --> </Host> </Engine> </Service> <Service name="Catalina2"> <Connector port="8082" protocol="HTTP/1.1" /> <Engine name="Catalina2" defaultHost="app2.example.com"> <Host name="app2.example.com" appBase="webapp2" unpackWARs="true" autoDeploy="true"> <!-- 应用2的配置 --> </Host> </Engine> </Service> 场景5:高可用性配置在需要高可用性的业务场景中,可以配置多个服务实例,每个实例运行在不同的端口上,并通过集群管理器进行管理:<Service name="CatalinaHA"> <Connector port="8080" protocol="HTTP/1.1" redirectPort="8443" /> <Engine name="Catalina" defaultHost="app.example.com" jvmRoute="node1"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> <Channel className="org.apache.catalina.ha.tcp.ReplicationChannel"> <Member className="org.apache.catalina.ha.tcp.ReplicationMember" host="node2" port="4000" /> </Channel> </Cluster> <Host name="app.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 高可用性应用的配置 --> </Host> </Engine> </Service> 3. <Connector><Connector>元素在Tomcat的server.xml配置文件中定义了服务器的网络连接参数,它用于处理客户端的HTTP请求。以下是根据不同业务场景的<Connector>配置示例:场景1:HTTP服务对于基本的HTTP服务,您需要配置一个标准的HTTP连接器:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> port: 设置HTTP服务监听的端口。protocol: 指定使用的协议,这里使用Tomcat的HTTP/1.1处理器。connectionTimeout: 请求超时时间(毫秒)。redirectPort: 当客户端使用HTTP请求时,重定向到的HTTPS端口。场景2:HTTPS服务如果您的应用需要通过HTTPS提供加密连接,您需要配置一个支持SSL的连接器:<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" scheme="https" secure="true" SSLEnabled="true" keystoreFile="conf/keystore.jks" keystorePass="changeit" /> scheme: 设置为https表示使用安全的连接。secure: 设置为true表示请求需要安全连接。SSLEnabled: 设置为true以启用SSL。keystoreFile: 指定包含SSL证书的密钥库文件路径。keystorePass: 密钥库的密码。场景3:性能优化对于需要处理大量并发请求的应用,可以配置NIO(非阻塞I/O)或NIO2的连接器来提高性能:<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" maxThreads="150" minSpareThreads="25" acceptCount="100" /> maxThreads: 最大工作线程数。minSpareThreads: 保持运行的最小空闲线程数。acceptCount: 可以接受的请求队列长度。场景4:限制请求大小为了防止服务器被大文件上传拖慢,可以限制请求的最大大小:<Connector port="8080" protocol="HTTP/1.1" maxPostSize="20971520" /> maxPostSize: 最大POST请求大小,这里设置为20MB。场景5:启用GZIP压缩为了减少网络传输的数据量,可以配置连接器以启用GZIP压缩:<Connector port="8080" protocol="HTTP/1.1" compression="on" compressionMinSize="2048" noCompressionUserAgent="gozilla, traviata" /> compression: 设置为on以启用压缩。compressionMinSize: 启用压缩的请求最小大小(字节)。noCompressionUserAgent: 不应用压缩的浏览器列表。场景6:配置代理设置如果您的Tomcat服务器位于一个或多个代理之后,您可能需要配置连接器以正确处理请求头:<Connector port="8080" protocol="HTTP/1.1" proxyName="www.example.com" proxyPort="80" scheme="http" secure="false" /> proxyName: 代理服务器的主机名。proxyPort: 代理服务器监听的端口。4. <Engine><Engine>元素在Tomcat的server.xml配置文件中代表了一个请求引擎,它负责接收<Service>中的<Connector>转发的请求,并将请求路由到相应的<Host>或<Context>。以下是根据不同业务场景的<Engine>配置示例:场景1:基本Web应用路由对于基本的Web应用部署,您可能只需要将请求路由到默认的虚拟主机:<Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm" /> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 可以包含具体的<Context>元素定义 --> </Host> </Engine> name: 引擎的名称,通常与<Service>元素的名称相匹配。defaultHost: 请求无法匹配到任何<Host>时使用的默认主机名。场景2:部署多个虚拟主机如果您需要在同一台服务器上部署多个虚拟主机,可以在同一个<Engine>下配置多个<Host>:<Engine name="Catalina" defaultHost="default"> <Host name="app1.example.com" appBase="webapps/app1" unpackWARs="true" autoDeploy="true"> <!-- 应用1的配置 --> </Host> <Host name="app2.example.com" appBase="webapps/app2" unpackWARs="true" autoDeploy="true"> <!-- 应用2的配置 --> </Host> </Engine> 场景3:集群部署在需要高可用性的集群部署场景中,可以配置集群管理器来同步会话信息:<Engine name="Catalina" defaultHost="localhost" jvmRoute="node1"> <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"> <Channel className="org.apache.catalina.ha.tcp.ReplicationChannel"> <Member className="org.apache.catalina.ha.tcp.ReplicationMember" host="node2" port="4000" /> </Channel> </Cluster> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 主机配置 --> </Host> </Engine> jvmRoute: 当前实例的JVM路由标识,用于集群中的会话查找。场景4:自定义请求过滤器如果您需要对所有请求应用自定义过滤器,可以在<Engine>下配置<Valve>:<Engine name="Catalina" defaultHost="localhost"> <Valve className="com.example.MyCustomRequestFilter" /> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 主机配置 --> </Host> </Engine> className: 指定自定义过滤器的完整类名。场景5:访问日志配置为了记录所有请求的访问日志,可以在<Engine>下配置访问日志阀:<Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm" /> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 主机配置 --> </Host> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="access_log." suffix=".txt" pattern="common" rotate="true" /> </Engine> directory: 访问日志文件存储的目录。prefix和suffix: 日志文件的前缀和后缀。pattern: 日志记录的格式。rotate: 是否启用日志轮转。5. <Host><Host>元素在Tomcat的server.xml配置文件中配置了一个虚拟主机,它处理指向特定主机名或IP地址的请求。以下是根据不同业务场景的<Host>配置示例:场景1:单个应用的虚拟主机对于单个应用的部署,您可以配置一个虚拟主机,所有请求都会映射到这个应用:<Host name="myapp.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 应用的Context配置可以在这里添加,或者在单独的XML文件中配置 --> </Host> name: 虚拟主机的名称,通常是应用的域名。场景2:多个应用的虚拟主机如果您希望一个虚拟主机管理多个应用,可以在<Host>下配置多个<Context>:<Host name="multiapp.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/app1" docBase="app1" /> <Context path="/app2" docBase="app2" /> <!-- 更多应用的Context配置 --> </Host> path: Web应用的路径。docBase: Web应用的文档基础路径或WAR文件名。场景3:使用外部定义的Context在复杂的部署场景中,您可能希望将<Context>配置在外部XML文件中,以保持server.xml的清晰:<Host name="externalctx.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="external" reloadable="true" /> <!-- 其他Context配置 --> </Host> <Context>的path可以留空,表示应用的根路径。docBase可以指向包含context.xml文件的目录。场景4:配置别名如果您希望虚拟主机响应多个域名,可以使用<Alias>元素:<Host name="alias.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Alias>www.alias.com</Alias> <!-- 应用的Context配置 --> </Host> <Alias>: 虚拟主机的另一个域名。场景5:配置SSL对于需要SSL加密的虚拟主机,可以配置一个SSL连接器,并在<Host>中指定SSL相关属性:<Host name="secure.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true" sslProtocol="TLS" sslCertificateFile="/path/to/certificate.cer" sslCertificateKeyFile="/path/to/key.key" sslPort="8443"> <!-- 应用的Context配置 --> </Host> sslProtocol: 使用的SSL协议。sslCertificateFile和sslCertificateKeyFile: SSL证书和私钥文件的路径。sslPort: SSL端口,当客户端通过这个端口访问时,将使用SSL。场景6:禁用某些HTTP方法出于安全考虑,您可能希望禁用某些HTTP方法:<Host name="securemethods.example.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" pattern="%h %l %u %t "%r" %s %b" /> <Context> <Valve className="org.apache.catalina.valves.MethodDisablerValve" methods="TRACE" /> </Context> </Host> methods: 需要禁用的HTTP方法列表。6. <Context><Context>元素在Tomcat的server.xml配置文件中定义了Web应用程序的上下文。每个<Context>代表一个Web应用,包括它的路径、文档基础、会话管理和其他特定于应用的设置。以下是根据不同业务场景的<Context>配置示例:场景1:基本Web应用部署对于基本的Web应用部署,您需要指定应用的路径和文档基础:<Context path="/myapp" docBase="myapp" /> path: Web应用的URL路径。docBase: Web应用的目录或WAR文件的名称。场景2:配置外部WAR文件如果您有一个外部WAR文件,希望部署为特定的上下文路径:<Context path="/externalapp" docBase="/path/to/externalapp.war" /> docBase: 指向外部WAR文件的绝对路径。场景3:使用相对路径的WAR文件在某些情况下,您可能希望使用相对于appBase的相对路径:<Context path="/relapp" docBase="webapps/relapp.war" /> 场景4:配置会话超时为了管理会话的生命周期,您可以设置会话超时时间(以分钟为单位):<Context path="/myapp" docBase="myapp" sessionTimeout="30" /> 场景5:启用应用的重新加载在开发过程中,您可能希望在代码更改后自动重新加载应用:<Context path="/devapp" docBase="devapp" reloadable="true" /> reloadable: 设置为true以启用应用的自动重新加载。场景6:配置资源链接如果您的应用需要连接到外部资源(如数据库),您可以配置资源链接:<Context path="/myapp" docBase="myapp"> <ResourceLink global="jdbc/myDB" type="javax.sql.DataSource" name="jdbc/myAppDB" /> </Context> ResourceLink: 定义了一个资源链接,允许应用访问在<GlobalNamingResources>中定义的资源。场景7:配置安全设置对于需要安全认证的应用,您可以配置安全约束和角色:<Context path="/secapp" docBase="secapp"> <SecurityConstraint> <WebResourceCollection urlPattern="/*"> <HttpMethod constraint="POST,PUT" /> </WebResourceCollection> <AuthConstraint> < Role name="admin" /> </AuthConstraint> </SecurityConstraint> <Valve className="org.apache.catalina.authenticator.BasicAuthenticator" /> </Context> SecurityConstraint: 定义了哪些资源需要安全保护。WebResourceCollection: 定义了受保护的URL模式和HTTP方法。AuthConstraint: 定义了允许访问的的角色。Valve: 指定了认证的类型(例如,基本认证)。场景8:配置字符集和本地化为了确保应用正确处理国际化内容,您可以配置字符集和本地化:<Context path="/globalapp" docBase="globalapp" useHttpOnly="true"> <LocaleConfig defaultLocale="en" /> <CharsetConfig> <Charset name="UTF-8" /> </CharsetConfig> </Context> useHttpOnly: 设置为true以启用HttpOnly Cookies。LocaleConfig: 定义了默认地区设置。CharsetConfig: 定义了应用使用的字符集。7. <Listener><Listener>元素在Tomcat的server.xml配置文件中用于注册事件监听器,这些监听器在Tomcat的生命周期事件(如启动和停止)发生时被调用。以下是根据不同业务场景的<Listener>配置示例:场景1:自定义上下文初始化如果您需要在Tomcat启动时执行自定义逻辑,比如初始化数据库连接池或加载应用程序特定的资源,可以定义一个自定义的上下文监听器:<Listener className="com.example.MyContextListener" /> className: 指定自定义监听器的完整类名。场景2:SSL证书管理在需要动态加载或刷新SSL证书的业务场景中,可以使用自定义的证书管理监听器:<Listener className="com.example.SSLCertLoader" /> 场景3:集群会话管理当Tomcat配置为集群模式时,可以使用特定的监听器来管理会话复制:<Listener className="org.apache.catalina.ha.session.JvmRouteBinderListener" /> 这个监听器是Tomcat集群会话管理的一部分,用于设置JVM路由。场景4:请求日志记录为了记录所有进入Tomcat的请求,可以配置请求日志监听器:<Listener className="org.apache.catalina.core.AsyncListenerWrapper" /> <Listener className="org.apache.catalina.core.AprLifecycleListener" /> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="access_log" suffix=".txt" pattern="common" resolveHosts="false" /> AccessLogValve: 用于记录访问日志的监听器,可以设置日志的目录、前缀、后缀和日志模式。场景5:性能监控为了监控Tomcat的性能,可以添加性能监控监听器:<Listener className="com.example.PerformanceMonitor" /> 场景6:Tomcat资源管理Tomcat的资源管理监听器可以用于跟踪和管理JNDI资源:<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> 场景7:自定义用户数据管理如果您需要在Tomcat启动或停止时加载或保存用户数据,可以定义一个自定义的用户数据管理监听器:<Listener className="com.example.UserDataManager" /> 场景8:Tomcat安全监听器Tomcat提供了一些内置的安全监听器,用于在启动和停止时进行安全相关的初始化和清理:<Listener className="org.apache.catalina.authenticator.AuthenticatorBase" /> 8. <Realm><Realm>元素在Tomcat的server.xml配置文件中定义了安全域,它负责处理用户认证和授权。以下是根据不同业务场景的<Realm>配置示例:场景1:使用内存认证在开发环境中,您可能希望使用内存中的用户和角色列表进行认证:<Realm className="org.apache.catalina.realm.MemoryRealm" /> 场景2:使用JDBC数据库认证对于生产环境,您可能需要使用数据库存储用户信息和角色信息:<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/tomcatdb" dataSourceName="java:comp/env/jdbc/tomcatDataSource" userTable="users" userCredColumn="password" userNameColumn="username" /> driverName: JDBC驱动的类名。connectionURL: 数据库连接URL。dataSourceName: JNDI资源名称,用于查找数据源。userTable: 存储用户信息的数据库表。userCredColumn: 存储密码的列。userNameColumn: 存储用户名的列。场景3:使用JAAS认证如果您的应用需要使用Java Authentication and Authorization Service (JAAS),可以配置JAAS认证:<Realm className="org.apache.catalina.realm.JAASRealm" appName="myApp" /> appName: JAAS应用的名称。场景4:使用LDAP认证当用户信息存储在LDAP服务器时,可以使用LDAP认证:<Realm className="org.apache.catalina.realm.JNDIRealm" userPattern="uid={0},ou=people,dc=example,dc=com" connectionName="uid=admin,ou=people,dc=example,dc=com" connectionPassword="adminpassword" url="ldap://ldap.example.com:389/" /> userPattern: LDAP中用户信息的搜索模式。connectionName: 连接LDAP服务器的用户名。connectionPassword: 连接LDAP服务器的密码。url: LDAP服务器的URL。场景5:使用自定义Realm如果您有特殊的认证需求,可以创建自定义的Realm实现:<Realm className="com.example.MyCustomRealm" /> 场景6:结合多个Realm使用在某些业务场景中,您可能需要结合多个Realm进行认证,例如,首先尝试使用内存认证,如果失败再尝试使用数据库认证:<Realm className="org.apache.catalina.realm.CombinedRealm"> <Realm className="org.apache.catalina.realm.MemoryRealm" /> <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="..." connectionURL="..." userTable="..." userCredColumn="..." userNameColumn="..." /> </Realm> CombinedRealm: 组合多个Realm的认证器。场景7:使用容器管理的Realm如果您使用Tomcat在应用服务器(如GlassFish或JBoss)中,可能需要使用容器管理的Realm:<Realm className="org.apache.catalina.realm.ContainerRealm" ignoreEmptyPassword="true" /> ignoreEmptyPassword: 是否忽略空密码。9. <Valve><Valve>元素在Tomcat的server.xml配置文件中用于插入自定义的处理逻辑,这些处理逻辑可以在请求处理管道的不同阶段执行。以下是根据不同业务场景的<Valve>配置示例:场景1:访问日志记录记录每个请求的详细日志信息,这对于分析流量和调试应用非常有用:<Valve className="org.apache.catalina.valves.AccessLogValve" pattern="%h %l %u %t "%r" %s %b" /> pattern: 定义日志的格式,%h, %l, %u, %t, %r, %s, %b 分别代表主机名、登录名、用户ID、时间、请求行、状态码和字节数。场景2:请求响应时间记录监控每个请求的响应时间,以评估应用性能:<Valve className="org.apache.catalina.valves.RequestDumpValve" /> 场景3:请求过滤过滤特定的请求,例如禁用或限制某些HTTP方法:<Valve className="org.apache.catalina.valves.MethodDisablerValve" methods="TRACE" /> methods: 指定要禁用的HTTP方法列表。场景4:静态资源缓存为静态资源设置缓存头,以提高响应速度和减少服务器负载:<Valve className="org.apache.catalina.valves.StaticResourcesValve" cache="maxSize=100000,ttl=3600" /> cache: 定义缓存的大小和时间(TTL)。场景5:SSL认证强制所有请求都使用SSL连接,增强应用安全性:<Valve className="org.apache.catalina.valves.SSLValve" keystoreFile="/path/to/keystore.jks" keystorePass="password" /> keystoreFile: 密钥库文件的路径。keystorePass: 密钥库的密码。场景6:请求重写根据特定规则重写请求URI,用于URL重定向或重写:<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> XML 复制 全屏场景7:自定义请求处理执行自定义的请求处理逻辑,例如用户请求的预处理或后处理:<Valve className="com.example.MyCustomRequestValve" /> 场景8:会话管理自定义会话管理逻辑,例如会话超时处理或会话持久化:<Valve className="org.apache.catalina.valves.SessionValve" /> 场景9:错误页面定制自定义错误页面的响应,例如为不同的HTTP状态码定义不同的错误页面:<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" /> showReport: 是否显示详细的错误报告。showServerInfo: 是否显示服务器信息。转载自https://www.cnblogs.com/wgjava/p/18381701
-
Java Web项目启动Tomcat时可能会遇到各种错误,这些错误可能涉及到项目本身、Tomcat配置、依赖关系、Java版本等多个方面。解决这些错误需要对Tomcat和Java Web开发的相关知识有一定的了解。以下是一些常见的启动Tomcat时可能遇到的错误及其解决方案:1. 端口被占用错误:错误描述: Tomcat启动时报端口被占用错误,通常是因为8080端口已被其他应用程序占用。解决方案:找到占用8080端口的进程,并终止该进程。修改Tomcat的端口号,可以通过编辑server.xml文件中的Connector配置,将端口号修改为其他未被占用的端口。2. Context路径配置错误:错误描述: 项目的Context路径配置错误,导致Tomcat无法正确部署项目。解决方案:检查web.xml文件中的<context-root>配置,确保路径正确。确保项目的目录结构正确,WEB-INF目录、类文件目录等都在正确的位置。3. Java版本不匹配:错误描述: 使用了不兼容的Java版本,导致Tomcat启动失败。解决方案:确保Tomcat和项目都使用相同的Java版本。在catalina.sh(Linux)或catalina.bat(Windows)文件中设置JAVA_HOME环境变量,确保指定的Java路径正确。4. 缺少依赖或jar包冲突:错误描述: 项目缺少必要的依赖,或者项目中存在依赖冲突。解决方案:使用项目管理工具(如Maven、Gradle)管理依赖,确保所有的依赖被正确引入。检查WEB-INF/lib目录下的jar包,确保没有版本冲突。5. Servlet类或配置错误:错误描述: 配置的Servlet类名或Servlet配置错误。解决方案:检查web.xml文件中的Servlet配置,确保类名、URL映射等配置正确。确保Servlet类在类路径中,且正确部署。6. 数据库连接问题:错误描述: 项目启动时无法连接数据库。解决方案:检查数据库连接配置,确保数据库地址、用户名和密码正确。确保数据库服务已启动。检查数据库驱动是否正确引入。7. 内存配置问题:错误描述: 启动时报内存溢出错误。解决方案:调整Tomcat的setenv.sh(Linux)或setenv.bat(Windows)文件,增加JVM内存参数。检查项目中是否存在内存泄漏的问题,优化代码。8. SSL证书配置错误:错误描述: 使用了HTTPS,但SSL证书配置错误。解决方案:确保SSL证书正确配置。检查server.xml中SSL相关的配置项。9. 权限问题:错误描述: Tomcat无法读取项目文件或写入日志。解决方案:确保Tomcat进程有足够的权限访问项目文件。检查日志文件夹是否有写入权限。10. 缓存问题:错误描述: 之前的项目缓存导致新的更改无法生效。解决方案:清除Tomcat工作目录下的缓存,通常在/work/Catalina/localhost/目录下。重启Tomcat。11. Tomcat版本问题:错误描述: 项目使用的Tomcat版本与项目不兼容。解决方案:确保项目使用的Tomcat版本与项目要求的版本一致。更新项目配置,以适应新的Tomcat版本。12. 其他异常:错误描述: 其他未分类的异常,可能是由于特定配置或环境导致的。解决方案:查看Tomcat日志,尝试理解错误信息。在搜索引擎中输入错误信息,查找是否有相关的解决方案。
-
选择 tar.gz 格式还是 zip 格式的文件下载,主要取决于操作系统和个人偏好:tar.gz (pgp, sha512):这是一种在 Unix-like 系统(如 Linux 和 macOS)中常用的压缩格式。tar是一种将多个文件合并为单个文件(归档)的工具,而gz是 gzip,用于压缩归档文件。pgp和sha512分别提供了文件的数字签名和哈希校验,用于验证下载的文件的完整性和真实性。如果你使用的是 Linux 或 macOS,通常选择tar.gz格式更方便,因为这些系统原生支持tar和gzip命令,此外 Linux 或 macOS也提供了工具来处理zip文件。zip (pgp, sha512):zip 是一种跨平台的文件压缩格式,Windows、macOS 和 Linux 都支持。和tar.gz类似,pgp和sha512用于验证文件。如果你使用的是 Windows,通常选择zip格式更方便,因为 Windows Explorer 原生支持zip文件的压缩和解压缩。转载自https://www.cnblogs.com/qiujicai/p/18014519
-
漏洞名称:Apache Tomcat HTTP 请求走私漏洞组件名称:Apache Tomcat影响范围:10.0.0 ≤ Apache Tomcat ≤ 10.0.2610.1.0 ≤ Apache Tomcat ≤ 10.1.0-M209.0.0 ≤ Apache Tomcat ≤ 9.0.678.5.0 ≤ Apache Tomcat ≤ 8.5.82漏洞类型:权限提升利用条件:1、用户认证:不需要用户认证2、前置条件:关闭 rejectIllegalHeader 前置条件3、触发方式:远程综合评价:<综合评定利用难度>:未知。<综合评定威胁等级>:中危,能造成钓鱼攻击。组件介绍:Apache Tomcat 是美国阿帕奇(Apache)基金会的一款轻量级 Web 应用服务器。该程序实现了对Servlet 和 JavaServer Page(JSP)的支持。漏洞简介:2022 年11月1日,监测到一则 Apache Tomcat 组件存在 HTTP 请求走私漏洞的信息,漏洞编号:CVE-2022-42252,漏洞威胁等级:中危。在关闭 rejectIllegalHeader 的条件下,攻击者可利用该漏洞构造恶意 HTTP Header 在未授权的情况执行钓鱼攻击。漏洞影响范围:目前受影响的 Apache Tomcat 版本:10.0.0 ≤ Apache Tomcat ≤ 10.0.2610.1.0 ≤ Apache Tomcat ≤ 10.1.0-M209.0.0 ≤ Apache Tomcat ≤ 9.0.678.5.0 ≤ Apache Tomcat ≤ 8.5.82解决方案:如何检测组件版本Windows 系统在 Tomcat 的 bin 目录下,输入 catalina version 命令即可显示当前版本信息。Linux 系统在 bin 目录下执行 sh version.sh 命令或 ./version.sh 命令可显示当前版本信息。官方修复建议当前官方已发布最新版本,建议受影响的用户及时更新升级到最新版本。链接如下:Apache Tomcat系列10https://tomcat.apache.org/download-10.cgiApache Tomcat系列9https://tomcat.apache.org/download-90.cgiApache Tomcat系列8https://tomcat.apache.org/download-80.cgi参考链接:https://lists.apache.org/thread/zzcxzvqfdqn515zfs3dxb7n8gty589sq
-
漏洞名称:Apache Tomcat 拒绝服务漏洞组件名称:Apache Tomcat影响范围:未配置 EncryptInterceptor 则全版本受影响配置 EncryptInterceptor 如下版本受影响:10.1.0-M1 ≤ Apache Tomcat ≤ 10.1.0-M1410.0.0-M1 ≤ Apache Tomcat ≤10.0.209.0.13 ≤ Apache Tomcat ≤ 9.0.628.5.38 ≤Apache Tomcat ≤8.5.78漏洞类型:拒绝服务利用条件:1、用户认证:不需要用户认证2、前置条件:开启集群配置3、触发方式:远程综合评价:<综合评定利用难度>:未知。<综合评定威胁等级>:中危,能造成拒绝服务。漏洞分析:组件介绍:Apache Tomcat 是美国阿帕奇(Apache)软件基金会的一款轻量级 Web 应用服务器,该程序实现了对Servlet 和 JavaServer Page(JSP) 的支持。漏洞简介:2022年7月2日,监测到一则 Apache Tomcat 拒绝服务漏洞的信息,漏洞编号:CVE-2022-29885,漏洞威胁等级:中危。该漏洞是由于 Tomcat 开启集群配置中存在缺陷,攻击者可利用该漏洞在未权限的情况下,构造恶意数据造成拒绝服务,最终导致目标服务器拒绝服务。影响范围:目前受影响的 Apache Tomcat 版本:未配置EncryptInterceptor则全版本受影响配置EncryptInterceptor如下版本受影响:10.1.0-M1 ≤ Apache Tomcat ≤ 10.1.0-M1410.0.0-M1 ≤ Apache Tomcat ≤10.0.209.0.13 ≤ Apache Tomcat ≤ 9.0.628.5.38 ≤ Apache Tomcat ≤8.5.78解决方案:1.如何检测组件系统版本Windows 系统在 Tomcat 的 bin 目录下,输入 catalina version 命令即可显示版本信息。Linux 系统在 bin 目录下执行如下命令:bash version.sh 可显示版本信息。2.官方修复建议当前官方已发布最新版本,建议受影响的用户及时更新升级到最新版本。链接如下:https://tomcat.apache.org/security-10.htmlhttps://tomcat.apache.org/security-9.htmlhttps://tomcat.apache.org/security-8.html
-
1. 没有开tomcat服务 在浏览器的地址栏中输入localhost:8080 回车会出现如下界面 tomcat没有开服务。在cmd中输入startup.bat。不要关闭开启的tomcat窗口。 2.输入url路径错误 在浏览器中输入url显示404,可能是输入的路径不存在或输入错误路径。 3. Java JDK环境变量未设置好 在cmd输入startup.bat时,报错。 如图: 解决方案: 这个是Java jdk的环境变量名设置不规范,将jdk的路径设置变量名必须是JAVA_HOME。 找到系统变量界面,更改错误的jdk变量名。 更改完后: 修改完之后,重新打开cmd在输入startup.bat就可以正常启动了 4.重复开启服务 服务已经开启,不需要重复打开。 5.端口被占用 通过网页访问出现 Access Error错误,端口被占用 打开cmd输入指令:将占用你所指定的端口号进程删掉netstat -ano :查看所有端口信息netstat ano | findstr "8080" :查看端口8080占用信息tasklist :查看所有进程tasklist | findstr "1": 查看某进程taskkill /f /pid 进程号: 删除某进程号到此这篇关于安装tomcat后可能出现的问题介绍的文章就介绍到这了转载自https://www.jb51.net/article/233667.htm
-
一、前言前面已经讲解了快速上手SpringBoot入门程序制作的四种方式,相信各位小伙伴们已经可以熟练的使用这些方式来创建一个简单的web程序了,但是仅仅知道这些还是不够的。接下来,带大家一起了解parent、starter、引导类、以及内嵌Tomcat相关的知识!二、百度百科Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。三、简化开发从百度百科中可以看出,其目的是用来简化Spring!那么到底简化在什么地方呢?让我们想想在学习SSM时,做过原始SpringMVC程序的小伙伴应该知道,写SpringMVC程序,最基础的spring-web和spring-webmvc这两个坐标是必须的,这些还不包含我们使用的json啊等等坐标,现在呢?一个坐标搞定!以前写配置类或者配置文件,然后用什么东西就要自己写加载bean这些东西,现在呢?什么都没写,照样能用。有以下优点:简化依赖配置简化常用工程相关配置内置服务器,比如Tomcat别着急,让我们慢慢来探讨探讨其中的奥秘~四、parent介绍打开创建好的springboot程序,可以看见pom.xml文件中的<parent> </parent> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.4</version> <relativePath/> </parent>这里的<version>2.6.4<version>就是自己使用的springboot版本,打开后可以发现其中又继承了一个坐标,引入了很多依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.6.4</version> </parent>再次点击打开,就可以找到其中的奥秘了。从下图我们可以发现各式各样的依赖版本号属性,下面列出依赖版本属性的局部,可以看的出来,定义了若干个技术的依赖版本号再看看下图,各式各样的的依赖坐标信息,可以看出依赖坐标定义中没有具体的依赖版本号,而是引用了第一组信息中定义的依赖版本属性值注意:上面的依赖坐标定义是出现在<dependencyManagement>标签中的,其实是对引用坐标的依赖管理,并不是实际使用的坐标。因此当我们的项目中继承了这组parent信息后,在不使用对应坐标的情况下,前面的这组定义是不会具体导入某个依赖的最后来看看使用不同的springboot版本时,其对应的pom依赖文件有什么不同。我这里对比的是springboot2.5.6版本和springboot2.6.4从图中可以清楚的看到,当我们使用不同的springboot版本时,他们的依赖版本就会不同。这也确保了,在使用springboot时,我们可以在某种程度上避免版本冲突的复杂问题,方便了程序员们的开发!五、starter介绍SpringBoot关注到开发者在实际开发时,对于依赖坐标的使用往往都有一些固定的组合方式,比如使用spring-webmvc就一定要使用spring-web。每次都要固定搭配着写,非常繁琐,而且格式固定,没有任何技术含量。SpringBoot一看这种情况,把所有的技术使用的固定搭配格式都给开发出来,以后我们使用某个技术,就不用一次写一堆依赖了,直接用springboot做好的这个东西就好了,对于这样的固定技术搭配,SpringBoot给它起了个名字叫做starter。starter定义了使用某种技术时对于依赖的固定搭配格式,也是一种最佳解决方案,使用starter可以帮助开发者减少依赖配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>比如我想开发web应用,就需要引入上面的web对应的starter依赖,并没有写SpringMVC的坐标,点击spring-boot-starter-web我们会发现在spring-boot-starter-web中又定义了若干个具体依赖的坐标通过上图我们可以细心的发现叫做spring-boot-starter-json的名字中也有starter,打开看看里面有什么?我们可以发现,这个starter中又包含了若干个坐标,其实就是使用SpringMVC开发通常都会使用到Json,使用json又离不开这里面定义的这些坐标,看来还真是方便,SpringBoot把我们开发中使用的东西能用到的都给提前做好了。仔细看完会发现,里面有一些我们没用过的。的确会出现这种过量导入的可能性,不过没关系,可以通过maven中的排除依赖剔除掉一部分。不过你不管它也没事,大不了就是过量导入呗。到这里基本上得到了一个信息,使用starter可以帮开发者快速配置依赖关系六、starter与parent的区别朦朦胧胧中感觉starter与parent好像都是帮助我们简化配置的,但是功能又不一样:starter是一个坐标中定了若干个坐标,以前写多个的,现在写一个,是用来减少依赖配置的书写量的parent是定义了几百个依赖版本号,以前写依赖需要自己手工控制版本,现在由SpringBoot统一管理,这样就不存在版本冲突了,是用来减少依赖冲突的温馨提示 SpringBoot官方给出了好多个starter的定义,方便我们使用,而且名称都是如下格式命名规则:spring-boot-starter-技术名称七、引导类介绍配置说完了,我们发现SpringBoot确实帮助我们减少了很多配置工作,下面说一下程序是如何运行的。目前程序运行的入口就是SpringBoot工程创建时自带的那个类了,带有main方法的那个类,运行这个类就可以启动SpringBoot工程的运行,我的是这个:@SpringBootApplication public class Springboot0101Application { public static void main(String[] args) { SpringApplication.run(Springboot0101Application.class, args); }写代码测试一下,先创建一个User类,把它放在容器中@Component public class User { }然后再写一个BookController类,也把它放在容器中@RestController @RequestMapping("/books") public class BookController { @GetMapping("/getBooks") public String getBooks() { System.out.println("springboot程序正在运行呢~"); return "Hello,SpringBoot is running"; } }看看我对应类的目录结构:最后写代码测试一下:@SpringBootApplication public class Springboot0101Application { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(Springboot0101Application.class, args); BookController bookBean = applicationContext.getBean(BookController.class); System.out.println("The message of bookBean : " + bookBean); User userBean = applicationContext.getBean(User.class); System.out.println("The message of userBean : " + userBean); } }运行结果:看到结果,小伙伴们不难猜想了——SpringBoot程序启动是创建了一个Spring容器对象吧?答案就是如此!Springboot0101Application这个类在SpringBoot程序中是所有功能的入口,称这个类为引导类。作为一个引导类最典型的特征就是当前类上方声明了一个注解@SpringBootApplication点击进入@SpringBootApplication,我们可以看到:这里面有我们之前学习SSM时用到的包扫描注解,再点击进入@SpringBootConfiguration内:我们可以发现,它最终使用了@Configuration注解,所以,归根到底,我们使用的引用类,也是一个配置类。八、内嵌Tomcat1、Tomcat定义位置程序现在已经运行了,通过引导类的main方法运行了起来。但是运行java程序不应该是执行完就结束了吗?但是我们现在明显是启动了一个web服务器啊,不然网页怎么能正常访问呢?这个服务器是在哪里写的呢?认真想一想,它就在我们引入的spring-boot-starter-web场景starter中,我们打开它来看一看:这里面有一个核心的坐标,tomcat-embed-core,叫做tomcat内嵌核心。就是这个东西把tomcat功能引入到了我们的程序中。2、Tomcat运行原理再来说第二个问题,这个服务器是怎么运行的?Tomcat服务器是一款软件,而且是一款使用java语言开发的软件,既然是使用java语言开发的,运行的时候肯定符合java程序运行的原理,java程序运行靠的是什么?对象呀,一切皆对象,万物皆对象。那tomcat运行起来呢?也是对象。如果是对象,那Spring容器是用来管理对象的,这个对象能不能交给Spring容器管理呢?答案是可以的!tomcat服务器运行其实是以对象的形式在Spring容器中运行的,怪不得我们没有安装这个tomcat,而且还能用。闹了白天这东西最后是以一个对象的形式存在,保存在Spring容器中悄悄运行的。具体运行的是什么呢?其实就是上前面提到的那个tomcat内嵌核心具体内嵌核心依赖如下:<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>9.0.58</version> <scope>compile</scope> <exclusions> <exclusion> <artifactId>tomcat-annotations-api</artifactId> <groupId>org.apache.tomcat</groupId> </exclusion> </exclusions> </dependency>3、更换内嵌Tomcat那既然是个对象,如果把这个对象从Spring容器中去掉是不是就没有web服务器的功能呢?当然可以,通过依赖排除可以去掉这个web服务器功能。根据SpringBoot的工作机制,用什么技术,加入什么依赖就行了。我选择的是SpringBoot提供的内置服务器jetty更换代码如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>让我们运行一下看看是什么样的结果:输出结果是没有问题的,但是服务器就不是默认的Tomcat了,而是我选择的jetty服务器链接:https://bbs.huaweicloud.com/blogs/336909
-
Tomcat集群原理通过Nginx负载均衡进行请求转发Tomcat集群能带来什么提高服务的性能, 并发能力, 以及高可用性提供项目架构的横向扩展能力Tomcat集群产生什么问题Session登录信息存储以及读取的问题服务器定时任务并发的问题Tomcat 单服务体系架构在这个架构图中,一层Nginx,首先Nginx主要职责给Tomcat一层反向代理。比如,我们的登录的时候登录了A服务器,session信息存储到A服务器上了,假设我们使用的负载均衡策略是ip hash,那么登录信息还可以从A服务器上访问,但是这个有可能造成某些服务器压力过大,某些服务器又没有什么压力,这个时候压力过大的机器(包括网卡带宽)有可能成为瓶颈,并且请求不够分散。首先要解决Session共享的问题这时候我们使用轮询或者最小连接负载均衡策略,就导致了,第一次访问A服务器,第二次可能访问到B服务器,这个时候存储在A服务器上的session信息在B服务器上读取不到。典型负载均衡策略分析打个比方,我们有轮询,权重,地址散列,地址散列又分为原ip地址散列hash,目标ip地址散列hash,最少连接,加权最少连接,还有继续升级的很多种策略轮询:优点:实现简单,缺点:不考虑每台服务器处理能力权重:优点:考虑了服务器处理能力的不同地址散列:优点:能实现同一个用户访问同一个服务器最少连接:优点:使集群中各个服务器负载更加均匀加权最少连接:在最少连接的基础上,为每台服务器加上权值。算法为(活动连接数*256+非活动连接数)/权重,计算出来的值小的服务器优先被选择。Session管理-Session Sticky粘滞会话:对于同一个连接中的数据包,负载均衡会将其转发至后端固定的服务器进行处理。解决了我们session共享的问题,但是它有什么缺点呢?一台服务器运行的服务挂掉,或者重启,上面的 session 都没了负载均衡器成了有状态的机器,为以后实现容灾造成了羁绊Session管理-Session 复制就是每一个Tomcat都存储我们的Session,不同的tomcat之间进行拷贝复制。解决了我们session共享的问题,但是它有什么缺点呢?应用服务器间带宽问题,因为需要不断同步session数据大量用户在线时,服务器占用内存过多Session管理-基于Cookie主要用于我们将session会话如同token一般存储在我们的前端解决了我们session共享的问题,但是它有什么缺点呢?cookie 的长度限制cookie存于浏览器,安全性是一个问题Session管理-Session 服务器就是通过一个专门管理session会话的管理器服务,进行集中化存储和管理session解决了我们session共享的问题,这种方案需要思考哪些问题呢?保证 session 服务器的可用性,session服务器单点如何解决?我们在写应用时需要做调整存储session的业务逻辑打个比方,我们为了提高session server的可用性,可以继续给session server做集群Tomcat单机部署多应用解压2个tomcat, 分别命名为tomcatA和tomcatB分别设置2个tomcat的URIEncoding, 将tomcat的conf/server.xml里的port修改为两个不同端口。作者:浩宇天尚链接:https://www.jianshu.com/p/02459aefbef1来源:简书
-
大家好,本篇文章主要讲的是安装tomcat后可能出现的问题介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览 1. 没有开tomcat服务 在浏览器的地址栏中输入localhost:8080 回车会出现如下界面 tomcat没有开服务。在cmd中输入startup.bat。不要关闭开启的tomcat窗口。 2.输入url路径错误 在浏览器中输入url显示404,可能是输入的路径不存在或输入错误路径。 3. Java JDK环境变量未设置好 在cmd输入startup.bat时,报错。 如图: 解决方案: 这个是Java jdk的环境变量名设置不规范,将jdk的路径设置变量名必须是JAVA_HOME。 找到系统变量界面,更改错误的jdk变量名。 更改完后: 修改完之后,重新打开cmd在输入startup.bat就可以正常启动了 4.重复开启服务 服务已经开启,不需要重复打开。 5.端口被占用 通过网页访问出现 Access Error错误,端口被占用 打开cmd输入指令:将占用你所指定的端口号进程删掉netstat -ano :查看所有端口信息netstat ano | findstr "8080" :查看端口8080占用信息tasklist :查看所有进程tasklist | findstr "1": 查看某进程taskkill /f /pid 进程号: 删除某进程号转载自https://www.jb51.net/article/233667.htm
-
【摘要】 前几天部门的技术经理给我分配了一个任务,叫我一个人去维护之前上古时期的Java Wbe项目,这个项目其实是一个前置机程序,负责消息的`加解密、加签验签`和消息的`转发`;这个程序部署于Servlet容器中,用的是Tomcat服务,并且这个Tomcat服务我们公司的运维人员不知道怎么操作链接:https://bbs.huaweicloud.com/blogs/344107@[TOC]前言:前几天部门的技术经理给我分配了一个任务,叫我一个人去维护之前上古时期的Java Wbe项目,这个项目其实是一个前置机程序,负责消息的加解密、加签验签和消息的转发;这个程序部署于Servlet容器中,用的是Tomcat服务,并且这个Tomcat服务我们公司的运维人员不知道怎么操作,说配置的步骤太多了,之前有一个人配置成功了,但是离职了,写的文档也模糊不清,现在他们都不知道咋配置,1000-9999人的公司,这个运维人员不大行,算了不吐槽了(⊙﹏⊙)!运维人员和笔者说,这个前置机程序是运行在客户那边的,最好是不需配置环境变量等其他操作,做到一键点击即可启动Tomcat服务。这样古老项目的维护难度又提高了亿丢丢。笔者解压缩了之前项目的压缩包后,看了一下,发现启动的步骤是用的Tomcat的startup.bat批处理文件(Windows系统)进行启动的,下面会详细讲。好了,下面进入正文:1.idea自动反编译class文件,在idea中我们也可以查看字节码的源代码首先之前开发的源码已经丢失了,只有编译后的class文件;当我拿到程序编译后的class文件后,用idea打开,idea自带反编译功能,如下是小demo(公司的代码不能向外界提供,所以这里提供了一个小demo):比如我打开JDK中的Integer类,上面说到过用idea打开是自动进行了反编译的结果,如下:那么如何查看反编译前的字节码文件呢,我们在idea中也可以查看,如下操作:(点击View–>Show Bytecode)字节码文件的内容如下:好说到这里,咋们就打住,关于如何查看字节码的内容,这个咋们之后再聊(会写一篇关于这个的博文)。回到主题,刚开始说了,idea自动进行的反编译,还好之前的项目写的代码不多,看了半天代码后,理清思路,然后又花费一天时间,写代码,自测,修改,又自测,终于写好了,自测通过;接下来的任务就是之前运维提到的,去掉项目启动前环境变量配置的过程,优化一系列的操作,做到点击startup.bat批处理文件即可一键启动Tomcat服务。2.如何做到一键点击startup.bat批处理文件启动Tomcat服务2.1startup.bat批处理文件如下是Tomcat的文件目录,关于Tomcat目录的讲解,可以参考笔者之前的博文:https://blog.csdn.net/MrYushiwen/article/details/113383917因为是点击startup.bat批处理文件进行启动的,我第一反应就是用文本编辑器打开startup.bat文件,点击进入bin目录下,bin目录如下,等会讲解红色框中的三个批处理文件:找到startup.bat批处理文件,用文本编辑器打开,具体内容如下(嘿嘿,之前有写过批处理脚本的我还是看得懂的哈,看不懂的小伙伴可以参看下面的章节三,关于批处理文件的讲解零基础快速入门):第一个红色框这条语句是检测CATALINE_HOME的值,如果不为空,就跳转到gotHome标记出执行。可以看到在这个批处理文件中,多次用到了CATALINA_HOME变量,这个变量我们可以在环境变量中进行配置,关于环境变量深入的理解,可以参考笔者这篇博文:https://blog.csdn.net/MrYushiwen/article/details/120509711,因为在批处理文件中用到了这个CATALINE_HOME变量,它可以取自环境变量,也可以用set命令给CATALINE_HOME变量赋值;所以之前我们需要设置如下环境变量才可以运行:第二个红框设置变量EXECUTABLE的值为CATALINE_HOME变量下的bin包下的catalina.bat批处理文件,这个EXECUTABLE在第三步中会用到。第三个红框用call命令进行调用,启动EXECUTABLE环境变量所指向的程序,即catalina.bat。好了,startup.bat批处理文件讲解完了,如果我们不想配置环境变量CATALINE_HOME的值,根据上面提到的我们只需要在startup.bat批处理文件头部加上set CATALINE_HOME=xxx(注意等号后面不允许有空格,本人踩过坑)即可,这样就不会从环境变量值获取该值了,直接在批处理文件中就有定义,如下(笔者的路径就是本项目的Tomcat,即就是解压缩之后的文件所在的路径):2.2catalina.bat批处理文件上面提到过startup.bat批处理文件会用call命令调用catalina.bat批处理文件,我们用文本编辑器打开catalina.bat批处理文件,如下:第一个红色框,可以看到在catalina.bat批处理文件中也同样用到了CATALINE_HOME这个变量,如果我们不想配置环境变量,同样也可以在文件的开始处加上set CATALINE_HOME=xxx即可。第二个红色框,用call命令调用了setclasspath.bat批处理文件。同样我们不想配置环境变量,在文件的开始处加上set CATALINE_HOME=xxx即可,如下:2.3setclasspath.bat批处理文件接下来我们点进setclasspath.bat批处理文件中查看,如下:第一个红框中可以看到setclasspath.bat批处理文件用到了JAVA_HOME和JRE_HOME这两个变量,如果们配置了环境变量,可以从环境变量中取,我们也可以用set命令在文件头部指定(如下图一),我们指定了就不需要配置Java的环境变量了,当然JDK需要放到Tomcat的目录中去(如下图二),虽然文件大了点,但是方便了用户。这样就做到了不需要配置环境变量,通过startup.bat批处理文件一键启动Tomcat服务。<image src=https://img-blog.csdnimg.cn/ffc9fc72cbbf43d88184f302119217a4.png > </image>图一<image src=https://img-blog.csdnimg.cn/224af50a00b14161ae3f0ebc85a17aad.png > </image>图二2.4复盘根据上面的2.1 、2.2、2.3的分析,我们现在总结一下:bin目录下的startup.bat—调用—>catalina.bat—调用—>setclasspath.bat说明:tomcat的startup.bat脚本主要用来判断环境,找到catalina.bat脚本源路径,将启动命令参数传递给catalina.bat执行;setclasspath.bat检查各种变量是否赋值,验证tomcat启动停止需要涉及到的文件,保障tomcat顺利启动停止;catalina.bat脚本使用了大量的判断,使用if作为参数的输入判断,核心的启动命令其实就是java命令。我们在startup.bat、catalina.bat和setclasspath.bat这三个批处理文件中用set操作对需要用到的变量进行赋值,这样就不需要再去配置环境变量了。3.bat批处理文件零基础快速入门我们以Tomcat中的startup.bat为例进行讲解:(其中rem为注释,大部分rem已被笔者删掉),文件内容如下:对上述的脚本一行行的分析(大家耐心看完,绝对会有很大的收获,如果对命令不是很了解的话,可以看下该篇文章进行学习:批处理命令教程;然后在过来看笔者这里写的,妥妥地保姆级别分析源码):@echo off默认情况下,批处理文件将在运行时显示其命令。 这第一个命令的目的是关闭这个显示。 “echo off”命令会关闭整个脚本的显示,除了“echo off”命令本身之外。前面的“@”符号使命令也适用于自己。if "%OS%"=="Windows_NT" setlocal这是个if语句。在命令行中执行help if就可以打印出if语句的使用帮助,大家可以多看下手册。这里这条语句的作用是检查OS环境变量的值是否是Windows_NT,如果条件成立,则执行setlocal。setlocal这是开始批处理文件中环境改动的本地化操作。在执行SETLOCAL之后所做的环境改动只限于批处理文件。要还原原先的设置,必须执行ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个尚未执行的SETLOCAL命令,都会有一个隐含的ENDLOCAL被执行。set CURRENT_DIR = %cd%这条语句是设置变量CURRENT_DIR 的值为当前目录(两个百分号可以取变量的值),比如C:\Users\yushiwenif not "%CATALINE_HOME%"=="" goto gotHome这条语句是检测CATALINE_HOME的值,如果不为空,就跳转到gotHome标记(标签)处执行。(用冒号+字符表示标记,比如第8条的 :gotHome)set CATALINA_HOME=%CURRENT_DIR%把CATALINA_HOME的值设置为CURRENT_DIR变量的值,两个百分号可以取变量的值。if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomecd ..set CATALINA_HOME=%cd%cd %CURRENT_DIR%6、7、8、9一起讲:如果catalina.bat是存在的,就跳转到okHome标记处开始往下继续执行,如果catalina.bat不存在,先cd到当前目录的上级目录,然后设置CATALINA_HOME变量为cd变量所对应的值(注意上一步已经执行了cd …,返回了上级目录,此时的目录是之前目前的上级目录)。:gotHome标记,goto命令用来跳转,上面的第4条语句用到了该标记。if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome判断指定的文件是否存在,存在就跳转到okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho命令用于在命令行中显示echo后面的字符内容echo This .....echo命令用于在命令行中显示echo后面的字符内容goto end和上面的11.if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome一起看,如果if条件不成立,就跳转到end标记处,继续往下执行,其实就是结束了此次批处理命令。:okHome标记,goto命令用来跳转,上面的第11条语句用到了该标记。set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat设置EXECUTABLE变量的值if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomeecho Cannot find ......eco This file ......goto end:okExec17、18、19、20、21一起看:如果catalina.bat还是不存在的话,就在命令行窗口回显两句话,然后跳转到end标记处,继续往下执行,其实就是结束了此次批处理命令。如果catalina.bat存在,就跳转到okExec标记(标签)处,继续往下执行。set CMD_LINE_ARGS=清空CMD_LINE_ARGS变量的值:setArgs标记,goto命令用来跳转,下面的第27条语句用到了该标记,起到了循环的作用。if ""%1""=="""" goto doneSetArgs检查%1是否为空,如果为空就表示没有参数了,设置参数结束,跳转至doneSetArgs标记处;如果不为空就把%1指向的参数追加到CMD_LINE_ARGS这个环境变量中。图A图B图C图Dset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1把%1指向的参数追加到CMD_LINE_ARGS这个环境变量中shiftshift指令是移位参数,使%1指向了下个参数goto setArgs跳转到setArgs,检查%1是否为空,如果不空,继续追加参数。:doneSetArgs标记(标签),goto命令用来跳转,上面的第24条语句用到了该标记,起到了结束循环的作用。call "%EXECUTABLE%" start %CMD_LINE_ARGS%调用EXECUTABLE环境变量所指向的程序,即catalina.bat,其后跟的第一个参数是start,表示启动Tomcat,如果是stop,则停掉Tomcat,第二个参数是把CMD_LINE_ARGS作为参数传递进去;:end标记,可以用goto命令跳转到此处,直接结束此处批处理命令。能坚持到这里,相信大家一定会有所收获,另外,如果觉得笔者写得还八错,期待后续的博文可以点波关注哈!知我所能,我所能者,尽善尽美; 知我所不能,我所不能者,虚怀若谷!我是喜欢分享知识、喜欢写博客的YuShiwen,与大家一起学习,共同成长!咋们下篇博文见。
-
# 【HCS Servciestage】如何通过servicestage部署基于Nginx的前端应用 ## 背景 HCS ServiceStage部署前端应用组件时,希望通过nginx代理来访问部署的前端应用。 ## 问题 如何通过Servicestage部署基于Nginx的前端应用?
-
1.1 Tomcat简介Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。1.2 物理机调优方法1.2.1 Tomcat参数调优目的:通过修改tomcat的配置文件,可以有效提高tomcat性能方法:按照如下所示信息,配置/home/apache-tomcat-9.0.20/conf/server.xml的各个参数。<Connector executor="tomcatThreadPool" port="10000" protocol="HTTP/1.1" acceptCount="10000" maxConnections="10000" connectionTimeout="20000" compression="off" compressionMinSize="2048" URIEncoding="utf-8" tcpNoDelay="true" enableLookups="false" useURIValidationHack="false" disableUploadTimeout="false" connectionUploadTimeout="150000" keepAliveTimeout="12000" maxKeepAliveRequests="1000"redirectPort="8443" /> 1.2.2 Tomcat 亲和性设置Tomcat支持cpu绑核,利用cpu亲和性设置,可以使用taskset或numctl工具进行绑核操作方法:taskset -c N ./startup.sh或numactl -C N ./startup.shN表示要指定核的序号,例如 将tomcat进程绑定到0-3core上:taskset -c 0-3 ./startup.sh1.2.3 容器场景调优方法容器与物理机共享网口,在物理机上执行绑核脚本。以4core的http短连接场景的绑核脚本为例,脚本内容如下,如果要修改绑核脚本,只需修改要绑定的网口名eth1,以及要绑定的core,然后在关闭irqbalance.service的情况下使用脚本即可:#!/bin/bashcnt=2eth1=enp3s0ethtool -L $eth1 combined $cntirq1=`cat /proc/interrupts| grep -E ${eth1} | head -1 | awk -F ':' '{print $1}'`irq1=`echo $irq1`i=0while(( $i < 1))do for cpunum in 2 3 do echo $cpunum "->" $irq1 echo $cpunum > /proc/irq/$irq1/smp_affinity_list let "irq1++" done let "i++"done脚本中参数及命令说明参数及命令名称参数及命令解释cnt 网口队列数eth1使用的网口名irq1网口eth1对应的中断号cpunum分配给网口eth1用于处理网卡中断的核ethtool -L $eth1 combined $cnt设置网口队列长度为核数cat /proc/interrupts | grep $eth1 | awk -F ':' '{print $1}'查询网口中断数echo $cpunum > /proc/irq/$irq/smp_affinity_list根据中断号,将每个中断各绑定在一个核上此脚本只是容器场景下网卡调优方法1.3 虚拟机调优方法虚拟机采用网卡直通的模式,每个虚拟机配置一个虚拟网口,在虚拟机内部执行绑核脚本。以4core的http短连接场景的绑核脚本为例,脚本内容如下,若要修改绑核脚本,只需修改要绑定的网口eth1,以及要绑定的core,在关闭irqbalance.service的情况下使用脚本即可。#!/bin/bashcnt=2eth1=enp5s0ethtool -L $eth1 combined $cntirq1=`cat /proc/interrupts| grep -E ${eth1} | head -1 | awk -F ':' '{print $1}'`irq1=`echo $irq1`i=0while(( $i < 2))do for cpunum in 3 do echo $cpunum "->" $irq1 echo $cpunum > /proc/irq/$irq1/smp_affinity_list let "irq1++" done let "i++"done脚本中参数名称及解释参数名称参数解释cnt网口队列数eth1实际使用的网口名irq1网口eth1对应的中断号cpunum分配给网口eth1用于处理网卡中断的核此脚本只是虚拟机场景下的网卡调优,虚拟机场景下的亲和性设置与物理机一致.
chuangzhijian@汪汪队
发表于2021-11-26 14:38:31
2021-11-26 14:38:31
最后回复
JammySate
2021-11-26 14:41:58
1902 1 -
【功能模块】华为云连接【操作步骤&问题现象】1、在本地使用tomcat搭建了服务器,开发的鸿蒙app无法与tomcat连接。连接使用的是模拟机。2、如果使用安卓的模拟机,其默认的外部地址是10.0.2.2,所以连接地址就是http://10.0.2.2:8080/..../....,但在鸿蒙的模拟器上地址就不对了。10.0.0.2和127.0.0.1都试过了,无法连接。请教一下,哪位知道地址是什么或者应该如何连接吗?【代码】连接部分代码如下:new Thread(new Runnable() { @Override public void run() { try { URL url = new URL(path); HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection(); httpURLConnection.setRequestMethod("GET"); httpURLConnection.setConnectTimeout(5000); int responseCode = httpURLConnection.getResponseCode(); if (200 == responseCode) { InputStream inputStream = httpURLConnection.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); responseMsg = bufferedReader.readLine(); if(responseMsg==null){ message = "空的"; } HiLog.warn(LABEL,"connect successfully","info"); } else { System.out.println("responseCode = " + responseCode); //连接服务器出错,错误代码为:responseCode 根据代码值告诉用户出错的原因 //.... } } catch (Exception e) { e.printStackTrace(); } }}).start();【其他信息】(可选,上传日志内容或者附件)相关网络权限已经开启。这段代码在安卓上是可以运行的,可以连接到本地的服务器。
-
通过服务构建器申请安装一个WordPress服务# 1. 软件介绍 **Tomcat** 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 # 2.任务目标 此任务是利用服务构建器的资源编排功能,一键式自动化实现虚拟机的创建以及`Tomcat`服务的安装,并通过`EIP`可以直接访问**Tomcat**首页。 # 3.任务准备 1. 我们选用`Tomcat9.0`版本,由于环境与`Tomcat`官网的网络不通,所以我们可以先手动讲软件包放置到`软件仓库`,虚拟机与软件仓库的网络互通,可以直接从软件仓库下载软件。 2. 由于`Tomcat`的运行依赖`JDK`,所以我们也需要准备`JDK`的安装包,我们这里选用`JDK1.8`版本。 3. 软件包准备如下图所示,都已经提前上传到**软件仓库**。  ## 4.执行步骤 ### 1. 编写Tomcat安装脚本 由于我们是通过在申请完虚拟机后,通过执行脚本来安装`Tomcat`的,所以我们需要提前编写好`Tomcat`的安装脚本。 **步骤:** 1. 登录`ManageOne`的租户面,依次点击 **资源->脚本资源->创建脚本**。 来到创建脚本界面:  2. 创建脚本 我们的脚本是在`linux`操作系统下的`shell`脚本,所以这里系统类型选择`Linux`,脚本类型选择`Shell`,脚本名称和分类可以自定义。 我们编写脚本内容: ```shell #!/bin/bash -v JDK_SOURCE_URL=jdk_source_url TOMCAT_SOURCE_URL=tomcat_source_url LOCAL_TEMP=/opt/tmp JDK_INSTALL_PATH=/usr/local/java TOMCAT_INSTALL_PATH=/opt/tomcat LOG_PATH=/var/log/tomcat_install.log echo "Start to execute tomcat install script. " >>${LOG_PATH} firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload [ ! -d ${LOCAL_TEMP} ] && mkdir -p ${LOCAL_TEMP} cd ${LOCAL_TEMP} JDK_PACKAGE_NAME=${JDK_SOURCE_URL##*/} wget -qc ${JDK_SOURCE_URL} -O ${JDK_PACKAGE_NAME} echo "Download jdk package success. JDK_PACKAGE_NAME=${JDK_PACKAGE_NAME} " >>${LOG_PATH} [ ! -d ${JDK_INSTALL_PATH} ] && mkdir -p ${JDK_INSTALL_PATH} tar -zxvf ${JDK_PACKAGE_NAME} -C ${JDK_INSTALL_PATH} rm ${JDK_PACKAGE_NAME} JDK_ROOT_FOLDER=$(echo ${JDK_PACKAGE_NAME} | awk -F- '{print $2}' | awk -Fu '{print "jdk1."$1".0_"$2}') cp /etc/profile /etc/profile.$(date +%Y%m%d%H%M%S)bak cat >/etc/profile export JAVA_HOME=${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER} export JRE_HOME=${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/jre export CLASSPATH=.:${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/lib:${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/jre/lib:$CLASSPATH export PATH=${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/bin:${JDK_INSTALL_PATH}/${JDK_ROOT_FOLDER}/jre/bin:$PATH EOF source /etc/profile echo "Export environment variable success. JAVA_HOME=${JAVA_HOME}" >>${LOG_PATH} TOMCAT_PACKAGE_NAME=${TOMCAT_SOURCE_URL##*/} wget -qc ${TOMCAT_SOURCE_URL} -O ${TOMCAT_PACKAGE_NAME} echo "Download tomcat package success. TOMCAT_PACKAGE_NAME=${TOMCAT_PACKAGE_NAME} " >>${LOG_PATH} [ ! -d ${TOMCAT_INSTALL_PATH} ] && mkdir -p ${TOMCAT_INSTALL_PATH} tar -zxvf ${TOMCAT_PACKAGE_NAME} -C ${TOMCAT_INSTALL_PATH} rm ${TOMCAT_PACKAGE_NAME} TOMCAT_ROOT_FOLDER=${TOMCAT_PACKAGE_NAME%.tar.gz} cd ${TOMCAT_INSTALL_PATH}/$TOMCAT_ROOT_FOLDER/bin chmod +x *.sh ./startup.sh echo "Start tomcat success. " >>${LOG_PATH} ``` 3. 参数设置 脚本可以设置参数,这里假设我们只需要用户传入`JDK`和`Tomcat`的下载地址即可,其他参数我们就在脚本中指定了。如果脚本内容中某一个变量是参数,需要在执行时用户传入,我们就需要给脚本设置参数。 点击创建脚本页面的 **参数配置** 就可以给脚本设置参数了:  我们给脚本设置两个参数,参数名称一定要和脚本内容中定义的名称一致。如我们脚本内容中的参数分别叫`jdk_source_url`和`tomcat_source_url`,所以我们定义的参数也必须一致,如下所示:   4. 保存脚本 我们脚本信息填写完成后,点击 **确定** 就可以保存脚本了。 ### 2.绘制服务模板 创建好脚本后,我们就可以创建服务模板了。 1. 登录`ManageOne`的租户面,依次点击 **系统 -> 服务构建->服务模板** 来到服务模板管理界面后,点击左上角的 **创建按钮**,选择 **资源编排图形化设计器** ,带到服务模板绘制界面。 2. 绘制模板 `Tomcat`是一个`Web`服务器,需要对外提供服务,所以我们需要一个**弹性IP**资源,用来暴露外界访问地址,其次我们需要一台**ECS**资源,并且要在`ECS`执行我们的`Tomcat`安装脚本,所以需要一个**脚本配置绑定**资源,其次拖入我们刚刚创建的**Tomcat安装脚本**资源。 最终我们的模板绘制如下:  * 输入参数: 输入参数主要包括虚拟机的基本参数以及脚本需要的基本参数。 * 输出参数: 我们安装好后的`Tomcat`需要暴露`Tomcat首页地址`,Tomcat首页地址格式:`http://弹性IP:8080`. 这里我们把虚拟机的弹性IP和私有IP也暴露出来,方便其他需求使用。  --- 绘制好模板后,点击**保存服务模板**,然后填写模板的一些基本信息后,点击**确定**即可保存模板成功。 ### 3.创建服务 创建好服务模板后,我们服务模板列表页面找到刚刚创建的模板,点击**创建服务**,来到创建服务界面:   在创建服务界面可以配置很多参数: 1. 服务的基本信息:包括服务的名称、描述、版本、分类等信息。 2. 位置信息:我们可以选择服务创建的`region`以及资源集信息。 3. 使用策略:可以配置服务发布后的可见范围,可以选择全部可见(当前VDC及下级VDC可见),或者部分可见,选择发布到的VDC信息。 4. 其他参数:剩下的参数就是我们服务模板的参数,这些参数我们可以在创建服务时锁定,如我们想控制虚拟机镜像,那我们可以在创建服务时锁定,并且对用户隐藏,这样以后申请时,用户就看不到镜像的参数,所有虚拟机镜像保持一致。这里我们所有的参数都选择用户自定义,由用户在申请时指定。 参数填写完成后,点击 **立即创建** 创建我们的服务。 --- ### 4.申请服务 服务创建完成后,就可以立即在左上角导航栏看到。  我们点击我们刚刚创建的服务,来到服务申请页面,填写对应的参数:  参数填写完成后,点击立即申请,申请服务是异步的,需要几分钟的时间,我们耐心等待一会,喝口水,就可以看到服务申请完成了。  --- ### 5. 服务测试 当我们的服务申请完成后,我们点击**申请到的服务名称**,进入详情界面,可以看到我们之前定义的输出参数:  点击`Tomcat欢迎页`,可以正确跳转到`Tomcat`的欢迎页。  --- ## 5. 总结 服务构建器提供了非常丰富的资源编排功能,用户通过编排,可以实现各种场景的软件安装、集群配置、资源组合等功能,欢迎体验。
-
架构信息和系统  安装mysql及tomcat运行所需依赖 [root@a1 ~]# yum install -y java-1.8.0-openjdk mysql [root@a1 mysql]# mkdir -p /data/mysql/data/ mysql初始化 [root@a1 mysql]# /usr/local/mysql/bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql 注意此时密码已经生成,用此密码登录 [root@a1 mysql]# systemctl start mysql  安装tomcat [root@a1 local]# wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.21/bin/apache-tomcat-8.0.21.tar.gz  [root@a1 local]# tar zxvf apache-tomcat-8.0.21.tar.gz [root@a1 local]# wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.21.tar.gz [root@a1 local]# tar zxvf mysql-connector-java-8.0.21.tar.gz 安装mysql-connect [root@a1 local]# cp mysql-connector-java-8.0.21/mysql-connector-java-8.0.21.jar apache-tomcat-8.0.21/lib/  编写连接mysql文件 [root@a1 local]# cd apache-tomcat-8.0.21/webapps/ [root@a1 webapps]# mkdir test [root@a1 webapps]# vim test/mysql.jsp  [root@a1 apache-tomcat-8.0.21]# cat webapps/test/mysql.jsp  测试连接  自此tomcat连接mysql成功 ps 报错无关连接问题,更改mysql初始password后正常 
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签