1. JavaWeb项目上线前的准备工作
当我们的JavaWeb项目开发完成后,上线部署是每个开发者都必须面对的关键环节。与本地开发环境不同,生产环境的配置需要考虑更多因素。我经历过多次从零开始部署JavaWeb项目的全过程,这里分享一些实战经验。
首先需要明确的是,JavaWeb项目上线不仅仅是把war包扔到服务器上那么简单。完整的部署流程包括:服务器选型、环境配置、应用部署、性能调优和安全加固等多个环节。每个环节都有其技术要点和潜在陷阱。
1.1 云服务器选型要点
目前主流的云服务器提供商包括阿里云、腾讯云、华为云等。对于JavaWeb项目来说,选择服务器时需要考虑以下几个关键因素:
-
CPU和内存:Java应用对内存需求较高,建议至少选择2核4G配置。如果是高并发场景,需要根据预估QPS进行计算。一个简单的估算方法是:每个Java线程约需要1MB内存,假设Tomcat默认最大线程数200,仅线程就需要200MB内存,再加上JVM自身开销和应用内存需求。
-
带宽:普通企业官网1-5Mbps足够,电商类应用建议5Mbps起步。需要注意的是,云服务商的带宽通常指的是出带宽,入带宽一般是免费的。
-
操作系统:推荐使用CentOS 7.x或Ubuntu LTS版本。我个人的经验是CentOS更加稳定,但Ubuntu的软件源更新更及时。
-
磁盘:系统盘建议50GB以上,如果需要存储大量文件,建议额外挂载数据盘。特别注意要选择SSD磁盘,IO性能对数据库应用至关重要。
提示:阿里云的"轻量应用服务器"性价比很高,特别适合中小型JavaWeb项目。它已经预装了常用环境,可以节省大量配置时间。
1.2 本地开发环境与生产环境的差异处理
开发环境和生产环境的不一致是很多问题的根源。在项目上线前,需要特别注意以下几点:
-
配置文件分离:使用Spring Boot的话,可以通过
application-{profile}.properties机制实现环境隔离。我通常准备三套配置:application-dev.properties:开发环境application-test.properties:测试环境application-prod.properties:生产环境
-
数据库差异:本地开发可能使用嵌入式H2,而生产环境使用MySQL。这种情况下,需要在Flyway或Liquibase迁移脚本中处理好兼容性问题。
-
第三方服务:短信、支付等接口的测试环境和生产环境通常是分开的,记得切换配置。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 服务器环境配置实战
2.1 基础环境安装
连接到云服务器后,第一件事是更新系统并安装必要工具:
bash复制# CentOS示例
yum update -y
yum install -y vim wget curl net-tools
接下来安装Java环境。建议使用OpenJDK:
bash复制# 安装OpenJDK 11
yum install -y java-11-openjdk-devel
# 验证安装
java -version
2.2 数据库安装与优化
MySQL是JavaWeb项目最常用的数据库。安装命令如下:
bash复制# CentOS 7安装MySQL 5.7
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
rpm -ivh mysql57-community-release-el7-11.noarch.rpm
yum install -y mysql-community-server
# 启动MySQL
systemctl start mysqld
systemctl enable mysqld
安装完成后,需要进行安全加固和性能优化:
- 运行安全脚本:
bash复制mysql_secure_installation
- 修改MySQL配置文件
/etc/my.cnf,添加以下优化参数:
ini复制[mysqld]
innodb_buffer_pool_size = 1G # 根据内存调整,建议为总内存的50%-70%
innodb_log_file_size = 256M
max_connections = 200
query_cache_size = 0 # MySQL 8.0已移除查询缓存
2.3 Web服务器配置
Tomcat是最常用的JavaWeb容器。安装和配置步骤如下:
bash复制# 下载Tomcat 9
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.68/bin/apache-tomcat-9.0.68.tar.gz
tar -xzf apache-tomcat-9.0.68.tar.gz
mv apache-tomcat-9.0.68 /usr/local/tomcat
优化Tomcat配置,修改/usr/local/tomcat/conf/server.xml:
xml复制<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="200"
minSpareThreads="10"
enableLookups="false"
acceptCount="100"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"/>
3. 项目部署与启动
3.1 应用打包与上传
在IDEA中,使用Maven打包项目:
bash复制mvn clean package -DskipTests
生成的war包通常位于target目录下。使用scp命令上传到服务器:
bash复制scp target/yourproject.war root@your-server-ip:/usr/local/tomcat/webapps/
3.2 启动与监控
启动Tomcat并监控日志:
bash复制/usr/local/tomcat/bin/startup.sh
tail -f /usr/local/tomcat/logs/catalina.out
为了更方便地管理应用,可以配置systemd服务。创建/etc/systemd/system/tomcat.service文件:
ini复制[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk
Environment=CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=CATALINA_BASE=/usr/local/tomcat
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
User=root
Group=root
UMask=0007
RestartSec=10
Restart=always
[Install]
WantedBy=multi-user.target
然后启用服务:
bash复制systemctl daemon-reload
systemctl enable tomcat
systemctl start tomcat
4. 安全排查与加固
4.1 常见安全风险排查
JavaWeb项目常见的安全风险包括:
- SQL注入:检查是否所有SQL查询都使用预编译语句
- XSS攻击:验证所有用户输入是否经过转义处理
- CSRF攻击:检查是否配置了CSRF令牌
- 敏感信息泄露:确保配置文件中没有明文密码
- 不安全的依赖:使用
mvn dependency:tree检查依赖版本
可以使用OWASP ZAP工具进行自动化扫描:
bash复制docker run -it -p 8080:8080 -p 8090:8090 \
-e ZAP_PORT=8080 \
owasp/zap2docker-stable zap-webswing.sh
4.2 服务器安全加固
-
SSH安全:
- 修改默认SSH端口
- 禁用root直接登录
- 使用密钥认证替代密码
修改
/etc/ssh/sshd_config:ini复制
Port 2222 PermitRootLogin no PasswordAuthentication no -
防火墙配置:
bash复制# 开放必要端口 firewall-cmd --permanent --add-port=2222/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload -
定期更新:
bash复制# 设置自动安全更新 yum install -y yum-cron systemctl enable yum-cron systemctl start yum-cron
4.3 应用层安全配置
对于Spring Boot应用,可以添加以下安全配置:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers()
.contentSecurityPolicy("default-src 'self'")
.and()
.frameOptions().deny()
.and()
.csrf().disable() // 根据实际情况决定是否禁用
.authorizeRequests()
.antMatchers("/admin/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
}
5. 性能优化与监控
5.1 JVM调优
Tomcat的JVM参数可以在/usr/local/tomcat/bin/setenv.sh中配置(没有则创建):
bash复制export CATALINA_OPTS="-server -Xms2g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
关键参数说明:
-Xms和-Xmx:堆内存初始值和最大值,建议设为相同值-XX:MetaspaceSize:元空间初始大小-XX:+UseG1GC:使用G1垃圾收集器-XX:MaxGCPauseMillis:目标最大GC停顿时间
5.2 连接池配置
如果使用HikariCP连接池,推荐配置:
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=10
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.leak-detection-threshold=5000
5.3 监控方案
推荐使用Prometheus + Grafana监控方案:
- 在应用中添加Micrometer依赖:
xml复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
- 配置Prometheus端点:
properties复制management.endpoints.web.exposure.include=health,info,prometheus
management.metrics.export.prometheus.enabled=true
- 服务器上安装Prometheus和Grafana:
bash复制# 安装Docker
yum install -y docker
systemctl start docker
# 运行Prometheus
docker run -d -p 9090:9090 --name prometheus prom/prometheus
# 运行Grafana
docker run -d -p 3000:3000 --name grafana grafana/grafana
6. 备份与灾备方案
6.1 数据库备份
设置MySQL自动备份:
bash复制# 创建备份脚本
cat > /usr/local/bin/mysql-backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d%H%M)
BACKUP_DIR=/data/backups/mysql
mkdir -p $BACKUP_DIR
mysqldump -u root -pYourPassword --all-databases | gzip > $BACKUP_DIR/mysql-$DATE.sql.gz
find $BACKUP_DIR -type f -mtime +7 -delete
EOF
chmod +x /usr/local/bin/mysql-backup.sh
# 添加定时任务
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/mysql-backup.sh") | crontab -
6.2 应用备份
备份Tomcat应用和配置:
bash复制# 创建备份脚本
cat > /usr/local/bin/tomcat-backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d%H%M)
BACKUP_DIR=/data/backups/tomcat
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/tomcat-$DATE.tar.gz /usr/local/tomcat/webapps /usr/local/tomcat/conf
find $BACKUP_DIR -type f -mtime +7 -delete
EOF
chmod +x /usr/local/bin/tomcat-backup.sh
# 添加定时任务
(crontab -l 2>/dev/null; echo "0 3 * * * /usr/local/bin/tomcat-backup.sh") | crontab -
6.3 灾备演练
定期进行灾备演练非常重要,我建议每季度至少进行一次。演练步骤包括:
- 模拟服务器宕机
- 从备份恢复数据库
- 重新部署应用
- 验证数据完整性和功能可用性
- 记录恢复时间和遇到的问题
在实际项目中,我曾经遇到过因为没做灾备演练,真正出问题时发现备份不可用的情况。从那以后,我养成了定期验证备份有效性的习惯。
