Nginx 从入门到精通:一篇讲透原理、功能、配置与实战场景

文章目录

  • 一、前言
  • [二、什么是 Nginx](#二、什么是 Nginx)
    • [1. 为什么 Nginx 这么常用](#1. 为什么 Nginx 这么常用)
    • [2. 一句话理解 Nginx](#2. 一句话理解 Nginx)
  • [三、Nginx 能做什么](#三、Nginx 能做什么)
    • [1. 作为 Web 服务器](#1. 作为 Web 服务器)
    • [2. 作为反向代理](#2. 作为反向代理)
    • [3. 作为负载均衡器](#3. 作为负载均衡器)
    • [4. 作为统一网关入口](#4. 作为统一网关入口)
    • [5. 作为 HTTPS 入口](#5. 作为 HTTPS 入口)
    • [6. 作为安全防护前置层](#6. 作为安全防护前置层)
  • [四、Nginx 的核心工作原理](#四、Nginx 的核心工作原理)
    • [1. 请求流程](#1. 请求流程)
    • [2. Nginx 是事件驱动模型](#2. Nginx 是事件驱动模型)
  • [五、Nginx 常见核心概念](#五、Nginx 常见核心概念)
    • [1. main 块](#1. main 块)
    • [2. events 块](#2. events 块)
    • [3. http 块](#3. http 块)
    • [4. server 块](#4. server 块)
    • [5. location 块](#5. location 块)
    • [6. upstream 块](#6. upstream 块)
  • [六、Nginx 配置文件结构详解](#六、Nginx 配置文件结构详解)
  • [七、Nginx 最常见的 10 大实战场景](#七、Nginx 最常见的 10 大实战场景)
    • [场景 1:部署静态网页](#场景 1:部署静态网页)
    • [场景 2:部署 Vue/React 前端项目](#场景 2:部署 Vue/React 前端项目)
      • [为什么要加 `try_files`](#为什么要加 try_files)
    • [场景 3:前后端分离项目代理接口](#场景 3:前后端分离项目代理接口)
    • [场景 4:多服务按路径转发](#场景 4:多服务按路径转发)
    • [场景 5:负载均衡](#场景 5:负载均衡)
    • [场景 6:HTTPS 配置](#场景 6:HTTPS 配置)
    • [场景 7:文件下载服务](#场景 7:文件下载服务)
    • [场景 8:图片服务器 / 静态资源服务器](#场景 8:图片服务器 / 静态资源服务器)
    • [场景 9:请求限流](#场景 9:请求限流)
    • [场景 10:IP 白名单 / 黑名单](#场景 10:IP 白名单 / 黑名单)
  • [八、Nginx 常见配置详解](#八、Nginx 常见配置详解)
    • [1. root 和 alias 的区别](#1. root 和 alias 的区别)
    • [2. proxy_pass 结尾有没有 `/` 的区别](#2. proxy_pass 结尾有没有 / 的区别)
    • [3. 常见代理请求头设置](#3. 常见代理请求头设置)
  • [九、Nginx 日志配置与分析](#九、Nginx 日志配置与分析)
    • [1. 访问日志](#1. 访问日志)
    • [2. 错误日志](#2. 错误日志)
    • [3. 使用场景](#3. 使用场景)
  • [十、Nginx 常见错误及排查思路](#十、Nginx 常见错误及排查思路)
  • [十一、Nginx 性能优化常见配置](#十一、Nginx 性能优化常见配置)
    • [1. 开启 sendfile](#1. 开启 sendfile)
    • [2. 开启 gzip 压缩](#2. 开启 gzip 压缩)
    • [3. 设置缓存过期时间](#3. 设置缓存过期时间)
    • [4. 调整 worker 数量](#4. 调整 worker 数量)
  • [十二、Nginx 在企业架构中的位置](#十二、Nginx 在企业架构中的位置)
  • [十三、Nginx 与 Apache 的简单对比](#十三、Nginx 与 Apache 的简单对比)
  • [十四、Nginx 常用命令](#十四、Nginx 常用命令)
    • [1. 查看版本](#1. 查看版本)
    • [2. 查看完整编译参数](#2. 查看完整编译参数)
    • [3. 检查配置文件是否正确](#3. 检查配置文件是否正确)
    • [4. 启动 Nginx](#4. 启动 Nginx)
    • [5. 重载配置](#5. 重载配置)
    • [6. 停止 Nginx](#6. 停止 Nginx)
    • [7. 平滑退出](#7. 平滑退出)
    • [8. systemd 管理方式](#8. systemd 管理方式)
  • 十五、一个完整的前后端分离配置示例
  • 十六、一个多节点负载均衡配置示例
  • [十七、一个 HTTPS + 跳转配置示例](#十七、一个 HTTPS + 跳转配置示例)
  • [十八、Nginx 学习路线建议](#十八、Nginx 学习路线建议)
  • [十九、面试和工作中最常问的 Nginx 问题](#十九、面试和工作中最常问的 Nginx 问题)
      • [1. Nginx 有什么作用?](#1. Nginx 有什么作用?)
      • [2. Nginx 为什么性能高?](#2. Nginx 为什么性能高?)
      • [3. 什么是反向代理?](#3. 什么是反向代理?)
      • [4. `root` 和 `alias` 有什么区别?](#4. rootalias 有什么区别?)
      • [5. 502 Bad Gateway 一般怎么排查?](#5. 502 Bad Gateway 一般怎么排查?)
  • 二十、总结

一、前言

在互联网系统里,Nginx 几乎是绕不开的组件。

不管是前后端分离项目、Java 后端服务、Python 服务、静态网站部署、反向代理、负载均衡,还是 HTTPS、网关入口、限流防刷,几乎都能看到 Nginx 的身影。

很多人刚接触 Nginx 时,会觉得它只是一个"Web 服务器"。但真正做项目之后会发现,Nginx 的定位远不止于此,它更像是:

  • 网站入口
  • 请求分发器
  • 反向代理
  • 负载均衡器
  • 静态资源服务器
  • 安全防护前置层

这篇文章就从 小白入门 开始,一步一步讲到 企业实战常见用法


二、什么是 Nginx

Nginx 是一个高性能的 HTTP 服务器、反向代理服务器,同时也支持负载均衡和邮件代理等能力。

更直白一点理解:

Nginx 就是一个专门用来接收网络请求、处理请求、转发请求、分发请求的高性能服务。


1. 为什么 Nginx 这么常用

因为它具备几个非常突出的特点:

  • 性能高
  • 并发能力强
  • 占用资源低
  • 配置灵活
  • 稳定性好
  • 非常适合做前置入口层

2. 一句话理解 Nginx

可以把 Nginx 理解成系统的"总入口"和"流量调度员"。

比如用户访问:

text 复制代码
https://www.demo.com

请求很可能不是直接打到后端 Java 或 Python 服务,而是先到 Nginx,再由 Nginx 决定:

  • 直接返回页面
  • 转给后端服务
  • 转给某一台服务器
  • 拒绝请求
  • 限流
  • 重定向 HTTPS

三、Nginx 能做什么

很多初学者学 Nginx 时,最大的问题是不知道它到底有什么用。下面先把核心用途讲清楚。


1. 作为 Web 服务器

Nginx 可以直接对外提供网页文件、图片、CSS、JS、下载文件等静态资源。

例如:

nginx 复制代码
server {
    listen 80;
    server_name localhost;

    location / {
        root /data/www/html;
        index index.html;
    }
}

这段配置表示:

  • 监听 80 端口
  • 当用户访问 /
  • /data/www/html 目录找文件
  • 默认首页是 index.html

使用场景

  • 静态官网部署
  • Vue/React 打包后的前端页面部署
  • 图片、JS、CSS 文件访问
  • 下载站点

2. 作为反向代理

这是 Nginx 最常见的用途。

用户访问的是 Nginx,但 Nginx 会把请求转发到后端服务,比如 Spring Boot、FastAPI、Django、Node.js。

nginx 复制代码
server {
    listen 80;
    server_name api.demo.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

这段配置表示:

  • 用户访问 api.demo.com
  • 实际请求先到 Nginx
  • Nginx 再转发给本机的 8080 服务

使用场景

  • 前端访问后端接口
  • 隐藏后端真实地址
  • 后端端口不直接暴露到公网
  • 统一入口管理

3. 作为负载均衡器

如果后端有多台服务器,Nginx 可以把请求分发给不同的机器。

nginx 复制代码
upstream backend_servers {
    server 192.168.1.101:8080;
    server 192.168.1.102:8080;
    server 192.168.1.103:8080;
}

server {
    listen 80;
    server_name demo.com;

    location / {
        proxy_pass http://backend_servers;
    }
}

使用场景

  • 多台后端共同提供服务
  • 分摊流量压力
  • 提高可用性
  • 其中一台异常时,流量可以切换到其他节点

4. 作为统一网关入口

Nginx 可以根据不同路径,把请求转发到不同服务。

nginx 复制代码
upstream user_service {
    server 10.0.0.11:8080;
}

upstream order_service {
    server 10.0.0.12:8080;
}

server {
    listen 80;
    server_name demo.com;

    location /user/ {
        proxy_pass http://user_service;
    }

    location /order/ {
        proxy_pass http://order_service;
    }
}

使用场景

  • 微服务统一入口
  • 不同业务模块按路径分发
  • 对外只暴露一个域名

5. 作为 HTTPS 入口

Nginx 可以统一处理 SSL 证书,实现 HTTPS 加密访问。

nginx 复制代码
server {
    listen 443 ssl;
    server_name demo.com;

    ssl_certificate     /etc/nginx/ssl/demo.crt;
    ssl_certificate_key /etc/nginx/ssl/demo.key;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

使用场景

  • 网站启用 HTTPS
  • 接口加密传输
  • 统一管理证书

6. 作为安全防护前置层

Nginx 可以实现很多前置安全控制,例如:

  • 限流
  • 白名单
  • 黑名单
  • 防盗链
  • 请求头控制
  • 隐藏后端信息

例如限制请求频率:

nginx 复制代码
limit_req_zone $binary_remote_addr zone=req_limit_zone:10m rate=2r/s;

server {
    listen 80;
    server_name demo.com;

    location /api/ {
        limit_req zone=req_limit_zone burst=5 nodelay;
        proxy_pass http://127.0.0.1:8080;
    }
}

四、Nginx 的核心工作原理

理解原理之后,很多配置才不会死记硬背。


1. 请求流程

用户访问系统时,通常会经历下面这条链路:

text 复制代码
浏览器/客户端
    ↓
Nginx
    ↓
后端服务
    ↓
数据库/缓存/消息队列

也就是说:

  • 用户先访问 Nginx
  • Nginx 再根据规则处理请求
  • 决定是自己返回资源,还是转给后端

2. Nginx 是事件驱动模型

Nginx 使用的是 异步、非阻塞、事件驱动 模型。

这意味着它处理大量并发连接时,比传统"一请求一线程"的模式更节省资源。

简单理解:

  • 不是每来一个请求就开一个线程
  • 而是通过事件通知机制高效处理大量连接

所以它非常适合:

  • 高并发 Web 访问
  • 静态资源分发
  • 大量短连接请求

五、Nginx 常见核心概念

学习 Nginx 配置时,必须搞懂下面这些关键字。


1. main 块

全局配置区域,比如 worker 数量、日志等。

nginx 复制代码
worker_processes auto;
error_log /var/log/nginx/error.log;

2. events 块

配置事件模型和连接数。

nginx 复制代码
events {
    worker_connections 1024;
}

3. http 块

HTTP 服务的主配置区域,大部分 Web 配置都写在这里。

nginx 复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name localhost;
    }
}

4. server 块

一个 server 就可以理解成一个虚拟主机。

nginx 复制代码
server {
    listen 80;
    server_name demo.com;
}

可以配置多个 server,分别处理不同域名或端口。


5. location 块

用于匹配不同 URL 路径,并决定如何处理。

nginx 复制代码
location / {
    root /data/www/html;
}

location /api/ {
    proxy_pass http://127.0.0.1:8080;
}

6. upstream 块

定义后端服务器组,常用于负载均衡。

nginx 复制代码
upstream backend {
    server 10.0.0.11:8080;
    server 10.0.0.12:8080;
}

六、Nginx 配置文件结构详解

一个典型的配置文件可能长这样:

nginx 复制代码
worker_processes auto;

events {
    worker_connections 2048;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    upstream backend {
        server 127.0.0.1:8080;
    }

    server {
        listen 80;
        server_name localhost;

        location / {
            root /data/www/html;
            index index.html index.htm;
        }

        location /api/ {
            proxy_pass http://backend;
        }
    }
}

七、Nginx 最常见的 10 大实战场景

下面直接讲最有价值的部分:实际项目到底怎么用。


场景 1:部署静态网页

配置示例

nginx 复制代码
server {
    listen 80;
    server_name www.demo.com;

    location / {
        root /data/nginx/html;
        index index.html;
    }
}

适用场景

  • 企业官网
  • 静态宣传页
  • 文档站点
  • 简单前端页面

场景 2:部署 Vue/React 前端项目

前端项目打包后,通常得到 dist 目录,然后交给 Nginx 提供访问。

nginx 复制代码
server {
    listen 80;
    server_name www.demo.com;

    root /data/frontend/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

为什么要加 try_files

因为 Vue Router 或 React Router 使用 history 模式时,刷新某个前端路由会找不到真实文件。

try_files 的作用是:

  • 先找真实文件
  • 找不到就返回 index.html
  • 让前端路由自己接管

场景 3:前后端分离项目代理接口

nginx 复制代码
server {
    listen 80;
    server_name www.demo.com;

    root /data/frontend/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        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;
    }
}

使用场景

  • Vue + Spring Boot
  • Vue + FastAPI
  • React + Django

作用

  • 页面由 Nginx 返回
  • /api/ 请求转发给后端
  • 避免前端跨域问题
  • 对外只暴露一个入口

场景 4:多服务按路径转发

nginx 复制代码
upstream user_service {
    server 10.0.0.11:8080;
}

upstream order_service {
    server 10.0.0.12:8080;
}

server {
    listen 80;
    server_name api.demo.com;

    location /user/ {
        proxy_pass http://user_service;
    }

    location /order/ {
        proxy_pass http://order_service;
    }
}

使用场景

  • 微服务项目
  • 网关前置场景
  • 按业务模块拆分服务

场景 5:负载均衡

最基本轮询

nginx 复制代码
upstream backend {
    server 10.0.0.11:8080;
    server 10.0.0.12:8080;
    server 10.0.0.13:8080;
}

server {
    listen 80;
    server_name demo.com;

    location / {
        proxy_pass http://backend;
    }
}

加权轮询

nginx 复制代码
upstream backend {
    server 10.0.0.11:8080 weight=5;
    server 10.0.0.12:8080 weight=3;
    server 10.0.0.13:8080 weight=1;
}

IP 哈希

nginx 复制代码
upstream backend {
    ip_hash;
    server 10.0.0.11:8080;
    server 10.0.0.12:8080;
}

使用场景

  • 多节点后端集群
  • 会话保持
  • 提升并发能力

场景 6:HTTPS 配置

nginx 复制代码
server {
    listen 443 ssl;
    server_name www.demo.com;

    ssl_certificate /etc/nginx/ssl/demo.crt;
    ssl_certificate_key /etc/nginx/ssl/demo.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        root /data/frontend/dist;
        index index.html;
    }
}

HTTP 跳转 HTTPS

nginx 复制代码
server {
    listen 80;
    server_name www.demo.com;
    return 301 https://$host$request_uri;
}

使用场景

  • 生产环境网站
  • 后台管理系统
  • 对外开放 API

场景 7:文件下载服务

nginx 复制代码
server {
    listen 80;
    server_name download.demo.com;

    location /files/ {
        alias /data/downloads/;
        autoindex on;
    }
}

使用场景

  • 软件安装包下载
  • 文档下载
  • 日志归档下载

场景 8:图片服务器 / 静态资源服务器

nginx 复制代码
server {
    listen 80;
    server_name static.demo.com;

    location /images/ {
        alias /data/static/images/;
        expires 30d;
    }

    location /js/ {
        alias /data/static/js/;
        expires 7d;
    }

    location /css/ {
        alias /data/static/css/;
        expires 7d;
    }
}

使用场景

  • 图片资源独立域名
  • 前端静态资源缓存
  • 提升页面访问速度

场景 9:请求限流

nginx 复制代码
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;

server {
    listen 80;
    server_name api.demo.com;

    location /api/ {
        limit_req zone=api_limit burst=10 nodelay;
        proxy_pass http://127.0.0.1:8080;
    }
}

参数说明

  • rate=5r/s:每秒最多 5 个请求
  • burst=10:允许短暂突发 10 个请求
  • nodelay:不排队,超出直接处理限制逻辑

使用场景

  • 防接口被刷
  • 登录接口防暴力请求
  • 验证码接口保护

场景 10:IP 白名单 / 黑名单

只允许内网访问

nginx 复制代码
location /admin/ {
    allow 192.168.1.0/24;
    deny all;
    proxy_pass http://127.0.0.1:8080;
}

禁止某个 IP

nginx 复制代码
location / {
    deny 1.2.3.4;
    allow all;
}

使用场景

  • 后台管理系统
  • 内网运维页面
  • 测试接口限制访问

八、Nginx 常见配置详解


1. root 和 alias 的区别

root

nginx 复制代码
location /img/ {
    root /data/static;
}

请求:

text 复制代码
/img/a.jpg

实际文件路径:

text 复制代码
/data/static/img/a.jpg

alias

nginx 复制代码
location /img/ {
    alias /data/static/;
}

请求:

text 复制代码
/img/a.jpg

实际文件路径:

text 复制代码
/data/static/a.jpg

结论

  • root:会把 location 路径拼进去
  • alias:直接替换匹配路径

2. proxy_pass 结尾有没有 / 的区别

这是高频坑点。

配置 1

nginx 复制代码
location /api/ {
    proxy_pass http://127.0.0.1:8080;
}

请求:

text 复制代码
/api/user/list

转发后可能是:

text 复制代码
http://127.0.0.1:8080/api/user/list

配置 2

nginx 复制代码
location /api/ {
    proxy_pass http://127.0.0.1:8080/;
}

请求:

text 复制代码
/api/user/list

转发后可能是:

text 复制代码
http://127.0.0.1:8080/user/list

使用建议

配置时一定要根据后端接口路径决定是否保留前缀。


3. 常见代理请求头设置

nginx 复制代码
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;
}

含义

  • Host:保留原始域名
  • X-Real-IP:客户端真实 IP
  • X-Forwarded-For:经过代理链后的真实来源 IP
  • X-Forwarded-Proto:原始访问协议,HTTP 或 HTTPS

很多后端系统做日志、权限判断、获取客户端 IP 时都依赖这些头。


九、Nginx 日志配置与分析

Nginx 主要有两类日志:

  • 访问日志
  • 错误日志

1. 访问日志

nginx 复制代码
http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;
}

2. 错误日志

nginx 复制代码
error_log /var/log/nginx/error.log warn;

3. 使用场景

  • 排查接口访问异常
  • 查看用户请求情况
  • 定位 404、502、504 等问题
  • 分析请求量和来源 IP

十、Nginx 常见错误及排查思路


1. 404 Not Found

常见原因

  • 路径配置错误
  • 文件不存在
  • rootalias 写错
  • 前端路由未配置 try_files

排查重点

  • 看访问路径
  • 看文件实际存在位置
  • 看 location 是否匹配正确

2. 403 Forbidden

常见原因

  • 文件权限不足
  • Nginx 进程无权限读取目录
  • 配置了 deny
  • SELinux 限制

排查重点

  • 检查文件权限
  • 检查目录权限
  • 检查 allow/deny 配置

3. 502 Bad Gateway

常见原因

  • 后端服务没启动
  • proxy_pass 地址写错
  • 后端端口没监听
  • Nginx 无法连接后端

排查步骤

bash 复制代码
ss -lntp | grep 8080
curl http://127.0.0.1:8080
tail -f /var/log/nginx/error.log

4. 504 Gateway Timeout

常见原因

  • 后端处理太慢
  • 接口超时
  • 数据库查询慢
  • Nginx 超时配置太短

可调整配置

nginx 复制代码
location /api/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_connect_timeout 60s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
}

十一、Nginx 性能优化常见配置


1. 开启 sendfile

nginx 复制代码
sendfile on;

提升文件传输效率。


2. 开启 gzip 压缩

nginx 复制代码
gzip on;
gzip_min_length 1k;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;

使用场景

  • 压缩前端资源
  • 减少网络传输量
  • 加快页面加载

3. 设置缓存过期时间

nginx 复制代码
location /static/ {
    root /data/www;
    expires 7d;
}

使用场景

  • 图片、JS、CSS 长缓存
  • 减少重复请求

4. 调整 worker 数量

nginx 复制代码
worker_processes auto;

让 Nginx 根据 CPU 自动设置工作进程数。


十二、Nginx 在企业架构中的位置

在实际生产环境中,Nginx 往往部署在系统入口层,通常位于:

text 复制代码
公网用户
   ↓
Nginx / 负载均衡 / WAF
   ↓
应用服务器
   ↓
Redis / MySQL / MQ / ES

它经常放在 DMZ 区或入口层,原因是:

  • 需要对外接收请求
  • 需要保护内网应用
  • 统一接入和分发流量
  • 便于做安全控制和日志记录

十三、Nginx 与 Apache 的简单对比

对比项 Nginx Apache
高并发表现 相对一般
静态资源处理 可以
反向代理 可以
配置复杂度 中等 中等
常见用途 网关、静态、代理、负载均衡 传统 Web 服务

现在互联网项目里,Nginx 更常用于入口层。


十四、Nginx 常用命令


1. 查看版本

bash 复制代码
nginx -v

2. 查看完整编译参数

bash 复制代码
nginx -V

3. 检查配置文件是否正确

bash 复制代码
nginx -t

4. 启动 Nginx

bash 复制代码
nginx

5. 重载配置

bash 复制代码
nginx -s reload

6. 停止 Nginx

bash 复制代码
nginx -s stop

7. 平滑退出

bash 复制代码
nginx -s quit

8. systemd 管理方式

bash 复制代码
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
systemctl status nginx

十五、一个完整的前后端分离配置示例

下面给一个企业里很常见的完整例子。

场景:

  • 前端 Vue 打包后放在 /data/frontend/dist
  • 后端 Spring Boot 跑在 127.0.0.1:8080
  • 域名是 www.demo.com
  • 需要支持前端路由
  • /api/ 转发给后端
  • 开启 gzip
nginx 复制代码
worker_processes auto;

events {
    worker_connections 2048;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile on;
    keepalive_timeout 65;

    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 5;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml;

    server {
        listen 80;
        server_name www.demo.com;

        root /data/frontend/dist;
        index index.html;

        location / {
            try_files $uri $uri/ /index.html;
        }

        location /api/ {
            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;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    }
}

十六、一个多节点负载均衡配置示例

场景:

  • 有三台后端服务
  • Nginx 对外统一提供服务
  • 需要分发请求
nginx 复制代码
upstream app_cluster {
    server 10.0.0.11:8080 weight=3;
    server 10.0.0.12:8080 weight=2;
    server 10.0.0.13:8080 weight=1;
}

server {
    listen 80;
    server_name api.demo.com;

    location / {
        proxy_pass http://app_cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

十七、一个 HTTPS + 跳转配置示例

nginx 复制代码
server {
    listen 80;
    server_name www.demo.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name www.demo.com;

    ssl_certificate /etc/nginx/ssl/demo.crt;
    ssl_certificate_key /etc/nginx/ssl/demo.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    root /data/frontend/dist;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/ {
        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;
    }
}

十八、Nginx 学习路线建议

如果想真正把 Nginx 学扎实,建议按这个顺序学:

第一步:先会基础部署

  • 安装 Nginx
  • 启动停止
  • 查看日志
  • 基础静态页面访问

第二步:学会 location 匹配和 server 配置

  • 域名配置
  • 端口配置
  • root / alias
  • index / try_files

第三步:学会反向代理

  • proxy_pass
  • 请求头转发
  • 前后端分离配置

第四步:学会负载均衡

  • upstream
  • 轮询
  • 权重
  • ip_hash

第五步:学会 HTTPS 和安全配置

  • 证书配置
  • HTTP 跳转 HTTPS
  • 限流
  • IP 白名单
  • 防盗链

第六步:学会排障和优化

  • 404/403/502/504 处理
  • 日志分析
  • gzip
  • 缓存
  • 超时控制

十九、面试和工作中最常问的 Nginx 问题

下面这些问题出现频率很高:

1. Nginx 有什么作用?

答:静态资源服务、反向代理、负载均衡、HTTPS、限流、安全防护等。

2. Nginx 为什么性能高?

答:采用异步非阻塞事件驱动模型,处理高并发连接时资源占用低。

3. 什么是反向代理?

答:客户端访问的是代理服务器,由代理服务器转发请求给真实后端服务。

4. rootalias 有什么区别?

答:root 会拼接 location 路径,alias 直接替换路径。

5. 502 Bad Gateway 一般怎么排查?

答:检查后端服务是否启动、端口是否监听、Nginx 能否连通后端、错误日志内容。


二十、总结

Nginx 之所以在互联网架构里地位这么高,根本原因在于它不是单一功能的软件,而是一个能够同时承担多个关键角色的组件:

  • 它可以做 Web 服务器
  • 可以做反向代理
  • 可以做负载均衡
  • 可以做入口网关
  • 可以做 HTTPS 终止
  • 可以做限流和安全控制

对于开发来说,Nginx 是部署和访问入口的重要一环。

对于运维来说,Nginx 是流量调度和安全防护的重要组件。

对于架构来说,Nginx 是连接外部请求和内部服务的桥梁。

真正掌握 Nginx,不只是会写几行配置,而是能够根据业务场景,设计出合适的接入方案、代理方案、分流方案和安全策略。

如果只记一句话,那就是:

Nginx 本质上是互联网系统里的流量入口和请求调度中心。谁掌握了 Nginx,谁就掌握了系统接入层的大部分核心能力。

相关推荐
IMPYLH2 小时前
Linux 的 dir 命令
linux·运维·服务器·数据库
fanged2 小时前
操作系统番外1(Linux的测试体系)(TODO)
linux·运维·服务器
givemeacar2 小时前
Nginx如何实现 TCP和UDP代理?
tcp/ip·nginx·udp
成为你的宁宁3 小时前
【Docker 与 Docker-Compose 实战:从零开始容器化部署若依项目,从单容器分步运行到 Compose 一键编排】
运维·docker·容器·docker-compose
xuefeiniao3 小时前
Docker 部署宝塔面板 Nginx 反向代理 502 踩坑实录
nginx·docker·容器
H_老邪4 小时前
Linux 与 Docker 常用命令
linux·运维·服务器·docker
博语小屋4 小时前
I/O 多路转接之epoll
运维·服务器·数据库
yaaakaaang4 小时前
(一)前端,如此简单!---下载Nginx
前端·nginx
yewq-cn4 小时前
linux 内核设备号
linux·运维·服务器