Skip to content

Nginx 知识体系导图

一、Nginx基础深入(入门与进阶)

1. Nginx核心基础

  • 定义:Nginx(Engine X)是一款高性能的HTTP和反向代理服务器,同时支持IMAP/POP3/SMTP代理,由俄罗斯程序员Igor Sysoev开发,核心定位是“高性能、高并发、高可靠”。

  • 核心特点(常见要点):

    • 高并发:单台服务器支持10万+并发连接(基于事件驱动模型),远超Apache。

    • 高性能:内存占用极低(单机仅占几MB),处理请求速度快,延迟低。

    • 高可靠性:稳定性极强,可长时间不间断运行,故障率极低,支持平滑重启(不中断服务)。

    • 可扩展性:模块化设计,支持自定义模块,可灵活扩展功能(如缓存、压缩、健康检查)。

    • 跨平台:兼容Linux、Windows、Unix等主流操作系统,主流部署在Linux服务器(前端部署首选)。

  • Nginx与Apache区别(重点):

    • 并发能力:Nginx基于事件驱动(epoll/kqueue),支持高并发;Apache基于多进程/多线程,并发能力较弱(几千级)。

    • 内存占用:Nginx内存占用极低,并发越高优势越明显;Apache内存占用高,并发增加时内存飙升。

    • 处理机制:Nginx异步非阻塞,资源利用率高;Apache同步阻塞,资源消耗大。

    • 适用场景:Nginx适合前端静态资源托管、反向代理、负载均衡、高并发场景;Apache适合动态请求(如PHP)、模块丰富的传统场景。

  • Nginx核心架构(重点):主进程(Master Process)+ 工作进程(Worker Process)+ 可选进程(缓存加载、缓存管理),核心是“多进程+事件驱动”。

    • 主进程:负责读取配置、启动/停止工作进程、接收信号(如重启、停止),不处理具体请求。

    • 工作进程:实际处理客户端请求,数量通常等于CPU核心数(最优配置),进程间相互独立,一个进程异常不影响其他进程。

2. Nginx安装与启动(实战基础,重点)

  • 安装方式(前端常用):

    • 源码编译安装(推荐):可自定义配置、添加第三方模块(如健康检查、缓存清理),适合生产环境。

    • 包管理器安装(快捷):yum(CentOS)、apt(Ubuntu),命令简单,适合测试或快速部署(如yum install nginx)。

    • Docker容器安装(主流):隔离性好,部署便捷,适合集群环境(docker run -d -p 80:80 nginx)。

  • 核心命令(常用):

    • 启动:nginx

    • 停止:nginx -s stop(强制停止,立即终止进程)、nginx -s quit(优雅停止,处理完当前请求再终止)。

    • 重启/重载配置:nginx -s reload(平滑重载,不中断服务,核心要点)。

    • 检查配置:nginx -t(验证配置文件语法是否正确,排查配置错误的首选命令)。

    • 查看版本:nginx -v(简单版本)、nginx -V(详细版本,包含编译参数、已安装模块)。

  • 核心路径(实战必备):

    • 配置文件路径:默认/etc/nginx/nginx.conf(主配置文件)、/etc/nginx/conf.d/(虚拟主机配置目录)。

    • 日志路径:/var/log/nginx/(access.log访问日志、error.log错误日志,排查问题核心)。

    • 静态资源路径:默认/usr/share/nginx/html(可自定义修改)。

  • 启动故障排查(常见场景):

    • 端口占用:netstat -tulnp | grep 80(查看80端口是否被占用,如被占用需终止对应进程)。

    • 配置错误:nginx -t 检查语法,根据提示修改配置文件。

    • 日志排查:查看error.log日志,定位具体错误(如权限不足、配置项错误)。

