资讯动态

nginx-1.25.2 Linux预编译包部署与依赖排查

发布时间:2026/10/28 3:30:27 来源:尧图企业网站定制
简介这份 Linux 环境下的 Nginx 1.25.2 预编译包面向需要快速搭建 Web 服务、反向代理或进行本地联调测试的运维与开发人员可省去从源码编译、依赖排查到环境适配的繁琐过程解压后即可启动使用。压缩包共 569 个文件、约 4.26MB内容以 262 个 C 源文件和 137 个头文件为主体保留 Nginx 核心模块、HTTP 处理与事件驱动等实现同时包含 14 个 conf 配置、若干 makefile/make 构建文件、patch 补丁及 readme 说明便于核对编译产物、迁移配置或后续扩展。通过 ./nginx -V 可查看版本与完整编译参数其中已集成 pcre-8.45、openssl-1.1.1l、zlib-1.2.11 等常用依赖能够满足基础 Web 服务与反向代理场景。目录结构保留源码与构建痕迹对想理解 Nginx 模块组成、验证配置加载或做轻量部署的读者较友好。目前已有 239 人学习下载适合希望跳过编译流程、直接投入测试和使用的技术人员参考。1. 解压就能跑的 nginx-1.25.2预编译包省掉的编译环节内网一台老服务器没有 gcc连不上外部软件源运维把一个压缩包放到你面前说这是 nginx-1.25.2 的 Linux 已编译版本解压就能直接用。这个场景我碰到过不止一次第一次也吃过亏解压完执行/sbin/nginx直接报GLIBC_2.28 not found运行时才发现编译机和目标机不是一路人。所谓“已编译、解压、可直接使用”本质上是一次./configure make的决策被提前做完并固化了模块清单、安装前缀、链接方式全都固定下来。它省掉的是装 pcre、zlib、openssl 开发包和等编译的半小时代价是你必须自己确认二进制和目标机器的兼容性。这篇写给要在离线或半离线环境快速启动一个稳定 nginx 的人也写给想弄清楚预编译包边界、避免上线后出现问题的人。2. 拆开这个已编译包目录结构、编译参数与依赖边界拿到包的第一件事不是解压运行而是检查。预编译包最适合直接使用的场景是三件事同时成立目录结构完整、编译参数覆盖你的功能需求、动态库和 glibc 版本在目标机上能兑现。这三件事任何一件不成立包再好也只是一个看起来能用的二进制文件。2.1 解压后先看四个目录conf、sbin、logs、html 各管什么标准布局的预编译包顶层通常只有四到五个条目逐一看过去能读出不少信息。先把包解到统一目录再做一次目录清单# 解压到 /opt 下路径里不要带空格、中文和括号nginx 的 include 对路径很敏感 mkdir -p /opt tar -zxvf nginx-1.25.2-linux-x86_64.tar.gz -C /opt # 看顶层结构以及 sbin/nginx 是否带执行位 ls -la /opt/nginx-1.25.2-linux-x86_64/ ls -l /opt/nginx-1.25.2-linux-x86_64/sbin/nginxsbin/nginx权限应该是-rwxr-xr-x如果是-rw-r--r--说明打包时丢了执行位chmod x补上即可这不是坏事说明包是普通打包工具压的没做过额外处理。conf/里至少要有nginx.conf、mime.types、fastcgi_params、koi-utf这几个mime.types缺失会导致所有静态资源返回application/octet-stream浏览器直接下载而不是渲染这个坑很隐蔽。目录或文件作用容易出问题的地方sbin/nginx主二进制缺执行位、缺动态库conf/nginx.conf主配置里面写死了编译时的绝对路径conf/mime.typesMIME 映射缺失导致静态资源类型错误logs/pid、error.log、access.log目录不可写启动即失败html/默认站点根目录权限不对返回 403client_body_temp等请求体、代理缓存临时目录启动时自动创建prefix 只读则失败最后一行要特别留意。nginx 启动时会在 prefix 下创建client_body_temp、proxy_temp、fastcgi_temp、uwsgi_temp、scgi_temp五个临时目录如果 prefix 所在分区只读或者运行用户没有写权限日志里会出现mkdir() /xxx/client_body_temp failed (13: Permission denied)然后 worker 起不来。常见做法是启动前手动建好这五个目录并把属主改成运行用户比启动失败后再回头找原因省事。2.2 用 nginx -V 反查编译参数判断能不能直接上生产nginx -V是这类包的核心信息来源大写 V 输出版本加configure arguments小写 v 只出版本号。注意它把内容打到标准错误必须重定向才能接管道cd /opt/nginx-1.25.2-linux-x86_64 # 大写 V版本 编译机 编译器 configure 参数内容走 stderr ./sbin/nginx -V 21 # 只把 -- 开头的参数拆出来方便逐条核对 ./sbin/nginx -V 21 | tr \n | grep ^--输出里第一行是nginx version: nginx/1.25.2接着是built by gcc x.y.z和built with OpenSSL ...最后一行是完整参数。逐项看什么--prefix决定默认配置和日志的相对基准目录后面所有相对路径都从这里算起如果它是/usr/local/nginx而你把包放在/opt下直接用./sbin/nginx启动会去/usr/local/nginx/conf/nginx.conf找配置报open() /usr/local/nginx/conf/nginx.conf failed。这是预编译包最常见的问题解决办法见第 3 章的-p。模块清单决定功能边界。--with-http_ssl_module没有配置里写ssl_certificate会直接报unknown directive ssl_certificate--with-http_realip_module没有反向代理后面拿不到客户端真实 IPset_real_ip_from同样报未知指令--with-http_stub_status_module没有做不了/status监控页--with-stream没有四层转发这条路直接堵死。这些不是配置写错是二进制里根本没有这段代码改配置永远改不出来。还要看--with-pcre、--with-zlib、--with-openssl后面跟的是路径还是dynamic。跟路径说明这几个库被静态编进去了二进制会大一些几 MB但换机器不用另装库带dynamic或者干脆没写说明是动态链接目标机上必须有对应.so。预编译包为了减小体积多数走动态链接所以下一节的检查不能省。顺便一个 1.25.x 的版本细节从 1.25.1 起listen 443 ssl http2;这种写法被标记为废弃改成listen 443 ssl;加一行http2 on;老写法虽然还能跑但日志里会持续输出告警。拿到 1.25.2 的包配置里如果还留着listen ... http2nginx -t就会提示别当成错误忽略过去。2.3 glibc 与动态库依赖ldd 一把梭确认真能跑判断“能不能在这台机器上跑”只需要两行命令但要看懂结果。# 1. 列出所有动态依赖重点看有没有 not found ldd ./sbin/nginx # 2. 看二进制引用的最高 GLIBC 符号版本 objdump -T ./sbin/nginx | grep -o GLIBC_[0-9.]* | sort -V | uniq | tail -3 # 3. 看目标机自己的 glibc 版本 getconf GNU_LIBC_VERSION第一行输出里每一行形如libpcre.so.1 /lib64/libpcre.so.1如果出现 not found说明这个库目标机上没有最典型的是libpcre.so.1和libssl.so.1.1补装对应运行库即可注意只需要运行时库不需要-devel。第二行和第三行是一组对比。objdump那条会打印出二进制引用到的所有GLIBC_x.y符号版本取最大的那个如果它大于getconf输出的目标机版本那这个包在这台机器上永远起不来报错形式是./sbin/nginx: /lib64/libc.so.6: version GLIBC_2.28 not found (required by ./sbin/nginx)。这种不一致没法靠装库绕过只能换一个在更老系统上编译的包或者在目标机同版本环境里自己编一个。把两条结论合起来就是判定表ldd无not found且最高GLIBC符号版本不高于目标机版本这个 nginx-1.25.2 的 Linux 已编译包就可以直接投入使用了。两个条件缺一先解决依赖问题不要急着改配置配置改得再对加载器那一步就过不去。3. 把 nginx-1.25.2 在 Linux 上跑起来的最小命令序列依赖确认通过之后启动本身只有几步但顺序很重要先前台看到错误再改成后台最后交给服务管理器。反过来的顺序会让你在日志里翻半天。3.1 前台启动与 -p 指定 prefix第一次启动别急着 daemon预编译包的 prefix 是编译时固定的而你的解压目录几乎不可能刚好是那个路径。-p参数就是用来在运行时覆盖 prefix 的它改变的是一批相对路径的解析基准配置文件名、日志、pid 文件、临时目录都跟着走。cd /opt/nginx-1.25.2-linux-x86_64 # -p 指定运行时 prefix-c 用相对路径相对 -p-g 追加全局指令 # daemon off 让 master 留在前台错误直接打在终端上第一次启动必用 ./sbin/nginx -p /opt/nginx-1.25.2-linux-x86_64 -c conf/nginx.conf -g daemon off;三个参数各管一件事。-p把 prefix 改成当前目录接下来conf/nginx.conf就解析成/opt/nginx-1.25.2-linux-x86_64/conf/nginx.conflogs/error.log同理。-c如果写成绝对路径-p对它就不起作用了所以要么全相对要么全绝对别混着来。-g是往配置最外层注入指令daemon off;让进程不脱离终端CtrlC 就能停这比启动后台再ps找进程、kill收尸快得多。前台跑起来之后终端会持续输出访问日志和错误日志任何一个配置问题都会当场报出来不用去logs/里翻。确认没问题后 CtrlC再去掉-g用后台方式启动。3.2 配置文件里必须改的三处user、pid、日志路径默认的nginx.conf是给编译时 prefix 写的搬到新目录后有几处必须对齐。一份可直接用的最小配置骨架# 运行用户。只有 master 以 root 启动时这一行才生效非 root 启动会告警并忽略 user nobody; # auto 按 CPU 核数起 worker容器里 CPU 受限时建议改成固定数字 worker_processes auto; # pid 用绝对路径避免 -p 不一致导致后续 reload 找不到进程 pid /opt/nginx-1.25.2-linux-x86_64/logs/nginx.pid; # error_log 级别 warn 足够排查阶段可临时降到 infodebug 需要编译时带 --with-debug error_log /opt/nginx-1.25.2-linux-x86_64/logs/error.log warn; events { # 单 worker 最大连接数与 worker_processes 相乘是理论上限 worker_connections 10240; } http { include mime.types; default_type application/octet-stream; # 日志格式里加 $request_time 和 $upstream_response_time后面排查慢请求全靠它 log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent rt$request_time urt$upstream_response_time; access_log /opt/nginx-1.25.2-linux-x86_64/logs/access.log main; sendfile on; keepalive_timeout 65; server { # 第一次启动用 8080避开 80 端口的权限问题 listen 8080; server_name _; location / { # root 用绝对路径不要依赖 prefix root /opt/nginx-1.25.2-linux-x86_64/html; index index.html index.htm; } } }三处改动的作用各不相同。user只在 master 是 root 时有效非 root 启动日志会打一条the user directive makes sense only if the master process runs with super-user privileges, ignored这条是告警不是错误可以忽略但要知道它意味着静态文件权限按当前用户算。pid写成绝对路径是为了让nginx -s reload无论从哪个目录执行都能找到 master这是预编译包最常遇到的问题之一后面第 5 章细说。error_log和access_log同理相对路径会跟-p绑定一旦启动和重载用的-p不一致日志就会写到两个不同的地方排查时看错文件。server_name _是通配内网单机场景够用。3.3 三件套验证nginx -t、ss、curl配置写完不要直接重启按顺序验三遍。# 1. 语法检查-t 只解析配置不启动进程-T 会顺带把最终配置打印出来 ./sbin/nginx -p /opt/nginx-1.25.2-linux-x86_64 -c conf/nginx.conf -t # 2. 看端口是否真的监听了-l 只列 LISTEN-n 不做域名解析-p 显示进程 ss -lntp | grep 8080 # 3. 发一个 HEAD 请求只关心状态码和响应头 curl -I http://127.0.0.1:8080/第一条要注意-t的局限它只做配置语法和文件可达性检查不检查端口是否被占用也不检查 upstream 后端是否活着。所以nginx -t通过不代表能起来端口冲突是启动时才报的bind() to 0.0.0.0:8080 failed (98: Address already in use)。第二条补的就是这个。第三条返回200 OK且Content-Type: text/html说明 mime.types 加载正常如果返回application/octet-stream回去查include mime.types的相对路径。三件套里任意一条不过先修再往下走。3.4 注册成 systemd 服务daemon off 与 LimitNOFILE手工-p启动适合验证长期跑还是交给 systemd机器重启能自动起来日志也能进 journal。写一个 unit 文件[Unit] Descriptionnginx 1.25.2 standalone Afternetwork.target [Service] Typesimple # -p 和 -g 必须和手工启动时一致否则 reload 找不到 pid ExecStart/opt/nginx-1.25.2-linux-x86_64/sbin/nginx -p /opt/nginx-1.25.2-linux-x86_64 -c conf/nginx.conf -g daemon off; ExecReload/opt/nginx-1.25.2-linux-x86_64/sbin/nginx -p /opt/nginx-1.25.2-linux-x86_64 -c conf/nginx.conf -s reload ExecStop/opt/nginx-1.25.2-linux-x86_64/sbin/nginx -p /opt/nginx-1.25.2-linux-x86_64 -s quit Restarton-failure RestartSec3 # 突破默认文件句柄数否则高并发下会出现 too many open files LimitNOFILE65535 [Install] WantedBymulti-user.targetTypesimple配daemon off;是这套组合的关键systemd 直接托管 master 进程不再需要Typeforking加PIDFile的老写法进程死了也能立刻感知并Restart。ExecReload里的-p和-c一定要和ExecStart对齐systemd 的reload是拿这条命令去执行的少一个参数就会报 pid 文件读不到。LimitNOFILE容易被忽略nginx 默认继承 systemd 的 1024worker_connections 10240配得再大也受这个上限约束。如果确实要用 80 端口又不想让 master 以 root 跑给二进制加 capability 比改配置有效# 允许非 root 进程绑定 1024 以下端口 setcap cap_net_bind_serviceep /opt/nginx-1.25.2-linux-x86_64/sbin/nginx getcap /opt/nginx-1.25.2-linux-x86_64/sbin/nginx这条对预编译包同样适用因为 capability 是打在文件属性上的和编译参数无关。注意重装或覆盖二进制后 capability 会丢需要重新执行一次。4. 拿它做静态站与反向代理可直接抄的配置跑通之后绝大多数人拿这个包做两件事一是当静态资源服务器二是给后面的应用做反向代理。这两块配置的默认值都有明显的实用倾向需要理解每个参数在解决什么问题否则调优就是瞎猜。4.1 静态资源站点root 与 alias 的斜杠差异静态站的核心是路径拼接规则。root是把 location 的匹配部分拼到后面alias是直接替换掉匹配部分差一个斜杠结果就完全不同server { listen 8080; server_name _; # root请求 /static/a.png 实际读 /data/www/static/a.png location /static/ { root /data/www; expires 7d; add_header Cache-Control public; } # alias请求 /files/a.png 实际读 /data/files/a.png # location 和 alias 末尾都要带斜杠否则路径会拼错 location /files/ { alias /data/files/; autoindex off; } }location /files/配alias /data/files/请求/files/a.png读的是/data/files/a.png如果 alias 少写末尾斜杠变成/data/files读的就是/data/filesa.png直接 404而且这个 404 很难从日志看出来因为路径看着“差不多”。root那段的expires 7d和add_header是给静态资源加缓存头配合文件名哈希做长期缓存才安全如果文件名不带哈希缓存时间别设太长改动后用户拿不到新文件。性能相关的几个开关放在http块参数建议值作用与边界sendfileon零拷贝发文件静态资源必开tcp_nopushon配合 sendfile攒满一个包再发tcp_nodelayon长连接上禁用 Nagle降低小包延迟gzipon文本类压缩图片视频不要压gzip_min_length1k太小压缩收益抵不过 CPUgzip_comp_level46 以上收益递减CPU 明显上升open_file_cachemax10000 inactive60s缓存文件描述符和元信息小文件多时收益明显client_max_body_size按业务设默认 1m上传接口不设必炸gzip_types里只放text/*、application/json、application/javascript这类不要用*对已经压缩过的 jpg、mp4、zip 再压一遍纯属浪费 CPU还可能出现压缩后比原文件大的情况。如果预编译包带了--with-http_gzip_static_module再加gzip_static on;让 nginx 优先返回预先压好的.gz文件省掉运行时压缩。4.2 反向代理proxy_pass 尾部斜杠与四个必调参数反向代理的配置量不大但每一行都有明确的失败模式upstream app_pool { # 后端地址max_fails/fail_timeout 控制被动健康检查 server 127.0.0.1:9000 max_fails3 fail_timeout10s; # 与后端保持长连接必须配合下面的 proxy_http_version 和 Connection keepalive 32; } server { listen 8080; server_name _; location /api/ { # 尾部带斜杠/api/user 转发成 /user不带则转发成 /api/user proxy_pass http://app_pool/; proxy_http_version 1.1; # 清空 Connection 头否则 upstream keepalive 不生效 proxy_set_header Connection ; 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; proxy_connect_timeout 5s; proxy_read_timeout 60s; proxy_send_timeout 60s; # 请求体上限按最大上传文件调整 client_max_body_size 50m; # 上传大文件时关掉缓冲避免先落盘再转发占磁盘 proxy_request_buffering off; } }proxy_pass尾部那个斜杠是经典问题带斜杠是“替换 location 匹配的前缀”不带是“把完整 URI 原样转过去”。后端路由按根路径写就必须带按带前缀写就不带配置完一定用curl -v看实际请求行别靠猜。proxy_set_header Connection 和 upstream 里的keepalive是一组只写 keepalive 不清空 Connectionnginx 仍然会给每个请求新建连接长连接池形同虚设表现是后端time_wait数量下不去。X-Forwarded-For用$proxy_add_x_forwarded_for而不是$remote_addr前者是追加能保留代理链如果前面还有一层负载均衡要配合--with-http_realip_module和set_real_ip_from才能取到真实客户端 IP模块没编进去的话这一步做不了只能看X-Forwarded-For的第一个值。超时三个参数对应三个失败场景proxy_connect_timeout管连不上后端后端挂了、端口不通proxy_read_timeout管连上了但后端迟迟不返回接口慢查询proxy_send_timeout管请求体发给后端的过程。默认的 60s 对普通接口够用对接导出、报表这类长任务要单独放大但别直接在http块全局放大按 location 加。4.3 平滑重载与日志切割-s reload 和 USR1 到底做了什么改完配置不重启进程用信号重载# 重载配置master 收到 HUP校验新配置通过则起新 worker老 worker 处理完存量请求后退出 ./sbin/nginx -p /opt/nginx-1.25.2-linux-x86_64 -c conf/nginx.conf -s reload # 切割日志先把旧文件改名再给 master 发 USR1它会重新打开日志文件 cd /opt/nginx-1.25.2-linux-x86_64/logs mv access.log access.log.$(date %F) kill -USR1 $(cat nginx.pid)-s reload的本质是给 master 发HUP信号master 先做一次配置校验不通过就保留老配置继续跑这是它比重启安全的地方。但有个前提这条命令必须能找到 pid 文件而 pid 文件的路径由配置里的pid指令决定所以前面强调写绝对路径。启动时用了一个-p重载时用了另一个就会报invalid PID number in .../nginx.pid。日志切割为什么不能直接rmLinux 下文件被删但句柄还开着磁盘空间不释放df看着满、du找不到这就是典型的“黑匣子”现象。正确做法是mv改名后发USR1master 重新open()一个新文件老文件在最后一个持有句柄的进程关闭后自然释放这时再删才干净。这套逻辑值得记牢出问题时能省下不少找文件的时间。5. 预编译包最常出问题的五个地方排查清单这一章按“现象 → 原因 → 解决”写都是我在实际环境里反复遇到的。预编译包的麻烦集中在一处它的所有路径和行为都是编译时定好的你看到的配置和它实际读的配置可能不是同一个文件。5.1 启动就报 Permission denied非 root 绑定 80 端口现象nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)配置语法检查-t是通过的。原因Linux 规定 1024 以下端口只有 root 或带CAP_NET_BIND_SERVICE的进程能绑。预编译包本身没有特权换个包也一样。解决三条路选一条。改监听端口到 8080 以上最省事必须用 80 就在前面挂一层负载均衡或端口转发或者给二进制打 capabilitysetcap cap_net_bind_serviceep /path/to/sbin/nginx之后非 root 也能绑 80。第三条要注意两点一是文件被覆盖后 capability 会丢二是部分文件系统不支持扩展属性getcap查不到就是没生效。5.2 reload 报 invalid PID number-p 不一致或 pid 文件残留现象执行-s reload报nginx: [error] invalid PID number in /xxx/logs/nginx.pid但进程明明在跑。原因nginx -s reload的工作方式是读 pid 文件拿 master 的 PID再发信号。pid 文件路径来自配置里的pid指令如果配的是相对路径它会跟着-p变。启动用了 A 目录、重载用了 B 目录读的就是两个不同文件B 目录下那个是空的或者不存在。解决把pid写成绝对路径启动和重载的命令行参数保持完全一致最好直接封成一个固定脚本或 systemd unit。另外进程被kill -9后 pid 文件会残留下次启动可能读到旧 PID删掉残留文件再启或者用-s quit正常停。5.3 静态文件一律 403目录权限与 user 指令的连锁反应现象curl返回403 Forbiddenerror.log里是open() /data/www/index.html failed (13: Permission denied)。原因worker 进程按user指令指定的身份跑非 root 启动时这个指令被忽略实际用的是当前登录用户。如果静态目录属主是 root 且权限是700worker 就没有读权限。另一条路径是父目录缺x权限中间任何一层目录没有执行位最终文件都读不到。解决namei -l /data/www/index.html这条命令会把路径上每一层的权限列出来一眼看出卡在哪一层。修正方式是给目录加x、给文件加r属主改成运行用户不要图省事直接chmod 777那只是把问题往后推。5.4 上传大文件返回 413默认 1m 的请求体上限现象上传稍大的文件返回413 Request Entity Too Large日志里client intended to send too large body。原因client_max_body_size默认 1m预编译包不会改这个值这是 nginx 的出厂默认。解决在对应的server或location里按需设置client_max_body_size 50m;不要放http块全局放大那等于对所有接口开放。另外如果前面还有一层代理那一层也要同步放开否则请求根本到不了 nginx。这个大文件上传的问题我在项目里遇到过改成 50m 还不够继续报 413才想起来前面还有一层没改。5.5 运行一段时间后磁盘满但找不到大文件日志句柄没释放现象df -h显示分区 100%du -sh却统计不出对应大小的目录。原因日志文件被rm或mv到其他分区后仍有进程持有句柄磁盘块不释放。日志文件用rm删除但 nginx 还开着文件句柄所以空间没释放。解决用lsof L1找出被删除但仍被占用的文件确认是 nginx 后执行kill -USR1 $(cat nginx.pid)让它重开日志。根治办法是配 logrotate用postrotate发USR1而不是copytruncate后者在写入频繁时有丢日志的风险。6. 把它做成可复用的运行基线软链切换、版本验证与压测单次部署跑通不算什么能重复才是本事。我的习惯是把版本目录和软链分开二进制解到/opt/nginx/1.25.2/再用/opt/nginx/current指向它配置、日志、站点目录都放在版本目录之外这样升级只是换一个软链。这里有个必须先想清楚的边界nginx -s reload只让 master 重新加载配置、起新 workermaster 自己执行的仍然是启动时那个二进制所以换软链后 reload 并不会真的换版本nginx -V看到的还是老编译参数。真要换二进制只有两条路直接停服重启或者走USR2→WINCH→QUIT的平滑升级流程。升级方式命令序列是否中断连接适用场景配置重载-s reload不中断只改配置不换二进制停服重启-s quit后重新启动短暂中断单机、可接受秒级抖动平滑升级kill -USR2→kill -WINCH→kill -QUIT不中断不能停服的核心入口平滑升级的三步含义USR2让 master 用新二进制拉起一个新 master此时新旧两套共存、都监听同一端口确认新 master 的日志和端口正常后WINCH通知老 master 的 worker 优雅退出观察一段时间没问题QUIT结束老 master。中间任何一步不对kill -HUP或直接回滚软链都还来得及这就是提前留退路的做法。验证环节不能只看curl通不通。我一般会补三件事一是用ab -n 2000 -c 50 http://127.0.0.1:8080/或wrk -t4 -c100 -d30s跑一轮看Requests per second和Failed requests重点看后者是不是 0二是如果包里有stub_status模块加一个/status位置读Active connections和accepts/handledhandled小于accepts说明有连接被丢弃得回头看worker_connections和LimitNOFILE三是压测同时tail -f error.logtoo many open files、worker_connections are not enough这两条会直接出现在日志里比看指标快。最后说个血泪经验预编译包最大的风险不是它不好用而是你默认它和源码编译出来的一样。每次拿到新包先花三分钟跑nginx -V和ldd再看一眼配置里所有相对路径这三步做完了后面基本不会翻车。至于那些版本号、模块清单和软链结构建议直接写进部署脚本里别靠记忆——我吃过记错 prefix 导致日志写进两个目录、排查时看了错文件的亏。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