Nginx 入门教程(2025 最新):安装、配置、反向代理全指南 - 趣味版

发布于:2025-07-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

🗂️《Nginx 学习之从入门到精通》内容结构目录

第一部分:快速入门篇(基础知识 + 环境搭建)

第1章:Nginx 简介

  • 1.1 什么是 Nginx?
  • 1.2 Nginx 的核心能力和应用场景
  • 1.3 Nginx 与 Apache 的对比
  • 1.4 常见名词解释:反向代理、负载均衡、静态服务等

第2章:安装与基本使用

  • 2.1 在 Linux / macOS / Windows 安装 Nginx
  • 2.2 使用 Docker 安装与运行 Nginx
  • 2.3 启动 / 停止 / 重载配置命令
  • 2.4 查看运行状态与日志定位

第3章:配置文件初识

  • 3.1 Nginx 配置结构概览
  • 3.2 http、server、location 块讲解
  • 3.3 编写第一个配置文件:Hello Nginx
  • 3.4 常见配置语法规则与调试技巧

第二部分:项目实战篇(进阶应用 + 场景部署)

第4章:部署静态网站

  • 4.1 创建站点目录与 HTML 文件
  • 4.2 配置静态资源访问路径
  • 4.3 设置默认首页、404 页面
  • 4.4 多站点配置(虚拟主机)

第5章:反向代理实战

  • 5.1 什么是反向代理?使用场景介绍
  • 5.2 Nginx 代理 Node.js/PHP 应用
  • 5.3 添加请求头 / 修改 Host 转发
  • 5.4 解决跨域问题(CORS)

第6章:负载均衡配置

  • 6.1 upstream 语法详解
  • 6.2 轮询、权重、IP 哈希等策略
  • 6.3 后端健康检查配置
  • 6.4 常见高可用架构介绍

第7章:HTTPS 与安全加固

  • 7.1 配置 SSL(Let’s Encrypt、阿里云证书等)
  • 7.2 强制 HTTP 跳转 HTTPS
  • 7.3 配置访问控制与防盗链
  • 7.4 限制请求频率与 IP 黑名单

第三部分:进阶精通篇(优化 + 排错 + 模块)

第8章:性能优化实践

  • 8.1 常见优化参数:worker、buffer、gzip
  • 8.2 静态缓存与浏览器缓存控制
  • 8.3 大文件传输优化:sendfile、tcp_nopush
  • 8.4 测试工具与性能对比(ab、wrk)

第9章:Rewrite 重写与跳转

  • 9.1 rewrite 语法与规则顺序
  • 9.2 URL 重写 vs 内部跳转
  • 9.3 实战示例:SEO 优化、旧链接重定向

第10章:排错与日志分析

  • 10.1 access.log 与 error.log 使用技巧
  • 10.2 常见配置错误解析
  • 10.3 日志格式定制与日志分析工具

第11章:模块与扩展能力

  • 11.1 常见第三方模块介绍
  • 11.2 Lua 模块与 OpenResty 入门
  • 11.3 限流、鉴权、自定义响应处理
  • 11.4 编译安装 Nginx 模块方法

附录:实用参考

  • A.1 Nginx 常用命令速查表
  • A.2 典型配置模板合集
  • A.3 面试常考题与答题技巧
  • A.4 常见报错速查手册
  • A.5 推荐阅读与工具导航

第一章:Nginx 是什么?为什么几乎所有网站都离不开它?

🚀 本章目标:你将了解 Nginx 是什么、它能做什么、常见应用场景,还有 Apache 是谁,它俩到底谁更香?


1.1 什么是 Nginx?听起来好像很高冷?

Nginx(发音:engine-x,读快点像“引擎X”)是一款高性能、高并发、开源免费的 Web 服务器,同时也可以做反向代理、负载均衡、缓存等等。

它诞生于 2004 年,由一位俄罗斯大哥 Igor Sysoev 开发。说白了,它是给互联网打工的搬砖侠,负责把网页端端正正地送到你的浏览器。

