最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你搞懂如何設(shè)置Nginx開機(jī)自啟動(dòng)(systemd 方式)

 更新時(shí)間:2026年07月08日 09:20:33   作者:知遠(yuǎn)漫談  
本文將帶你從零開始,深入理解 systemd 的工作原理,手把手教你配置 Nginx 開機(jī)自啟動(dòng),并結(jié)合真實(shí) Java 應(yīng)用場(chǎng)景,演示如何構(gòu)建一個(gè)“Nginx + Spring Boot + MySQL”的完整高可用架構(gòu),有需要的可以了解下

在現(xiàn)代 Linux 服務(wù)器運(yùn)維中,Nginx 作為高性能的 Web 服務(wù)器和反向代理,早已成為不可或缺的核心組件。無論是部署 Java Web 應(yīng)用、靜態(tài)資源服務(wù),還是作為 API 網(wǎng)關(guān),Nginx 都以其輕量、穩(wěn)定、高并發(fā)的特性贏得了開發(fā)與運(yùn)維團(tuán)隊(duì)的廣泛信賴。然而,一個(gè)看似簡(jiǎn)單的問題常常被忽視:當(dāng)服務(wù)器重啟后,Nginx 是否能自動(dòng)恢復(fù)運(yùn)行?

答案是:不能默認(rèn)自動(dòng)啟動(dòng),除非你明確配置了開機(jī)自啟動(dòng)機(jī)制。在傳統(tǒng) SysV init 系統(tǒng)時(shí)代,我們通過 chkconfigupdate-rc.d 來管理服務(wù);而在當(dāng)今主流的 Linux 發(fā)行版(如 CentOS 7+、Ubuntu 16.04+、Debian 9+)中,systemd 已成為標(biāo)準(zhǔn)的系統(tǒng)和服務(wù)管理器。掌握如何使用 systemd 配置 Nginx 開機(jī)自啟動(dòng),不僅是運(yùn)維的基本功,更是保障服務(wù)高可用性的關(guān)鍵一步。

本文將帶你從零開始,深入理解 systemd 的工作原理,手把手教你配置 Nginx 開機(jī)自啟動(dòng),并結(jié)合真實(shí) Java 應(yīng)用場(chǎng)景,演示如何構(gòu)建一個(gè)“Nginx + Spring Boot + MySQL”的完整高可用架構(gòu)。我們將通過代碼示例、架構(gòu)圖、配置解析和故障排查技巧,讓你不僅“會(huì)配置”,更“懂原理”。

為什么需要開機(jī)自啟動(dòng)?

想象一下這樣一個(gè)場(chǎng)景:

你是一名 Java 開發(fā)工程師,負(fù)責(zé)公司核心業(yè)務(wù)系統(tǒng)的部署。你精心優(yōu)化了 Spring Boot 應(yīng)用的性能,配置了數(shù)據(jù)庫(kù)連接池、線程池、緩存策略,甚至使用了 Prometheus + Grafana 做了全鏈路監(jiān)控。一切看起來完美無缺。

直到某天深夜,機(jī)房突發(fā)斷電,服務(wù)器意外關(guān)機(jī)。第二天早上,運(yùn)維同事發(fā)現(xiàn):

  • 數(shù)據(jù)庫(kù)服務(wù)已自動(dòng)恢復(fù)(因?yàn)榕渲昧?systemd 自啟動(dòng));
  • Redis 緩存也正常運(yùn)行;
  • 但你的 Java 應(yīng)用無法訪問 —— 因?yàn)樗蕾嚨?Nginx 沒有啟動(dòng)!

用戶投訴:“網(wǎng)站打不開!”

產(chǎn)品經(jīng)理追問:“為什么上次升級(jí)后總是出問題?”

你只能無奈地登錄服務(wù)器,手動(dòng)執(zhí)行:

sudo systemctl start nginx

然后默默在心里記下:“下次一定要配置開機(jī)自啟。”

