部署前后端项目
前后端分离项目在云服务器上的部署流程
#tech / ops / vps
#type / howto
#status / growing
[!info] related notes
部署一个前后端分离的用户中心项目。
后端部署
构建项目
mvn package
配置云服务器中的环境(下载 java、maven)
在服务器中运行项目
简单运行
java -jar [包名] 会在 ssh 连接断开后结束
使用进程管理工具
PM2
PM2(适合Node.js/Java):
通过 pm2 start java -- -jar your-app.jar 启动,支持日志管理和自动重启。
systemd
(本次使用)
systemd(Linux系统服务):
创建服务文件 /etc/systemd/system/myapp.service:
[Unit]
Description=My Java App
After=network.target
[Service]
ExecStart=/usr/bin/java -jar /path/to/your-app.jar
Restart=always
User=root
[Install]
WantedBy=multi-user.target
// 启动并开机自启
systemctl start myapp
systemctl enable myapp
查看日志
# 查看服务的全部日志
journalctl -u your-service-name.service
# 查看最近100行日志
journalctl -u your-service-name.service -n 100
# 实时跟踪日志(类似 tail -f)
journalctl -u your-service-name.service -f
# 按时间筛选(如最近1小时)
journalctl -u your-service-name.service --since "1 hour ago"
# 结合优先级过滤(如仅显示错误)
journalctl -u your-service-name.service -p err
容器化部署(Docker)
原理:将Java应用打包为容器,通过Docker守护进程管理。
前端部署
构建项目
配置云服务器中的环境
- 下载 Nginx
- 配置 Nginx
server {
listen [端口号];
server_name [域名];
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/user-center;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
# Proxy regular requests
proxy_pass [后端服务器地址];
# Handle OPTIONS requests first
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Origin' '[域名]';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}
# Add CORS headers to proxied responses
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Origin' '[域名]' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length, Content-Range' always;
}
}