一文帶你搞懂如何設(shè)置Nginx開機自啟動(systemd 方式)
在現(xiàn)代 Linux 服務(wù)器運維中,Nginx 作為高性能的 Web 服務(wù)器和反向代理,早已成為不可或缺的核心組件。無論是部署 Java Web 應(yīng)用、靜態(tài)資源服務(wù),還是作為 API 網(wǎng)關(guān),Nginx 都以其輕量、穩(wěn)定、高并發(fā)的特性贏得了開發(fā)與運維團(tuán)隊的廣泛信賴。然而,一個看似簡單的問題常常被忽視:當(dāng)服務(wù)器重啟后,Nginx 是否能自動恢復(fù)運行?
答案是:不能默認(rèn)自動啟動,除非你明確配置了開機自啟動機制。在傳統(tǒng) SysV init 系統(tǒng)時代,我們通過 chkconfig 或 update-rc.d 來管理服務(wù);而在當(dāng)今主流的 Linux 發(fā)行版(如 CentOS 7+、Ubuntu 16.04+、Debian 9+)中,systemd 已成為標(biāo)準(zhǔn)的系統(tǒng)和服務(wù)管理器。掌握如何使用 systemd 配置 Nginx 開機自啟動,不僅是運維的基本功,更是保障服務(wù)高可用性的關(guān)鍵一步。
本文將帶你從零開始,深入理解 systemd 的工作原理,手把手教你配置 Nginx 開機自啟動,并結(jié)合真實 Java 應(yīng)用場景,演示如何構(gòu)建一個“Nginx + Spring Boot + MySQL”的完整高可用架構(gòu)。我們將通過代碼示例、架構(gòu)圖、配置解析和故障排查技巧,讓你不僅“會配置”,更“懂原理”。

