目录前言为什么要学 Nginx一、Nginx 基础入门从零搭建第一个服务1.1 初识 Nginx它是什么能做什么1.2 第一个 Nginx 服务最小化配置实战1.3 安装Linux 里的 Nginx 魔法从下载到部署轻松拿捏二、核心架构与配置解析读懂 Nginx 的 运行逻辑2.1 架构精髓Master-Worker 进程模型2.2 配置骨架从 http 到 location 的层级关系2.3 静态资源服务Nginx 的 原生强项三、关键应用场景Nginx 实战核心技能3.1 反向代理隐藏后端统一入口3.2 负载均衡分摊压力提升可用3.3 动静分离各司其职极致性能3.4 SSL/TLS 终端代理打造 HTTPS 安全站点四、性能优化与安全加固让 Nginx 更稳更快4.1 性能调优从配置到内核的全维度优化4.2 安全加固抵御常见攻击五、总结与展望Nginx 的核心价值与未来5.1 核心价值总结5.2 Nginx 与其他技术的对比5.3 未来发展趋势 附录Nginx 常用工具与资源常用命令速查配置文件检查清单推荐学习资源前言为什么要学 Nginx学习Nginx就是掌握如何为你的Web服务构建一个高效、可靠且强大的“交通中枢”Nginx 的核心价值体现在三个关键方面高性能采用事件驱动的异步非阻塞架构能够轻松应对 C10K甚至 C100K问题高可靠性Master-Worker 进程模型确保服务稳定运行高扩展性模块化设计支持丰富的功能扩展无论是作为 Web 服务器、反向代理、负载均衡器还是 API 网关Nginx 都展现出了卓越的性能表现。本文将带你从零开始全面掌握 Nginx 的核心概念和实战技能。一、Nginx 基础入门从零搭建第一个服务1.1 初识 Nginx它是什么能做什么Nginx 的主要应用场景Web 服务器处理静态资源请求性能远超传统服务器反向代理服务器隐藏后端服务提供统一的访问入口负载均衡器在多台服务器间分配请求负载API 网关处理 API 路由、认证、限流等能力内容缓存缓存动态和静态内容提升响应速度1.2 第一个 Nginx 服务最小化配置实战最小化配置文件示例以源码安装的 Nginx 为例配置文件路径为/usr/local/nginx/conf/nginx.conf最小可用配置如下# -------------------------- main 区块全局配置-------------------------- # 工作进程数建议设为 CPU 核心数auto 表示自动匹配 worker_processes auto; # 全局错误日志路径与级别debug/info/notice/warn/error/crit error_log /usr/local/nginx/logs/error.log warn; # 进程 PID 文件路径 pid /usr/local/nginx/logs/nginx.pid; # -------------------------- events 区块连接处理配置-------------------------- events { # 每个工作进程的最大连接数默认 1024需结合系统文件描述符调整 worker_connections 1024; # 事件模型Linux 推荐 epollBSD 推荐 kqueue use epoll; # 允许一个连接同时被多个请求复用HTTP 长连接相关 multi_accept on; } # -------------------------- http 区块HTTP 协议总配置-------------------------- http { # 引入 MIME 类型映射文件定义文件后缀与 Content-Type 的对应关系 include /usr/local/nginx/conf/mime.types; # 未知文件类型的默认 Content-Type default_type application/octet-stream; # 日志格式定义main 为格式名称可自定义 log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; # 访问日志路径使用 main 格式 access_log /usr/local/nginx/logs/access.log main; # 启用零拷贝直接磁盘→网卡传输跳过用户态缓冲区提升性能 sendfile on; # 与 sendfile 配合合并数据包发送减少 TCP 握手次数 tcp_nopush on; # 禁用 Nagle 算法小数据包即时发送平衡延迟与效率 tcp_nodelay on; # 连接超时时间客户端与 Nginx 保持连接的超时时间 keepalive_timeout 65; # -------------------------- server 区块虚拟主机-------------------------- # 定义一个虚拟主机可理解为“单个网站” server { # 监听端口默认 80HTTP 标准端口 listen 80; # 绑定域名多个域名用空格分隔如 example.com www.example.com server_name localhost; # 字符集设置避免中文乱码 charset utf-8; # -------------------------- location 区块请求路径匹配-------------------------- # 匹配根路径 /所有未被其他 location 匹配的请求都会命中这里 location / { # 网站根目录静态资源存放路径 root /usr/local/nginx/html; # 默认首页多个页面用空格分隔按顺序查找 index index.html index.htm; } # 匹配 404 错误页面 error_page 404 /404.html; # 匹配 50x 系列错误500/502/503/504 error_page 500 502 503 504 /50x.html; # 对应错误页面的路径配置 location /50x.html { root /usr/local/nginx/html; } } }配置优化示例# 在nginx.conf的main块中设置 worker_processes auto; # 自动设置为CPU核心数 worker_cpu_affinity auto; # 自动绑定CPU核心 # 设置每个Worker进程的最大文件打开数 worker_rlimit_nofile 100000; events { worker_connections 4096; # 每个Worker的最大连接数 use epoll; # Linux高性能事件模型 multi_accept on; # 一次接受所有新连接 }1.3 安装Linux 里的 Nginx 魔法从下载到部署轻松拿捏参考这篇博客https://blog.csdn.net/qq_59998784/article/details/146231297?spm1011.2415.3001.5331二、核心架构与配置解析读懂 Nginx 的 运行逻辑2.1 架构精髓Master-Worker 进程模型Nginx 采用经典的 Master-Worker 多进程架构这种设计确保了高稳定性和性能。进程架构详解Master Process (PID: 1234) [管理者] ├── Worker Process (PID: 1235) [处理客户端请求] ├── Worker Process (PID: 1236) [处理客户端请求] ├── Worker Process (PID: 1237) [处理客户端请求] ├── Cache Loader Process (PID: 1238) [只在启动时出现用于初始化缓存索引完成后自动退出] └── Cache Manager Process (PID: 1239) [常驻的“后台管家”定期清理过期缓存]各进程职责Master 进程读取和验证配置文件管理 Worker 进程启动、停止、重载平滑升级不中断服务的情况下更新版本Worker 进程实际处理客户端请求每个进程独立运行互不干扰采用事件驱动模型非阻塞处理Cache Manager 进程专职负责缓存的过期与清理是 Nginx 缓存系统的“后台管家”2.2 配置骨架从 http 到 location 的层级关系Nginx 配置文件采用层次化的“区块嵌套”结构理解这种结构是掌握配置的关键核心层级为main全局→events事件→httpHTTP 协议→server虚拟主机→location请求匹配。层级上下文作用范围核心作用Main全局整个 Nginx 实例配置进程、日志、用户等全局参数Eventsevents网络连接配置最大连接数、连接处理模型影响性能HTTPhttp所有 HTTP/HTTPS 流量配置协议级通用参数日志、压缩、MIME等Serverserver单个虚拟主机网站基于域名/IP/端口区分不同网站Locationlocation虚拟主机内的特定 URI对请求路径进行最精细化的处理和控制配置层次结构# 层级1: Main Context (全局配置) worker_processes auto; # 工作进程数建议设为 CPU 核心数 error_log /var/log/nginx/error.log warn; # 全局错误日志路径与级别 pid /run/nginx.pid; # 进程 PID 文件路径 # 层级2: Events Context (事件配置) events { worker_connections 1024; # 每个工作进程的最大连接数 use epoll; # Linux 系统推荐使用 epoll 事件模型 multi_accept on; # 允许一个连接同时处理多个请求 } # 层级3: HTTP Context (HTTP协议配置) http { include /etc/nginx/mime.types; # 引入 MIME 类型映射文件 default_type application/octet-stream; # 未知文件类型的默认 Content-Type # 定义日志格式 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; # 访问日志路径和格式 # 性能优化指令 sendfile on; # 启用零拷贝传输 tcp_nopush on; # 优化数据包发送减少网络报文 tcp_nodelay on; # 禁用 Nagle 算法降低延迟 keepalive_timeout 65; # 客户端连接保持超时时间 # 启用 Gzip 压缩 gzip on; gzip_types text/plain text/css application/json application/javascript; # 层级4: Server Context (虚拟主机配置) server { listen 80; # 监听 80 端口HTTP server_name example.com www.example.com; # 绑定的域名 # 字符集设置避免中文乱码 charset utf-8; # 层级5: Location Context (URI匹配配置) location / { root /var/www/html; # 网站根目录 index index.html index.htm; # 默认首页文件 } # 静态资源缓存优化 location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { root /var/www/static; expires 1y; # 缓存 1 年 add_header Cache-Control public, immutable; } # 错误页面配置 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location /50x.html { root /var/www/html; } } }Location 匹配规则详解Nginx 的 location 块支持多种匹配方式优先级从高到低server { # 1. 精确匹配 () - 最高优先级 location /exact-path { return 200 This is an exact match; } # 2. 优先前缀匹配 (^~) - 第二优先级 location ^~ /static/ { root /var/www; # 此配置会阻止后续的正则匹配 } # 3. 正则匹配 (~ 区分大小写, ~* 不区分大小写) location ~ \.php$ { # 处理PHP文件 fastcgi_pass 127.0.0.1:9000; } location ~* \.(jpg|png|gif)$ { # 处理图片文件不区分大小写 expires 30d; } # 4. 普通前缀匹配 - 最低优先级 location / { # 通用匹配 try_files $uri $uri/ 404; } }2.3 静态资源服务Nginx 的 原生强项Nginx 在处理静态资源方面具有天然优势正确的配置可以极大提升性能。基础静态服务配置server { listen 80; server_name static.example.com; # 基础静态文件服务 location / { root /var/www/html; # 设置根目录路径 index index.html index.htm; # 默认索引文件 # 性能优化设置 sendfile on; # 启用零拷贝传输绕过用户空间直接在内核处理文件发送 tcp_nopush on; # 在sendfile启用时优化数据包发送减少网络报文数量 # 缓存控制 expires 1h; # 设置浏览器缓存1小时HTTP响应头Expires和Cache-Control add_header Cache-Control public; # 允许所有缓存CDN、代理、浏览器缓存资源 } # 图片文件特殊处理 location ~* \.(jpg|jpeg|png|gif|ico|webp)$ { root /var/www/images; # 更长的缓存时间 expires 1y; add_header Cache-Control public, immutable; # 图片优化 image_filter resize 800 600; # 可选图片处理 } # CSS和JS文件 location ~* \.(css|js)$ { root /var/www/assets; expires 7d; add_header Cache-Control public; # Gzip压缩 gzip on; gzip_types text/css application/javascript; } }高级静态资源优化http { # 文件访问缓存配置优化静态文件读取性能 # 启用文件描述符缓存最多缓存10000个文件描述符30秒内未被访问则移除缓存 open_file_cache max10000 inactive30s; # 每60秒检查一次缓存中文件的有效性如是否被修改 open_file_cache_valid 60s; # 一个文件至少被访问2次后才会被缓存避免缓存低频访问文件 open_file_cache_min_uses 2; # 缓存文件访问错误如文件不存在、权限问题避免重复校验错误状态 open_file_cache_errors on; # Gzip压缩配置减少网络传输数据量提升加载速度 gzip on; # 开启Gzip压缩 gzip_vary on; # 在响应头中添加Vary: Accept-Encoding告知客户端支持压缩 gzip_min_length 1024; # 仅压缩大小超过1024字节的文件小文件压缩收益低 # 指定需要压缩的MIME类型文件类型 gzip_types text/plain # 纯文本 text/css # CSS样式表 text/xml # XML文档 text/javascript # JS脚本旧标准 application/javascript # JS脚本新标准 application/xmlrss # RSS订阅XML application/json; # JSON数据 }三、关键应用场景Nginx 实战核心技能3.1 反向代理隐藏后端统一入口反向代理是 Nginx 最常用的功能之一它隐藏了后端服务器的细节提供了统一的访问入口。基础反向代理配置客户端请求 → Nginx (监听80端口) → 根据server_name匹配 → Location / 处理 → 转发到proxy_pass代理的后端服务器组→upstream定义后端服务器集群server { listen 80; server_name example.com; location / { # 基本代理设置 proxy_pass http://backend_server; # 重要的请求头设置确保后端服务器能获取正确的客户端信息而不是看到代理服务器的IP proxy_set_header Host $host; # 保持原始域名 proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链IP记录 proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议(http/https) # 超时设置防止因后端服务响应慢而阻塞 Nginx 工作进程 proxy_connect_timeout 30s; # 连接后端超时时间 proxy_send_timeout 30s; # 发送请求到后端超时时间 proxy_read_timeout 30s; # 读取后端响应超时时间 # 缓冲优化缓冲后端响应减少后端服务器连接保持时间优化对客户端的响应传输防止快速客户端拖慢慢速后端 proxy_buffering on; proxy_buffer_size 4k; # 响应头缓冲区大小 proxy_buffers 8 4k; # 响应体缓冲区(8个4k块) } } # 定义后端服务器组 upstream backend_server { server 192.168.1.10:8080; server 192.168.1.11:8080; }高级代理配置location /api/ { # 将匹配 /api/ 路径的请求代理到名为 api_backend 的后端服务器组 proxy_pass http://api_backend; # # 错误处理与故障转移配置 # # 定义在什么情况下应该尝试下一个上游服务器 # error: 与后端服务器建立连接、发送请求或读取响应时发生错误 # timeout: 与后端服务器连接、发送或读取超时 # invalid_header: 后端服务器返回空或无效的响应头 # http_500: 后端服务器返回500状态码 # http_502: 后端服务器返回502状态码 # http_503: 后端服务器返回503状态码 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; # 指定故障转移的最大重试次数包括第一次请求 # 这里设置为3次意味着如果第一个服务器失败会再尝试另外两个服务器 proxy_next_upstream_tries 3; # 设置故障转移的超时时间限制 # 在30秒内如果没有成功响应则停止尝试其他服务器并返回错误 proxy_next_upstream_timeout 30s; # # 连接池配置性能优化 # # 设置与每个后端服务器保持的最大空闲keepalive连接数 # 保持连接复用可以减少TCP握手开销提高性能 keepalive 32; # 设置keepalive连接的最大空闲时间 # 超过30秒未使用的连接将被关闭 keepalive_timeout 30s; # 单个keepalive连接上允许处理的最大请求数 # 达到100个请求后连接将被关闭防止连接老化 keepalive_requests 100; # # 超时与重试机制 # # 与后端服务器建立连接的超时时间 # 如果5秒内无法建立连接将触发错误处理 proxy_connect_timeout 5s; # 向后端服务器发送请求的超时时间 # 如果10秒内无法发送完所有请求数据将触发错误处理 proxy_send_timeout 10s; # 从后端服务器读取响应的超时时间 # 如果30秒内没有收到任何数据将触发错误处理 # 对于API接口这个值通常设置得比连接和发送超时长 proxy_read_timeout 30s; }3.2 负载均衡分摊压力提升可用Nginx 提供多种负载均衡算法可以根据业务需求选择合适的策略。负载均衡配置示例upstream backend_cluster { # 负载均衡算法 least_conn; # 最少连接数算法 # 服务器定义 server 192.168.1.10:8080 weight3 max_fails3 fail_timeout30s; server 192.168.1.11:8080 weight2 max_fails3 fail_timeout30s; server 192.168.1.12:8080 weight1 max_fails3 fail_timeout30s; server 192.168.1.13:8080 backup; # 备份服务器 } server { listen 80; server_name app.example.com; location / { proxy_pass http://backend_cluster; proxy_set_header Host $host; # 其他代理配置... } }不同负载均衡算法# 1. 轮询默认 upstream round_robin { server backend1.example.com; server backend2.example.com; } # 2. 加权轮询 upstream weighted_round_robin { server backend1.example.com weight5; # 处理50%的请求 server backend2.example.com weight3; # 处理30%的请求 server backend3.example.com weight2; # 处理20%的请求 } # 3. IP哈希会话保持 upstream ip_hash { ip_hash; # 基于客户端IP的哈希 server backend1.example.com; server backend2.example.com; } # 4. 最少连接数 upstream least_conn { least_conn; server backend1.example.com; server backend2.example.com; } # 5. 基于响应时间的负载均衡需要商业版 upstream response_time { fair; server backend1.example.com; server backend2.example.com; }3.3 动静分离各司其职极致性能动静分离是提升网站性能的重要手段将动态请求和静态请求分别处理。完整的动静分离配置upstream dynamic_backend { server 192.168.1.20:8000; server 192.168.1.21:8000; } server { listen 80; server_name www.example.com; # 静态资源 - 直接由Nginx处理 location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|txt)$ { root /var/www/static; # 缓存优化 expires 1y; add_header Cache-Control public, immutable; # 性能优化 sendfile on; tcp_nopush on; # 如果文件不存在不代理到后端 try_files $uri 404; } # 动态请求 - 代理到后端应用服务器 location / { proxy_pass http://dynamic_backend; 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; } # API请求单独处理 location /api/ { proxy_pass http://dynamic_backend; # 特殊的API配置... } }3.4 SSL/TLS 终端代理打造 HTTPS 安全站点Nginx 可以作为 SSL/TLS 终端处理加密连接减轻后端服务器的负担。完整的 HTTPS 配置# HTTPS服务器配置 server { listen 443 ssl http2; # 启用HTTP/2 server_name example.com; # SSL证书配置 ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; # SSL协议配置 ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的旧协议 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # SSL性能优化 ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; # 安全头设置 add_header Strict-Transport-Security max-age31536000; includeSubDomains always; add_header X-Frame-Options SAMEORIGIN always; add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection 1; modeblock always; # 应用配置 location / { proxy_pass http://backend_server; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; } } # HTTP重定向到HTTPS server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; }四、性能优化与安全加固让 Nginx 更稳更快4.1 性能调优从配置到内核的全维度优化Nginx 配置层优化# nginx.conf 中的性能优化配置 http { # 基础性能设置 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 1000; # 缓冲优化 client_body_buffer_size 128k; client_max_body_size 10m; client_header_buffer_size 1k; large_client_header_buffers 4 4k; # Gzip压缩优化 gzip on; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/javascript application/xmlrss application/json; # 文件缓存优化 open_file_cache max10000 inactive30s; open_file_cache_valid 60s; open_file_cache_min_uses 2; open_file_cache_errors on; } # 事件模块优化 events { worker_connections 2048; use epoll; multi_accept on; }操作系统层优化# 调整内核参数/etc/sysctl.conf echo net.core.somaxconn 65535 /etc/sysctl.conf echo net.core.netdev_max_backlog 65536 /etc/sysctl.conf echo net.ipv4.tcp_max_syn_backlog 65536 /etc/sysctl.conf echo net.ipv4.tcp_fin_timeout 30 /etc/sysctl.conf echo net.ipv4.tcp_tw_reuse 1 /etc/sysctl.conf echo fs.file-max 100000 /etc/sysctl.conf # 应用配置 sysctl -p4.2 安全加固抵御常见攻击基础安全配置server { # 隐藏Nginx版本信息 server_tokens off; # 安全头设置 add_header X-Frame-Options SAMEORIGIN always; add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection 1; modeblock always; add_header Referrer-Policy strict-origin-when-cross-origin always; # 限制请求方法 if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; } # 防止点击劫持 add_header X-Frame-Options SAMEORIGIN; # 限制文件上传大小 client_max_body_size 10m; } # 速率限制防御DDoS http { limit_req_zone $binary_remote_addr zoneapi:10m rate10r/s; limit_req_zone $binary_remote_addr zonelogin:10m rate1r/m; server { location /api/ { limit_req zoneapi burst20 nodelay; # API配置... } location /login { limit_req zonelogin burst5; # 登录配置... } } }高级安全防护# 防止SQL注入和XSS攻击 server { # 屏蔽敏感文件 location ~ /\.(ht|git|svn) { deny all; } location ~* \.(bak|config|sql|log)$ { deny all; } # 防止图片盗链 location ~* \.(jpg|jpeg|png|gif)$ { valid_referers none blocked server_names ~\.google\. ~\.baidu\.; if ($invalid_referer) { return 403; # 或者返回一个默认图片 # rewrite ^ /images/blocked.png; } } }五、总结与展望Nginx 的核心价值与未来5.1 核心价值总结通过本文的学习我们可以看到 Nginx 的核心价值体现在卓越的性能事件驱动架构轻松应对高并发场景灵活的配置模块化设计支持各种复杂业务需求稳定的运行Master-Worker 进程模型确保服务高可用丰富的生态大量第三方模块扩展功能边界5.2 Nginx 与其他技术的对比特性NginxApacheCaddy性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐配置复杂度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐功能丰富度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐学习曲线⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐社区生态⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐5.3 未来发展趋势云原生支持Nginx 在 Kubernetes 生态中作为 Ingress Controller 广泛应用边缘计算作为边缘节点处理计算和缓存任务API 网关功能不断丰富向全功能 API 网关演进安全增强集成更多安全功能如 WAF、Bot 防护等 附录Nginx 常用工具与资源常用命令速查# 测试配置 nginx -t # 重新加载配置不中断服务 nginx -s reload # 重新打开日志文件 nginx -s reopen # 优雅停止 nginx -s quit