Nginx 入门:从单体到集群、反向代理与进程模型

发布时间:2026/10/8 22:47:44
Nginx 入门:从单体到集群、反向代理与进程模型 从单体到集群简介单体撑不住业务增长时先演进为集群再逐步走向分布式架构演进路线图中红色节点是现阶段要完成的演进架构总是和业务发展相关联发展到什么阶段就用什么架构不要过度设计架构初创团队用单体就能满足需求不可能一上来就做分布式单体部署两个 Tomcat前端项目、后端项目和数据库 MariaDB 都是单节点前期为了节省成本可以放在同一台云服务器上分开部署到三台服务器后它们各自仍然是独立的单体单体架构的优点小团队成型即可完成开发、测试、上线沟通成本低迭代周期短速度快停机 10~30 分钟即可完成维护线上 bug 可以立即修复打包方便运维省事直接打成一个 war 包交给运维发布单体架构面临的挑战挑战说明解决方向单节点宕机造成所有服务不可用用户量增长后系统承载量成为瓶颈宕机或卡顿对企业是毁灭性打击集群实现高可用耦合度太高迭代、测试、部署代码越来越臃肿可读性、可维护性、可扩展性变差每次发布都要把耦合的功能重新测一遍业务拆分分布式或微服务单节点并发能力有限并发能力取决于自身优化和硬件配置单机总会碰到天花板负载均衡把请求分发到其他节点集群概念计算机以“群体”的方式构成整个系统由多台计算机节点共同组成每台计算机服务器称为一个节点这个“群体”是一个整体对用户透明用户不知道后台有多少台计算机只知道有一个服务器在处理请求“人多力量大”群体提升并发能力与可用性也就是负载均衡和高可用各节点运行相同的业务是集群运行不同的业务是分布式图示理解图中红色节点部署的业务一模一样这样才能称为集群订单、商品的访问流量大单独抽出来并增加节点整体是一个分布式的集群系统类比组装汽车轮子和底盘 4 个人一起做是集群方向盘和座椅 1 个人做是单机使用集群的优势提高系统性能流量分发到各个节点提高系统可用性一两个节点宕机剩余节点仍可提供服务即高可用可扩展、可伸缩预测到高流量时提前增加节点流量平缓后再减少使用集群的注意点注意点问题解决用户会话会话保存在 Tomcat 里不能跨 Tomcat使用分布式会话通过 Redis 实现定时任务到时间点后每个节点都会跑一遍相同的任务浪费资源单独部署一个定时任务服务或使用 MQ 延时任务内网互通节点之间 ping 不通就无法组成集群所有节点保证在同一个局域网内网不互通集群就实现不了集群、分布式、微服务都是如此什么是 Nginx 与常见 Web 服务器简介Nginx 是高性能的 HTTP 和反向代理 Web 服务器主要功能是反向代理核心定义Nginxengine x是一个高性能的 HTTP 和反向代理 Web 服务器同时也提供 IMAP / POP3 / SMTP 服务IMAP / POP3 / SMTP 都和邮件相关俄罗斯人开发的开源服务器2004 年出现主要功能反向代理实现集群、负载均衡、URL 路由通过配置文件就能实现集群和负载均衡配置简单支持热加载不需要重启服务器避免用户请求丢失静态资源虚拟化把本地的 HTML、CSS、JS、图片、视频、音频虚拟化成服务通过 URL 访问在架构中的位置客户端的请求最先到达 Nginx再由它分发到内部的计算机节点充当负载均衡器、反向代理器也可以称为网关常见的服务器服务器适用场景MS IIS发布 ASP.NET 项目WebLogic、JBoss传统行业的 ERP、物流、电信、金融服务收费Tomcat、JettyJ2EEJava 项目以 Tomcat 为主Apache、Nginx静态服务、反向代理Netty高性能通过编码开发 Web Server、WebSocket Server例如聊天室Apache 与 Nginx 对比维度ApacheNginx出现时间更早早期占有率很高2004 年后起之秀并发能力并发超过百万后性能逐渐下降支持的并发更高市场趋势Netcraft 2019 年 6 月统计占有率持续下降稳步上升与 Apache 的差距越来越小Nginx 成本低、配置简单互联网环境下绝大多数项目都采用 Nginx正向代理与反向代理简介两者都位于客户端和目标服务器之间反向代理由代理服务器决定请求落到哪个节点对比图图中红色节点是代理服务器第二行文字是对应的生活例子维度正向代理反向代理定义请求先经过代理服务器再转发到目标服务器获得内容后响应给客户端用户请求目标服务器由代理服务器决定访问哪个计算机节点、哪个 IP生活例子在家上网先经过电信、移动、联通等运营商网吧服务器控制网速、屏蔽非法网站交报名表给教务处由教务处安排去哪个班级上课特点可以检测和控制客户端的请求后端如何处理对用户透明所有请求都由它转发验证反向代理多次执行ping www.taobao.com一段时间内请求都落在同一个 IP过一两分钟再请求落到了另一个 IP用户一直访问同一个站点最终落到哪台目标服务器由反向代理服务器决定集群、负载均衡的原理就是反向代理反向代理之路由图中红色节点 Nginx 按配置的规则把请求转发到特定的服务器虚拟主机shop、center是不同的域名按域名把请求转到对应的 Tomcat路由域名后面的/image类似 Controller 里的路径匹配后到静态资源服务器取图片对现有项目的作用规避域名后面带的端口用 Nginx 发布图片替代 Tomcat 虚拟目录Nginx 安装与运行简介Linux 下载到的是源码包需要先装依赖、配置、编译再安装安装流程图中橙色节点最容易漏绿色节点是安装成功的标志版本选择官网http://nginx.org/的 download 页面版本说明Mainline version开发版 / 预览版可能不稳定不推荐Stable version最新的稳定版推荐使用例如nginx-1.16.1Legacy versions曾经发布过的历史版本学习阶段用虚拟机里的 LinuxCentOS即可熟练后再到云服务器上使用安装命令# 1. 安装依赖环境yuminstall gcc-c# gcc 环境Nginx 源码用 C 语言开发yuminstall-ypcre pcre-devel# PCRE 库用于解析正则表达式yuminstall-yzlib zlib-devel# zlib 压缩和解压缩依赖yuminstall-yopenssl openssl-devel# SSL 安全套接字层用于 HTTPS# 2. 解压得到的是源码需要编译后才能安装tar-zxvfnginx-1.16.1.tar.gz# 3. 创建 Nginx 临时目录mkdir/var/temp/nginx-p# 4. 在 nginx 源码目录下进行配置目的是创建 Makefile 文件./configure\--prefix/usr/local/nginx\--pid-path/var/run/nginx/nginx.pid\--lock-path/var/lock/nginx.lock\--error-log-path/var/log/nginx/error.log\--http-log-path/var/log/nginx/access.log\--with-http_gzip_static_module\--http-client-body-temp-path/var/temp/nginx/client\--http-proxy-temp-path/var/temp/nginx/proxy\--http-fastcgi-temp-path/var/temp/nginx/fastcgi\--http-uwsgi-temp-path/var/temp/nginx/uwsgi\--http-scgi-temp-path/var/temp/nginx/scgi# 5. 编译、安装makemakeinstall# 6. 查看安装位置即 --prefix 指定的目录whereisnginx\代表命令换行用于提高可读性编译之前要先创建临时目录否则启动 Nginx 时会报错configure参数说明参数说明--prefix指定 Nginx 安装目录--pid-path指向 Nginx 的 pid--lock-path锁定安装文件防止被恶意篡改或误操作--error-log-path错误日志--http-log-pathHTTP 日志--with-http_gzip_static_module启用 gzip 模块在线实时压缩输出数据流--http-*-temp-path设定客户端请求、HTTP 代理、fastcgi、uwsgi、scgi 的临时目录安装目录/usr/local/nginx目录说明conf配置文件其中nginx.conf是核心配置文件html静态资源index.html是默认首页50x.html是出错页面sbin可执行文件nginx常用命令在sbin目录下执行./nginx# 启动./nginx-sstop# 停止./nginx-sreload# 重新加载配置文件启动后用浏览器访问服务器的内网 IP看到Welcome to nginx!表示安装成功修改html/index.html后刷新页面就能看到变化注意点在云服务器安装需要开启 Nginx 默认端口 80在虚拟机安装需要关闭防火墙本地 Windows 或 Mac 也需要关闭防火墙保证内网互通Nginx 显示默认首页的过程简介请求依次经过端口、server、location、root、index一步步找到首页文件请求过程图中红色节点是匹配的关键绿色节点是最终结果浏览器输入 IP 时默认使用 HTTP 协议和 80 端口所以两者都可以省略内网环境输入内网 IP云服务器输入公网 IP末尾的/代表根路由类似 Controller 里的根路径核心配置conf/nginx.confserver { listen 80; # 监听的端口 server_name localhost; # 请求的 IP 或域名 location / { # 映射根路由 / root html; # 相对目录html 和 conf 在同一级 index index.html index.htm; # 默认首页 } error_page 500 502 503 504 /50x.html; location /50x.html { root html; } }一个server块代表一台服务器要监听多个端口可以配置多个server域名解析到本机后server_name可以写域名例如www.example.com注意点修改配置文件后必须重新加载才生效把listen改成 88 后直接访问IP:88没有任何内容执行./nginx -s reload后页面才在 88 端口展示Nginx 进程模型简介一个 master 进程管理多个 worker 进程worker 负责处理客户端请求两种进程进程角色职责master主进程相当于老板只有一个接收外界的信号并分发给 worker监控 worker异常退出时重新启动新的 worker读取并验证配置文件worker工作进程相当于员工默认一个连接并处理大量客户端请求、响应数据、与后端服务通信执行 master 传来的重启、关闭等指令进程模型图图中红色节点 master 不处理请求信号由 master 接收再传递给 worker 去执行每个 worker 都有很多连接处理很多 client 的请求配置 worker 进程数worker_processes 2; # 在 nginx.conf 开头默认为 1./nginx-t# 检测配置文件是否正确./nginx-sreload# 重新加载ps-ef|grepnginx# master 仍是 1 个worker 变成 2 个信号./nginx -s stop停止./nginx -s quit退出./nginx -s reload重新加载./nginx -t检测配置收到停止信号时没有连接的 worker 直接关闭正在处理请求的 worker 等请求处理完、连接释放后再关闭不需要中断服务就可以平滑地热重启、热加载多进程模型的好处进程之间相互独立互不影响多线程的开销比进程小但共用内存、相互影响需要开发人员自己维护内存管理容易出错一个 worker 异常退出其他 worker 继续正常运作master 只需再 fork 一个新的 worker更安全黑客攻击到的可能只是某一个 worker把它关闭即可其他 worker 不受影响面试/考试记忆点多个节点运行相同的业务是集群运行不同的业务是分布式架构跟着业务走先单体再集群最后分布式不过度设计集群提升性能和可用性但要处理分布式会话、定时任务重复执行、内网互通Nginx 是高性能的 HTTP 和反向代理 Web 服务器可以做负载均衡、路由、静态资源服务正向代理请求经代理服务器转发到目标服务器反向代理由代理服务器决定请求落到哪个节点后端对用户透明源码安装四步安装依赖、configure生成 Makefile、make编译、make install安装请求先按端口找到server再由location映射到root目录下的index页面修改nginx.conf后先用./nginx -t检测再用./nginx -s reload生效master 接收信号、管理 workerworker 处理请求多进程相互独立一个 worker 出问题不影响其他 worker