搭建 Java Web 服务器时,Linux 系统的选择与配置直接影响性能、安全性和可维护性。以下是关键步骤和最佳实践:
一、操作系统选择建议
| 发行版 | 适用场景 | 优点 |
|---|---|---|
| Ubuntu Server(20.04/22.04 LTS) | 通用开发/生产环境 | 社区活跃、文档丰富、包管理友好(APT)、长期支持(5年) |
| CentOS Stream / Rocky Linux / AlmaLinux | 企业级稳定需求 | RHEL 生态兼容、安全性高、长期支持(10 年+)、适合X_X/X_X等强合规场景 |
| Debian Stable | 追求极致稳定 | 软件包经过严格测试、资源占用低、无商业绑定 |
✅ 推荐:
- 初创团队/快速迭代 → Ubuntu 22.04 LTS
- 企业核心系统/需通过等保/ISO 认证 → Rocky Linux 9 或 AlmaLinux 9
⚠️ 避免使用已停止支持的版本(如 CentOS 7、Ubuntu 18.04),存在安全漏洞风险。
二、基础系统配置要点
1. 最小化安装 & 更新系统
# Ubuntu 示例
sudo apt update && sudo apt upgrade -y
sudo apt install -y openssh-server curl wget vim net-tools
# Rocky/Alma 示例
sudo dnf update -y
sudo dnf install -y epel-release openssh-server curl wget vim net-tools
2. 用户权限管理
- 禁用 root 远程登录(
PermitRootLogin noin/etc/ssh/sshd_config) - 创建专用运维用户并配置
sudo:sudo useradd -m -G sudo deployer sudo passwd deployer # 设置免密 sudo(谨慎操作) echo 'deployer ALL=(ALL) NOPASSWD: ALL' | sudo tee /etc/sudoers.d/deployer
3. 防火墙与安全加固
# UFW(Ubuntu)
sudo ufw default deny incoming
sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable
# firewalld(RHEL系)
sudo firewall-cmd --permanent --add-service={ssh,http,https}
sudo firewall-cmd --reload
✅ 额外建议:
- 启用 Fail2Ban 防暴力破解
- 配置 SELinux(RHEL系)为 enforcing 模式(除非明确需要 permissive)
三、Java 运行时环境配置
1. 安装 JDK(推荐 OpenJDK 17/21 LTS)
# Ubuntu
sudo apt install openjdk-21-jdk -y
# Rocky/Alma
sudo dnf install java-21-openjdk-devel -y
验证:
java -version
javac -version
echo $JAVA_HOME # 应指向 /usr/lib/jvm/java-21-openjdk...
✅ 优先使用官方仓库或 EPEL 源,避免从第三方下载 tarball(难维护、版本混乱)。
2. 环境变量标准化
编辑 /etc/profile.d/java.sh:
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CATALINA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
使所有会话生效:source /etc/profile.d/java.sh
四、Web 服务器部署方案选型
| 方案 | 适用场景 | 配置复杂度 |
|---|---|---|
| Tomcat + Nginx 反向X_X | 大多数 Java Web 应用 | 中(灵活可控) |
| Spring Boot Embedded Jar | 微服务/容器化优先 | 低(单进程启动) |
| Jetty/GlassFish | 轻量级或特定框架需求 | 中 |
▶ 推荐架构:Nginx + Tomcat(经典组合)
- Nginx:处理静态资源、SSL 终止、负载均衡
- Tomcat:运行 WAR/JAR,暴露 AJP/HTTP 端口
示例:Tomcat 优化配置($CATALINA_BASE/conf/server.xml)
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="200" connectionTimeout="20000"
URIEncoding="UTF-8" relaxedPathChars="[]" relaxedQueryChars="[]{}^`|""/>
调整
maxThreads、connectionTimeout根据压测结果;生产环境务必启用secure="true"和SSLEnabled="true"(配合证书)。
Nginx 反向X_X配置(/etc/nginx/sites-available/myapp.conf)
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 60s;
}
location ~* .(jpg|png|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
五、监控与日志管理
- 应用日志:Logback/Log4j2 输出到
/var/log/myapp/app.log,配合logrotate轮转 - 系统监控:
- Prometheus + Node Exporter + JMX Exporter(采集 JVM 指标)
- Grafana 可视化仪表盘(CPU、内存、GC 时间、线程数)
- 告警:Prometheus Alertmanager 通知钉钉/邮件
六、容器化进阶(可选但推荐)
若采用 Docker/Kubernetes:
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY target/myapp.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
优势:环境一致、快速扩缩容、便于 CI/CD 集成。
附:检查清单(部署前必核)
- [ ] 系统已更新至最新安全补丁
- [ ] SSH 密钥登录启用,密码登录禁用
- [ ] 防火墙仅开放必要端口(22, 80, 443)
- [ ] JDK 版本符合应用要求(如 Spring Boot 3.x 需 Java 17+)
- [ ] JVM 参数已调优(堆大小、GC 策略)
- [ ] 日志有轮转机制,避免磁盘写满
- [ ] 定期备份数据库与应用代码
如需针对具体场景(如高并发电商、微服务集群、国产化信创环境)进一步细化配置,可提供更多需求细节,我将为您定制方案。
云小栈