CentOS手动部署Tomcat完整教程:JDK配置、systemd托管与SELinux加固

发布时间:2026/10/17 19:15:13
CentOS手动部署Tomcat完整教程:JDK配置、systemd托管与SELinux加固 1. 项目概述为什么在 CentOS 上装 Tomcat 还得“完整版”CentOS 安装 tomcat 环境安装及配置过程完整版——这个标题看着平平无奇但背后藏着太多新手踩坑、老手翻车的真实现场。我带过不少刚从学校出来的开发实习生也帮某高校实验室部署过十几台教学服务器几乎每次遇到“Tomcat 启不起来”“页面打不开”“端口被占”“日志全是乱码”最后追根溯源90% 都卡在安装和配置的前 30 分钟JDK 版本没对齐、SELinux 没关、防火墙规则漏了一条、catalina.sh 权限没加、甚至解压包里多了一层目录都没注意。这不是操作有多难而是整个流程像拼乐高——少一颗螺丝塔就歪错一个顺序整套服务就静默失败。所谓“完整版”不是堆砌命令而是把从裸机到可访问http://ip:8080的每一步都拉出来晒太阳哪些步骤必须做、哪些可以跳过、哪些看似可选实则埋雷。比如你用yum install tomcat装出来的是 CentOS 自带的精简版连 JSP 编译器都不全而官网下载的 tar.gz 包又得自己配用户、设权限、写 service 文件——这两条路一条省事但功能残缺一条自由但容错率低。我们今天走的是第三条手动解压 独立 JDK systemd 托管 日志分级 中文路径兼容全程不依赖系统仓库所有路径、用户、端口、编码全部显式声明确保你在任何一台干净的 CentOS 7/8注意CentOS Stream 不在此列上复制粘贴就能跑通且后续运维不懵圈。关键词里没提 JDK但它就是隐形主角。Tomcat 本身不带 Java它只是个容器真正干活的是 JVM。我试过用 OpenJDK 11 跑 Tomcat 9结果某个老项目里的javax.xml.bind报NoClassDefFoundError——因为 Java 11 默认删了 JAXB 模块也见过用 Oracle JDK 8u202 装完catalina.sh一执行就提示Unsupported major.minor version 52.0查半天发现是脚本里硬编码了/usr/java/default/bin/java而实际 JDK 装在/opt/jdk1.8.0_301。所以“完整”首先是环境链路的完整JDK → Tomcat → OS 服务 → 网络策略 → 字符集五环相扣断一不可。适合谁看三类人第一类是正在准备 Linux 运维考试的考生需要知道systemctl enable和chkconfig的本质区别第二类是 Java 开发者想本地搭个轻量测试环境又不想被 Docker 或 IDE 内置 Tomcat 绑架第三类是中小公司运维手头只有几台物理服务器要快速上线一个管理后台不能等 DevOps 团队排期。这篇文章不讲 Docker Compose 怎么编排也不聊 Kubernetes 里怎么挂卷就聚焦在最原始、最可控、最贴近生产逻辑的手动部署上——因为很多真实场景里你连curl都得先yum install -y curl才能用。2. 整体设计思路与方案选型解析2.1 为什么放弃 yum 安装坚持手动解压CentOS 系统仓库里的tomcat包表面看是一键安装实则暗藏三重限制版本锁定严重CentOS 7 默认提供的是 Tomcat 7EOL 已多年CentOS 8 仓库里是 Tomcat 9但补丁滞后。去年某次安全扫描发现系统仓库版 Tomcat 9.0.37 存在 CVE-2020-9484反序列化漏洞而官方早在 9.0.39 就修复了。你yum update也升不到因为仓库没同步。手动下载官网二进制包版本、补丁、发布时间线完全自主可控。目录结构被“标准化”破坏yum install tomcat会把文件散落到/usr/share/tomcat/核心代码、/etc/tomcat/配置、/var/log/tomcat/日志、/var/cache/tomcat/工作目录。这看似规范但导致两个问题一是CATALINA_HOME和CATALINA_BASE强制分离新手根本分不清哪个该改二是/etc/tomcat/下的server.xml被 RPM 包管理器标记为配置文件yum update时会提示冲突不敢随便覆盖。依赖绑架yum install tomcat会顺手装tomcat-admin-webapps、tomcat-webapps、tomcat-el-3.0-api等一堆子包。其中tomcat-admin-webapps默认开启 manager 页面但它的manager-gui角色需要明文写在/etc/tomcat/tomcat-users.xml里——而这个文件在仓库版中是空的你得自己填稍有不慎就暴露管理后台。手动解压则一切从零开始你要什么加什么不要的绝不沾边。我最终选择Apache 官网发布的 core 版本 tar.gz 包如apache-tomcat-10.1.24.tar.gz原因很实在它只包含运行必需的bin/、conf/、lib/、webapps/、work/、temp/、logs/目录没有 admin、host-manager 等可选组件解压后目录结构干净$CATALINA_HOME就是解压根目录$CATALINA_BASE默认与之相同概念统一所有配置文件都在conf/下修改即生效无 RPM 标签干扰官网包自带startup.sh和shutdown.sh启动逻辑透明便于调试。提示别下zip或exe包那是给 Windows 准备的也别下src包那是源码要自己编译——我们只要开箱即用的二进制发行版。2.2 JDK 选型OpenJDK 还是 Oracle JDK版本怎么定Tomcat 官方文档明确写了支持的 Java 版本范围。以 Tomcat 10.1.x 为例它要求Java 11 或更高版本JDK 11且不支持 Java 17 的预览特性如--enable-preview。这就排除了 JDK 8太老、JDK 17部分新特性未适配、JDK 21LTS 但 Tomcat 10.1 尚未全面验证。稳妥起见我们选OpenJDK 11.0.222024 年 1 月发布的最新 LTS 补丁版。为什么是 OpenJDK 而非 Oracle JDK三点现实考量授权合规Oracle JDK 自 2019 年起对商业用途收费而 OpenJDK 是完全开源免费的由 Red Hat、Adoptium 等社区维护CentOS 原生支持生态匹配CentOS 8 默认的java -version就是 OpenJDKyum install java-11-openjdk-devel装的就是它路径、符号链接、环境变量风格高度一致长期维护Adoptium原 AdoptOpenJDK提供的 Temurin JDK 11每月发布安全更新比某些厂商的定制版更及时。安装方式也拒绝yum install java-11-openjdk-devel原因在于yum装的 JDK 默认在/usr/lib/jvm/java-11-openjdk-11.0.22.0.7-1.el8_9.x86_64/路径带版本号和构建号一升级就变脚本里写死会崩它会创建/usr/lib/jvm/jre-11-openjdk-11.0.22.0.7-1.el8_9.x86_64/这样的软链接但JAVA_HOME应该指向 JDK 根目录含bin/javac而非 JRE更关键的是yum装的 JDK 可能缺少javac开发工具而 Tomcat 启动时虽不需编译但如果你后续要部署 JSPjspc编译器就得靠它。所以我们采用手动解压 OpenJDK 11 二进制包并建立稳定软链接# 下载地址https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz tar -zxf OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz -C /opt/ ln -sf /opt/jdk-11.0.227 /opt/java11这样JAVA_HOME/opt/java11永远有效升级时只需换链接目标不用改任何配置。2.3 服务管理systemd 还是 init.d为什么必须写 .service 文件CentOS 7 全面转向 systemdservice tomcat start这种 init.d 语法虽能兼容但本质是调用/etc/rc.d/init.d/tomcat脚本而这个脚本在手动安装场景下根本不存在。很多人图省事直接./startup.sh启动结果 SSH 断开后进程就挂了——因为没托管给系统服务管理器。systemd 的优势不是“新潮”而是解决三个刚需进程守护Restartalways让 Tomcat 崩溃后自动拉起比nohup ./startup.sh 可靠十倍依赖声明Afternetwork.target确保网络就绪再启动避免bind failed: Cannot assign requested address日志归集journalctl -u tomcat直接查 Tomcat 日志不用翻catalina.out还能按时间过滤、实时跟踪。但直接systemctl enable tomcat会报错因为没.service文件。我们必须手写一个且不能照搬网上流传的“通用模板”。常见错误模板里写ExecStart/opt/tomcat/bin/startup.sh这是大忌——startup.sh本质是nohup catalina.sh start它 fork 出子进程后父进程就退出了systemd 以为服务启动失败立刻杀掉子进程。正确做法是ExecStart/opt/tomcat/bin/catalina.sh runrun模式让 catalina.sh 前台阻塞运行systemd 才能正确追踪主进程。另外.service文件里必须显式声明EnvironmentJAVA_HOME/opt/java11和EnvironmentCATALINA_HOME/opt/tomcat。很多人以为在/etc/profile里设了全局变量systemd 就能读到其实不然——systemd 的每个 unit 都有独立环境不继承 shell 的env。漏写这一句catalina.sh启动时找不到java日志里只会写Neither the JAVA_HOME nor the JRE_HOME environment variable is defined让你怀疑人生。2.4 安全加固SELinux 和防火墙关还是不关这是新手最容易“自废武功”的地方。网上教程动辄一句“先setenforce 0关 SELinux”看似解决问题实则埋下生产隐患。SELinux 不是摆设它是 Linux 内核级强制访问控制MAC能阻止 Tomcat 进程读取/var/www/html、写入/tmp、绑定非标准端口。真关了等于拆掉防盗门只留一把挂锁。正确姿势是保留 enforcing 模式仅放行必要策略Tomcat 默认监听 8080SELinux 允许http_port_t类型端口无需额外操作但如果你改成 8081就得semanage port -a -t http_port_t -p tcp 8081如果 Tomcat 需要读取 Web 应用外的配置文件如/etc/myapp/config.properties就得semanage fcontext -a -t tomcat_exec_t /etc/myapp(/.*)?再restorecon -Rv /etc/myapp最常用的是允许 Tomcat 写日志semanage fcontext -a -t tomcat_log_t /opt/tomcat/logs(/.*)?否则catalina.out会 Permission Denied。防火墙同理。firewall-cmd --permanent --add-port8080/tcp是必须的但别--add-servicehttp——那会开 80 端口和 Tomcat 无关。更别firewall-cmd --set-default-zonetrusted这等于把整个防火墙设成摆设。注意semanage命令在policycoreutils-python-utils包里CentOS 8 默认没装得先yum install -y policycoreutils-python-utils。这是很多人semanage: command not found的根源。3. 核心细节解析与实操要点3.1 JDK 安装与环境变量配置为什么 export 要写在 /etc/profile.d/ 而非 /etc/profileJDK 安装看似简单但环境变量配置是后续所有步骤的基础。export JAVA_HOME/opt/java11这一行写在哪决定 Tomcat 能不能找到 Java。很多人习惯改/etc/profile但这有两大隐患/etc/profile是登录 shell 的初始化脚本只在用户登录时执行一次。systemd 服务启动时不走 login shell 流程JAVA_HOME对它无效多个软件如 Maven、Gradle都需要JAVA_HOME如果全堆在/etc/profile里一旦出错整个系统登录都可能卡住。最佳实践是新建/etc/profile.d/java11.sh# /etc/profile.d/java11.sh export JAVA_HOME/opt/java11 export PATH$JAVA_HOME/bin:$PATH # 验证echo $JAVA_HOME java -version为什么因为/etc/profile.d/下的所有.sh文件会在/etc/profile末尾被for循环source且 systemd 在启动服务前会通过systemctl show-environment加载这些变量。更重要的是它模块化——Maven 可以有自己的maven.shPython 有自己的python3.sh互不干扰。验证是否生效不能只echo $JAVA_HOME因为那是当前 shell 的变量。要模拟 systemd 环境# 临时进入 systemd 环境 systemd-run --scope -- bash -c echo $JAVA_HOME java -version # 输出应为 /opt/java11 和 openjdk 11.0.22另一个细节PATH里JAVA_HOME/bin必须放在最前面。否则如果系统里还装了 OpenJDK 8比如which java返回/usr/bin/javajava -version就会调用旧版本。/usr/bin/java其实是/etc/alternatives/java的软链接而 alternatives 系统优先级低于PATH显式声明。3.2 Tomcat 解压与目录规划为什么不能直接解压到 /opt/tomcat/官网下载的apache-tomcat-10.1.24.tar.gz解压命令通常是tar -zxf ... -C /opt/。但这里有个致命陷阱默认解压出来是apache-tomcat-10.1.24/这个带版本号的目录。如果直接ln -sf /opt/apache-tomcat-10.1.24 /opt/tomcat看似解决了路径问题但catalina.sh里有一行CATALINA_HOME$(dirname $PRG)/..它通过脚本位置反推CATALINA_HOME。当你cd /opt/tomcat/bin ./catalina.sh run$PRG是./catalina.shdirname返回...就是/opt/tomcat没问题但如果你cd /root /opt/tomcat/bin/catalina.sh run$PRG就是/opt/tomcat/bin/catalina.shdirname返回/opt/tomcat/bin..就是/opt/tomcat依然 OK。真正的问题在升级场景下次要升到 10.1.25你得rm -rf /opt/apache-tomcat-10.1.24再解压新包再改软链接。但万一某个应用正运行着你rm -rf时没停服务catalina.sh还在读老目录下的conf/server.xml而新目录还没建好就彻底乱套。所以我的做法是解压时不指定-C /opt/而是先解压到临时目录再mv到无版本号目录# 1. 创建临时目录 mkdir /tmp/tomcat-install # 2. 解压到临时目录 tar -zxf apache-tomcat-10.1.24.tar.gz -C /tmp/tomcat-install # 3. mv 到目标目录原子操作 mv /tmp/tomcat-install/apache-tomcat-10.1.24 /opt/tomcat # 4. 清理临时目录 rm -rf /tmp/tomcat-install这样/opt/tomcat就是真实目录不是软链接。升级时新包解压到/opt/tomcat-new停服务mv /opt/tomcat /opt/tomcat-old mv /opt/tomcat-new /opt/tomcat两秒切换零风险。目录权限也必须严格Tomcat 进程不应以 root 运行所以创建专用用户tomcatuseradd -r -u 8080 -d /opt/tomcat -s /sbin/nologin tomcatchown -R tomcat:tomcat /opt/tomcat但conf/目录要额外chmod 750防止其他用户读取server.xml里的密码logs/和work/目录必须可写chown tomcat:tomcat /opt/tomcat/logs /opt/tomcat/workwebapps/目录如果要支持热部署如cp myapp.war /opt/tomcat/webapps/自动解压就得保证tomcat用户对其有写权限chmod 755 /opt/tomcat/webapps。3.3 catalina.sh 权限与编码设置为什么 chmod x 后还要改 LANGcatalina.sh默认没有执行权限./catalina.sh会报Permission denied。这是常识chmod x bin/catalina.sh即可。但很多人忽略了一个隐藏问题中文路径或中文日志乱码。Tomcat 启动时catalina.sh会调用java命令而 Java 的默认字符集取决于系统 locale。CentOS 默认 locale 是LANGen_US.UTF-8但如果你的server.xml里Connector配置了URIEncodingUTF-8而系统 locale 是zh_CN.UTF-8某些老版本 Tomcat 会因 locale 解析异常导致启动失败。更常见的是日志乱码catalina.out里出现?????。这是因为catalina.sh启动 JVM 时没显式指定-Dfile.encodingUTF-8。解决方案是在bin/setenv.sh里添加# /opt/tomcat/bin/setenv.sh export JAVA_OPTS-Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8 # 如果要用 G1 垃圾回收器加-XX:UseG1GC # 如果内存紧张加-Xms512m -Xmx1024m注意setenv.sh默认不存在要手动创建且必须放在bin/目录下catalina.sh会自动 source 它。JAVA_OPTS是 Tomcat 启动时传给 JVM 的参数比在catalina.sh里硬编码更优雅。另一个细节setenv.sh本身也要chmod x虽然它不直接执行但catalina.sh用source加载对权限无要求不过为统一风格还是加上。3.4 server.xml 配置精要Connector、Engine、Host 三层结构怎么理解conf/server.xml是 Tomcat 的心脏但新手常把它当黑盒。其实它就是一个 XML 描述的容器嵌套结构Server顶层服务→Service服务单元→Connector连接器Engine引擎→Host虚拟主机→ContextWeb 应用上下文。我们只改最关键的三处1. Connector 端口与编码Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /port8080监听端口生产环境建议改 8080 以外的端口如 8081避免与测试环境冲突URIEncodingUTF-8必须加否则 URL 里的中文参数如/search?q测试会变成乱码connectionTimeout2000020 秒无响应断开防慢连接攻击redirectPort8443HTTP 请求重定向到 HTTPS 的端口如果不用 HTTPS可删或注释。2. Engine 的 defaultHostEngine nameCatalina defaultHostlocalhostdefaultHost指定默认虚拟主机当请求 Host 头不匹配任何Host时路由到这里。localhost是默认值但生产环境建议改成你的域名如myapp.example.com并在Host里定义它。3. Host 的 appBase 与 autoDeployHost namelocalhost appBasewebapps unpackWARstrue autoDeploytrueappBasewebappsWeb 应用根目录默认是$CATALINA_HOME/webappsautoDeploytrue启用热部署webapps/下放 WAR 包自动解压unpackWARstrue自动解压 WAR 包如果设为 false则直接以 WAR 形式运行节省磁盘但调试困难。提示autoDeploytrue有安全风险——如果黑客能往webapps/写文件就能上传恶意 WAR。生产环境务必设为false用manager页面或脚本部署。4. 实操过程与核心环节实现4.1 全流程命令实录从零开始每一步都带解释以下是在一台全新安装的 CentOS 8.5Minimal Install上的完整操作记录已脱敏可直接复制执行。为防误操作所有rm、mv命令前加echo演示实际使用时删掉echo。# 步骤 1更新系统并安装基础工具 yum update -y yum install -y wget tar gzip vim-enhanced net-tools policycoreutils-python-utils # 步骤 2下载并安装 OpenJDK 11 cd /tmp wget https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz tar -zxf OpenJDK11U-jdk_x64_linux_hotspot_11.0.22_7.tar.gz -C /opt/ ln -sf /opt/jdk-11.0.227 /opt/java11 # 步骤 3配置 JDK 环境变量 echo export JAVA_HOME/opt/java11 /etc/profile.d/java11.sh echo export PATH$JAVA_HOME/bin:$PATH /etc/profile.d/java11.sh source /etc/profile.d/java11.sh # 验证 JDK java -version # 应输出 openjdk 11.0.22 echo $JAVA_HOME # 应输出 /opt/java11 # 步骤 4创建 tomcat 用户 useradd -r -u 8080 -d /opt/tomcat -s /sbin/nologin tomcat # 步骤 5下载并解压 Tomcat wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.24/bin/apache-tomcat-10.1.24.tar.gz mkdir /tmp/tomcat-install tar -zxf apache-tomcat-10.1.24.tar.gz -C /tmp/tomcat-install mv /tmp/tomcat-install/apache-tomcat-10.1.24 /opt/tomcat rm -rf /tmp/tomcat-install # 步骤 6设置目录权限 chown -R tomcat:tomcat /opt/tomcat chmod 750 /opt/tomcat/conf chown tomcat:tomcat /opt/tomcat/logs /opt/tomcat/work # 步骤 7配置 catalina.sh 执行权限和编码 chmod x /opt/tomcat/bin/*.sh echo export JAVA_OPTS-Dfile.encodingUTF-8 -Dsun.jnu.encodingUTF-8 /opt/tomcat/bin/setenv.sh chmod x /opt/tomcat/bin/setenv.sh # 步骤 8修改 server.xml备份原文件 cp /opt/tomcat/conf/server.xml /opt/tomcat/conf/server.xml.bak sed -i s/port8080/port8081/g /opt/tomcat/conf/server.xml sed -i /Connector/a \ \ \ \ URIEncodingUTF-8 /opt/tomcat/conf/server.xml # 步骤 9创建 systemd service 文件 cat /etc/systemd/system/tomcat.service EOF [Unit] DescriptionApache Tomcat Web Application Container Afternetwork.target [Service] Typeforking EnvironmentJAVA_HOME/opt/java11 EnvironmentCATALINA_HOME/opt/tomcat EnvironmentCATALINA_BASE/opt/tomcat EnvironmentCATALINA_PID/opt/tomcat/temp/tomcat.pid ExecStart/opt/tomcat/bin/catalina.sh start ExecStop/opt/tomcat/bin/catalina.sh stop Usertomcat Grouptomcat Restartalways RestartSec10 UMask0007 MemoryLimit1G [Install] WantedBymulti-user.target EOF # 步骤 10重载 systemd 配置并启动 systemctl daemon-reload systemctl enable tomcat systemctl start tomcat # 步骤 11配置 SELinux 和防火墙 semanage fcontext -a -t tomcat_log_t /opt/tomcat/logs(/.*)? restorecon -Rv /opt/tomcat/logs firewall-cmd --permanent --add-port8081/tcp firewall-cmd --reload # 步骤 12验证服务状态 systemctl status tomcat # 应显示 active (running) ss -tuln | grep :8081 # 应看到 LISTEN curl -I http://localhost:8081 # 应返回 HTTP/1.1 200 OK关键点说明Typeforking因为catalina.sh start会 fork 子进程systemd 需识别这种模式EnvironmentCATALINA_PID...指定 pid 文件路径catalina.sh stop会读它来 kill 进程UMask0007设置文件创建掩码确保 tomcat 创建的文件默认权限是 660组可读写而非 644MemoryLimit1G限制 Tomcat 进程最大内存防 OOM 拖垮整机。4.2 service 文件深度解析每一行参数的实战意义/etc/systemd/system/tomcat.service不是模板是经过 20 次线上故障复盘后的精准配置。逐行解读其设计逻辑[Unit]段Afternetwork.target确保网络就绪。曾有客户反馈 Tomcat 启动时报java.net.UnknownHostException查发现是网卡还没 upsystemd 就急着启动服务Wantsnetwork.target可省略因为After已隐含依赖不加BindsTo因为 Tomcat 不依赖其他服务只是需要网络。[Service]段Typeforking这是核心。catalina.sh start本质是nohup catalina.sh start /dev/null 21 它 fork 出子进程后父进程退出。systemd 必须用 forking 模式才能正确追踪子进程 PIDEnvironment...显式声明所有环境变量。CATALINA_BASE设为/opt/tomcat表示配置、日志、工作目录都在此ExecStart/opt/tomcat/bin/catalina.sh start调用 start 而非 run因为 start 会后台运行符合 forking 模式ExecStop/opt/tomcat/bin/catalina.sh stopstop 命令会读CATALINA_PID文件发送 SIGTERMUsertomcat Grouptomcat强制以非 root 用户运行最小权限原则Restartalways RestartSec10崩溃后 10 秒重启避免无限重启可用StartLimitIntervalSec60 StartLimitBurst3限流UMask0007umask 0007表示创建文件时移除组和其他用户的写权限即 666 → 660目录则是 777 → 770MemoryLimit1Gcgroup v2 限制CentOS 8 默认启用。设为 1G 是经验值——Tomcat 自身约 100MB留 900MB 给应用OOMScoreAdjust-500降低 OOM killer 优先级避免内存不足时被优先干掉可选。[Install]段WantedBymulti-user.target表示开机自启对应传统 runlevel 3不用graphical.target因为 Tomcat 是后台服务无需 GUI。4.3 防火墙与 SELinux 策略实操如何用 semanage 精准放行防火墙配置很简单firewall-cmd --permanent --add-port8081/tcp # 永久开放 8081 firewall-cmd --reload # 重载规则 firewall-cmd --list-ports # 验证8081/tcp但 SELinux 策略容易出错。semanage不是直接改配置而是向 SELinux 策略数据库写入规则。常用操作查看当前端口类型semanage port -l | grep http # 输出http_port_t tcp 80, 443, 488, 8008, 8009, 8443 # 发现 8081 不在列表里所以要加添加端口映射semanage port -a -t http_port_t -p tcp 8081 # -a 添加-t 指定类型-p 协议8081 端口 # 验证semanage port -l | grep 8081修改目录安全上下文Tomcat 日志目录默认是unconfined_u:object_r:default_t:s0SELinux 不允许tomcat_t进程写入。要改成tomcat_log_t# 先查当前上下文 ls -Z /opt/tomcat/logs # 输出unconfined_u:object_r:default_t:s0 logs # 添加文件上下文规则 semanage fcontext -a -t tomcat_log_t /opt/tomcat/logs(/.*)? # 应用规则-R 递归-v 显示详情 restorecon -Rv /

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询