3. Nginx配置文件结构(核心)

  • 配置文件层级(从外到内,记清顺序):全局块 → events块 → http块 → server块 → location块。

  • 各块核心作用(常见要点):

    • 全局块:配置Nginx全局参数,影响整个Nginx服务。

      • 核心指令:worker_processes(工作进程数,建议等于CPU核心数,如worker_processes 4)、error_log(错误日志路径)、pid(PID文件路径)、worker_rlimit_nofile(单个工作进程最大文件描述符限制)。
    • events块:配置Nginx事件处理模型,决定Nginx的并发能力。

      • 核心指令:use epoll;(启用epoll事件模型,Linux系统首选,提升并发)、worker_connections(单个工作进程最大连接数,如10240)。
    • http块:配置HTTP协议相关参数,可包含多个server块(虚拟主机),是配置核心。

      • 核心指令:include(引入其他配置文件)、default_type(默认MIME类型)、log_format(日志格式定义)、sendfile on(开启高效文件传输)、gzip on(开启压缩)。
    • server块:配置虚拟主机,实现多域名/多端口部署(同一服务器部署多个前端项目)。

      • 核心指令:listen(监听端口,如listen 80;)、server_name(虚拟主机域名,如server_name www.xxx.com)、root(网站根目录)、index(默认首页)。
    • location块:配置请求匹配规则,处理具体的请求(如静态资源、反向代理),一个server块可包含多个location。

      • 核心指令:location [匹配规则] { ... },匹配规则优先级(重点):精确匹配(=)> 前缀匹配(^~)> 正则匹配(~ ~*)> 普通前缀匹配。
  • 配置语法规则(避坑重点):指令末尾必须加分号(;)、注释用#开头、指令区分大小写、块级指令用{}包裹、空格分隔指令与参数。

二、Nginx核心功能(进阶核心)

1. 静态资源服务(前端部署基础,重点)

  • 核心作用:托管前端打包后的静态资源(Vue/React的dist目录、HTML、CSS、JS、图片等),提供高效访问。

  • 核心配置(实战示例):

    • 基础配置:root /home/dist;(指定静态资源根目录)、index index.html index.htm;(默认首页)。

    • MIME类型配置:include /etc/nginx/mime.types;(映射文件后缀与Content-Type,避免静态资源无法识别)。

  • 静态资源优化(进阶要点 · 可选强化):

    • 缓存优化:expires 7d;(设置静态资源缓存时间,7天,减少重复请求)、add_header Cache-Control "public, max-age=604800";(配合浏览器缓存)。

    • 压缩优化:gzip on;(开启gzip压缩)、gzip_types text/css application/javascript image/png;(指定压缩文件类型)、gzip_comp_level 6;(压缩级别,1-9,越高压缩率越高但消耗CPU)。

    • 防盗链优化:valid_referers www.xxx.com;(允许访问的来源域名),if ($invalid_referer) { return 403; }(非法引用返回403)。

    • 路径优化:try_files $uri $uri/ /index.html;(解决Vue/React单页应用刷新404问题,核心配置)。

  • 常见问题排查:

    • 静态资源404:根目录配置错误(root路径错误)、文件权限不足(chmod 755 /home/dist)、请求路径错误。

    • 压缩不生效:未开启gzip、未配置对应压缩文件类型、客户端不支持gzip。

    • 缓存不生效:expires指令配置错误、Cache-Control头设置冲突、资源路径带版本号(如app.js?v=1.0)。

2. 反向代理(进阶重点)

  • 定义(理解核心):客户端发送请求到Nginx,Nginx将请求转发到后端服务器(Node.js、Java等),后端处理后将响应返回给Nginx,再由Nginx返回给客户端(客户端不知道后端服务器存在,隐藏后端地址)。

  • 与正向代理的区别(重点,区分清楚):

    • 正向代理:客户端主动配置代理服务器,代理客户端访问目标服务器(如VPN),客户端知道代理存在,目标服务器不知道真实客户端。

    • 反向代理:客户端直接访问Nginx,Nginx代理后端服务器,客户端不知道后端服务器存在,后端服务器隐藏在代理后(保护后端安全)。

  • 核心配置指令(实战必备):

  • 前端实战场景(重点):

    • 解决跨域:前端项目(80端口)请求后端接口(3000端口),通过Nginx反向代理,避免浏览器跨域限制。

    • 隐藏后端地址:后端服务器不直接暴露给客户端,提升安全性(如后端只允许Nginx访问,禁止外部直接访问)。

  • 常见问题:

    • 后端获取不到真实客户端IP:未配置proxy_set_header X-Real-IP/X-Forwarded-For。

    • 反向代理后请求404:proxy_pass路径加/与不加/配置错误、后端服务未启动、后端接口路径错误。

    • 反向代理超时:后端服务响应过慢、超时时间配置过短。

