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

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

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

在現(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)時代,我們通過 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 開機自啟動,不僅是運維的基本功,更是保障服務(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 的核心概念

概念說明
Unitsystemd 管理的基本對象,如服務(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=alwaysRestart=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: 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ù)庫連接測試
            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?

場景systemdDocker
部署方式原生進(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ù)。”

最后:測試你的配置是否真的生效

終極測試方法

  1. 執(zhí)行 sudo reboot
  2. 等待 2 分鐘
  3. 用手機或另一臺機器訪問你的網(wǎng)站
  4. 如果頁面正常加載,恭喜你!
  5. 如果沒加載?立刻登錄服務(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)文章

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

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

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

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

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

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

    上傳附件到部署服務(wù)器,但是上傳到服務(wù)器出現(xiàn)文件名中文亂碼,中文變成(?)問號,而且在本地測試是正常的,通過打印日志發(fā)現(xiàn),下面fileName亂碼,本文給大家講解文件上傳到服務(wù)器文件名中文亂碼問題解決方案,感興趣的朋友一起看看吧
    2024-02-02
  • NGINX 配置內(nèi)網(wǎng)訪問的實現(xià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如何配置負(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運行環(huán)境配置教程

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

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

    nginx緩存頁面后 串會話問題的解決方法

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

    Nginx中輪詢機制的實現(xiàn)

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

    HipChat上傳文件報未知錯誤的原因分析及解決方案

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

最新評論

南澳县| 鄂托克旗| 嘉鱼县| 团风县| 滦平县| 东城区| 博白县| 石家庄市| 彰武县| 应用必备| 普陀区| 滦平县| 杂多县| 剑川县| 武功县| 石河子市| 介休市| 乐山市| 南乐县| 静海县| 崇州市| 桐柏县| 竹溪县| 建始县| 灵宝市| 伊宁市| 资兴市| 清水河县| 当雄县| 大新县| 沈阳市| 四会市| 德惠市| 花垣县| 玉龙| 胶州市| 赣州市| 集安市| 永新县| 怀仁县| 邳州市|