nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > Nginx常用命令

一文带你快速上手Nginx中启动、停止、重启的常用命令

作者:知远漫谈

本文将带你从零开始,系统掌握 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 常作为:

  1. 反向代理:接收外部请求,转发给后端多个 Spring Boot 实例
  2. 负载均衡器:在多个 Java 服务实例间分发流量,提升可用性
  3. 静态资源服务器:缓存前端资源(HTML/CSS/JS),减轻后端压力
  4. SSL 终止点:处理 HTTPS 加解密,后端使用 HTTP 通信,降低 JVM 负担
  5. 安全网关:限制 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/nginxNginx 可执行文件路径
/etc/init.d/nginx传统 SysV 启动脚本(旧系统使用)

小贴士:sites-availablesites-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

重启 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, INTnginx -s stop快速停止(立即终止)
QUITnginx -s quit优雅退出(等待请求完成)
HUPnginx -s reload重载配置(推荐)
USR1nginx -s reopen重新打开日志文件(用于日志轮转)
USR2nginx -s upgrade平滑升级 Nginx 可执行文件(高级用法)
WINCHnginx -s stop(配合 QUIT优雅关闭 Worker 进程(不关闭 Master)

实战:日志轮转(Log Rotation)

生产环境中,access.logerror.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,实时监控:

3. 日志分析:ELK Stack 实战

Nginx 的 access.log 是宝贵的流量数据源。结合 ELK(Elasticsearch + Logstash + Kibana):

# 查看最近 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 应用

原因

排查步骤

# 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;
}

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 的日志、配置、性能指标,你会像看一首诗一样,读懂它的优雅与力量。

记住一句话:“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常用命令的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文