一文带你快速上手Nginx中启动、停止、重启的常用命令
在现代 Web 架构中,Nginx 已经成为不可或缺的基石组件。无论是作为反向代理、负载均衡器、静态资源服务器,还是 HTTPS 终止点,Nginx 凭借其高性能、低内存占用和高稳定性,赢得了全球开发者与运维团队的青睐。从 Netflix 到 Airbnb,从阿里巴巴到腾讯,无数大型平台背后都运行着 Nginx 的身影。
本文将带你从零开始,系统掌握 Nginx 的核心操作命令——启动、停止、重启、重载配置,并深入理解其背后的运行机制。你将不仅学会“怎么做”,更懂得“为什么这么做”。同时,我们将结合 Java Web 应用场景,通过真实代码示例展示 Nginx 如何与 Spring Boot 应用协同工作,实现高效部署与流量调度。文末还将提供可访问的外部资源链接,帮助你进一步拓展知识边界。
无论你是刚接触运维的 Java 开发者,还是希望优化生产环境的 DevOps 工程师,本文都将为你提供一份清晰、实用、可立即落地的操作指南。让我们开启这段高效、稳定、优雅的 Nginx 之旅吧!

一、Nginx 是什么?为什么它如此重要
Nginx(发音为 “engine-x”)是一个开源的高性能 HTTP 服务器和反向代理服务器,同时也支持 IMAP/POP3 代理服务。它由俄罗斯程序员 Igor Sysoev 于 2004 年开发,初衷是解决 C10K 问题——即如何在单台服务器上同时处理一万并发连接。
传统 Web 服务器(如 Apache)采用“多进程/多线程”模型,每个连接都需要一个独立的进程或线程来处理,当并发量激增时,系统资源(内存、CPU)迅速耗尽,导致性能急剧下降。而 Nginx 采用事件驱动、异步非阻塞架构,单个进程即可高效处理成千上万的并发连接,资源消耗极低。
Nginx 的核心优势
| 特性 | 说明 |
|---|---|
| 高性能 | 单进程处理数万并发,响应延迟低 |
| 低资源占用 | 内存占用仅为 Apache 的 1/5~1/10 |
| 反向代理 | 可将请求转发至后端多个应用服务器 |
| 负载均衡 | 支持轮询、加权、IP哈希、最少连接等策略 |
| SSL/TLS 终止 | 解决后端应用的加密负担 |
| 静态资源服务 | 高效缓存图片、CSS、JS 等静态文件 |
| 模块化扩展 | 可通过第三方模块增强功能(如 Lua、Gzip、缓存) |
Nginx 在 Java 应用中的典型角色
在典型的 Java Web 架构中,Nginx 常作为:
- 反向代理:接收外部请求,转发给后端多个 Spring Boot 实例
- 负载均衡器:在多个 Java 服务实例间分发流量,提升可用性
- 静态资源服务器:缓存前端资源(HTML/CSS/JS),减轻后端压力
- SSL 终止点:处理 HTTPS 加解密,后端使用 HTTP 通信,降低 JVM 负担
- 安全网关:限制 IP、防爬虫、限流、防盗链
// 示例:一个简单的 Spring Boot 控制器,用于测试 Nginx 是否正常代理
package com.example.nginxdemo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HealthController {
@GetMapping("/health")
public String healthCheck() {
return "✅ Nginx + Spring Boot is working! Server: " +
System.getenv("HOSTNAME") +
" | Time: " + java.time.LocalDateTime.now();
}
@GetMapping("/info")
public java.util.Map<String, Object> serverInfo() {
java.util.Map<String, Object> info = new java.util.HashMap<>();
info.put("server", System.getProperty("os.name"));
info.put("javaVersion", System.getProperty("java.version"));
info.put("port", System.getenv("SERVER_PORT") != null ? System.getenv("SERVER_PORT") : "8080");
info.put("uptime", java.time.Duration.ofMillis(java.lang.management.ManagementFactory.getRuntimeMXBean().getUptime()).toString());
return info;
}
}当你启动这个 Spring Boot 应用(默认监听 8080),并通过 Nginx 访问 http://your-domain.com/health,Nginx 就会将请求转发到 http://127.0.0.1:8080/health,并把响应返回给客户端。这正是 Nginx 作为反向代理的核心价值所在。
二、Nginx 安装与基本结构
在开始操作命令前,我们必须先确认 Nginx 已正确安装,并了解其基本文件结构。
安装 Nginx(以 Ubuntu 22.04 为例)
# 更新包索引 sudo apt update # 安装 Nginx sudo apt install nginx -y # 启动 Nginx(后续会详解启动命令) sudo systemctl start nginx # 设置开机自启 sudo systemctl enable nginx # 检查状态 sudo systemctl status nginx
安装完成后,访问你的服务器 IP 地址(如 http://your-server-ip),你应该能看到 Nginx 的默认欢迎页面,说明安装成功!
Nginx 目录结构一览
| 路径 | 说明 |
|---|---|
/etc/nginx/ | 主配置目录,所有配置文件存放于此 |
/etc/nginx/nginx.conf | 主配置文件,全局设置 |
/etc/nginx/sites-available/ | 可用站点配置(默认含 default) |
/etc/nginx/sites-enabled/ | 已启用的站点配置(软链接到 sites-available) |
/var/www/html/ | 默认静态文件根目录 |
/var/log/nginx/ | 日志目录(access.log, error.log) |
/usr/sbin/nginx | Nginx 可执行文件路径 |
/etc/init.d/nginx | 传统 SysV 启动脚本(旧系统使用) |
小贴士:sites-available 和 sites-enabled 是 Debian/Ubuntu 系统的惯例,方便你“启用/禁用”站点,而无需删除配置文件。
验证配置文件是否正确
在修改配置后,务必先测试配置语法是否正确,避免重启时服务崩溃!
sudo nginx -t
输出示例:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
如果出现错误,Nginx 会明确指出哪一行有问题,例如:
nginx: [emerg] unknown directive "sssl" in /etc/nginx/sites-enabled/default:15
这时你只需打开对应文件,修正拼写错误即可。
三、Nginx 启动、停止、重启、重载详解
Nginx 的生命周期管理是运维日常的核心任务。掌握正确的命令,能让你在生产环境中游刃有余,避免因误操作导致服务中断。
启动 Nginx —— 让服务跑起来
sudo systemctl start nginx
或使用传统方式(不推荐,仅兼容旧系统):
sudo /etc/init.d/nginx start
或直接调用二进制文件:
sudo nginx
注意:nginx 命令是“启动”而非“重启”。如果 Nginx 已在运行,再次执行 nginx 会启动一个新的进程,导致进程泄漏,应避免!
推荐使用 systemctl,因为它能更好地管理服务状态、依赖关系和日志。
停止 Nginx —— 安全关闭服务
sudo systemctl stop nginx
或:
sudo nginx -s stop
-s stop 是 Nginx 内置的信号控制命令,stop 表示立即停止所有工作进程,不等待当前请求完成。
如果你希望优雅关闭(等待当前请求处理完毕后再退出),请使用:
sudo nginx -s quit
对比:stop vs quit
stop:强制终止,可能导致客户端连接中断,适用于紧急情况quit:优雅退出,等待活跃连接完成,推荐日常使用
重启 Nginx —— 完全重启服务
sudo systemctl restart nginx
或:
sudo nginx -s reload
注意! restart 会先停止再启动,导致短暂的服务中断(通常 1~3 秒)。在生产环境中,尽量避免使用 restart,除非你确实需要完全重置状态(如升级版本、更换 SSL 证书等)。
重载配置(推荐!)—— 无中断更新
这是最重要、最常用的命令!
sudo nginx -s reload
或:
sudo systemctl reload nginx
作用:重新读取配置文件,不中断现有连接,新连接使用新配置,旧连接继续使用旧配置直到完成。
这是 Nginx 最伟大的设计之一!你可以随时修改 nginx.conf 或站点配置,然后执行 reload,服务几乎无感知地更新。
实战演示:动态修改端口并重载
假设你有一个 Spring Boot 应用监听 8080,你想通过 Nginx 把 80 端口的请求转发给它。
编辑配置文件:
sudo nano /etc/nginx/sites-available/default
修改 location / 部分:
server {
listen 80;
server_name your-domain.com;
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;
}
}
启用配置(如果使用 sites-available):
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
测试配置:
sudo nginx -t
重载配置(关键!):
sudo systemctl reload nginx
测试访问:
curl http://localhost
你会看到 Spring Boot 的响应,而无需重启任何 Java 进程!
最佳实践:每次修改配置后,先 nginx -t,再 reload,养成习惯,避免线上事故。
四、Nginx 信号控制机制深度解析
Nginx 使用 Unix 信号(Signals)进行进程控制,这是其高性能和稳定性的底层支撑。
Nginx 进程模型
Nginx 启动后,会创建两个进程:
| 进程类型 | 作用 |
|---|---|
| Master 进程 | 管理 Worker 进程,监听信号,负责重载、重启、日志轮转 |
| Worker 进程 | 实际处理 HTTP 请求,数量由 worker_processes 配置决定 |
ps aux | grep nginx
输出示例:
root 12345 0.0 0.1 12345 6789 ? Ss 10:00 0:00 nginx: master process /usr/sbin/nginx
www-data 12346 0.0 0.2 12456 7890 ? S 10:00 0:00 nginx: worker process
www-data 12347 0.0 0.2 12456 7891 ? S 10:00 0:00 nginx: worker process
Nginx 支持的信号
| 信号 | 命令 | 作用 |
|---|---|---|
TERM, INT | nginx -s stop | 快速停止(立即终止) |
QUIT | nginx -s quit | 优雅退出(等待请求完成) |
HUP | nginx -s reload | 重载配置(推荐) |
USR1 | nginx -s reopen | 重新打开日志文件(用于日志轮转) |
USR2 | nginx -s upgrade | 平滑升级 Nginx 可执行文件(高级用法) |
WINCH | nginx -s stop(配合 QUIT) | 优雅关闭 Worker 进程(不关闭 Master) |
实战:日志轮转(Log Rotation)
生产环境中,access.log 和 error.log 会快速增长。Nginx 本身不自动切割日志,需配合 logrotate 工具。
# 手动触发日志重命名(不重启 Nginx) sudo mv /var/log/nginx/access.log /var/log/nginx/access.log.1 sudo nginx -s reopen
-s reopen 会让 Nginx 关闭当前日志文件句柄,重新打开新文件,旧文件可安全备份或删除。
推荐工具:logrotate 是 Linux 系统标准日志管理工具,Nginx 配置文件通常已内置支持,路径:/etc/logrotate.d/nginx
五、Java 应用与 Nginx 协同实战
现在我们进入最激动人心的部分:让 Java Web 应用与 Nginx 真正协同工作。
场景:部署一个 Spring Boot 应用,通过 Nginx 提供 HTTPS 访问
步骤 1:构建并运行 Spring Boot 应用
// pom.xml 添加必要依赖(确保包含 Web 和 Actuator)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies># application.yml
server:
port: 8080
servlet:
context-path: /
management:
endpoints:
web:
exposure:
include: "*"打包并运行:
mvn clean package java -jar target/nginx-demo-0.0.1-SNAPSHOT.jar
此时访问 http://localhost:8080/health 应返回:
✅ Nginx + Spring Boot is working! Server: ubuntu | Time: 2024-06-15T10:30:00
步骤 2:配置 Nginx 作为反向代理
编辑 /etc/nginx/sites-available/default:
server {
listen 80;
server_name example.com www.example.com;
# 访问日志
access_log /var/log/nginx/app-access.log;
error_log /var/log/nginx/app-error.log;
# 静态资源缓存(可选)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
try_files $uri =404;
}
# API 反向代理
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
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_buffering off;
proxy_read_timeout 60s;
}
# 健康检查端点(可选)
location /health {
proxy_pass http://127.0.0.1:8080/health;
proxy_set_header Host $host;
}
}
为什么设置 proxy_http_version 1.1?
因为 Spring Boot 默认使用 HTTP/1.1,Nginx 默认使用 HTTP/1.0,可能导致连接无法复用,影响性能。
步骤 3:启用站点并重载
sudo ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
步骤 4:测试访问
curl http://localhost/health
# 输出:✅ Nginx + Spring Boot is working! Server: ubuntu | Time: ...
curl http://localhost/info
# 输出:{"server":"Linux","javaVersion":"17.0.10","port":"8080","uptime":"PT2H30M"}
成功标志
通过 curl http://localhost/health 能获取 Java 应用响应
Nginx 日志中出现访问记录:
tail -f /var/log/nginx/app-access.log
输出示例:
127.0.0.1 - - [15/Jun/2024:10:35:22 +0800] "GET /health HTTP/1.1" 200 68 "-" "curl/7.81.0"
Mermaid 图表:Nginx + Java 架构图