為什么需要開機自啟動?
想象一下這樣一個場景:
你是一名 Java 開發(fā)工程師,負(fù)責(zé)公司核心業(yè)務(wù)系統(tǒng)的部署。你精心優(yōu)化了 Spring Boot 應(yīng)用的性能,配置了數(shù)據(jù)庫連接池、線程池、緩存策略,甚至使用了 Prometheus + Grafana 做了全鏈路監(jiān)控。一切看起來完美無缺。
直到某天深夜,機房突發(fā)斷電,服務(wù)器意外關(guān)機。第二天早上,運維同事發(fā)現(xiàn):
- 數(shù)據(jù)庫服務(wù)已自動恢復(fù)(因為配置了 systemd 自啟動);
- Redis 緩存也正常運行;
- 但你的 Java 應(yīng)用無法訪問 —— 因為它依賴的 Nginx 沒有啟動!
用戶投訴:“網(wǎng)站打不開!”
產(chǎn)品經(jīng)理追問:“為什么上次升級后總是出問題?”
你只能無奈地登錄服務(wù)器,手動執(zhí)行:
sudo systemctl start nginx
然后默默在心里記下:“下次一定要配置開機自啟。”
這不是技術(shù)問題,這是責(zé)任心問題。一個沒有自啟動能力的服務(wù),就像一輛沒有自動點火的跑車——再快,也得靠人推。
小貼士:在生產(chǎn)環(huán)境中,任何核心服務(wù)(Nginx、Java 應(yīng)用、Redis、MySQL、RabbitMQ)都必須配置開機自啟動。這是 DevOps 的“最低道德標(biāo)準(zhǔn)”。
systemd 是什么?它為什么重要?
systemd 是 Linux 系統(tǒng)中用于初始化、管理和監(jiān)控系統(tǒng)服務(wù)的守護(hù)進(jìn)程。它于 2010 年由 Lennart Poettering 發(fā)起,如今已被絕大多數(shù)主流 Linux 發(fā)行版采用,取代了傳統(tǒng)的 SysV init 系統(tǒng)。
systemd 的優(yōu)勢包括:
- 并行啟動服務(wù):不再像 SysV 那樣串行啟動,大幅提升開機速度;
- 依賴管理:服務(wù)之間可以聲明依賴關(guān)系,比如“Nginx 依賴網(wǎng)絡(luò)和 MySQL”;
- 日志統(tǒng)一管理:通過
journalctl統(tǒng)一查看所有服務(wù)日志; - 資源控制:可限制 CPU、內(nèi)存、文件句柄等資源;
- 進(jìn)程監(jiān)控:自動重啟崩潰的服務(wù);
- 靈活的單元配置:通過
.service文件定義服務(wù)行為。
systemd 的核心概念
| 概念 | 說明 |
|---|---|
| Unit | systemd 管理的基本對象,如服務(wù)(service)、套接字(socket)、目標(biāo)(target)等 |
| Service Unit | 描述一個后臺服務(wù)的配置文件,擴展名為 .service |
| Target | 類似于運行級別(runlevel),如 multi-user.target 相當(dāng)于傳統(tǒng) runlevel 3 |
| Wants / Requires | 服務(wù)之間的依賴聲明方式,Wants 是弱依賴,Requires 是強依賴 |
| ExecStart | 啟動服務(wù)時執(zhí)行的命令 |
| Restart | 服務(wù)崩潰后是否自動重啟,如 always, on-failure |
檢查當(dāng)前 Nginx 狀態(tài)
在配置自啟動之前,我們先確認(rèn)當(dāng)前 Nginx 的運行狀態(tài)。
1. 查看 Nginx 是否已安裝
which nginx # 輸出示例:/usr/sbin/nginx nginx -v # 輸出示例:nginx version: nginx/1.24.0
如果未安裝,請先安裝:
# Ubuntu/Debian sudo apt update && sudo apt install nginx # CentOS/RHEL sudo yum install epel-release -y sudo yum install nginx -y # 或使用 dnf(較新版本) sudo dnf install nginx -y
2. 檢查 Nginx 是否正在運行
sudo systemctl status nginx
輸出示例:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-03-18 10:22:33 CST; 2h 15min ago
Main PID: 1234 (nginx)
Tasks: 6 (limit: 4915)
Memory: 5.2M
CGroup: /system.slice/nginx.service
├─1234 nginx: master process /usr/sbin/nginx -g daemon off;
└─1235 nginx: worker process
關(guān)鍵字段解釋:
Loaded:服務(wù)單元文件是否被加載Enabled:是否設(shè)置為開機自啟(enabled表示是,disabled表示否)Active:當(dāng)前是否運行Main PID:主進(jìn)程 ID
3. 查看服務(wù)單元文件位置
systemctl show nginx --property=UnitFileState # 輸出:UnitFileState=enabled systemctl cat nginx
systemctl cat nginx 會顯示服務(wù)文件的完整內(nèi)容,通常位于:
/lib/systemd/system/nginx.service
Nginx 默認(rèn)服務(wù)文件解析
運行 systemctl cat nginx,你可能會看到類似如下內(nèi)容(以 Ubuntu 22.04 為例):
[Unit] Description=A high performance web server and a reverse proxy server After=network.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;' ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload ExecStop=/usr/sbin/nginx -s stop PrivateTmp=true [Install] WantedBy=multi-user.target
字段詳解
1.[Unit]部分
Description:服務(wù)描述,用于systemctl list-units顯示After=network.target:表示 Nginx 在網(wǎng)絡(luò)服務(wù)啟動后才啟動。這是非常關(guān)鍵的一行!如果沒有它,Nginx 可能在網(wǎng)絡(luò)未就緒時嘗試綁定端口 80,導(dǎo)致啟動失敗。
注意:network.target 并不等于“網(wǎng)絡(luò)完全可用”。它只表示網(wǎng)絡(luò)接口已激活。對于依賴 DNS 解析的服務(wù),建議使用 network-online.target(需 systemd-networkd-wait-online.service 支持)。
2.[Service]部分
Type=forking:Nginx 啟動時會 fork 一個子進(jìn)程作為 master,父進(jìn)程退出。這與Type=simple(直接運行主進(jìn)程)不同。PIDFile:指定 PID 文件路徑,systemd 通過此文件追蹤主進(jìn)程。ExecStartPre:啟動前執(zhí)行的命令,常用于配置文件語法檢查(nginx -t)。ExecStart:實際啟動命令。ExecReload:重載配置命令。ExecStop:停止命令。PrivateTmp=true:為服務(wù)創(chuàng)建獨立的臨時目錄,提高安全性。
3.[Install]部分
WantedBy=multi-user.target:表示當(dāng)系統(tǒng)進(jìn)入多用戶模式(即正常登錄狀態(tài))時,啟動此服務(wù)。
你可能注意到:默認(rèn)的 Nginx 服務(wù)文件已經(jīng)配置了開機自啟!那為什么我們還要寫這篇文章?
因為——很多情況下,這個服務(wù)文件被誤刪、被覆蓋、或被禁用。尤其是在使用非官方包(如源碼編譯安裝)、Docker 容器、或云平臺鏡像時,systemd 單元文件可能缺失或未啟用。
手動啟用 Nginx 開機自啟動
如果你發(fā)現(xiàn) systemctl status nginx 顯示 Enabled: disabled,或服務(wù)文件缺失,你需要手動啟用。
步驟 1:確認(rèn)服務(wù)文件存在
ls -l /lib/systemd/system/nginx.service # 或 ls -l /etc/systemd/system/nginx.service
如果文件不存在,你需要創(chuàng)建它。
步驟 2:創(chuàng)建或修復(fù) nginx.service 文件
使用編輯器創(chuàng)建服務(wù)文件:
sudo nano /etc/systemd/system/nginx.service
粘貼以下內(nèi)容(推薦版本,兼容性強):
[Unit] Description=The NGINX HTTP and reverse proxy server After=network.target network-online.target Wants=network-online.target [Service] Type=forking PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;' ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload ExecStop=/usr/sbin/nginx -s stop Restart=on-failure RestartSec=5s LimitNOFILE=100000 [Install] WantedBy=multi-user.target
關(guān)鍵改進(jìn)點說明
| 項目 | 說明 |
|---|---|
After=network.target network-online.target | 更嚴(yán)格地等待網(wǎng)絡(luò)完全可用,避免啟動失敗 |
Wants=network-online.target | 聲明弱依賴,提高啟動可靠性 |
Restart=on-failure | 服務(wù)異常退出時自動重啟,提升可用性 |
RestartSec=5s | 重啟前等待 5 秒,避免頻繁重啟導(dǎo)致系統(tǒng)負(fù)載飆升 |
LimitNOFILE=100000 | 提高文件描述符限制,避免高并發(fā)下“Too many open files”錯誤 |
重要提醒:如果你是使用源碼編譯安裝的 Nginx(非 apt/yum 安裝),請確保 ExecStart、ExecStartPre 中的路徑指向你實際安裝的 nginx 可執(zhí)行文件。例如:
ExecStart=/opt/nginx/sbin/nginx -g 'daemon on; master_process on;'
你可以通過 which nginx 確認(rèn)路徑。
步驟 3:重新加載 systemd 配置
sudo systemctl daemon-reload
這是最關(guān)鍵的一步!每次修改 .service 文件后,都必須執(zhí)行此命令,否則 systemd 不會讀取新配置。
步驟 4:啟用開機自啟動
sudo systemctl enable nginx
輸出:
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.
步驟 5:驗證是否啟用成功
systemctl is-enabled nginx # 輸出:enabled
步驟 6:啟動 Nginx(如果未運行)
sudo systemctl start nginx
步驟 7:設(shè)置開機啟動日志記錄(可選)
為了便于排查啟動失敗問題,建議開啟 systemd 日志持久化:
sudo mkdir -p /var/log/journal sudo systemctl restart systemd-journald
之后你可以用 journalctl 查看 Nginx 啟動日志:
journalctl -u nginx --since today
實戰(zhàn):Java 應(yīng)用 + Nginx 高可用架構(gòu)設(shè)計
現(xiàn)在我們進(jìn)入實戰(zhàn)環(huán)節(jié)。假設(shè)你有一個 Spring Boot Java 應(yīng)用,部署在一臺 CentOS 服務(wù)器上,需要通過 Nginx 作為反向代理對外提供服務(wù),并確保服務(wù)器重啟后,Nginx 和 Java 應(yīng)用都能自動啟動。
架構(gòu)圖示意(Mermaid)