這不是技術(shù)問題,這是責(zé)任心問題。一個(gè)沒有自啟動(dòng)能力的服務(wù),就像一輛沒有自動(dòng)點(diǎn)火的跑車——再快,也得靠人推。

小貼士:在生產(chǎn)環(huán)境中,任何核心服務(wù)(Nginx、Java 應(yīng)用、Redis、MySQL、RabbitMQ)都必須配置開機(jī)自啟動(dòng)。這是 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)勢(shì)包括:

  • 并行啟動(dòng)服務(wù):不再像 SysV 那樣串行啟動(dòng),大幅提升開機(jī)速度;
  • 依賴管理:服務(wù)之間可以聲明依賴關(guān)系,比如“Nginx 依賴網(wǎng)絡(luò)和 MySQL”;
  • 日志統(tǒng)一管理:通過 journalctl 統(tǒng)一查看所有服務(wù)日志;
  • 資源控制:可限制 CPU、內(nèi)存、文件句柄等資源;
  • 進(jìn)程監(jiān)控:自動(dòng)重啟崩潰的服務(wù);
  • 靈活的單元配置:通過 .service 文件定義服務(wù)行為。

systemd 的核心概念

概念說明
Unitsystemd 管理的基本對(duì)象,如服務(wù)(service)、套接字(socket)、目標(biāo)(target)等
Service Unit描述一個(gè)后臺(tái)服務(wù)的配置文件,擴(kuò)展名為 .service
Target類似于運(yùn)行級(jí)別(runlevel),如 multi-user.target 相當(dāng)于傳統(tǒng) runlevel 3
Wants / Requires服務(wù)之間的依賴聲明方式,Wants 是弱依賴,Requires 是強(qiáng)依賴
ExecStart啟動(dòng)服務(wù)時(shí)執(zhí)行的命令
Restart服務(wù)崩潰后是否自動(dòng)重啟,如 always, on-failure

檢查當(dāng)前 Nginx 狀態(tài)

在配置自啟動(dòng)之前,我們先確認(rèn)當(dāng)前 Nginx 的運(yùn)行狀態(tài)。

1. 查看 Nginx 是否已安裝

which nginx
# 輸出示例:/usr/sbin/nginx

nginx -v
# 輸出示例:nginx version: nginx/1.24.0

如果未安裝,請(qǐng)先安裝:

# 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 是否正在運(yùn)行

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è)置為開機(jī)自啟(enabled 表示是,disabled 表示否)
  • Active:當(dāng)前是否運(yùn)行
  • Main PID:主進(jìn)程 ID

3. 查看服務(wù)單元文件位置

systemctl show nginx --property=UnitFileState
# 輸出:UnitFileState=enabled

systemctl cat nginx

systemctl cat nginx 會(huì)顯示服務(wù)文件的完整內(nèi)容,通常位于:

/lib/systemd/system/nginx.service

Nginx 默認(rèn)服務(wù)文件解析

運(yùn)行 systemctl cat nginx,你可能會(huì)看到類似如下內(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ù)啟動(dòng)后才啟動(dòng)。這是非常關(guān)鍵的一行!如果沒有它,Nginx 可能在網(wǎng)絡(luò)未就緒時(shí)嘗試綁定端口 80,導(dǎo)致啟動(dòng)失敗。

注意:network.target 并不等于“網(wǎng)絡(luò)完全可用”。它只表示網(wǎng)絡(luò)接口已激活。對(duì)于依賴 DNS 解析的服務(wù),建議使用 network-online.target(需 systemd-networkd-wait-online.service 支持)。