这张图展示了 Nginx 如何在多个 Java 实例间做负载均衡,同时缓存静态资源,减轻后端压力。在实际生产环境中,你可能还会接入 Redis 缓存、RabbitMQ 消息队列等,但 Nginx 始终是流量入口的“守门人”。
六、Nginx 高级运维技巧:自动化与监控
掌握基本命令只是起点,真正的运维高手懂得如何自动化、监控和告警。
1. 使用脚本一键部署 Nginx + Java
#!/bin/bash
# deploy-nginx-java.sh
echo "🚀 开始部署 Nginx + Spring Boot 应用..."
# 1. 停止旧服务(优雅退出)
echo "🛑 停止旧版 Java 应用..."
pkill -f "java.*nginx-demo" || echo "没有运行中的 Java 进程"
# 2. 部署新 JAR
echo "📥 部署新版本 JAR..."
cp /opt/deploy/nginx-demo-*.jar /opt/apps/nginx-demo.jar
# 3. 启动 Java 应用
echo "⚡ 启动 Java 应用..."
nohup java -jar /opt/apps/nginx-demo.jar --server.port=8080 > /var/log/nginx-demo.log 2>&1 &
# 4. 检查 Java 是否启动成功
sleep 5
if curl -s http://localhost:8080/health | grep -q "✅"; then
echo "✅ Java 应用启动成功!"
else
echo "❌ Java 应用启动失败!检查日志:tail -f /var/log/nginx-demo.log"
exit 1
fi
# 5. 重载 Nginx 配置
echo "🔄 重载 Nginx 配置..."
sudo nginx -t && sudo systemctl reload nginx
if [ $? -eq 0 ]; then
echo "🎉 Nginx 重载成功!服务已上线!"
curl -s http://localhost/health
else
echo "🚨 Nginx 配置错误!请检查 /etc/nginx/sites-available/default"
exit 1
fi
将此脚本保存为 deploy.sh,在 CI/CD 流程中调用,实现一键发布!
2. 监控 Nginx 状态(Prometheus + Grafana)
你可以在 Nginx 中启用 stub_status 模块,暴露监控指标:
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
访问 http://localhost/nginx_status 输出:
Active connections: 29 server accepts handled requests 12345 12345 123456 Reading: 0 Writing: 1 Waiting: 28
使用 Prometheus + Nginx Exporter 可将这些指标接入 Grafana,实时监控:
- 当前活跃连接数
- 每秒请求数
- 5xx 错误率
- 响应时间分布
3. 日志分析:ELK Stack 实战
Nginx 的 access.log 是宝贵的流量数据源。结合 ELK(Elasticsearch + Logstash + Kibana):
- 统计访问量峰值
- 识别异常 IP(如频繁爬虫)
- 分析用户行为路径
- 触发告警(如 5xx 超过 1%)
# 查看最近 100 条 5xx 错误 grep " 5" /var/log/nginx/access.log | tail -100
七、常见错误与解决方案
即使是最有经验的工程师,也会在 Nginx 配置中踩坑。以下是高频问题清单:
问题 1:bind() to 0.0.0.0:80 failed (98: Address already in use)
原因:80 端口被其他进程占用(如 Apache、另一个 Nginx 实例)
解决:
sudo lsof -i :80 # 输出示例: # COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME # nginx 12345 root 6u IPv4 12345 0t0 TCP *:http (LISTEN) sudo kill -9 12345 sudo systemctl start nginx
问题 2:403 Forbidden—— 访问静态文件失败
原因:Nginx 用户(通常是 www-data)没有读取文件权限
解决:
sudo chown -R www-data:www-data /var/www/html/ sudo chmod -R 755 /var/www/html/
问题 3:502 Bad Gateway—— Nginx 无法连接 Java 应用
原因:
- Java 应用未启动
- 端口不匹配(Nginx 配置为 8080,Java 实际运行在 9090)
- 防火墙阻止连接
排查步骤:
# 1. 检查 Java 是否运行 ps aux | grep java # 2. 检查端口监听 ss -tuln | grep 8080 # 3. 本地测试 Java 是否可达 curl http://localhost:8080/health # 4. 检查 Nginx 错误日志 tail -f /var/log/nginx/error.log
问题 4:SSL 证书错误 ——SSL_do_handshake() failed
原因:证书路径错误、私钥不匹配、证书链不完整
解决:
ssl_certificate /etc/ssl/certs/fullchain.pem; ssl_certificate_key /etc/ssl/private/privkey.pem;
八、Nginx 性能调优指南
一个“能跑”的 Nginx 不是好 Nginx,一个“跑得快”的才是真正的高手。
1. 调整 worker_processes
worker_processes auto;
auto 表示自动匹配 CPU 核心数。建议设置为 worker_processes 4;(4 核 CPU)。
2. 增加 worker_connections
events {
worker_connections 10240;
multi_accept on;
use epoll;
}
worker_connections:每个 worker 进程最大连接数multi_accept on;:允许一个 worker 同时接受多个新连接use epoll;:Linux 下最优 I/O 多路复用模型
3. 启用 Gzip 压缩
gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
可将 JS/CSS 文件压缩 70% 以上,显著提升页面加载速度。
4. 启用缓存(静态资源)
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
add_header Cache-Control "public, immutable";
log_not_found off;
}
性能测试工具:Apache Bench (ab)
测试 Nginx 能承受多少并发:
ab -n 10000 -c 100 http://your-domain.com/health
5. 调整超时时间(防连接堆积)
client_header_timeout 10s; client_body_timeout 10s; keepalive_timeout 65s; send_timeout 10s;
建议:生产环境 keepalive_timeout 不要超过 75s,避免占用过多连接资源。
九、Nginx 与 Docker 集成实战
现代部署离不开容器化。将 Nginx 放入 Docker,实现“一次构建,随处运行”。
Dockerfile 示例
# Dockerfile.nginx FROM nginx:alpine # 复制自定义配置 COPY nginx.conf /etc/nginx/nginx.conf COPY default.conf /etc/nginx/conf.d/default.conf # 复制静态资源 COPY dist/ /var/www/html/ # 暴露端口 EXPOSE 80 # 启动 Nginx(前台运行) CMD ["nginx", "-g", "daemon off;"]
docker-compose.yml
version: '3.8'
services:
nginx:
build:
context: .
dockerfile: Dockerfile.nginx
ports:
- "80:80"
depends_on:
- app
networks:
- app-network
app:
image: openjdk:17-jre-slim
ports:
- "8080:8080"
command: java -jar /app/nginx-demo.jar
volumes:
- ./target/nginx-demo.jar:/app/nginx-demo.jar
networks:
- app-network
networks:
app-network:
driver: bridge启动:
docker-compose up --build
此时,Nginx 与 Java 应用运行在同一个 Docker 网络中,通过服务名 app 通信:
location / {
proxy_pass http://app:8080;
}
优势:环境一致、部署简单、便于扩缩容、支持 Kubernetes 集成
十、总结:Nginx 运维黄金法则
| 原则 | 说明 |
|---|---|
| 先测试,后重载 | nginx -t 是你的第一道防线 |
| 避免 restart | 生产环境永远用 reload |
| 监控 + 日志 | 没有监控的系统是盲目的 |
| 自动化部署 | 脚本 + CI/CD = 稳定的基石 |
| 模块化配置 | 每个站点独立文件,便于管理 |
| 安全加固 | 关闭服务器版本号、限制访问、启用 HTTPS |
| 持续学习 | Nginx 每年更新,新特性不断 |
结语:从命令到架构,你已掌握核心
你不再只是会敲 sudo systemctl reload nginx 的运维小白。你理解了:
- Nginx 的异步事件驱动架构为何高效
reload为何比restart更安全- 如何让 Java 应用与 Nginx 无缝协作
- 如何通过日志、监控、脚本构建自动化运维体系
- 如何在 Docker、Kubernetes 中集成 Nginx
真正的技术高手,不是会用工具的人,而是理解工具为何如此设计的人。
从今天起,当你看到 Nginx 的日志、配置、性能指标,你会像看一首诗一样,读懂它的优雅与力量。
记住一句话:“Nginx 不是工具,它是架构的基石。” —— 每一个高并发系统的背后,都有一个沉默而可靠的 Nginx。
附录:快速命令速查表
| 操作 | 命令 |
|---|---|
| 启动 | sudo systemctl start nginx |
| 停止 | sudo systemctl stop nginx |
| 重启 | sudo systemctl restart nginx |
| 重载配置 | sudo systemctl reload nginx |
| 检查配置语法 | sudo nginx -t |
| 查看状态 | sudo systemctl status nginx |
| 查看版本 | nginx -v |
| 查看编译参数 | nginx -V |
| 优雅退出 | sudo nginx -s quit |
| 强制停止 | sudo nginx -s stop |
| 重新打开日志 | sudo nginx -s reopen |
| 查看占用端口 | sudo lsof -i :80 |
| 查看错误日志 | tail -f /var/log/nginx/error.log |
以上就是一文带你快速上手Nginx中启动、停止、重启的常用命令的详细内容,更多关于Nginx常用命令的资料请关注脚本之家其它相关文章!
相关文章
服务器报错nginx 502 Bad Gateway的原因及如何解决详解
项目启动时莫名其妙网站访问不了,502 Bad Gateway,下面这篇文章主要给大家介绍了关于服务器报错nginx 502 Bad Gateway的原因及如何解决的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下2023-06-06
Nginx的location路径与proxy_pass匹配规则说明
这篇文章主要介绍了Nginx的location路径与proxy_pass匹配规则说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-06-06


最新评论