💬 举个例子:
当你在浏览器里输入 https://www.taobao.com 的时候,大概率是 Nginx 在幕后默默把页面“搬运”给你了。


1.2 Nginx 能做什么?能干饭也能打仗!

功能 解释 实际用途
🚚 静态资源服务 直接返回 HTML、CSS、图片等 做前端页面托管
🪞 反向代理 把请求偷偷转发给后端服务 让前端访问 Node、PHP、Flask 等
⚖️ 负载均衡 把请求分发到多台服务器 高并发系统的“分流器”
🔐 HTTPS 支持 配置 SSL 证书,保障安全 网站上加小锁头(https)
🔄 URL 重写 重定向或修改访问路径 优化 URL,做 SEO,跳转旧链接
⚡ 缓存加速 提前准备好内容,提高响应 少敲几次数据库,响应更快

Nginx 是什么?一句话总结:能打能抗、能做饭、还能防身的 Web 门面担当。


1.3 Apache 是谁?和 Nginx 有仇吗?

咱不八卦,但这俩真的有点“内卷”。

对比项 Nginx Apache
架构 异步非阻塞(event-driven) 多进程/多线程(传统)
并发性能 更优秀,吃得少,干得多 并发高时容易“吃不消”
配置难度 简洁、模块化 功能强但略复杂
资源占用 相对高
热更新模块 不支持 支持(可动态加载)
使用场景 静态服务、代理、微服务架构 动态网站、老项目居多

🧠 一句话记住:
Apache 是“老派绅士”,有经验但体力差;
Nginx 是“新锐干将”,年轻能干还吃得少。


1.4 常见术语一网打尽(小白友好翻译)

什么是 Web Server?什么是反向代理?这些词怎么一听就劝退……

来,我们用人话讲讲这些名词 👇

  • Web Server(Web 服务器)
    比如 Nginx,它的工作就是响应用户请求,发网页、发图片、发资源。

  • 静态资源
    不需要程序处理的内容:图片、HTML、JS、CSS,放那就能访问。

  • 动态资源
    登录注册、评论点赞、搜索结果等,必须靠后端程序“临时做菜”处理。

  • 反向代理(Reverse Proxy)
    你访问 A,实际上是 A 把你转发到 B,然后再把 B 的结果发给你。你以为你在跟 A 聊,其实是 Nginx 代聊(代理)。

  • 负载均衡(Load Balancing)
    一堆用户访问,一堆服务器响应,Nginx 负责安排“谁先谁后”,避免一台机器累死。

  • OpenResty
    一个带有“外挂”的 Nginx,内置 Lua,可以写逻辑处理请求,更适合做 API 网关或限流服务。


🧠 本章小结:一句话总结一切

  • Nginx 是 Web 世界的“水电工”:你看不到它,但离不开它;
  • 它能服务静态网页、转发请求、做缓存、搞负载均衡、处理 HTTPS,一人顶仨;
  • 跟 Apache 相比,Nginx 更轻、更快、更适合现代网站架构;
  • 掌握它,你就能把一个网站从“做完了”带到“上线了”。

✅ 本章作业:为下一章准备下食材

📦 你可以先准备好以下环境,为下一章的实战部署做准备:

  • 🐧 一台 Linux 虚拟机(推荐 Ubuntu / CentOS)或一台云服务器
  • 🐳 或者使用 Docker 启动一个 Nginx 容器(简单方便)
  • 🌐 一个简单的 HTML 页面,作为你第一个 Nginx 网站主页

下一章,我们就要开始动手部署你人生第一个网站了!


下一章预告:Nginx 安装与 Hello World 实战教程!


📌 喜欢这套教程?别忘了收藏、点赞、关注我。别怕复杂,我带你搞定每一行配置。


第二章:安装 Nginx 并运行你的第一个网站(Hello, World!)