2.[Service]部分

  • Type=forking:Nginx 啟動(dòng)時(shí)會(huì) fork 一個(gè)子進(jìn)程作為 master,父進(jìn)程退出。這與 Type=simple(直接運(yùn)行主進(jìn)程)不同。
  • PIDFile:指定 PID 文件路徑,systemd 通過此文件追蹤主進(jìn)程。
  • ExecStartPre:?jiǎn)?dòng)前執(zhí)行的命令,常用于配置文件語(yǔ)法檢查(nginx -t)。
  • ExecStart:實(shí)際啟動(dòng)命令。
  • ExecReload:重載配置命令。
  • ExecStop:停止命令。
  • PrivateTmp=true:為服務(wù)創(chuàng)建獨(dú)立的臨時(shí)目錄,提高安全性。

3.[Install]部分

WantedBy=multi-user.target:表示當(dāng)系統(tǒng)進(jìn)入多用戶模式(即正常登錄狀態(tài))時(shí),啟動(dòng)此服務(wù)。

你可能注意到:默認(rèn)的 Nginx 服務(wù)文件已經(jīng)配置了開機(jī)自啟!那為什么我們還要寫這篇文章?

因?yàn)?mdash;—很多情況下,這個(gè)服務(wù)文件被誤刪、被覆蓋、或被禁用。尤其是在使用非官方包(如源碼編譯安裝)、Docker 容器、或云平臺(tái)鏡像時(shí),systemd 單元文件可能缺失或未啟用。

手動(dòng)啟用 Nginx 開機(jī)自啟動(dòng)

如果你發(fā)現(xiàn) systemctl status nginx 顯示 Enabled: disabled,或服務(wù)文件缺失,你需要手動(dòng)啟用。

步驟 1:確認(rèn)服務(wù)文件存在

ls -l /lib/systemd/system/nginx.service
# 或
ls -l /etc/systemd/system/nginx.service

如果文件不存在,你需要?jiǎng)?chuàng)建它。

步驟 2:創(chuàng)建或修復(fù) nginx.service 文件

使用編輯器創(chuàng)建服務(wù)文件:

sudo nano /etc/systemd/system/nginx.service

粘貼以下內(nèi)容(推薦版本,兼容性強(qiáng)):

[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)點(diǎn)說明

項(xiàng)目說明
After=network.target network-online.target更嚴(yán)格地等待網(wǎng)絡(luò)完全可用,避免啟動(dòng)失敗
Wants=network-online.target聲明弱依賴,提高啟動(dòng)可靠性
Restart=on-failure服務(wù)異常退出時(shí)自動(dòng)重啟,提升可用性
RestartSec=5s重啟前等待 5 秒,避免頻繁重啟導(dǎo)致系統(tǒng)負(fù)載飆升
LimitNOFILE=100000提高文件描述符限制,避免高并發(fā)下“Too many open files”錯(cuò)誤

重要提醒:如果你是使用源碼編譯安裝的 Nginx(非 apt/yum 安裝),請(qǐng)確保 ExecStart、ExecStartPre 中的路徑指向你實(shí)際安裝的 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 不會(huì)讀取新配置。

步驟 4:?jiǎn)⒂瞄_機(jī)自啟動(dòng)

sudo systemctl enable nginx

輸出:

Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /etc/systemd/system/nginx.service.

步驟 5:驗(yàn)證是否啟用成功

systemctl is-enabled nginx
# 輸出:enabled

步驟 6:?jiǎn)?dòng) Nginx(如果未運(yùn)行)

sudo systemctl start nginx

步驟 7:設(shè)置開機(jī)啟動(dòng)日志記錄(可選)

為了便于排查啟動(dòng)失敗問題,建議開啟 systemd 日志持久化:

sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald

之后你可以用 journalctl 查看 Nginx 啟動(dòng)日志:

journalctl -u nginx --since today

實(shí)戰(zhàn):Java 應(yīng)用 + Nginx 高可用架構(gòu)設(shè)計(jì)

現(xiàn)在我們進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)。假設(shè)你有一個(gè) Spring Boot Java 應(yīng)用,部署在一臺(tái) CentOS 服務(wù)器上,需要通過 Nginx 作為反向代理對(duì)外提供服務(wù),并確保服務(wù)器重啟后,Nginx 和 Java 應(yīng)用都能自動(dòng)啟動(dòng)

