为 Spring Boot 项目和 Nginx 配置开机自启

简介 为SpringBoot项目和Nginx配置开机自启,使用systemd是目前Linux系统中推荐和服务化管理的方式。我会为你提供详细的配置步骤和验证方法。下面的表格汇总了这两个服务的主要配置要点:特性SpringBoot服务(cd-device-distance.service)Nginx服务(nginx.service)服务描述CDDeviceDistanceSpringBootApplicat

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

为 Spring Boot 项目和 Nginx 配置开机自启,使用 systemd 是目前 Linux 系统中推荐和服务化管理的方式。我会为你提供详细的配置步骤和验证方法。

下面的表格汇总了这两个服务的主要配置要点:

特性Spring Boot 服务 (cd-device-distance.service)Nginx 服务 (nginx.service)
服务描述CD Device Distance Spring Boot ApplicationThe NGINX HTTP and reverse proxy server
依赖关系network.targetnetwork.targetsyslog.target, network.target, remote-fs.target, nss-lookup.target
服务类型simpleforking
关键配置WorkingDirectory, ExecStartPIDFile, ExecStartPre, ExecStart
用户权限可选指定用户和组通常以 root 用户运行
安装目标multi-user.targetmulti-user.target

📁 创建 Spring Boot 的 systemd 服务

  1. 创建服务文件:使用文本编辑器(如 vimnano)在 /etc/systemd/system/ 目录下创建一个名为 cd-device-distance.service 的文件。

    sudo vim /etc/systemd/system/cd-device-distance.service
  2. 编写服务配置:将以下内容写入文件。你需要重点关注 WorkingDirectoryExecStart 这两个参数,确保它们指向你实际的目录和启动命令。

    [Unit]
    Description=CD Device Distance Spring Boot Application
    After=network.target
    
    [Service]
    # 如果希望以特定用户运行(推荐),可取消以下两行的注释并替换为你的用户名和组
    # User=your_username
    # Group=your_groupname
    Type=simple
    WorkingDirectory=/htdocs/service/cd-devcie-distance
    ExecStart=/usr/bin/java -jar /htdocs/service/cd-devcie-distance/cd-devcie-distance.jar
    SuccessExitStatus=143
    TimeoutStopSec=10
    Restart=on-failure
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
    • WorkingDirectory: 设置工作目录,这对于应用读取相对路径下的配置文件(如 application.properties)或写日志文件很重要。

    • ExecStart: 这里直接使用 java 的绝对路径(通常可通过 which java 确认)更可靠。你原有的 nohup 和输出重定向对于 systemd 是不需要的,因为 systemd 会自行管理日志(可用 journalctl 查看)。

    • UserGroup: 建议出于安全考虑,创建一个专用系统用户和组来运行你的 Java 应用,而不是使用 root

    • Restart: 配置为 on-failure 意味着当进程异常退出时(退出状态码非 0),systemd 会自动尝试重启应用。

    • 关键参数说明

  3. 保存并退出编辑器

📁 创建 Nginx 的 systemd 服务

Nginx 在通过包管理器安装时,通常会自动创建 systemd 服务文件。如果你从源码编译安装,或者想确认配置,可以检查或创建它。

  1. 检查服务是否已存在

    ls /lib/systemd/system/nginx.service /etc/systemd/system/nginx.service 2>/dev/null || echo "Nginx service file not found, will create one."

    如果输出提示文件不存在,或者你想使用自定义配置,可以创建它。

  2. 创建或编辑服务文件

    sudo vim /etc/systemd/system/nginx.service
  3. 编写服务配置:将以下内容写入文件。

    [Unit]
    Description=The NGINX HTTP and reverse proxy server
    After=network.target
    
    [Service]
    Type=forking
    PIDFile=/run/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    • Type=forking: 适用于像 Nginx 这样会自行创建守护进程(daemonize)的应用程序。

    • PIDFile: 指明 Nginx 主进程 PID 文件的路径。重要:这个路径必须与 Nginx 配置文件 (nginx.conf) 中 pid 指令设置的路径一致,否则 systemd 可能无法正确管理服务。

    • ExecStartPre: 在启动主服务之前执行的命令,nginx -t 用于测试配置文件语法是否正确,提前发现问题。

    • ExecReload: 定义了当执行 systemctl reload nginx 时发出的命令,优雅地重新加载配置。

    • 关键参数说明

  4. 保存并退出编辑器

🔧 启用并启动服务

配置好服务文件后,需要让 systemd 识别并设置它们开机自启。

  1. 重新加载 systemd 配置:每当新增或修改了服务文件后,都需要执行此命令。

    sudo systemctl daemon-reload
  2. 启用开机自动启动

    sudo systemctl enable cd-device-distance.service
    sudo systemctl enable nginx.service

    这会在 /etc/systemd/system/multi-user.target.wants/ 目录下创建相应的符号链接。

  3. 立即启动服务

    sudo systemctl start cd-device-distance.service
    sudo systemctl start nginx.service

✅ 验证服务状态和自启生效

确保服务已正确运行并配置为开机启动。

  1. 检查服务当前状态

    sudo systemctl status cd-device-distance.service
    sudo systemctl status nginx.service

    期望的输出:状态 (Active) 应显示为 active (running),并且日志中不应有错误信息。 如果状态显示为 inactivefailed,需要根据日志排查问题。

  2. 确认是否启用开机自启

    sudo systemctl is-enabled cd-device-distance.service
    sudo systemctl is-enabled nginx.service

    期望的输出:两条命令都应输出 enabled

  3. 验证 Nginx 是否正在监听指定端口(通常是 80 或 443):

    sudo netstat -tuln | grep :80
    # 或者使用 ss 命令
    sudo ss -tuln | grep :80

    期望的输出:能看到 nginx 进程正在监听相关端口。

  4. 最终验证:重启服务器
    这是最彻底的验证方式。重启后,再次使用 systemctl status 命令检查两个服务是否都已自动运行。

    sudo reboot

🔍 补充:验证 Nginx 的 systemd 服务文件是否存在

如果你不确定 Nginx 是否已经存在 systemd 服务文件,或者想知道它在哪里,可以通过以下命令查找:

# 在标准 systemd 搜索路径中查找 nginx.service 文件
sudo find /lib/systemd/system /etc/systemd/system -name "nginx.service" 2>/dev/null

# 如果找到,查看其内容
sudo cat /path/to/found/nginx.service

如果系统已存在服务文件,建议优先使用已有的文件,除非你需要自定义修改。

⚠️ 注意

  • Java路径:确保 ExecStart 中的 Java 路径是正确的。可以使用 which java 命令查看。

  • 配置文件路径:对于 Nginx,确保 PIDFile 的路径与 Nginx 自身配置文件中 pid 指令定义的路径完全一致,否则会导致 systemd 管理异常。

  • 日志查看:使用 journalctl -u cd-device-distance.service -u nginx.service -b 来查看本次启动后这两个服务的日志,对于调试非常有用。

  • 用户权限:如果为 Spring Boot 服务指定了非 root 用户,请确保该用户对相关目录和文件有足够的读写执行权限。

按照以上步骤操作,你的 Spring Boot 应用和 Nginx 就应该能够通过 systemd 实现开机自启了。


TopTop