3. 负载均衡(进阶重点)

  • 定义:当后端服务器为集群(多台服务器)时,Nginx将客户端请求按照一定规则分发到不同的后端服务器,实现负载分担、提高系统并发能力和可用性(一台服务器故障,不影响整体服务)。

  • 核心配置(实战示例):

  • 负载均衡算法(重点,记清每种算法的适用场景):

    • 轮询(默认):请求依次分发到后端服务器,适用于后端服务器性能一致的场景(如3台服务器,请求1→3000、请求2→3001、请求3→3002,循环)。

    • weight(权重):根据权重值分发请求,权重越高,被分配到请求的概率越大(适用于后端服务器性能不一致)。

      • 示例:upstream backend { server 127.0.0.1:3000 weight=5; server 127.0.0.1:3001 weight=3; }(3000服务器被分配的概率是3001的5/3倍)。
    • ip_hash:根据客户端IP地址哈希分配,同一客户端请求始终分发到同一后端服务器(解决会话保持问题,如登录状态、购物车)。

    • fair(第三方):根据后端服务器的响应时间分发请求,响应时间越短,优先分配(需要安装fair模块)。

    • url_hash(第三方):根据请求URL哈希分配,同一URL请求分发到同一后端服务器(适用于静态资源缓存,需要安装ngx_http_upstream_hash_module模块)。

  • 健康检查(重点 · 可选强化):

    • 被动健康检查(默认支持):proxy_next_upstream error timeout invalid_header;(当后端服务器出现错误、超时等情况,自动转发到下一台服务器)。

    • 主动健康检查(第三方模块):安装ngx_http_upstream_check_module模块,定期检测后端服务器状态,下线异常服务器,上线恢复服务器(避免请求分发到故障服务器)。

  • 实战场景:前端项目部署后,后端接口集群部署,通过Nginx负载均衡分担请求压力,提升系统可用性。

4. 虚拟主机(实战必备,常见)

  • 定义:在一台Nginx服务器上,通过配置多个server块,实现多个域名/端口对应不同的网站服务(共享一台服务器资源,降低部署成本)。

  • 虚拟主机类型(重点,记清3种类型):

    • 基于域名的虚拟主机(最常用):多个域名指向同一服务器IP,通过server_name区分不同网站(如www.xxx.com、blog.xxx.com)。

      • 示例:两个server块,分别配置server_name www.xxx.com(前端项目1)、server_name blog.xxx.com(前端项目2),共用80端口。
    • 基于端口的虚拟主机:同一域名,通过不同端口区分不同网站(如www.xxx.com:80、www.xxx.com:8080),适用于测试环境。

    • 基于IP的虚拟主机:服务器有多个IP,每个IP对应一个网站(较少用,IP资源宝贵)。

  • 核心配置示例(基于域名):

    • server { listen 80; server_name www.xxx.com; root /home/dist1; index index.html; }

    • server { listen 80; server_name blog.xxx.com; root /home/dist2; index index.html; }

  • 常见问题:

    • 虚拟主机无法访问:域名未解析到服务器IP、server_name配置错误、端口未开放、防火墙拦截。

    • 域名冲突:多个server块的server_name重复,Nginx会优先匹配第一个server块。

三、Nginx高级特性与实战(进阶与深化)