架構(gòu)圖示意(Mermaid)

這是一個(gè)典型的微服務(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)建運(yùn)行用戶(安全最佳實(shí)踐)

sudo groupadd appgroup
sudo useradd -g appgroup -s /bin/false appuser
sudo chown -R appuser:appgroup /opt/myapp

安全提示:永遠(yuǎn)不要用 root 用戶運(yùn)行 Java 應(yīng)用!這是重大安全隱患。

3. 啟用并啟動(dòng) Java 服務(wù)

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp

4. 檢查 Java 應(yīng)用是否運(yùn)行

sudo systemctl status myapp
journalctl -u myapp -f  # 實(shí)時(shí)查看日志

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 防止長(zhǎng)連接超時(shí)。

6. 測(cè)試 Nginx 配置并重載

sudo nginx -t
sudo systemctl reload nginx

7. 驗(yàn)證服務(wù)鏈路

curl -I http://localhost
# 應(yīng)該返回 200 OK

curl http://localhost/actuator/health
# 應(yīng)該返回 {"status":"UP"}

高級(jí)技巧:服務(wù)依賴順序與啟動(dòng)延遲

在復(fù)雜系統(tǒng)中,服務(wù)之間存在依賴關(guān)系。例如:

  • Nginx 依賴網(wǎng)絡(luò)
  • Java 應(yīng)用依賴 Nginx(反向代理)
  • Java 應(yīng)用依賴 MySQL(數(shù)據(jù)庫(kù)連接)

Java 應(yīng)用不應(yīng)該依賴 Nginx!因?yàn)?Nginx 是反向代理,它只是轉(zhuǎn)發(fā)請(qǐng)求,Java 應(yīng)用本身不需要 Nginx 才能運(yùn)行。正確的依賴關(guān)系是:

  • Java 應(yīng)用 → MySQL / Redis
  • Nginx → Java 應(yīng)用(通過網(wǎng)絡(luò)訪問)

但有時(shí),我們希望“Nginx 啟動(dòng)后,再啟動(dòng) Java 應(yīng)用”,比如為了防止用戶在 Java 未就緒時(shí)訪問到 502 錯(cuò)誤。

方法一:使用Wants+After(推薦)

[Unit]
Description=My Java Spring Boot Application
After=network.target mysql.service redis.service
Wants=mysql.service redis.service
[Service]
...

這樣,系統(tǒng)會(huì)確保 MySQL 和 Redis 啟動(dòng)后,再啟動(dòng) Java 應(yīng)用。

方法二:使用ExecStartPre延遲啟動(dòng)(模擬等待)

如果你的 Java 應(yīng)用需要等待 Nginx 完全啟動(dòng)(比如注冊(cè)到服務(wù)發(fā)現(xiàn)),可以添加一個(gè)等待腳本:

[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

注意:這種方式會(huì)延長(zhǎng)啟動(dòng)時(shí)間,僅在必要時(shí)使用。

方法三:使用 systemd 的socket activation(進(jìn)階)

你可以讓 systemd 監(jiān)聽 80 端口,當(dāng)?shù)谝粋€(gè)請(qǐng)求到來時(shí)才啟動(dòng) Java 應(yīng)用。但 Nginx 通常不推薦這樣用,因?yàn)?Nginx 本身需要常駐監(jiān)聽。

故障排查指南

即使配置了開機(jī)自啟動(dòng),服務(wù)仍可能啟動(dòng)失敗。以下是常見問題和解決方案。

1. 啟動(dòng)失?。篔ob for nginx.service failed

sudo systemctl status nginx

常見錯(cuò)誤:

錯(cuò)誤 1:端口被占用

bind() to 0.0.0.0:80 failed (98: Address already in use)

解決:

sudo ss -tlnp | grep :80
# 查看哪個(gè)進(jìn)程占用了 80 端口
sudo kill -9 <PID>
# 或修改 nginx 監(jiān)聽端口為 8080 測(cè)試

錯(cuò)誤 2:配置文件語(yǔ)法錯(cuò)誤

nginx: [emerg] unknown directive "xxx" in /etc/nginx/nginx.conf:xx

解決:

sudo nginx -t
# 會(huì)精確指出錯(cuò)誤行

錯(cuò)誤 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

錯(cuò)誤 4:Java 應(yīng)用啟動(dò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

# 實(shí)時(shí)跟蹤日志
journalctl -u nginx -f

# 查看啟動(dòng)時(shí)所有事件(包括失?。?
journalctl -b -u nginx

# 查看特定時(shí)間范圍
journalctl -u nginx --since "2024-03-18 08:00:00" --until "2024-03-18 09:00:00"

3. 服務(wù)未啟動(dòng)但狀態(tài)顯示“active”

有時(shí)服務(wù)狀態(tài)是 active (running),但你訪問 80 端口卻返回 502 或超時(shí)。

原因:Nginx 啟動(dòng)了,但后端 Java 應(yīng)用沒啟動(dòng)!

解決方案:

systemctl status myapp
# 如果是 inactive,說明 Java 應(yīng)用沒起來

journalctl -u myapp --since "1 hour ago"
# 查看 Java 應(yīng)用啟動(dòng)日志

最佳實(shí)踐清單

類別推薦做法
服務(wù)文件位置優(yōu)先使用 /etc/systemd/system/ 而非 /lib/systemd/system/,避免被包管理器覆蓋
用戶權(quán)限Java 應(yīng)用使用非 root 用戶運(yùn)行
日志管理使用 journalctl 統(tǒng)一收集日志,不要依賴傳統(tǒng) log 文件
重啟策略設(shè)置 Restart=alwaysRestart=on-failure
資源限制設(shè)置 LimitNOFILE=100000,避免高并發(fā)下文件句柄耗盡
健康檢查Java 應(yīng)用暴露 /actuator/health,Nginx 可配合 upstream 做健康探測(cè)
配置測(cè)試修改 Nginx 配置后,永遠(yuǎn)先執(zhí)行 nginx -t
自動(dòng)化部署使用 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)閉健康端點(diǎn)。

1. Spring Boot 健康端點(diǎn)(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: always

3. 自定義健康檢查(可選)

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ù)庫(kù)連接測(cè)試
            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 會(huì)等待 30 秒,讓正在處理的請(qǐng)求完成后再關(guān)閉。

與 Docker 的區(qū)別

有人會(huì)問:既然有 Docker,為什么還要用 systemd?

場(chǎng)景systemdDocker
部署方式原生進(jìn)程容器化
啟動(dòng)速度快(無虛擬化開銷)較慢(需啟動(dòng)容器)
資源占用高(容器運(yùn)行時(shí))
日志管理journalctl 統(tǒng)一docker logs
配置復(fù)雜度中等高(需編寫 Dockerfile、docker-compose)
適用場(chǎng)景虛擬機(jī)、物理機(jī)微服務(wù)、K8s、CI/CD

建議:如果你的服務(wù)器是裸機(jī)或云主機(jī)(非 K8s),優(yōu)先使用 systemd。它更輕量、更穩(wěn)定、更易調(diào)試。

自動(dòng)化腳本:一鍵部署 Nginx + Java 應(yīng)用

下面是一個(gè) Bash 腳本,可一鍵完成 Nginx 和 Java 應(yīng)用的部署與自啟動(dòng)配置:

#!/bin/bash
# deploy-nginx-java.sh

set -e  # 遇錯(cuò)即停

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)建運(yùn)行用戶..."
    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 文件(請(qǐng)?zhí)鎿Q為你的實(shí)際路徑)
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 "?? 啟動(dòng)服務(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)險(xiǎn)。

