尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

爆肝整理!Nginx 从原理到生产实战全套教程(零基础吃透)

爆肝整理!Nginx 从原理到生产实战全套教程(零基础吃透) 爆肝整理Nginx 从原理到生产实战全套教程零基础吃透很多开发、运维同学在工作中只会简单使用 Nginx 托管静态页面面对反向代理失效、负载均衡不均、HTTPS 配置报错、并发瓶颈等生产问题束手无策。作为企业项目必备的高性能网关Nginx 是前后端开发、运维工程师的核心技能。本文从零入门、全覆盖、可直接落地生产包含底层原理、架构解析、命令实操、配置详解、负载均衡算法、生产案例看完直接搞定99%的Nginx场景一、Nginx 核心基础概述1.1 什么是 NginxNginx是一款高性能、事件驱动、开源的 Web 服务网关不仅是 Web 服务器更是集反向代理、负载均衡、HTTP 缓存、安全防护于一体的全能中间件。由俄罗斯工程师 Igor Sysoev 开发凭借极致的性能优势成为目前互联网、微服务、集群项目的主流标配组件。核心生产优势单机可支撑5万高并发连接CPU、内存资源消耗极低7×24小时稳定运行支持零停机热更新适配所有线上生产环境。1.2 Nginx 三大核心优势1. 异步非阻塞事件驱动高并发核心采用epoll/kqueueIO多路复用、异步非阻塞机制从底层碾压传统 Apache 服务器传统 Apache一连接绑定一个进程/线程万级并发会产生上万个进程内存飙升、系统上下文切换频繁并发瓶颈极大Nginx仅启动少量 Worker 进程单个进程可同时管理数千上万连接空闲连接几乎零资源消耗轻松支撑高并发场景。2. 轻量极简、部署零门槛无冗余依赖、跨环境适配配置文件结构化清晰支持一键安装、快速启停、无感重载个人项目、企业集群均可快速部署。3. 一站式全能网关能力Nginx 绝非单纯的网页服务器覆盖网关全场景需求✅静态资源托管高效解析 html、js、css、图片、附件等静态文件✅反向代理转发请求至后端 SpringBoot、PHP、Python 服务隐藏后端真实节点✅负载均衡实现多节点流量分发支持集群扩容、故障自动容错✅缓存加速缓存后端响应数据大幅提升接口响应速度、降低后端压力✅HTTPS 安全终端统一处理证书加密解密实现 HTTP 强制跳转✅安全防护限流、防盗链、IP黑白名单、访问控制、URL重写二、Nginx 核心架构生产稳定性核心Nginx 采用经典Master-Worker 多进程解耦架构管理进程与业务进程分离是其高稳定、零宕机更新的核心原理。2.1 三大核心进程分工1. Master 主进程Root权限只管理、不处理业务全局调度核心读取、校验、解析全局 Nginx 配置文件统一管控所有 Worker 子进程的启动、停止、重载、销毁监听系统信号响应运维操作重启、热重载、日志切割2. Worker 工作进程业务核心真正处理用户请求的工作进程是业务落地的核心单进程单线程异步非阻塞处理 TCP 连接、HTTP 请求解析、代理转发、文件读写多进程相互独立单进程故障不会影响整体服务生产最优配置worker_processes auto;自动匹配CPU核心数最大化硬件性能3. 缓存辅助进程可选cache manager定时清理磁盘过期缓存释放服务器资源cache loader服务启动时加载历史缓存元数据快速恢复缓存服务2.2 零停机热重载原理生产最常用的nginx -s reload命令全程用户无感知、服务不中断核心流程Master 进程读取新配置严格校验语法合法性启动全新 Worker 进程加载最新配置处理新请求旧 Worker 进程停止接收新请求处理完已有连接后自动退出新旧进程平滑交替实现配置无感更新。三、Nginx 高频核心命令Linux生产整理运维日常高频命令覆盖启停、校验、重载全场景nginx# 启动 Nginx 服务nginx-sstop# 快速强制停止不推荐生产nginx-squit# 优雅停止处理完现有连接再退出nginx-sreload# 热重载配置生产最常用零停机nginx-t# 校验配置文件语法是否正确systemctlenablenginx--now# 开机自启立即启动服务四、Nginx 生产快速部署实操4.1 环境节点规划主机节点IP 地址核心角色nginx-server10.1.8.10/24Nginx 服务部署节点nginx-client10.1.8.11/24客户端测试节点4.2 静态网络配置服务端配置# 修改主机名[rootserver ~ 09:30:54]# hostnamectl set-hostname nginx-server# 配置静态IP、网关、DNS[rootnginx-server ~ 09:31:37]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.10/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes[rootnginx-server ~ 09:32:48]# nmcli connection up ens33客户端配置[rootserver ~ 09:33:28]# hostnamectl set-hostname nginx-client[rootnginx-client ~ 09:34:09]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.2 ipv4.dns 10.1.8.2 autoconnect yes[rootnginx-client ~ 09:35:17]# nmcli connection up ens334.3 一键安装部署# 安装 Nginx[rootnginx-server ~ 09:40:58]# yum -y install nginx# 启动并设置开机自启,同时查看状态[rootnginx-server ~ 09:41:18]# systemctl enable nginx --now[rootnginx-server ~ 09:42:02]# systemctl status nginx# 防火墙放行HTTP服务,[rootnginx-server ~ 09:42:15]# firewall-cmd --add-servicehttp --permanent[rootnginx-server ~ 09:44:24]# firewall-cmd --reload# 临时内核防火墙关闭[rootnginx-server ~ 09:44:37]# setenforce 0# 自定义默认首页[rootnginx-server ~ 09:47:41]# mv /usr/share/nginx/html/index.html{,.ori}[rootnginx-server ~ 09:49:10]# echo Hello World Form Nginx /usr/share/nginx/html/index.html4.4 访问测试# windows客户端测试修改 C:\Windows\System32\drivers\etc\hosts# Linux或Unix修改 /etc/hosts# 添加如下记录10.1.8.10 www.fangbing.cloud# 客户端验证[rootnginx-client ~ 09:40:23]# echo 10.1.8.10 www.fangbing.cloud /etc/hosts[rootnginx-client ~ 09:56:49]# curl www.fangbing.cloudHello World Form Nginx五、Nginx 配置文件核心详解5.1 核心文件路径主配置文件/etc/nginx/nginx.conf模块化子配置/etc/nginx/conf.d/*.conf生产推荐拆分配置便于维护5.2 五层嵌套配置结构Nginx 配置逐层嵌套、子级覆盖父级优先级从全局到局部递减全局块 → events块 → http块 → server块 → location块1. 全局块全局生效管控整个 Nginx 实例基础参数user nginx;# Nginx工作进程运行身份为nginx普通用户降低root高危权限提升安全worker_processes auto;# 作进程数量auto自动等于CPU核心数最大化利用多核处理器error_log /var/log/nginx/error.log;# 全局错误日志存放路径记录报错、异常、启动故障用于排错pid /run/nginx.pid;# 主进程PID文件路径保存Nginx主进程编号reload/stop等命令依靠它控制进程include /usr/share/nginx/modules/*.conf;# 加载扩展模块2. events 块并发核心配置控制网络连接、并发上限events{worker_connections1024;# 单个worker进程最大能够维持的并发连接数量use epoll;# 选用epollIO多路复用模型Linux系统专用实现异步非阻塞高并发multi_accept on;# 开启批量接纳新连接内核有多个就绪连接时一次性全部接收减少轮询损耗}3. 业务模块 块全站通用所有 HTTP/HTTPS 请求共用配置包含日志格式、文件传输、压缩、长连接等另外可以包含多个server块。http{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 /var/log/nginx/access.log main;# 全局访问日志路径使用上面定义的main格式记录所有客户端访问日志default_type application/octet-stream;# 默认MIME类型未知文件统一识别为二进制流下载格式include /etc/nginx/conf.d/*.conf;# 批量引入conf.d下所有站点配置网站、反向代理等配置统一放在该目录server{# 定义一个虚拟主机站点配置listen80;# 监听IPv4的80端口listen[::]:80;# 监听IPv6的80端口兼容ipv6访问server_name _;# 泛域名匹配接收所有未匹配到指定域名的请求充当默认兜底站点root /usr/share/nginx/html;# 网站网页根目录请求静态文件会从该目录查找include /etc/nginx/default.d/*.conf;# 引入当前站点额外的局部配置文件error_page404/404.html;# 访问不存在页面返回404跳转至站点下404.html页面location/404.html{# 精准匹配404页面路径放行404页面正常访问}error_page500502503504/50x.html;# 服务器内部异常错误统一跳转至50x.htmllocation/50x.html{# 精准匹配50x错误页面路径保证错误页面可正常打开}}}关键变量简易说明变量含义$remote_addr客户端公网 IP$remote_user登录认证用户名无则为空$time_local服务器本地访问时间$request客户端 HTTP 请求行请求方式、地址、协议$statusHTTP 响应状态码200、404、502 等$body_bytes_sent发给客户端的网页字节大小$http_referer来源跳转页面$http_user_agent浏览器、设备、爬虫标识$http_x_forwarded_for代理转发后的真实客户端 IP4. server 块虚拟主机对应单个域名/站点实现一台服务器部署多个网站隔离不同业务。# 第二个虚拟机配置server{listen8080;server_name test.example.com;# 其他配置}5. location 块路径精准匹配站点内 URL 路径匹配核心实现代理、静态托管、权限控制、限流等精细化配置核心作用是给不同的访问路径定义不同的规则。server{listen80;location/{index index.html;}# 1.首页精准加速精准匹配网站首页访问首页默认加载index.htmllocation ^~ /static/{expires 15d;}# 2.静态资源强制缓存匹配/static/所有子路径屏蔽正则浏览器缓存15天location ~\.php${fastcgi_pass9000;}# 3.php交给后端解析区分大小写匹配php文件转发至php-fpm进程解析location ~*\.(jpg|gif)${expires 7d;}# 4.图片统一缓存不区分大小写匹配jpg/gif图片浏览器缓存7天location /api{limit_rate 100k;}# 5.接口限流普通前缀匹配接口路径限制单连接最大网速100KB/slocation /{root html;}# 6.兜底页面全局兜底未匹配路径默认从html目录读取静态文件}Location 匹配优先级生产必记优先级从高到低精准匹配优先正则次之普通匹配兜底序号匹配类型标准写法规则说明实例演示1精确匹配location /uri访问路径必须和定义路径完全一模一样匹配成功直接终止检索不再匹配其他 location写法location /login {}命中/login不命中/login/、/Login、/login/1232强前缀匹配location ^~ /uri只要请求路径以指定前缀开头即匹配一旦匹配成功不再检索所有正则 location写法location ^~ /static/ {}命中/static/1.jpg、/static/js/app.js特性不会被下方图片、文件正则覆盖3大小写敏感正则匹配location ~ 正则表达式使用正则匹配路径严格区分英文字母大小写从上至下依次匹配第一个命中正则生效写法location ~ \.php$ {}命中/index.php不命中/index.PHP4大小写不敏感正则匹配location ~* 正则表达式正则匹配路径忽略英文字母大小写写法location ~* .(jpg5普通前缀最长匹配location /uri路径开头和定义前缀一致就匹配多条前缀同时满足时路径字符更长的规则生效匹配后依旧会检索正则配置location /doc{}、location /docs{}访问/docs/info两条前缀都匹配更长的/docs生效6全局兜底匹配location /前面所有 location 均未匹配成功最终固定进入该规则作为全站默认兜底规则访问/random.txt、/test123等无特殊规则路径全部命中兜底日常写 location、 proxy_pass反向代理经常使用变量变量名含义通俗解释示例值$uri请求的 URI不带 GET 参数网址里问号前面的路径部分内部重定向后会变化访问/page?id1值为/page$argsURL 问号后的全部 GET 查询参数网址问号后面那一长串键值对访问/page?id1nameabc值为id1nameabc$request_uri完整原始 URI路径 参数用户最初请求的完整地址全程不变不会被重写修改访问/page?id1值为/page?id1$remote_addr客户端真实 IP 地址访问你网站的用户的公网 IP192.168.1.100$http_host请求头中的 Host 字段用户浏览器地址栏里写的域名 端口www.example.com$http_user_agent客户端浏览器 / 设备标识告诉服务器你用的什么浏览器、什么系统、什么设备Mozilla/5.0 Chrome/120.0$scheme请求协议类型判断用户走的是 HTTP 还是 HTTPShttp或https$server_name当前匹配到的 server_name当前请求命中的虚拟主机域名www.example.com$request_methodHTTP 请求方法用户是来拿数据还是提交数据GET、POST、PUT、DELETE6. 特殊配置如果配置 HTTPS会在 server 块内增加 SSL 相关配置server{listen443ssl;# 监听HTTPS端口并启用SSLserver_name example.com;# 绑定当前HTTPS站点域名# SSL证书配置ssl_certificate /etc/nginx/cert/server.crt;# 配置SSL公钥文件路径ssl_certificate_key /etc/nginx/cert/server.key;# 配置SSL私钥文件路径ssl_session_cache shared:SSL:1m;# 开启会话共享缓存1M内存存放会话提升握手速度ssl_session_timeout 5m;# SSL会话有效期5分钟有效期内重连不用重新握手ssl_ciphers HIGH:!aNULL:!MD5;# 加密套件选用高强度算法禁用空加密、MD5弱加密ssl_prefer_server_ciphers on;# 优先使用服务器选定的加密算法而非客户端自选# 其他配置}六、Nginx 五大生产核心功能6.1 静态资源高效托管依托内核sendfile机制零拷贝传输文件静态资源性能远超普通 Web 服务server{# 虚拟主机配置块用于定义单个网站服务listen80;# 监听80端口HTTP协议默认访问端口server_name localhost;# 绑定站点域名localhost、127.0.0.1均可访问root /data/static;# 网站根目录所有静态文件的查找根路径index index.html;# 访问目录时默认加载的首页文件}6.2 反向代理前后端分离核心正向代理藏客户端反向代理藏后端服务是微服务、前后端分离的基础隐藏后端真实IP提升安全性location /api/{# 匹配所有以/api/开头的请求路径proxy_pass http://127.0.0.1:8080;# 末尾无/完整保留/api/路径转发至后端proxy_set_header Host$http_host;# 把客户端请求的Host域名传递给后端服务器proxy_set_header X-Real-IP$remote_addr;# 将客户端真实IP存入X-Real-IP请求头发给后端proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;# 传递完整代理链路IP记录经过所有代理与真实客户端IP}proxy_pass 关键细节地址末尾带/剔除 location 匹配路径转发剩余路径地址末尾不带/保留完整匹配路径转发。6.3 七层负载均衡集群必备通过upstream定义后端服务集群实现流量分发、故障自动摘除支撑服务水平扩容。1. 默认轮询round_robin请求依次均匀分发节点故障自动剔除适配后端性能一致场景upstream backends{# 定义名为backends的后端负载均衡集群server10.1.8.10:8080;# 后端服务节点1监听本机8080端口server10.1.8.11:8080;# 后端服务节点2监听本机8080端口server10.1.8.12:8080;# 后端服务节点3监听本机8080端口}2. 权重轮询weight根据服务器性能配置权重性能越好、权重越高、流量越多适配新旧服务器混布upstream backends{# 定义负载均衡集群集群名称backendsserver10.1.8.10:8080weight10;# 节点1权重10server10.1.8.11:8080weight20;# 节点2权重20server10.1.8.12:8080weight30;# 节点3权重30}3. IP哈希ip_hash同一客户端IP固定访问同一后端节点解决集群Session共享问题upstream backends{# 定义后端负载均衡集群ip_hash;# 开启IP哈希调度策略server10.1.8.10:8080;# 后端节点1server10.1.8.11:8080;# 后端节点2}4. 最少连接least_conn优先分发至当前活跃连接最少的节点适配长连接、请求耗时差异大的业务upstream backends{# 定义后端负载均衡集群least_conn;# 开启最小连接数调度策略server10.1.8.10:8080;# 后端服务节点1server10.1.8.11:8080;# 后端服务节点2}6.4 HTTPS 加密与强制跳转统一配置SSL证书实现全站HTTPS加密HTTP请求自动301跳转满足生产安全规范# HTTPS 加密站点server{listen443ssl http2;# 监听443端口开启SSL加密与HTTP2协议server_name localhost;# 绑定当前站点域名ssl_certificate/etc/ssl/certs/www.crt;# 公钥证书文件路径ssl_certificate_key/etc/ssl/certs/www.key;# 私钥密钥文件路径ssl_protocols TLSv1.2 TLSv1.3;# 仅使用TLS1.2、TLS1.3丢弃不安全的TLS1.0/1.1}# HTTP 强制跳转 HTTPSserver{listen80;# 监听HTTP默认80端口server_name localhost;# 匹配域名return301https://$host$request_uri;# 永久重定向301跳转至HTTPS保留域名与完整请求路径}6.5 拓展实用功能Gzip压缩压缩文本、接口数据减少传输带宽提升访问速度gzipon;# 开启压缩gzip_min_length 1k;# 小于1KB文件不压缩gzip_comp_level6;# 压缩等级(1-9)6兼顾压缩率与CPU性能gzip_types text/plain text/css application/json application/javascript text/xml;gzip_vary on;IP访问控制白 / 黑名单# 设置白名单location /admin{allow10.1.8.0/24;# 放行整个192.168.1.x局域网deny all;# 其余所有IP全部拒绝访问}# 设置黑名单location /{deny114.xx.xx.xx;# 拒绝IP访问allow all;}接口限流防止CC攻击、恶意刷量保护后端服务limit_req_zone$binary_remote_addrzoneapi_limit:10mrate10r/s;# $binary_remote_addr以客户端IP作为限流标识# zoneapi_limit:10m开辟10M内存存放IP限流记录# rate10r/s单个IP每秒最多10次请求防盗链防止静态资源被第三方网站盗用节省服务器带宽。# ~* 正则匹配不区分大小写匹配后缀为jpg/png/gif/mp4的静态资源location ~*\.(jpg|png|gif|mp4)${# 合法来源白名单配置valid_referers none blocked localhost;# 如果来源不合法变量$invalid_referer为真if($invalid_referer){return403;# 返回403禁止访问拦截盗链}}HTTP 缓存 proxy_cache缓存后端返回结果降低后端压力# 1. 在http{}全局块定义缓存空间proxy_cache_path /nginx/cache/api_cache# 缓存文件存放目录levels1:2# 目录分级结构优化大量文件读写keys_zoneapi_cache:20m# 开辟20M内存存放缓存索引调用名称api_cachemax_size1G# 磁盘缓存最大上限1G超量自动清理冷缓存inactive10m# 10分钟无人访问的缓存自动失效删除use_temp_pathoff;# 关闭临时目录减少磁盘IO损耗# 2. 在 location 中开启缓存使用location /api/data{proxy_pass http://backends;# 转发至后端集群proxy_cache api_cache;# 启用上面定义的缓存空间proxy_cache_valid2005m;# 正常200响应缓存5分钟proxy_cache_valid40410s;# 404错误仅缓存10秒proxy_cache_key$host$request_uri;# 以域名路径作为唯一缓存标识proxy_cache_bypass$cookie_login;# 登录用户不使用缓存实时请求后端}重写 rewrite url 地址改写、跳转# 旧域名更换全站迁移新域名server{listen80;# 监听80端口接收旧域名HTTP访问server_name old.com;# 绑定旧域名old.comrewrite ^/(.*)$ https://new.com/$1permanent;# 捕获所有路径301永久跳转到新域名同源路径}七、生产常见报错排查502 Bad GatewayNginx无法连接后端服务大概率是后端宕机、端口错误、防火墙拦截504 Gateway Timeout后端接口处理超时可调整Nginx代理超时参数403 Forbidden文件权限不足、目录不存在、无默认索引文件并发上不去检查worker_processes、worker_connections、系统文件句柄数限制。八、总结本文全覆盖讲解了 Nginx底层原理、架构机制、部署实操、配置语法、核心功能、负载均衡算法、生产排错所有配置均可直接落地生产。Nginx 作为网关核心吃透底层匹配规则与负载均衡原理才能从容应对高并发、集群、安全防护等生产场景是开发与运维进阶的必备核心能力。
返回列表