部署前后端项目

前后端分离项目在云服务器上的部署流程

#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守护进程管理。

前端部署

构建项目

配置云服务器中的环境

  1. 下载 Nginx
  2. 配置 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;
    }
}
创建于 2025/1/1 更新于 2026/5/27