4. 定期更新

sudo apt update && sudo apt upgrade nginx

總結(jié):你的服務(wù),值得被認(rèn)真對(duì)待

配置 Nginx 開機(jī)自啟動(dòng),不是“多一步操作”,而是對(duì)系統(tǒng)穩(wěn)定性的承諾。

  • 你寫的一行 systemctl enable nginx,可能是客戶凌晨三點(diǎn)不投訴的關(guān)鍵;
  • 你多加的一句 Restart=always,可能是服務(wù)器宕機(jī)后自動(dòng)恢復(fù)的救命稻草;
  • 你創(chuàng)建的 myapp.service,是你作為工程師專業(yè)性的體現(xiàn)。

真正的 DevOps 不是會(huì)寫腳本,而是知道為什么寫。

記住這句話“一個(gè)沒有自啟動(dòng)的服務(wù),不是高可用的服務(wù),只是幸運(yùn)的服務(wù)。”

最后:測(cè)試你的配置是否真的生效

終極測(cè)試方法

  1. 執(zhí)行 sudo reboot
  2. 等待 2 分鐘
  3. 用手機(jī)或另一臺(tái)機(jī)器訪問你的網(wǎng)站
  4. 如果頁(yè)面正常加載,恭喜你!
  5. 如果沒加載?立刻登錄服務(wù)器,執(zhí)行:
journalctl -u nginx --since "1 minute ago"
journalctl -u myapp --since "1 minute ago"

找出問題,修正,再測(cè)試。

你已經(jīng)掌握了 Linux 服務(wù)管理的核心技能。從今天起,你不再是“只會(huì)敲命令”的運(yùn)維,而是懂原理、能設(shè)計(jì)、可交付的系統(tǒng)工程師。

附錄:常用命令速查表

命令作用
systemctl status nginx查看服務(wù)狀態(tài)
systemctl enable nginx開機(jī)自啟動(dòng)
systemctl disable nginx取消開機(jī)自啟動(dòng)
systemctl start nginx啟動(dòng)服務(wù)
systemctl stop nginx停止服務(wù)
systemctl reload nginx重載配置(不中斷連接)
systemctl restart nginx重啟服務(wù)(中斷連接)
systemctl daemon-reload重載 systemd 配置(修改 .service 后必做)
journalctl -u nginx -f實(shí)時(shí)查看日志
nginx -t檢查配置語(yǔ)法
ss -tlnp | grep :80查看 80 端口占用
systemctl is-enabled nginx檢查是否已啟用自啟動(dòng)

