🗂️《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 reload 或 systemctl 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.conf
、site2.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
的匹配是有规则的,简单记住三个关键词:
- 精准匹配:用
=
开头(比如location = /api/health
) - 前缀匹配:默认(如
location /api/
) - 正则匹配:用
~
或~*
开头,区分大小写
你只需要记住一条经验法则:
越具体越靠前,越模糊越靠后。
配置顺序很重要!
🪄 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?
- 安全:防止中间人窃听(尤其是登录、支付等接口)
- 浏览器警告:HTTP 会提示“不安全”
- 搜索引擎优化:Google 明说了 HTTPS 是 SEO 权重指标
- 微信、支付宝不支持 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 支持 Upgradeproxy_set_header Upgrade
和Connection
负责升级连接为 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 做微服务的统一入口,路径分发管理服务
- 脚本化部署,自动化省时省力