1. HTTPS配置(重点,安全相关,前端部署必懂)

  • HTTPS原理:基于SSL/TLS协议,实现数据传输加密(防止数据被窃取、篡改),需要CA证书(验证服务器身份,避免中间人攻击)。

  • 核心配置(实战必备):

    • 监听443端口:listen 443 ssl;(HTTPS默认端口为443)。

    • 证书配置:ssl_certificate /etc/nginx/cert/xxx.pem;(CA证书路径)、ssl_certificate_key /etc/nginx/cert/xxx.key;(证书私钥路径)。

    • SSL协议优化:ssl_protocols TLSv1.2 TLSv1.3;(禁用不安全的SSLv3、TLSv1.0/1.1)、ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:HIGH:!aNULL:!MD5:!RC4;(指定加密算法套件)。

  • HTTPS优化:

    • HTTP自动跳转HTTPS:通过rewrite指令,将80端口请求跳转至443端口(rewrite ^(.*)$ https://$host$1 permanent;)。

    • SSL会话缓存:ssl_session_cache shared:SSL:10m;(缓存SSL会话,减少握手时间,提升性能)。

    • HSTS配置:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;(强制客户端后续访问使用HTTPS,避免HTTP劫持)。

  • 证书相关(实战细节):

    • 免费证书:Let's Encrypt(免费、自动续期,适合个人和小型项目)。

    • 付费证书:阿里云、腾讯云等厂商提供,安全性更高,适合企业级项目。

    • 自签名证书:仅用于测试环境,浏览器不认可,会提示不安全。

  • 常见问题:

    • HTTPS访问报错:证书过期、证书与域名不匹配、SSL协议配置错误、证书私钥错误。

    • HTTP跳转HTTPS失效:rewrite指令配置错误、server块监听端口错误。

2. Nginx Rewrite重写(高级重点,常见)

  • 定义:Rewrite指令用于修改请求URL,实现URL重定向、路径重写、伪静态等功能,基于正则表达式匹配请求路径(核心是“匹配+替换”)。

  • 核心指令(重点):

    • rewrite:核心重写指令,格式:rewrite 正则表达式 目标URL [标记]。

    • 标记(flag,重点记4种):

      • last:重写后,停止当前location块的rewrite规则,继续匹配其他location块(常用)。

      • break:重写后,停止所有rewrite规则,不再继续匹配(常用)。

      • redirect:临时重定向(302状态码),客户端会重新发起请求(适用于临时跳转)。

      • permanent:永久重定向(301状态码),客户端会缓存重定向地址(适用于永久跳转,如域名更换)。

    • if指令:结合rewrite使用,判断条件(如请求方法、请求头、IP地址等),格式:if (条件) { 指令; }。

  • 典型应用场景(实战重点):

    • URL伪静态:将动态URL重写为静态URL(如rewrite ^/index/(\d+)\.html$ /index.php?id=$1 last;)。

    • 域名跳转:如www.xxx.com跳转至xxx.com(rewrite ^(.*)$ https://xxx.com$1 permanent;)。

    • 路径重写:将/api/*重写为/backend/api/*(rewrite ^/api/(.*)$ /backend/api/$1 last;)。

    • 屏蔽特定IP:if ($remote_addr = 192.168.1.1) { return 403; }(禁止特定IP访问)。

  • 常见问题:

    • rewrite规则不生效:正则表达式错误、标记使用错误、location匹配优先级问题。

    • 重定向循环:如A域名跳转至B域名,B域名又跳转至A域名,需检查rewrite规则逻辑。

3. Nginx缓存机制(延伸 · 可选强化)

  • 缓存分类:浏览器缓存(客户端缓存,由expires、Cache-Control控制)、Nginx代理缓存(服务器端缓存,缓存后端响应结果,减轻后端压力)。

  • Nginx代理缓存核心配置(重点):

    • proxy_cache_path:在http块配置,指定缓存存储路径、大小、有效期等,示例:proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=7d use_temp_path=off;。

      • keys_zone=my_cache:10m:定义缓存名称为my_cache,分配10MB内存存储缓存key。

      • max_size=10g:缓存最大磁盘空间,超过后自动删除最久未使用的缓存。

      • inactive=7d:缓存7天未被访问则自动删除。

    • proxy_cache:在location块启用缓存,指定缓存名称(与proxy_cache_path一致),如proxy_cache my_cache;。

    • 其他指令:proxy_cache_valid 200 302 10m;(200、302状态码缓存10分钟)、proxy_cache_key "$scheme$request_method$host$request_uri";(定义缓存key,确保缓存唯一性)。

  • 缓存清理:Nginx本身不支持主动清理缓存,可通过两种方式实现:

    • 手动清理:删除缓存目录下的文件(rm -rf /var/nginx/cache/*)。

    • 第三方模块:安装ngx_cache_purge模块,实现主动清理指定缓存(如根据URL清理)。

  • 应用场景:缓存后端接口响应(如接口数据不常变化)、缓存静态资源(减轻后端和Nginx压力,提升响应速度)。

4. Nginx模块开发与扩展(延伸提要)

  • Nginx模块分类:

    • 核心模块(内置):如http模块、events模块,不可卸载,是Nginx运行的基础。

    • 基础模块(默认安装):如gzip模块、ssl模块,可通过配置开启/关闭。

    • 第三方模块(需手动编译安装):如ngx_http_upstream_check_module(健康检查)、ngx_cache_purge(缓存清理)、ngx_http_rewrite_module(重写)。

  • 常用第三方模块(实战常用):

    • ngx_http_upstream_check_module:负载均衡健康检查,实现主动检测后端服务器状态。

    • ngx_cache_purge:缓存清理,实现主动清理指定缓存。

    • ngx_http_image_filter_module:图片处理(压缩、裁剪),适合前端静态图片优化。

  • 第三方模块编译安装流程(重点):

    • 步骤1:下载Nginx源码和第三方模块源码。

    • 步骤2:重新编译Nginx,添加模块(./configure --add-module=模块源码路径)。

    • 步骤3:make(编译)、make install(安装)。

    • 步骤4:重启Nginx,验证模块是否生效(nginx -V 查看已安装模块)。

四、Nginx性能优化与故障排查(扩展 · 重点)

1. Nginx性能优化(重点,常见)

  • 全局配置优化:

    • worker_processes:设置为CPU核心数(如worker_processes 4;),充分利用CPU资源(查看CPU核心数:cat /proc/cpuinfo | grep "cpu cores")。

    • worker_connections:提高单个工作进程最大连接数(如worker_connections 10240;),结合worker_rlimit_nofile(如65535),提升并发能力。

  • 事件块优化:

    • use epoll;(Linux系统首选,启用高效事件模型,提升并发处理能力)。

    • multi_accept on;(允许一个工作进程同时接收多个连接,减少连接建立时间)。

  • http块优化:

    • 开启sendfile:sendfile on;(高效文件传输,减少内核与用户空间的数据拷贝,提升静态资源传输速度)。

    • 开启tcp_nopush:tcp_nopush on;(与sendfile配合,减少TCP数据包数量,提升传输效率)。

    • 开启tcp_nodelay:tcp_nodelay on;(禁用Nagle算法,减少请求延迟,适合实时请求)。

    • 压缩优化:gzip on;(开启压缩,减少资源体积)、gzip_min_length 1k;(小于1KB的文件不压缩,避免浪费CPU)。

  • 静态资源优化:

    • 开启文件缓存:open_file_cache max=10000 inactive=60s;(缓存文件描述符,减少文件打开次数)。

    • 合理设置缓存时间:静态资源(图片、JS、CSS)设置较长缓存时间(如7天),HTML设置较短缓存时间(如10分钟)。

2. Nginx故障排查(实战必备,重点)

  • 核心排查思路:查看日志 → 检查配置 → 验证服务 → 定位问题 → 解决问题。

  • 日志排查(核心手段):

    • 错误日志:/var/log/nginx/error.log,记录Nginx启动、运行中的错误(如配置错误、端口占用、后端连接失败)。

      • 常用命令:tail -n 10 error.log(查看最近10条错误)、tail -f error.log(实时监控错误)。
    • 访问日志:/var/log/nginx/access.log,记录所有客户端请求(如请求URL、状态码、客户端IP、响应时间)。

      • 常用命令:grep "404" access.log(筛选404请求)、awk '{print $1}' access.log | sort | uniq -c | sort -nr(统计访问最多的IP)。
  • 常见故障及解决方案(重点):

    • Nginx无法启动:端口占用(netstat -tulnp | grep 80,终止对应进程)、配置错误(nginx -t 检查语法)。

    • 静态资源404:根目录配置错误、文件权限不足、请求路径错误。

    • 反向代理失败:后端服务未启动、proxy_pass路径错误、后端服务器拒绝访问(防火墙拦截)。

    • HTTPS访问报错:证书问题、SSL配置错误、443端口未开放。

    • Nginx响应慢:后端服务响应慢、缓存未启用、CPU/内存占用过高(top查看,终止异常进程)。

3. Nginx安全配置(延伸)

  • 限制请求频率:防止恶意请求(如DDOS攻击),配置limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;(限制单个IP每秒最多10个请求)。

  • 禁止目录浏览:autoindex off;(默认关闭,避免静态资源目录被遍历)。

  • 隐藏Nginx版本号:server_tokens off;(避免泄露版本信息,减少安全风险)。

  • 限制请求方法:if ($request_method !~ ^(GET|POST|HEAD)$) { return 405; }(禁止PUT、DELETE等危险请求方法)。

  • 配置防火墙:开放必要端口(80、443),关闭无用端口,禁止外部直接访问后端服务器。