以上就是一文帶你搞懂如何設(shè)置Nginx開機(jī)自啟動(dòng)(systemd 方式)的詳細(xì)內(nèi)容,更多關(guān)于Nginx開機(jī)自啟動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Rhit高效可視化Nginx日志查看工具

    Rhit高效可視化Nginx日志查看工具

    一個(gè)格式化 Nginx 日志,可快速閱讀、查看 Nginx 日志的工具。 可以每秒處理百萬行日志數(shù)據(jù),感興趣的可以了解一下
    2021-10-10
  • Nginx中防止SQL注入攻擊的相關(guān)配置介紹

    Nginx中防止SQL注入攻擊的相關(guān)配置介紹

    這篇文章主要介紹了Nginx中防止SQL注入攻擊的相關(guān)配置介紹,文中提到的基本思路為將過濾的情況用rewrite重訂向到404頁(yè)面,需要的朋友可以參考下
    2016-01-01
  • 文件上傳到服務(wù)器文件名中文亂碼問題

    文件上傳到服務(wù)器文件名中文亂碼問題

    上傳附件到部署服務(wù)器,但是上傳到服務(wù)器出現(xiàn)文件名中文亂碼,中文變成(?)問號(hào),而且在本地測(cè)試是正常的,通過打印日志發(fā)現(xiàn),下面fileName亂碼,本文給大家講解文件上傳到服務(wù)器文件名中文亂碼問題解決方案,感興趣的朋友一起看看吧
    2024-02-02
  • NGINX 配置內(nèi)網(wǎng)訪問的實(shí)現(xiàn)步驟

    NGINX 配置內(nèi)網(wǎng)訪問的實(shí)現(xiàn)步驟

    本文主要介紹了NGINX 配置內(nèi)網(wǎng)訪問的實(shí)現(xiàn)步驟,Nginx的geo模塊限制域名訪問權(quán)限,僅允許內(nèi)網(wǎng)/辦公室IP訪問,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-05-05
  • Nginx如何配置負(fù)載均衡

    Nginx如何配置負(fù)載均衡

    這篇文章主要介紹了Nginx如何配置負(fù)載均衡,幫助大家更好的理解和學(xué)習(xí)使用Nginx,感興趣的朋友可以了解下
    2021-03-03
  • 詳解Nginx + Tomcat 反向代理 負(fù)載均衡 集群 部署指南

    詳解Nginx + Tomcat 反向代理 負(fù)載均衡 集群 部署指南

    Nginx是一種服務(wù)器軟件,也是一種高性能的http和反向代理服務(wù)器,本篇文章主要介紹了Nginx + Tomcat 反向代理 負(fù)載均衡 集群 部署指南,有興趣的可以了解一下。
    2016-12-12
  • Nginx+SSL+Node.js運(yùn)行環(huán)境配置教程

    Nginx+SSL+Node.js運(yùn)行環(huán)境配置教程

    這篇文章主要介紹了Nginx+SSL+Node.js運(yùn)行環(huán)境配置教程,本文用反向代理的方式代理基于Node.js的Web應(yīng)用,需要的朋友可以參考下
    2014-09-09
  • nginx緩存頁(yè)面后 串會(huì)話問題的解決方法

    nginx緩存頁(yè)面后 串會(huì)話問題的解決方法

    nginx支持頁(yè)面緩存,之前我的博客有介紹配置方案,昨天出了一個(gè)詭異的問題,別人的機(jī)器登錄后,我的機(jī)器打開應(yīng)用的首頁(yè)會(huì)出現(xiàn)別人的用戶信息,也就是說我的瀏覽器訪問的應(yīng)用會(huì)話其實(shí)是別人的會(huì)話
    2013-06-06
  • Nginx中輪詢機(jī)制的實(shí)現(xiàn)

    Nginx中輪詢機(jī)制的實(shí)現(xiàn)

    Nginx是一款優(yōu)秀的Web服務(wù)器和反向代理服務(wù)器,本文主要介紹了Nginx中最基本的輪詢機(jī)制的原理、配置及其優(yōu)化方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10
  • HipChat上傳文件報(bào)未知錯(cuò)誤的原因分析及解決方案

    HipChat上傳文件報(bào)未知錯(cuò)誤的原因分析及解決方案

    HipChat的功能類似于Campfire、Sazneo等在線協(xié)同工具,并且和Yammer以及Salesforce的Chatter等企業(yè)社交平臺(tái)有一定相似之處。你可以為單個(gè)項(xiàng)目或者小組搭建自有的聊天室,也可以很方便的發(fā)起一對(duì)一聊天
    2016-01-01

最新評(píng)論

沧源| 彭阳县| 勃利县| 铁岭市| 五台县| 大姚县| 舞阳县| 陆良县| 涟水县| 阳春市| 新营市| 吴堡县| 沿河| 徐州市| 宜都市| 施甸县| 镇沅| 玛多县| 沭阳县| 漳浦县| 方城县| 道真| 比如县| 玛沁县| 新郑市| 揭东县| 五莲县| 江陵县| 丰台区| 长白| 巴里| 巧家县| 任丘市| 曲沃县| 平舆县| 宜君县| 泊头市| 株洲县| 卢氏县| 宜州市| 海宁市|