🚀 本章目标:你将在本地或云服务器上安装 Nginx,并成功部署一个网页,让它在浏览器中“亮相”。这是你通往服务器世界的第一步!


2.1 我们该把 Nginx 安装到哪儿?

✅ 安装环境三选一:

环境类型 适合人群 推荐
🐧 本地 Linux / 虚拟机 学生党 / 运维党 推荐 Ubuntu 20+ / CentOS 7+
☁️ 云服务器(阿里云、腾讯云等) 想部署上线的人 推荐入门轻量服务器
🐳 Docker 怕装坏系统 / 喜欢干净环境的人 推荐!快速试错,1分钟起飞

2.2 用 apt / yum 安装 Nginx(Ubuntu / CentOS)

🐧 Ubuntu 系统:

sudo apt update
sudo apt install nginx -y

🔥 检查安装成功:

nginx -v
# 输出:nginx version: nginx/1.22.x

🐧 CentOS 系统:

sudo yum install epel-release -y
sudo yum install nginx -y

启动、停止、重载命令:

sudo systemctl start nginx     # 启动
sudo systemctl stop nginx      # 停止
sudo systemctl restart nginx   # 重启
sudo systemctl reload nginx    # 热重载配置

浏览器访问试试:

访问 http://你的服务器IP,你应该能看到熟悉的 “Welcome to Nginx” 页面。


2.3 不想折腾?用 Docker 安装 Nginx

安装 Docker(跳过如果你已有):

# Ubuntu
sudo apt install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker

拉取 Nginx 镜像并运行:

docker run -d \
  --name my-nginx \
  -p 8080:80 \
  -v $(pwd)/html:/usr/share/nginx/html \
  nginx

📂 $(pwd)/html 是你本地的网页目录,你可以放一个 index.html 进去!

浏览器访问:

访问 http://localhost:8080,你会看到你自己的网页上线了!


2.4 Nginx 配置文件结构图(带点人话解释)

