
简介这份压缩包是基于Nginx 1.7.11.3的Gryphon定制版本专为媒体直播服务优化与FFmpeg整合后可以支撑RTMP、HLS、DASH等流媒体协议适合运维人员和流媒体开发者参考学习。包内共有126个文件以C语言模块源码、头文件、配置文件样例和HTML文档为主也包含若干脚本与工具以及SWF播放器相关文件整体体积约46.82兆目录结构一目了然。目前已有856人学习下载其中附带的配置示例覆盖了直播、转码、录制等场景并有演示内容辅助理解对初学者尤其友好。细读其中与RTMP相关的模块代码能够看清Nginx事件驱动架构下如何应对高并发流请求掌握与FFmpeg协作完成推拉流、协议转换和安全限制的方法结合配置样例还能快速上手直播服务搭建、HLS切片、DASH自适应流等关键技能为生产部署打下坚实基础是一份兼顾理论与实战的参考资源。 Nginx_1.7.11.3_Gryphon.zip第一次看到这个文件名的人大概率会愣一下Nginx 官方版本号里不是只有 1.7.11 吗后面怎么会跟着 .3 和 Gryphon先说结论这不是官方原版目录的命名习惯而是某个团队或发行版基于 Nginx 1.7.11 核心做的一次定制构建Gryphon 更像一个对外代号和当年 OpenResty 在 1.7.x 时期使用的命名体系能对上号。把这个包解压之后你得到的就是一个自带运行环境的 Nginx 服务能做的活儿和官方版一样反向代理、静态站点托管、负载均衡、RTMP 流媒体转发都行区别是它把常用模块提前编译好了不用手动折腾依赖。这类包我见过不少大多是从历史工程、离线安装包或者别人交接的项目里扒出来的。如果正好是你手头项目在用这篇文章可以帮你从头到尾捋一遍这个版本到底是什么、怎么启动、怎么配反向代理和负载均衡、前端构建产物怎么挂上去以及那些让人头疼的 502、403、端口占用到底怎么查。既适合刚接触 Nginx 的新人也适合拿到老包不知道怎么下手的同学。1. 解开压缩包这个版本到底是个啥1.1 从版本号能读出什么Nginx 官方版本分为主线版Mainline和稳定版Stable1.7.11 属于 2015 年前后的主线版本当时 HTTP/2 模块还只是实验性功能很多公司还在用 1.6、1.8 的稳定版。官方从来没有发布过 1.7.11.3 这个编号Nginx 的点号一般只到三位比如 1.7.11再往后的版本号是 1.7.12 或 1.8.0。所以带 .1/.2/.3 这种后缀的编号基本可以判断是第三方发行版把核心代码拉下来后打了补丁、加了模块顺延出来的版本号。Gryphon 这个词如果你去翻 OpenResty 历史版本列表会发现 1.7.11.x 正好对应一串连续的小版本迭代而那个时期确实使用过一些动物代号。所以这个 zip 大概率是从 OpenResty 体系或者类似思路的构建里流出来的。不过我不能百分百断定你手里这个包的具体出处这恰恰是这类老包最常见的问题出处不明。知道大概来路后最好先用下面的命令看编译参数确认里面到底编了哪些模块再决定能不能直接用。老版本有一个绕不开的隐患安全补丁。1.7.11 距今已经十年期间公开的 CVE 修了一大批涉及请求走私、缓冲区溢出、HTTP/2 等问题。如果这个包只是本地实验、内网工具、自己折腾问题不大如果准备跑公网建议优先换官方最新稳定版或新版 OpenResty配置迁移成本并没有想象中高。1.2 解压后你会看到什么标准的 Nginx 目录结构大概是这样的conf所有配置文件所在地nginx.conf 是主配置。html默认静态页面目录默认 index.html 在这里。logs日志目录启动后会出现 access.log 和 error.log。temp临时文件目录。contrib给编辑器用的语法高亮文件不影响功能。nginx.exeWindows 下唯一的可执行程序。Linux 下编译安装的目录通常不在一个固定地方但 conf 和 logs 的结构是类似的。拿到一个不明来源的包第一件事不是双击 exe而是先看版本信息和编译参数。在 Windows 上打开 cmd 进入解压目录执行nginx.exe -V nginx.exe -t-V会打印出编译参数比如是否带--with-http_ssl_module、是否带--with-http_stub_status_module、有没有第三方 RTMP 模块这些直接影响你能不能用它做 HTTPS 和直播流。-t会检查配置文件语法一切正常会输出 syntax is ok 和 test is successful。注意如果编译参数里没有 ssl_module配置 HTTPS 时 Nginx 会直接报错 unknown directive ssl。很多老包默认不带 SSL配之前一定要先确认。2. 先把它跑起来启动、停服与日常管理2.1 Windows 下的启动与停止Windows 下最省事的启动方式是直接在解压目录里双击nginx.exe但我不建议这么做因为窗口一关你可能想不起来进程在哪后续 reload 也不方便。我习惯开一个 cmd先 cd 到解压目录cd C:\tools\nginx_1.7.11.3_Gryphon start nginx.exe用start而不是直接执行是为了不让 cmd 阻塞在当前窗口。启动后没有任何提示是正常的Nginx 不像普通软件默认不会弹日志窗口。要验证是否真的起来了有两个办法tasklist /fi imagename eq nginx.exe curl -I http://127.0.0.1tasklist能看到 nginx.exe 进程就说明 master 进程已经跑起来curl能返回 HTTP 响应头说明端口也监听正常。停止的命令对应nginx -s stop和nginx -s quit前者立即终止后者等处理完当前请求再退出生产环境通常用 quit但 Windows 下实测有时 quit 会卡住最稳妥还是 stop 或强制结束进程。如果改了配置需要生效执行nginx -s reload即可。Windows 下有个奇怪的现象reload 后新配置有时候不生效尤其是改了监听端口这类核心参数。这种情况下直接taskkill /f /im nginx.exe全部杀干净再启动注意这会中断现有连接操作前最好挑业务低峰期。2.2 Linux 与 Docker 下怎么起拿到这种老包很多人并不是在 Windows 上用而是把它传到 Linux 服务器。Linux 下如果没有 systemd 服务文件最简单的方式是直接执行二进制./nginx -t ./nginx ./nginx -s reload如果有 systemd就写成标准 service 文件或者直接用发行版自带的 nginx 包apt install nginx或yum install nginx。仓库里的版本远比你手中这个老包新能少操很多安全补丁的心。Docker 场景现在更常见。对应到前端部署用镜像启动一个 nginx 并挂载多个项目目录一条命令就够了docker run -d --name nginx-web -p 80:80 \ -v /data/html:/usr/share/nginx/html:ro \ -v /data/conf:/etc/nginx/conf.d:ro \ nginx:1.26多个项目目录可以多写几个-v把不同项目挂到不同子目录。配置修改后不用重启容器直接在宿主机执行docker exec nginx-web nginx -s reload即可。这个命令我用过无数次比 restart 那种粗暴方式强在不会断连接证书更新、配置文件小改动都能用。3. 配置实战反向代理、负载均衡与前端部署3.1 反向代理一天最常用的功能反向代理的概念新手容易绕晕我用一句话解释把外面进来的请求统一收下再转发给内部服务对外只暴露 Nginx 一个入口。比如你有一台后端服务跑在 8080 端口不想让它直接暴露就能用 Nginx 代理到 80 端口。在 conf/nginx.conf 中加一个 server 块server { listen 80; server_name api.example.com; location / { proxy_pass http://127.0.0.1:8080; 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_pass是核心它把匹配到的请求转到指定地址。proxy_set_header这几行很关键尤其是 Host 头。很多后端服务会校验 Host如果不带上原始域名后端会以为请求是从 Nginx 内部来的可能返回异常或无法路由。X-Forwarded-For是为了让后端日志能看到真实客户端 IP不然日志里全是一串 127.0.0.1排查问题难度翻倍。如果你在某台服务器上配了多个域名就写多个 server 块每个 server 块对应一个域名Nginx 会根据server_name自动选择匹配的配置。这个机制是理解 Nginx 虚拟主机的关键也是新手最容易云里雾里的地方。3.2 upstream 负载均衡配置如果后端不止一台就需要 upstream 块。upstream 可以理解为一组后端服务器的名单Nginx 会按策略把请求分发给名单里的机器upstream my_backend { server 192.168.1.10:8080 weight2; server 192.168.1.11:8080 max_fails3 fail_timeout10s; server 192.168.1.12:8080 backup; keepalive 32; } server { listen 80; location / { proxy_pass http://my_backend; } }默认轮询一台一台轮流接。weight 越大被分配的概率越高适合配给配置更好的机器。backup 表示备用节点平时不接流量只在其他节点都挂了才会顶上适合当灾备。max_fails 和 fail_timeout 控制健康检查连续 3 次失败就把这台摘掉 10 秒避免请求打到已经挂掉的服务上。如果业务需要会话保持比如 web 应用依赖 session 存本地可以在 upstream 里加一行ip_hash;让同一个来源 IP 固定访问同一台后端。这个写法在 Windows 和 Linux 下完全一样没有平台差异。3.3 前端打包产物如何快速上线前端项目现在基本都走构建流程pnpm run build 或 npm run build 之后会生成一个 dist 或 build 目录里面是一堆静态文件。让 Nginx 服务这个目录只需要一个很简单的 server 块server { listen 80; server_name www.example.com; root /data/www/dist; index index.html; location / { try_files $uri $uri/ /index.html; } location /assets/ { expires 30d; add_header Cache-Control public, immutable; } }重点在try_files $uri $uri/ /index.html这一行。Vue Router、React Router 这类前端路由开启 history 模式后用户直接访问/user/123这样的地址时服务器上并不存在这个文件如果不做回退Nginx 直接返回 404。try_files 会把不存在的路径回退到 index.html让前端路由接管页面就能正常打开。assets 目录单独设置长缓存是因为打包后的文件通常带 hash 指纹比如app.8f3a2b.js文件名变了就相当于新文件缓存策略可以激进一点。但 index.html 本身不能长缓存否则发版后用户看到的一直是旧页面这个坑很多团队踩过。4. 常见的坑与排查实录4.1 启动失败和端口占用启动失败最典型的原因就是 80 端口被占。Nginx 启动后 error.log 会记录类似bind() to 0.0.0.0:80 failed (10048: An attempt was made to access a socket...)的报错。Windows 下这块尤其恶心IIS、SQL Server Reporting Services、甚至迅雷都可能把 80 占了。排查窗口打开netstat -ano | findstr :80看最后一列 PID去任务管理器找到对应进程处理或者干脆改 Nginx 监听端口比如 8080。Linux 下用ss -lntp | grep :80能看到是哪个进程在占端口一般是 Apache 或其他 Web 服务。另一种 Windows 特有情况是 HTTP.sys 系统服务抢占 80这时候改端口最省事别跟系统硬刚。4.2 502、403、404 背后的原因这几个状态码是日常线上高频问题我整理成速查表状态码典型现象主要原因排查方向502 Bad Gateway页面显示 502后端服务没启动、upstream 地址写错确认后端端口能通nginx error.log 里看 connect failed 具体地址504 Gateway Timeout请求卡半天后超时后端响应太慢proxy_read_timeout 太小看后端日志调大 proxy_read_timeout 到 30s/60s403 Forbidden目录能访问但被拒绝index 文件缺失、目录权限不足确认 root 下存在 index.html文件夹有读权限404 Not Found页面找不到静态路径不对、SPA 没配 try_files检查 root 路径确认 history 模式配置502 是我见过最多的。常见场景是 pom 里起了java -jar但端口写错一两位数Nginx 转发过去自然连不上。准确做法是在 Nginx 所在机器上先curl -v http://127.0.0.1:8080确认后端真的能通再去查 Nginx 配置别对着配置猜半天。4.3 证书、私钥与 Docker reload 说明Nginx 使用 PEM 格式的证书和私钥常见扩展名是 .pem、.crt、.key。配置里两个指令成对出现server { listen 443 ssl; server_name www.example.com; ssl_certificate /etc/nginx/certs/server.pem; ssl_certificate_key /etc/nginx/certs/server.key; }私钥不要带密码。带密码的私钥在 Nginx reload 时会卡住让你手动输入 pass phrase自动化部署和凌晨发版场景根本没法接受。如果手头私钥有密码可以用 openssl 去掉openssl rsa -in encrypted.key -out decrypted.key生成后注意设置好文件权限无密码的私钥等于一张通行证泄露了后果很严重。客户端证书场景比如企业内网接口网关需要额外配置ssl_client_certificate和ssl_verify_client on这属于双向 TLS配置思路和常规 HTTPS 不同。Docker 里重新加载证书和配置文件一样证书文件覆盖到容器对应路径后执行docker exec nginx nginx -s reload注意 reload 会让新连接使用新证书但已建立的 keepalive 连接在超时前仍可能使用旧证书体感上感觉证书没更新其实就是长连接还挂着旧会话。想彻底换证书直接docker restart nginx最干脆。4.4 老版本迁移建议如果你手里这个 Gryphon 包要长期维护我的建议是尽快规划迁移。1.7.11 这个时代的配置放到今天至少有这几个地方要改老配置里的spdy指令要改成http2SSL 协议版本建议至少 TLSv1.2ssl on这种老写法在新版本更推荐直接写listen 443 ssl。这些改动都不大但版本差太多容易遇到指令废弃、默认行为变化的问题不能完全复制粘贴。迁移时最稳的操作是先在新版本上跑nginx -t校验配置改完一项测一项确认站点、代理、证书都正常后再切流量。老包如果只是临时应急记得不要暴露到公网。最后再分享一个我自己的习惯拿到任何不明来路的 Nginx 包第一件事就是nginx -V和nginx -t把输出截图或文字版存进项目交接文档后面排查问题能省很多时间。另外 conf 目录一定要用 git 管理每次改动前留个提交记录线上出了问题可以快速 diff 出是哪行配置导致的事故。这几个小习惯我踩过好几次坑才养成分享给正在折腾 Nginx 的同行能少走不少弯路。本文还有配套的精品资源点击获取