這是一個典型的微服務(wù)前端網(wǎng)關(guān)架構(gòu):Nginx 處理靜態(tài)資源、負(fù)載均衡、SSL 終止,Java 應(yīng)用專注業(yè)務(wù)邏輯。
Java 應(yīng)用部署示例(Spring Boot)
假設(shè)你的 Java 應(yīng)用打包為 myapp.jar,部署在 /opt/myapp/ 目錄下。
1. 創(chuàng)建 Java 服務(wù)單元文件
sudo nano /etc/systemd/system/myapp.service
內(nèi)容如下:
[Unit] Description=My Java Spring Boot Application After=network.target nginx.service Wants=nginx.service [Service] User=appuser Group=appgroup WorkingDirectory=/opt/myapp ExecStart=/usr/bin/java -jar -Dspring.profiles.active=prod -Xms512m -Xmx1024m -XX:+UseG1GC myapp.jar Restart=always RestartSec=10s StandardOutput=journal StandardError=journal Environment=JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom Environment=SERVER_PORT=8080 [Install] WantedBy=multi-user.target
2. 創(chuàng)建運行用戶(安全最佳實踐)
sudo groupadd appgroup sudo useradd -g appgroup -s /bin/false appuser sudo chown -R appuser:appgroup /opt/myapp
安全提示:永遠(yuǎn)不要用 root 用戶運行 Java 應(yīng)用!這是重大安全隱患。
3. 啟用并啟動 Java 服務(wù)
sudo systemctl daemon-reload sudo systemctl enable myapp sudo systemctl start myapp
4. 檢查 Java 應(yīng)用是否運行
sudo systemctl status myapp journalctl -u myapp -f # 實時查看日志
5. Nginx 反向代理配置
編輯 Nginx 配置文件:
sudo nano /etc/nginx/conf.d/myapp.conf
內(nèi)容如下:
server {
listen 80;
server_name example.com www.example.com;
access_log /var/log/nginx/myapp-access.log;
error_log /var/log/nginx/myapp-error.log;
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 90s;
proxy_connect_timeout 90s;
}
location /static/ {
alias /opt/myapp/static;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /actuator/ {
proxy_pass http://127.0.0.1:8080/actuator/;
allow 192.168.1.0/24;
deny all;
}
}
這里我們做了幾件重要的事:
- 將
/static/路徑直接由 Nginx 返回,減輕 Java 應(yīng)用壓力; - 設(shè)置緩存頭,提升前端性能;
- 限制
/actuator/只允許內(nèi)網(wǎng)訪問,保障安全; - 使用
proxy_read_timeout防止長連接超時。
6. 測試 Nginx 配置并重載
sudo nginx -t sudo systemctl reload nginx
7. 驗證服務(wù)鏈路
curl -I http://localhost
# 應(yīng)該返回 200 OK
curl http://localhost/actuator/health
# 應(yīng)該返回 {"status":"UP"}
高級技巧:服務(wù)依賴順序與啟動延遲
在復(fù)雜系統(tǒng)中,服務(wù)之間存在依賴關(guān)系。例如:
- Nginx 依賴網(wǎng)絡(luò)
- Java 應(yīng)用依賴 Nginx(反向代理)
- Java 應(yīng)用依賴 MySQL(數(shù)據(jù)庫連接)
但Java 應(yīng)用不應(yīng)該依賴 Nginx!因為 Nginx 是反向代理,它只是轉(zhuǎn)發(fā)請求,Java 應(yīng)用本身不需要 Nginx 才能運行。正確的依賴關(guān)系是:
- Java 應(yīng)用 → MySQL / Redis
- Nginx → Java 應(yīng)用(通過網(wǎng)絡(luò)訪問)
但有時,我們希望“Nginx 啟動后,再啟動 Java 應(yīng)用”,比如為了防止用戶在 Java 未就緒時訪問到 502 錯誤。
方法一:使用Wants+After(推薦)
[Unit] Description=My Java Spring Boot Application After=network.target mysql.service redis.service Wants=mysql.service redis.service [Service] ...
這樣,系統(tǒng)會確保 MySQL 和 Redis 啟動后,再啟動 Java 應(yīng)用。
方法二:使用ExecStartPre延遲啟動(模擬等待)
如果你的 Java 應(yīng)用需要等待 Nginx 完全啟動(比如注冊到服務(wù)發(fā)現(xiàn)),可以添加一個等待腳本:
[Service] ... ExecStartPre=/bin/bash -c 'until curl -s http://127.0.0.1:80/health; do echo "Waiting for Nginx to be ready..."; sleep 5; done' ExecStart=/usr/bin/java -jar myapp.jar
注意:這種方式會延長啟動時間,僅在必要時使用。
方法三:使用 systemd 的socket activation(進(jìn)階)
你可以讓 systemd 監(jiān)聽 80 端口,當(dāng)?shù)谝粋€請求到來時才啟動 Java 應(yīng)用。但 Nginx 通常不推薦這樣用,因為 Nginx 本身需要常駐監(jiān)聽。
故障排查指南
即使配置了開機自啟動,服務(wù)仍可能啟動失敗。以下是常見問題和解決方案。
1. 啟動失敗:Job for nginx.service failed
sudo systemctl status nginx
常見錯誤:
錯誤 1:端口被占用
bind() to 0.0.0.0:80 failed (98: Address already in use)
解決:
sudo ss -tlnp | grep :80 # 查看哪個進(jìn)程占用了 80 端口 sudo kill -9 <PID> # 或修改 nginx 監(jiān)聽端口為 8080 測試
錯誤 2:配置文件語法錯誤
nginx: [emerg] unknown directive "xxx" in /etc/nginx/nginx.conf:xx
解決:
sudo nginx -t # 會精確指出錯誤行
錯誤 3:權(quán)限不足(文件讀取失?。?/p>
nginx: [emerg] open() "/etc/nginx/conf.d/myapp.conf" failed (13: Permission denied)
解決:
sudo chmod 644 /etc/nginx/conf.d/myapp.conf sudo chown root:root /etc/nginx/conf.d/myapp.conf
錯誤 4:Java 應(yīng)用啟動失敗(內(nèi)存不足)
Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
解決:
- 減少
-Xmx內(nèi)存 - 檢查系統(tǒng)內(nèi)存:
free -h - 添加 swap:
sudo fallocate -l 2G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
2. 日志分析技巧
# 查看最近 100 行 Nginx 日志 journalctl -u nginx -n 100 # 實時跟蹤日志 journalctl -u nginx -f # 查看啟動時所有事件(包括失?。? journalctl -b -u nginx # 查看特定時間范圍 journalctl -u nginx --since "2024-03-18 08:00:00" --until "2024-03-18 09:00:00"
3. 服務(wù)未啟動但狀態(tài)顯示“active”
有時服務(wù)狀態(tài)是 active (running),但你訪問 80 端口卻返回 502 或超時。
原因:Nginx 啟動了,但后端 Java 應(yīng)用沒啟動!
解決方案:
systemctl status myapp # 如果是 inactive,說明 Java 應(yīng)用沒起來 journalctl -u myapp --since "1 hour ago" # 查看 Java 應(yīng)用啟動日志
最佳實踐清單
| 類別 | 推薦做法 |
|---|---|
| 服務(wù)文件位置 | 優(yōu)先使用 /etc/systemd/system/ 而非 /lib/systemd/system/,避免被包管理器覆蓋 |
| 用戶權(quán)限 | Java 應(yīng)用使用非 root 用戶運行 |
| 日志管理 | 使用 journalctl 統(tǒng)一收集日志,不要依賴傳統(tǒng) log 文件 |
| 重啟策略 | 設(shè)置 Restart=always 或 Restart=on-failure |
| 資源限制 | 設(shè)置 LimitNOFILE=100000,避免高并發(fā)下文件句柄耗盡 |
| 健康檢查 | Java 應(yīng)用暴露 /actuator/health,Nginx 可配合 upstream 做健康探測 |
| 配置測試 | 修改 Nginx 配置后,永遠(yuǎn)先執(zhí)行 nginx -t |
| 自動化部署 | 使用 Ansible / Terraform / Shell 腳本統(tǒng)一管理服務(wù)配置 |
| 備份配置 | 定期備份 /etc/nginx/ 和 /etc/systemd/system/*.service |
Java 代碼示例:優(yōu)雅關(guān)閉與健康檢查
為了確保 Java 應(yīng)用能被 systemd 正確管理,我們需要支持優(yōu)雅關(guān)閉和健康端點。
1. Spring Boot 健康端點(pom.xml)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>2. application-prod.yml 配置
server:
port: 8080
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: always3. 自定義健康檢查(可選)
package com.example.myapp.health;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public class DatabaseHealthIndicator implements HealthIndicator {
@Override
public Health health() {
try {
// 模擬數(shù)據(jù)庫連接測試
Thread.sleep(100); // 避免過快響應(yīng)
return Health.up().withDetail("database", "connected").build();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return Health.down().withDetail("error", "interrupted").build();
}
}
}4. 優(yōu)雅關(guān)閉(Spring Boot 2.3+ 默認(rèn)支持)
在 application.yml 中:
spring:
lifecycle:
timeout-per-shutdown-phase: 30s這樣,當(dāng)你執(zhí)行 systemctl stop myapp,Spring Boot 會等待 30 秒,讓正在處理的請求完成后再關(guān)閉。
與 Docker 的區(qū)別
有人會問:既然有 Docker,為什么還要用 systemd?
| 場景 | systemd | Docker |
|---|---|---|
| 部署方式 | 原生進(jìn)程 | 容器化 |
| 啟動速度 | 快(無虛擬化開銷) | 較慢(需啟動容器) |
| 資源占用 | 低 | 高(容器運行時) |
| 日志管理 | journalctl 統(tǒng)一 | docker logs |
| 配置復(fù)雜度 | 中等 | 高(需編寫 Dockerfile、docker-compose) |
| 適用場景 | 虛擬機、物理機 | 微服務(wù)、K8s、CI/CD |
建議:如果你的服務(wù)器是裸機或云主機(非 K8s),優(yōu)先使用 systemd。它更輕量、更穩(wěn)定、更易調(diào)試。
自動化腳本:一鍵部署 Nginx + Java 應(yīng)用
下面是一個 Bash 腳本,可一鍵完成 Nginx 和 Java 應(yīng)用的部署與自啟動配置:
#!/bin/bash
# deploy-nginx-java.sh
set -e # 遇錯即停
echo "?? 開始部署 Nginx + Java 應(yīng)用..."
# 1. 安裝 Nginx
if ! command -v nginx &> /dev/null; then
echo "?? 安裝 Nginx..."
sudo apt update
sudo apt install -y nginx
fi
# 2. 創(chuàng)建 Java 應(yīng)用用戶
if ! id "appuser" &>/dev/null; then
echo "?? 創(chuàng)建運行用戶..."
sudo groupadd appgroup
sudo useradd -g appgroup -s /bin/false appuser
fi
# 3. 創(chuàng)建應(yīng)用目錄
APP_DIR="/opt/myapp"
mkdir -p $APP_DIR
echo "?? 創(chuàng)建應(yīng)用目錄: $APP_DIR"
# 4. 復(fù)制 JAR 文件(請?zhí)鎿Q為你的實際路徑)
cp ./myapp.jar $APP_DIR/
chown appuser:appgroup $APP_DIR/myapp.jar
# 5. 創(chuàng)建 Java 服務(wù)文件
cat > /etc/systemd/system/myapp.service <<EOF
[Unit]
Description=My Java Spring Boot Application
After=network.target
Wants=network.target
[Service]
User=appuser
Group=appgroup
WorkingDirectory=$APP_DIR
ExecStart=/usr/bin/java -jar -Dspring.profiles.active=prod -Xms512m -Xmx1024m -XX:+UseG1GC myapp.jar
Restart=always
RestartSec=10s
StandardOutput=journal
StandardError=journal
Environment=JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom
[Install]
WantedBy=multi-user.target
EOF
# 6. 創(chuàng)建 Nginx 配置
cat > /etc/nginx/conf.d/myapp.conf <<EOF
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/myapp-access.log;
error_log /var/log/nginx/myapp-error.log;
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;
}
location /actuator/ {
proxy_pass http://127.0.0.1:8080/actuator/;
allow 127.0.0.1;
deny all;
}
}
EOF
# 7. 重載 systemd 和 Nginx
echo "?? 重載 systemd 配置..."
sudo systemctl daemon-reload
echo "? 啟用服務(wù)..."
sudo systemctl enable nginx
sudo systemctl enable myapp
echo "?? 啟動服務(wù)..."
sudo systemctl start nginx
sudo systemctl start myapp
# 8. 檢查狀態(tài)
echo "?? 檢查服務(wù)狀態(tài)..."
systemctl status nginx --no-pager
systemctl status myapp --no-pager
echo "? 部署完成!訪問 http://$(curl -s ifconfig.me) 查看應(yīng)用"
將此腳本保存為 deploy.sh,賦予執(zhí)行權(quán)限 chmod +x deploy.sh,即可一鍵部署。
安全加固建議
1. 防止 Nginx 被暴力 破解
# 在 nginx.conf 的 http 塊中添加 limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; limit_req zone=api burst=20 nodelay;
2. 禁用不必要的模塊
nginx -V 2>&1 | grep -i modules
移除不需要的模塊(如 autoindex、ssi),減少攻擊面。
3. 使用非標(biāo)準(zhǔn)端口(可選)
將 Nginx 監(jiān)聽端口從 80 改為 8080,前端加一層云防火墻,降低被掃描風(fēng)險。
4. 定期更新
sudo apt update && sudo apt upgrade nginx
總結(jié):你的服務(wù),值得被認(rèn)真對待
配置 Nginx 開機自啟動,不是“多一步操作”,而是對系統(tǒng)穩(wěn)定性的承諾。
- 你寫的一行
systemctl enable nginx,可能是客戶凌晨三點不投訴的關(guān)鍵; - 你多加的一句
Restart=always,可能是服務(wù)器宕機后自動恢復(fù)的救命稻草; - 你創(chuàng)建的
myapp.service,是你作為工程師專業(yè)性的體現(xiàn)。
真正的 DevOps 不是會寫腳本,而是知道為什么寫。
記住這句話:“一個沒有自啟動的服務(wù),不是高可用的服務(wù),只是幸運的服務(wù)。”
最后:測試你的配置是否真的生效
終極測試方法:
- 執(zhí)行
sudo reboot - 等待 2 分鐘
- 用手機或另一臺機器訪問你的網(wǎng)站
- 如果頁面正常加載,恭喜你!
- 如果沒加載?立刻登錄服務(wù)器,執(zhí)行:
journalctl -u nginx --since "1 minute ago" journalctl -u myapp --since "1 minute ago"
找出問題,修正,再測試。
你已經(jīng)掌握了 Linux 服務(wù)管理的核心技能。從今天起,你不再是“只會敲命令”的運維,而是懂原理、能設(shè)計、可交付的系統(tǒng)工程師。
附錄:常用命令速查表
| 命令 | 作用 |
|---|---|
systemctl status nginx | 查看服務(wù)狀態(tài) |
systemctl enable nginx | 開機自啟動 |
systemctl disable nginx | 取消開機自啟動 |
systemctl start nginx | 啟動服務(wù) |
systemctl stop nginx | 停止服務(wù) |
systemctl reload nginx | 重載配置(不中斷連接) |
systemctl restart nginx | 重啟服務(wù)(中斷連接) |
systemctl daemon-reload | 重載 systemd 配置(修改 .service 后必做) |
journalctl -u nginx -f | 實時查看日志 |
nginx -t | 檢查配置語法 |
ss -tlnp | grep :80 | 查看 80 端口占用 |
systemctl is-enabled nginx | 檢查是否已啟用自啟動 |
以上就是一文帶你搞懂如何設(shè)置Nginx開機自啟動(systemd 方式)的詳細(xì)內(nèi)容,更多關(guān)于Nginx開機自啟動的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
NGINX 配置內(nèi)網(wǎng)訪問的實現(xiàn)步驟
本文主要介紹了NGINX 配置內(nèi)網(wǎng)訪問的實現(xiàn)步驟,Nginx的geo模塊限制域名訪問權(quán)限,僅允許內(nèi)網(wǎng)/辦公室IP訪問,具有一定的參考價值,感興趣的可以了解一下2025-05-05
詳解Nginx + Tomcat 反向代理 負(fù)載均衡 集群 部署指南
Nginx是一種服務(wù)器軟件,也是一種高性能的http和反向代理服務(wù)器,本篇文章主要介紹了Nginx + Tomcat 反向代理 負(fù)載均衡 集群 部署指南,有興趣的可以了解一下。2016-12-12
Nginx+SSL+Node.js運行環(huán)境配置教程
這篇文章主要介紹了Nginx+SSL+Node.js運行環(huán)境配置教程,本文用反向代理的方式代理基于Node.js的Web應(yīng)用,需要的朋友可以參考下2014-09-09