Nginx 的默认配置文件一般在:

  • /etc/nginx/nginx.conf(Linux)
  • /usr/local/nginx/conf/nginx.conf(源码安装)
  • /etc/nginx/conf.d/*.conf(通常用来添加自定义网站)
nginx.conf
├── http {                # HTTP 全局配置
│   ├── server {          # 每个网站一个 server 块
│   │   ├── listen 80;    # 监听端口
│   │   ├── server_name;  # 域名
│   │   └── location / {  # URL 路由规则
│   │        root /var/www/html;
│   │      }
│   └── ...
└── ...

2.5 Hello World!部署第一个网页

步骤 1:创建网页目录并写个首页

sudo mkdir -p /var/www/hello
echo "<h1>Hello from Nginx!</h1>" | sudo tee /var/www/hello/index.html

步骤 2:创建配置文件(以 Ubuntu 为例)

sudo nano /etc/nginx/conf.d/hello.conf

内容如下:

server {
    listen 80;
    server_name localhost;

    location / {
        root /var/www/hello;
        index index.html;
    }
}

步骤 3:测试配置是否正确

sudo nginx -t
# 输出 should be:syntax is ok / test is successful

步骤 4:重载配置

sudo systemctl reload nginx

🎉 步骤 5:打开浏览器

访问你的 IP 地址:http://你的服务器 IP
你会看到页面上写着:

Hello from Nginx!

恭喜你,你刚刚部署了人生中第一个网站!


🚨 常见坑提示区

问题 解决办法
访问不了? 检查服务器防火墙是否放行 80 端口(阿里云/腾讯云安全组)
配置改了没生效? 重载 Nginx:sudo nginx -s reloadsystemctl reload nginx
页面 403 Forbidden? 检查网页目录和文件权限是否对 Nginx 可读

🧠 本章小结

  • 你学会了用系统包或 Docker 安装 Nginx;
  • 成功运行了你的第一个网页;
  • 搞懂了 Nginx 配置文件的基本结构;
  • 为后续部署 Node、PHP、反向代理、HTTPS 等做好了准备!

✅ 小练习

  • 尝试把网页内容换成你自己写的 HTML 页面;
  • 改一下端口从 80 改为 81,重新加载看看效果;
  • 尝试新建一个 server,绑定另一个路径 /demo 返回不同内容。

📌 下一章,我们将学习如何用 Nginx 部署多个网站,以及如何把它变成你前后端项目的“流量中转站”。


如果你觉得这篇文章对你有用,麻烦点个赞 / 收藏 / 关注~ 你的一点鼓励,就是我持续更新的动力!


第三章:部署前端静态网站 & 多站点配置,一台服务器多种花活!

本章目标:你将掌握用 Nginx 托管任意前端静态网站,并学会配置多个站点(如 blog.test 和 shop.test),轻松实现“一台服务器多个项目”。


3.1 什么是静态网站部署?

静态网站是最适合 Nginx 管的事儿:
📁 一堆 HTML / CSS / JS 文件,直接往 /usr/share/nginx/html 一丢,Nginx 就能“快准稳”地把它们送到用户浏览器。

适合部署的前端项目包括:

  • Vue / React / Angular 打包后的 dist/ 目录
  • 静态博客(Hugo、Hexo、Jekyll)
  • 纯手写的 HTML 作品集

3.2 部署你的第一个前端项目

🧪 假设你打包好了 Vue 项目,输出在 ~/my-portfolio/dist

🧱 第一步:把项目拷贝到部署目录

sudo mkdir -p /var/www/portfolio
sudo cp -r ~/my-portfolio/dist/* /var/www/portfolio

🧱 第二步:创建 Nginx 配置文件

sudo nano /etc/nginx/conf.d/portfolio.conf

内容如下:

server {
    listen 80;
    server_name portfolio.local;

    root /var/www/portfolio;
    index index.html;

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

🧱 第三步:配置本地 DNS(仅本机测试用)

编辑你的 hosts 文件(Windows/Linux/Mac):

# 添加一行
127.0.0.1 portfolio.local

🧱 第四步:重启 Nginx 并访问测试

sudo nginx -t
sudo systemctl reload nginx

访问:http://portfolio.local
🎉 看到前端页面就成功啦!


3.3 多站点部署(虚拟主机)

什么是多站点?

👉 一台服务器部署多个网站,用户访问不同域名/端口,Nginx 自动“分门别类”。

方式一:按端口分站

server {
    listen 8081;
    server_name _;
    root /var/www/blog;
    index index.html;
}

server {
    listen 8082;
    server_name _;
    root /var/www/shop;
    index index.html;
}

方式二:按域名分站(推荐)

server {
    listen 80;
    server_name blog.test;

    root /var/www/blog;
    index index.html;
}

server {
    listen 80;
    server_name shop.test;

    root /var/www/shop;
    index index.html;
}

📌 配置 hosts:

127.0.0.1 blog.test
127.0.0.1 shop.test

📎 然后访问:

✨ 它们会自动访问各自的目录,互不干扰!


3.4 常见场景进阶配置

✅ 设置默认首页和 404 页面

server {
    root /var/www/portfolio;
    index index.html;

    error_page 404 /404.html;
}

✅ 加上 gzip 压缩(让前端更快)

http {
    gzip on;
    gzip_types text/css application/javascript application/json;
}

✅ 开启缓存头(提升性能)

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 30d;
    add_header Cache-Control "public";
}

🚨 踩坑提示

症状 原因 & 解决
页面空白 / 样式丢失 前端打包路径错:Vue 项目需设置 publicPath 为相对路径或 /
访问地址跳 404? Nginx 要加 try_files $uri $uri/ /index.html,否则不支持前端路由
域名访问不了? 检查 hosts 文件是否写了映射,或 DNS 是否解析到你服务器 IP

🧠 本章小结

  • 使用 Nginx 部署前端静态网站,超级适合个人作品集 / 博客 / 小项目;
  • 利用 server 配置多个站点,让你在一台服务器上玩转多个项目;
  • 学会 gzip、缓存、404 等基础优化配置,让页面快起来!

✅ 小练习

  • 尝试部署一个 Vue 项目 + 一个 Hexo 博客作为两个站点;
  • 使用 Docker 部署多个前端站点,映射不同端口;
  • 尝试给某个页面加上访问密码(提示:auth_basic

📌 下一章我们要玩点更“后端”的东西了:反向代理实战!让你的前后端项目“融为一体”


✨ 如果你部署成功了,不妨截图页面 + 配置文件发出来让我看看!有问题也欢迎评论区留言,我会一条条看 😎


第四章:配置文件看不懂?带你读懂 nginx.conf 的前世今生

“人生苦短,我选 nginx.conf。”——一个在注释中迷失的开发者


✨ 本章目标

  • 了解 Nginx 的配置文件结构
  • 学会常用模块的位置和用途
  • 理解 Nginx 是怎么一步步从请求到响应工作的
  • 改掉复制粘贴 nginx.conf 却不知道为啥能跑的坏习惯(不是说你,就是我 🙈)

🍜 一碗 nginx.conf 的“配料表”到底是啥?

你装好了 Nginx,打开了 /etc/nginx/nginx.conf(或者你是在 Windows,用的是 conf/nginx.conf),然后你看到一堆神秘的单词:

worker_processes  1;

events {
    worker_connections  1024;
}

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

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

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

是不是感觉像是走进了一家异世界餐厅,菜单看不懂却忍不住想点单?

没事,我来一条条翻译成“人话”。


👷‍♂️ nginx.conf 顶层结构一览

# 全局块
worker_processes 1;

# 事件块
events {
    worker_connections 1024;
}

# HTTP块(也可能是 mail / stream)
http {
    # HTTP 模块配置
    ...
}

简单记忆口诀:

nginx.conf 三层大法好:全局设定定天下,事件监听稳如狗,http 块中藏乾坤


🧠 各部分“人话解释”

worker_processes
  • 意思:Nginx 要开几个“工人”来干活(处理请求)
  • 通常设成和 CPU 核心数一样,比如 4核CPU 就设成 4

🚀 小技巧:有的系统可以写 auto,Nginx 自动检测核心数!


events
events {
    worker_connections 1024;
}
  • 意思:每个 worker 最多同时处理 1024 个连接。
  • 高并发场景要调大一点(不过也得看系统上限)

🍡 类比一下:工人(worker)一个人最多能接待 1024 位客人,客满了就得排队了。


http

这块最复杂,但也是我们最常打交道的:

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

    sendfile on;
    keepalive_timeout 65;

    server {
        ...
    }
}

我们常见的配置:反向代理、静态资源服务、HTTPS 都写在这里。


📦 server 块(网站的“店面”)

server {
    listen 80;
    server_name example.com;

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

一句话解释:

一个 server 就是一家门店,开在哪(listen),叫什么名字(server_name),店里摆了啥(location)都写在这。


🧩 location 块(路由分发中心)

这是 nginx 的“前台接待员”,有人访问 / 就把人带到 /usr/share/nginx/html

你可以写多个 location

location /api {
    proxy_pass http://localhost:3000;
}

location /static {
    root /var/www;
}

📜 配置文件中的 include 是啥?

include /etc/nginx/conf.d/*.conf;
  • 类似 C 语言里的 #include
  • 把别的配置文件“拼”进来,方便模块化管理

举个例子:你的网站很多,就可以每个网站写一个 conf.d/site1.confsite2.conf,全部自动加载。


🔥 实用 tips

  • 想排错时加上:error_log /var/log/nginx/error.log debug;

  • 不确定配置改对没?用:nginx -t 检查语法!

  • 修改配置后记得 reload:

    sudo nginx -s reload
    

💡 本章小结

名词 是什么 用来干嘛
worker_processes 工人数 控制并发能力
events 工人能接几个客人 控制连接数量
http 核心配置区 服务、缓存、代理全靠它
server 门店 域名 + 端口 + 业务逻辑入口
location 接待员 请求路由转发、处理


第五章:反向代理的进阶玩法:路径转发 + 多服务调度

“一条路径走到黑?不,Nginx 说:这条 URL 给我,我转个弯让你惊喜。”


🧩 什么是路径转发?为什么这么香?

还记得我们之前写的简单代理规则吗?

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

这很好,但当你有多个服务时,比如:

  • /api 走后端接口服务(如 Express)
  • /admin 是个 Vue 管理后台
  • /static 是静态文件服务

你总不能一个个开端口、买域名、搭 Nginx 吧?

这时候,路径转发(location routing) 就闪亮登场了!你只需要一个域名+端口,通过路径分流访问不同的服务,非常香。


🚧 示例场景:我有三个服务

路径 服务描述 实际端口
/api 后端接口服务 3000
/admin 管理后台页面 8080
/static 静态资源服务 9000

✍️ 实战配置:路径分流搞起来!

server {
    listen 80;
    server_name localhost;

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

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

    location /static/ {
        proxy_pass http://127.0.0.1:9000/;
    }
}

✅ 小贴士:记得 proxy_pass 末尾加 /,否则可能路径拼接出 Bug,变成“套娃”。


🧠 路径匹配背后的魔法逻辑

Nginx 对 location 的匹配是有规则的,简单记住三个关键词:

  1. 精准匹配:用 = 开头(比如 location = /api/health
  2. 前缀匹配:默认(如 location /api/
  3. 正则匹配:用 ~~* 开头,区分大小写

你只需要记住一条经验法则:

越具体越靠前,越模糊越靠后。

配置顺序很重要!


🪄 Bonus:隐藏路径前缀的骚操作(去掉 /api

有时候后端服务并不知道 /api 是个“外号”,我们只想让它看见 /users/login

location /api/ {
    proxy_pass http://127.0.0.1:3000/;
    rewrite ^/api/(.*)$ /$1 break;
}

这段配置干了啥?

  • 用户访问 /api/users
  • Nginx 把它偷偷改写为 /users
  • 然后转发给 3000 端口服务
  • 用户毫无察觉,服务开心收包

🎩 这就像你给朋友发“生日快乐”时,还偷偷加了红包,但红包入口你藏得好,他只觉得你很贴心(没错,Nginx 就这么贴心)。


🛠 配置调试小技巧

  • curl -i http://localhost/api/ping 检查响应
  • 观察返回头部是否有后端服务的痕迹
  • 错误日志看 /var/log/nginx/error.log
  • 开启访问日志调试路径请求细节
access_log /var/log/nginx/access.log;

✅ 小结:你已经可以:

  • 按路径分发不同服务(多服务部署利器)
  • 配置路径重写(服务路径解耦)
  • 搞清楚 proxy_pass 的拼接逻辑(防 Bug)

下一章,我们要来点更刺激的:HTTPS 配置 + 自动证书续期,上线上线上线!

别眨眼,马上上车!


第六章:上线才是硬道理——配置 HTTPS + 自动续期

“你的网站再漂亮,不上 HTTPS,Chrome 都不搭理你。”


🧨 为什么你必须用 HTTPS?

  1. 安全:防止中间人窃听(尤其是登录、支付等接口)
  2. 浏览器警告:HTTP 会提示“不安全”
  3. 搜索引擎优化:Google 明说了 HTTPS 是 SEO 权重指标
  4. 微信、支付宝不支持 HTTP 域名回调

所以,别犹豫了,该上 HTTPS 了!


🏅 最主流的免费证书:Let’s Encrypt

Let’s Encrypt 提供 90 天有效期的免费 SSL 证书,还能通过工具自动续期,搭配 Nginx 一起飞。

我们推荐的自动化神器:Certbot


📦 Certbot 安装指南(以 Ubuntu 为例)

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

这一步会装好 certbot 及 Nginx 插件,后续它会自动帮你改配置、续期。


⚙️ 快速申请证书(最简单的一行命令)

sudo certbot --nginx

它会引导你选择哪个域名开 HTTPS,还会自动修改你的 Nginx 配置。全过程不到 1 分钟!

完成后,你的配置大概变成这样:

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

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

🔄 自动续期?我不想手动 renew!

Let’s Encrypt 证书有效期只有 90 天,不过放心,Certbot 已经自动帮你搞定:

sudo systemctl list-timers

你会看到一个 certbot.timer,每天都会检查证书是否需要续期。

你也可以手动验证一把:

sudo certbot renew --dry-run

如果你看到 “Congratulations”,恭喜你:自动续期安排妥当!


🔀 强制所有 HTTP 自动跳转到 HTTPS

如果你还开着 80 端口,一定记得做自动跳转:

server {
    listen 80;
    server_name yourdomain.com;

    return 301 https://$host$request_uri;
}

👆 这段配置让所有 HTTP 流量立刻跳转到 HTTPS,用户无感,体验极佳。


❗️可能遇到的坑(别掉进去)

问题 原因 解决方案
443 端口访问不到 云服务器安全组没开 去控制台放行 TCP 443
申请失败,提示 DNS 不存在 域名没解析到服务器 去 DNS 服务商配置解析
证书续期失败 Nginx 配置挡住了 .well-known 路径 加一段专用 location 放行路径
location ~ /.well-known/acme-challenge/ {
    allow all;
    root /var/www/html;
}

✅ 本章你已掌握:

  • 一键开启 HTTPS
  • 了解自动续期机制
  • 配置 HTTP 自动跳转
  • 踩坑不慌,解决有方

下一章我们要聊聊生产环境的性能优化、日志分析、压缩加速,真刀真枪搞性能!


第七章:性能加速与日志利器——让 Nginx 跑得更快,看得更清楚!

“高并发是压力?不,是动力!日志是枯燥?不,是宝藏!”


7.1 开启 gzip 压缩,节省带宽提速页面加载

默认情况下,Nginx 不一定开启 gzip 压缩,压缩后能大幅减少传输体积,提高用户体验。

开启 gzip

http 块里加:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 256;
gzip_comp_level 5;

💡 含义:对指定类型的响应开启压缩,5 是压缩级别,范围 1-9,数字越大压缩越彻底,但 CPU 占用也高。


7.2 缓存控制,提升重复访问速度

给静态资源设置长缓存:

location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
    expires 30d;
    add_header Cache-Control "public";
}

这样浏览器会缓存静态资源 30 天,减少重复请求。


7.3 日志文件详解

访问日志(access.log)

默认路径:/var/log/nginx/access.log

记录每个请求详情,格式包括:IP、请求时间、状态码、请求路径、用户代理等。

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

错误日志(error.log)

默认路径:/var/log/nginx/error.log

记录运行时错误,调试 Nginx 配置问题的利器。

error_log /var/log/nginx/error.log warn;

7.4 日志格式自定义

你可以定义自己的日志格式,方便分析。

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;

7.5 性能优化建议

  • 调整 worker_processes:设置为 CPU 核数
  • 增大 worker_connections:比如调到 4096,支持更多并发
  • 开启 sendfile
sendfile on;

减少文件传输延迟

  • 开启 TCP 优化
tcp_nopush on;
tcp_nodelay on;
  • 使用 keepalive 连接
keepalive_timeout 65;

7.6 使用第三方日志分析工具

  • GoAccess:实时命令行日志分析
  • ELK(Elasticsearch + Logstash + Kibana):企业级日志管理
  • Grafana + Prometheus:配合导出插件实现 Nginx 性能监控

✅ 本章小结

  • 开启 gzip 压缩节省带宽
  • 合理设置缓存头提升页面响应速度
  • 理解访问日志与错误日志作用
  • 优化 Nginx 配置参数提升性能
  • 搭配日志分析工具洞察运营状况

📌 下一章预告:高阶进阶!Nginx 反代 WebSocket + HTTP2 + 微服务架构实践,敬请期待!


第八章:Nginx 反向代理 WebSocket + HTTP/2 + 微服务实战

“WebSocket 实时聊天,HTTP/2 多路复用,微服务架构加速上线,一篇搞定!”


8.1 WebSocket 反向代理示例

WebSocket 让浏览器和服务器保持长连接,适合聊天室、游戏、实时推送。

配置示例(假设后端 WebSocket 服务跑在 127.0.0.1:4000)

server {
    listen 80;
    server_name ws.example.com;

    location /ws/ {
        proxy_pass http://127.0.0.1:4000/;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;

        proxy_read_timeout 86400;
    }
}

💡 关键点:

  • proxy_http_version 1.1; 保证 HTTP/1.1 支持 Upgrade
  • proxy_set_header UpgradeConnection 负责升级连接为 WebSocket

8.2 开启 HTTP/2 支持

HTTP/2 提升多路复用、header 压缩,默认只支持 HTTPS 端口 443。

配置示例

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

小提示:listen 443 ssl http2; 一定要写,才能开启 HTTP/2。


8.3 微服务架构中的 Nginx 路由示例

假设你有三个微服务:

路径前缀 服务地址 说明
/user http://127.0.0.1:5001 用户服务
/order http://127.0.0.1:5002 订单服务
/pay http://127.0.0.1:5003 支付服务

Nginx 配置示例

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

    location /user/ {
        proxy_pass http://127.0.0.1:5001/;
    }

    location /order/ {
        proxy_pass http://127.0.0.1:5002/;
    }

    location /pay/ {
        proxy_pass http://127.0.0.1:5003/;
    }
}

确保服务内部接口兼容路径前缀,或者配合 rewrite 实现路径重写。


8.4 实操脚本合集

脚本 1:自动部署 Nginx + Certbot + WebSocket 配置

#!/bin/bash

# 安装 Nginx 和 Certbot
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx

# 配置 WebSocket 代理(写入配置文件)
cat <<EOF | sudo tee /etc/nginx/sites-available/ws.conf
server {
    listen 80;
    server_name ws.example.com;

    location /ws/ {
        proxy_pass http://127.0.0.1:4000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade \$http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host \$host;
        proxy_read_timeout 86400;
    }
}
EOF

# 启用配置
sudo ln -sf /etc/nginx/sites-available/ws.conf /etc/nginx/sites-enabled/ws.conf

# 测试 Nginx 配置并重载
sudo nginx -t && sudo systemctl reload nginx

# 申请 HTTPS 证书
sudo certbot --nginx -d ws.example.com --non-interactive --agree-tos -m your-email@example.com

echo "WebSocket 反向代理 + HTTPS 已配置完成!"

脚本 2:开启 HTTP/2 的 Nginx 配置模板

#!/bin/bash

DOMAIN="www.example.com"

cat <<EOF | sudo tee /etc/nginx/sites-available/http2.conf
server {
    listen 443 ssl http2;
    server_name $DOMAIN;

    ssl_certificate /etc/letsencrypt/live/$DOMAIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$DOMAIN/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
    }
}

server {
    listen 80;
    server_name $DOMAIN;
    return 301 https://\$host\$request_uri;
}
EOF

sudo ln -sf /etc/nginx/sites-available/http2.conf /etc/nginx/sites-enabled/http2.conf
sudo nginx -t && sudo systemctl reload nginx
echo "HTTP/2 配置完成,已开启 HTTPS 重定向。"

8.5 本章小结

  • 轻松配置 WebSocket 反向代理,搞定实时应用
  • 一键开启 HTTP/2,网页多路复用提速
  • 用 Nginx 做微服务的统一入口,路径分发管理服务
  • 脚本化部署,自动化省时省力

网站公告

今日签到

点亮在社区的每一天
去签到