☰
Linux下解压安装Nginx 1.22.0全流程详解
2026/10/10 22:25:42 网站建设 项目流程

简介:Nginx 1.22.0 Linux版源码压缩包,面向运维工程师、后端开发及对Web服务器原理感兴趣的读者。Nginx以高并发、低内存占用著称,常被用作反向代理、负载均衡和静态资源服务,此版本为稳定分支,适合新站点部署或学习研究。资源包共403个文件,以C源文件(207个)和头文件(98个)为核心,另含conf配置模板、Makefile编译脚本及辅助工具文件,整体仅714KB,便于快速下载与解压安装。已有3326人学习使用,适合需要在实际环境中搭建Nginx服务、调整编译参数或阅读源码以排查问题的用户。通过本包可以拿到完整的Nginx 1.22.0源码目录结构,结合官方文档可完成从配置到编译安装的全过程,也可借鉴其中的模块划分和配置写法,为定制化开发提供基础。

1. 系统仓库里只有旧版nginx,业务又点名要1.22.0,解压安装是把版本控制权拿回手里的方案

你在一台最小化安装的Linux服务器上准备部署Web服务,执行apt install nginx后装到的是发行版仓库里那个年代久远的版本,而你手里的配置、模块和第三方扩展针对的却是nginx 1.22.0 Linux版本。这种时候,解压安装是我会采用的方案:下载官方tar.gz包,解压,配置,编译,把指定版本装到指定目录,全程不碰系统包管理器。它解决的是精确版本、自定义编译参数和多实例共存的问题,适合刚接触Linux编译安装的新手,也适合被仓库版本锁住的老运维。读完这篇笔记,你会清楚从哪里拿包、configure参数怎么设、systemd怎么写,以及我踩过的那些坑。

2. 解压安装和包管理器安装的差别:选型原理与适用边界

2.1 为什么包管理器不一定能给你1.22.0

用包管理器安装nginx,本质上是检索发行版软件源里已经编译好的二进制包。软件源的维护者希望给用户一个稳定、可追踪的版本,所以会把一个版本的nginx固化成系统标准,之后只做安全补丁的小更新,大版本常年不动。你执行apt install nginx或yum install nginx,拿到的多半是一个旧的小版本,例如1.14或1.16,而你手里配置里引用的模块、头文件、编译参数很可能只匹配1.22.0。这种时候,包管理器不给力,解压安装就成了把版本锁到你想要的位置的办法。

我用这个方案时一般出于三个判断。第一,目标机的软件源同步滞后,或者干脆是内网环境没有合适的仓库。第二,项目文档明确写了必须使用nginx 1.22.0这个具体版本,兼容性测试都按它做。第三,我需要在编译阶段加入自定义模块或参数,比如开HTTP/2、开stream。缺少这三个条件,我会反过来建议使用包管理器,因为手工会带来不必要的维护量。

另外,包管理器安装还会把文件分散到系统多个目录:日志在/var/log/nginx,配置在/etc/nginx,二进制在/usr/sbin/nginx。你看着不直观,卸载也不利落。解压安装只用一个prefix目录,独立装一堆文件在里面,删除时直接删目录,这种“一个软件、一个目录”的做法对于喜欢可控的运维来说很舒服。

我放一个简单的对比表在这里,方便你一眼看出边界:

对比项包管理器安装解压安装(源码tar.gz)
版本由谁决定发行版仓库你下载的官方包
安装路径/usr、/etc分散放置prefix自定义目录
依赖处理自动解析安装configure脚本检查并报错
升级方式仓库同步小版本更新重新下载解压编译
多实例需要改配置与共享二进制不同prefix天然隔离
卸载包管理器统一管理直接删除prefix目录

这里每一个差别都会左右你的运维方式。版本准确性、目录隔离性、多实例部署这三项是解压安装最明显的优势,也是我回头选它的原因。

2.2 解压安装的本质:从tar.gz到configure、make、make install

解压安装这个说法,容易让人以为解压完就能直接跑。实际上一把tar.gz源码包的任务是:解压、配置、编译、安装。我按顺序给你拆一遍工作链。

tar -xzf nginx-1.22.0.tar.gz cd nginx-1.22.0

tar -xzf把源码包解到当前目录。这里有两个细节:一是要提前规划好工作目录,我一般放/usr/local/src里,避免源码包目录被随意改动;二是解压后的目录名nginx-1.22.0带着版本号,后续脚本定位路径时不要把它随便改成别的名字。

接着configure脚本登场。它检查系统里有没有nginx需要的依赖,比如正则库、压缩库、SSL库,然后把用户指定的编译选项写进Makefile。configure执行成功后会生成Makefile和objs目录,如果缺少依赖库,它就停在出错的位置并给出明确提示。这其实是有用的反馈:与其后面跑一半失败,不如在配置阶段就拦下来。make命令负责按Makefile里的规则把源码编译成二进制,生成的核心可执行文件在objs/nginx。最后make install把这套产物复制到--prefix指定的目录。

这个流程的收益是过程可复现。你只要保留configure参数和相关依赖的安装记录,在另一台相同系统上重跑一遍,得到的nginx行为和版本完全一样。这对批量部署、灾备恢复都很友好。代价是要手动处理依赖库安装、版本升级和安全补丁,运维提醒必须自己留意。你决定走这条路的时候,等于同时接受这份维护责任。

再补充一个容易被忽视的点:make install不会自动初始化运行用户,也不会生成让你开机关机时用的service脚本。这些自由裁量权都回到了你手上。所以严格说,真正落地一个可用的nginx服务,不是以make install结束,而是以你写好systemd服务为终点。这个观点我会在第4章展开,你现在只需要记住,解压安装对于路径和进程管理的影响是全局性的。

2.3 什么时候该用解压安装,什么时候别用

选型不是越复杂越好。如果你只要一台能跑nginx的Web服务器,apt或yum一行命令解决,后面升级安全补丁也省事。解压安装的适用面主要被我归纳成四个场景:精确版本锁定、自定义编译参数、多实例或固定路径要求、以及需要用第三方模块的场合。四个场景里命中一个,我就走源码包路线。

反过来,解压安装也有一笔显性成本:每次升级都要重新下载、configure、make、make install,而且你必须在测试环境里先跑一遍验证。依赖库变了,configure可能报错;目录结构变了,systemd unit也可能失效。如果你没有这个重复劳动的准备,或者项目里同时有多个依赖包需要手工维护,我建议老老实实用包管理器。它最大的优点正是你越不想操心的部分,它替你操心了。

我的判断原则可以缩成一句话:版本、路径、模块三项里,有一项是硬性需求就走解压安装;三项都能将就,就走包管理器。实际上我在评估新项目时,最先问的永远是这三点,而不是直接看别人的安装教程。先把选型理由定下来,后面才不会被具体的命令牵着走。这篇文章后面的所有命令,都是为“确认要解压安装”的人准备的。

3. 在Linux上用tar.gz装好Nginx 1.22.0:下载、校验、配置、安装的最小步骤集

3.1 下载与校验:别急着解压,先确认文件完整

官方发布nginx时会在下载页同时放.tar.gz和对应的校验文件。我在第2章里提过下载地址通常位于官方下载目录,tar包按版本号命名。拿到包之后第一件事不是解压,而是校验文件完整性。下载过程中偶发的网络中断或存储问题,可能让tar文件尾部缺一块,解压时才会报错,到那时候排查起来反而更折腾。

wget https://nginx.org/download/nginx-1.22.0.tar.gz wget https://nginx.org/download/nginx-1.22.0.tar.gz.asc sha256sum nginx-1.22.0.tar.gz

这里先下载源码包和PGP签名文件,再用sha256sum生成一个本地哈希值。你不需要自己记住官方哈希值,把本地生成的哈希值拿到可信环境里与官方公布的哈希对照就能判断文件是否完整。如果你的机器上装有gpg,并且已经导入了官方发布密钥,还可以用gpg --verify验证签名。验证签名比起单纯哈希对照更可靠,因为它能同时证明文件来源和完整性。

校验完成后再解压。这个习惯能避免后面读到的是被截断的源码包。你可能会觉得每次装都要多一步很烦,但打包出问题时,这一下能帮你省下半小时找错时间。养成固定动作后,这条命令也要写进你的安装脚本里,方便整套自动化回归。

这个步骤里最大的坑是有人贪快,直接从不明来源的镜像站下载,结果文件被篡改或版本不对。我见过有人在镜像站拿到一个nginx-1.22.0.tar.gz,解压后configure报出一堆奇怪错误,最后发现是别人重新打包过的。所以下载地址尽量用官方目录,装之前顺手做哈希校验,这是给自己买的后悔药。

3.2 configure参数:三个必调和一个推荐

编译安装最核心的部分是configure。参数不同,装出来的nginx行为和依赖也就不同。初次安装时,我一般会在这几个参数里做选择,先保证能用,再优化性能。

cd /usr/local/src/nginx-1.22.0 ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-stream

--prefix定义了安装根目录。后续生成的所有文件都在这个目录下,比如sbin/nginx、conf/nginx.conf、logs/。这个参数的设置决定了卸载、升级和脚本定位路径的难易度。--with-http_ssl_module启用HTTPS支持;只要你的站点要接TLS证书,这个模块就必开。--with-http_v2_module启用HTTP/2;在HTTP/2已经普及的今天,它是高并发页面性能优化的重要选项。--with-stream让nginx能作为四层负载均衡器转发TCP/UDP流量,这个模块不开的话,后端TCP代理这类需求就没法直接实现。

如果你运行nginx的用户不是root,还推荐额外加一个参数,把worker进程运行到固定用户上:

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_v2_module --with-stream --user=nginx --group=nginx

--user和--group指定worker进程运行身份。配置了这两个参数后,nginx启动时会自动把master进程保留为root,worker进程切换到nginx用户,从而降低权限过高带来的风险。这个用户需要事先用useradd创建,如果你不打算在systemd服务里写User=选项,那么nginx.conf里就必须保持这两个参数和系统用户一致。

configure执行成功后会生成Makefile,并打印一段配置摘要。摘要里列出的关键项你要扫一眼,比如“nginx path prefix”“modules path”“configure arguments”是否按预期。如果发现参数漏配,现在重跑configure比后面重新编译代价小得多。我见过有人configure一遍后又想加--with-stream,结果直接从头再来,就是因为一开始没养成看摘要的习惯。

3.3 make与make install:编译完成的二进制怎么落到系统里

configure成功后,就进入编译阶段。nginx这个项目编译比较轻量,但现代CPU多核环境下直接用make让它单线程跑就亏了,我一般先看核数再并行编译。

make -j$(nproc) make install

$(nproc)会返回当前机器的CPU逻辑核数,make -j按这个数字并行编译,能把编译时间从几分钟压到几十秒。注意这里不要盲目加更大数字,比如用-j32在小机器上会大量消耗内存,编译时内存不足反而让进程被杀。make编译完成后,同目录下会多出objs目录,里面有一个可执行文件objs/nginx,这就是编译产物。make install把这产物复制到--prefix指定目录,同时会带上conf/、logs/、html/这三个默认目录。

make install之后,你的安装就算完成了。此时先不要急着做任何修改,去检查一下prefix目录的信号。如果/usr/local/nginx/conf/nginx.conf存在,说明安装链路是通的。这个步骤里最容易发生的问题是configure时给了--prefix,但后续手动拷贝或软链接时又用了系统级路径,最后启动的是系统里的旧二进制,而不是你刚装好的1.22.0。所以在配置systemd之前,我习惯先执行一次。

/usr/local/nginx/sbin/nginx -V

nginx -V会在输出里打印编译参数和版本号。你确认能看到nginx/1.22.0字样,就说明手头这个二进制是对的。

官方源码包里包含的html目录只有默认的index.html和50x.html,如果你需要自定义站点页面,在后面配置阶段再改,不要手工往里面塞文件,免得与nginx内部逻辑互相干扰。安装到这里只完成了一半,真正让服务跑起来的是下一步的启动与管理。

4. 启动、停止与开机自启:第一次装好后直接跑进程容易出问题

4.1 安装完成后的第一次配置检查和启动

前缀目录建好之后,先别急着执行sbin/nginx,而是先做配置检查。我踩过很多次直接启动后页面不可用的坑,原因很多是配置文件里少了分号或路径写错。nginx给了一个很好的自检机制:nginx -t。

/usr/local/nginx/sbin/nginx -t

nginx -t会读取conf/nginx.conf,依次检查语法、路径、include模块等。如果输出显示syntax is ok,那就可以启动;如果报错,它会精准指出文件和行号,比启动后看日志省时间。注意执行这条命令时一定要用绝对路径调用你编译出的二进制,因为PATH里的nginx可能是系统自带的那一个,二者可能版本不一致。

确认配置没问题后,执行启动:

/usr/local/nginx/sbin/nginx

这条命令以daemon方式启动,本身不会阻塞终端。启动后nginx会在logs目录生成nginx.pid文件,里面记录master进程的PID。这个文件对后续reload、stop等信号操作很重要。如果没有生成pid文件,说明启动失败了,这时要立刻去看logs/error.log,而不是反复执行启动。一次启动失败通常还会留下端口占用、配置文件路径错误这类普通报错,日志里的行号会直接指出问题在哪一段。

我习惯在这个环节顺手验证一下端口监听:

ss -lntp | grep nginx

如果看到LISTEN状态的80端口,说明启动这一步已经通了。如果你的服务器上原本跑了其他Web服务,这里会立刻暴露端口冲突,所以先检查再启动,能少走一段回头路。

4.2 用systemd接管nginx,避免启动后进程没人管

有人喜欢直接在命令行里sbin/nginx完事,但服务器重启后nginx不会自动拉起,而且进程掉线后也没有守护。我通常的做法是给systemd写一个unit文件,让它把nginx当成一个服务管理。这样开机自启、崩溃重启、日志清理都顺势解决。

cat > /etc/systemd/system/nginx.service <<'EOF' [Unit] Description=nginx high performance web server After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop PIDFile=/usr/local/nginx/logs/nginx.pid [Install] WantedBy=multi-user.target EOF

这个unit文件的核心是Type=forking。nginx启动时master进程创建worker进程后,原本调用的主进程会退出,把控制权交给后台的master。因此systemd必须知道真正的服务主进程PID在哪里,否则它会误以为启动失败。PIDFile指定到logs/nginx.pid,配合ExecStart就能让systemd正确追踪。

填完文件后执行:

systemctl daemon-reload systemctl enable --now nginx systemctl status nginx

daemon-reload重新加载unit文件;enable --now让服务开机自启并立即启动。status命令的active (running)状态和进程信息能确认守护关系生效。如果你在配置systemd之前已经手动启动过nginx,这里会碰到端口占用的问题,先用pkill或nginx -s stop关掉手动启动的进程,再交给systemd管理。

还有个常见的维护动作是reload。修改配置后执行systemctl reload nginx,它会走ExecReload里的nginx -s reload,比restart平滑,因为不会中断现有连接。我一般修改完配置后先用nginx -t检查,再reload,这是最基本的流程。

4.3 运行用户与日志目录权限

出于安全考虑,worker进程不应该用root跑。第3章里如果configure时加了--user=nginx --group=nginx,那么在启动前要先创建这个用户,并给logs和html目录授权;如果没有加configure参数,nginx.conf里可以直接用user指令临时指定运行用户。需要坚持的是worker进程权限尽量低。

我遇过一次误操作:运行用户加载不出静态文件,最后发现html目录的属主是root、权限没有放开给nginx用户。这种情况下页面会显示403,而日志里只有权限拒绝的一行。所以创建完用户后我会习惯性执行:

useradd -r -s /sbin/nologin nginx chown -R nginx:nginx /usr/local/nginx/logs chown -R nginx:nginx /usr/local/nginx/html

-r表示创建系统用户,-s /sbin/nologin禁止该用户登录,这两项都能收紧权限面。logs需要写权限,html需要读执行权限。之后启动再观察error.log,别再让一些无关紧要的警告绊住。

这里要补充一个容易被忽略的点:如果在configure阶段没有加--user参数,实际上还是一个常见做法是直接在nginx.conf的顶部写user nginx;。但这个指令必须放在配置文件的全局段,且nginx.conf里的启动身份优先级会覆盖configure参数。如果你在配置文件里写了user root,那你前面费劲创建的普通用户就没有意义了。所以每次改权限后,我都要确认nginx.conf和configure参数口径一致,否则排查半天最后发现是权限逻辑冲突。

5. 解压安装Nginx的五个常见坑与排查路径

5.1 configure报错“the HTTP rewrite module requires the PCRE library”

现象:./configure执行到一半,输出类似“the HTTP rewrite module requires the PCRE library”,然后直接退出。

原因:nginx的rewrite模块依赖正则表达式库,系统里没有安装开发头文件。很多最小化服务器默认不带libpcre-dev这类包,configure脚本检查依赖时就会拦下来。

解决:在支持包管理的系统上安装对应开发包。在Debian系用apt install libpcre3-dev,在RHEL系用yum install pcre-devel,装完后再重新configure。如果你需要静态链接这个库,可以在configure加--with-pcre=路径指向源码包,但这会多一步下载pcre源码的步骤,普通场景下系统库就够了。这个报错出现时不要慌,它只是检查依赖,不会污染环境,重新执行configure就能继续。

5.2 启动后访问一直转圈:先看error.log再看防火墙

现象:nginx启动成功,进程在,防火墙也放行了80端口,但浏览器持续转圈,页面迟迟加载不出来。

原因:很多时候不是端口问题,而是nginx的error.log里已经写了权限错误或upstream连接不上。我在排错时先看日志而不是先关防火墙,因为防火墙问题主要是现网干等,而日志能直接告诉你后端拒绝、权限拒绝等真实信息。

解决:执行tail -f /usr/local/nginx/logs/error.log,看最新几行定位真实消息。如果日志为空,再用ss -lntp检查监听地址;如果你的nginx.conf里把listen 80改成了listen 127.0.0.1:80,外部当然访问不到,这时curl 127.0.0.1能通,curl 公网IP不通,问题就在监听地址或云安全组,而不是nginx本身。

5.3 systemd启动超时:Type写错导致管理器等不到主进程

现象:systemctl start nginx卡住不动,然后又超时失败,systemctl status显示状态为activating (start)而不是active。

原因:unit文件的Type=forking写成了Type=simple。systemd会认为启动过程是一个前台进程,而nginx自己会让主进程变成后台进程,导致管理器没法确认服务已经起来,最后把自己等超时了。

解决:确认unit文件里ExecStart指向绝对路径,Type=forking,同时PIDFile路径和nginx.conf里的pid指令保持一致。改完文件必须systemctl daemon-reload再重启服务。这个坑在手工复制unit文件时特别容易出现,因为网上模板五花八门,不熟的人根本不会注意到Type这一行的作用。

5.4 升级翻车:新二进制换了,但模块旧目录和配置残留

现象:从1.20.0升到1.22.0,make install执行后启动,nginx -V显示的还是一个旧编译参数,或某些模块加载失败。

原因:make install只在全新安装时干净,升级时它会覆盖二进制,但不清理旧的动态模块,也不处理旧配置里的注释差异。新版二进制和旧模块之间可能存在ABI不兼容,加载时直接报错。

解决:升级前备份整个prefix目录,执行:

cp -a /usr/local/nginx /usr/local/nginx.bak.$(date +%F)

然后重新make install,执行后对比nginx -V输出;如果你手动替换过conf目录,升级后配置文件也可能不对应新版二进制。这是典型的解压安装翻车点。我通常会先在staging环境模拟一次升级,再动生产,因为生产上直接覆盖很容易让回滚变得手忙脚乱。

5.5 403权限拒绝:worker进程拿到文件却没有读取权限

现象:静态文件路径写的问题不大,但浏览器访问出现403,日志出现权限拒绝。

原因:configure时加了--user=nginx,worker进程以nginx身份运行,但它对html目录或静态资源目录没有读权限。权限过紧是解压安装常见的副作用,因为手工管理目录时,很容易把属主留给root。

解决:用chown指定目录属主,或者增加执行权限,保持目录路径在nginx用户的访问范围内。同时确认nginx.conf里的user指令没有在全局段配置成别的用户,否则与configure参数冲突时以配置文件为准,容易造成权限错觉。排查这类问题时,我会顺手用sudo -u nginx ls 目录来模拟worker进程的访问视角,直接验证权限是否通。

6. 装完Nginx 1.22.0后我习惯做的五个验证动作:从curl到日志断言

装完服务后,我从来不会直接交付。先做一组低成本的验证动作,确认它真正可用,而不是“看起来启动了”。

先看监听端口和进程:

ss -lntp | grep nginx ps -ef | grep nginx

确认master和worker进程都在,监听地址符合预期。然后用curl验证默认页:

curl -I http://127.0.0.1

期望响应里出现HTTP/1.1 200 OK。这一步验证的是web服务器基本功能,如果返回503或拒绝连接,问题通常出在配置或权限上。

再验证你安装的版本和编译参数:

/usr/local/nginx/sbin/nginx -V

重点看输出里的nginx/1.22.0和--with-http_v2_module这类参数,确认自己没取错二进制。然后检查错误日志里没有启动期残留:

tail -n 20 /usr/local/nginx/logs/error.log

这条命令应该返回几行启动成功的消息,或者干脆为空。如果看到大量连接拒绝,就要回到第5章去对号入座。

最后我会做一个小技巧:把nginx.pid文件内容读出来和ps里的PID比对,确认systemd追踪的进程没有错位。这五个动作加起来不到一分钟,却能覆盖进程、版本、配置、日志、守护关系这几个最容易出错的地方。

从第一次手工编译到现在,我每次都坚持先验证再交付。这个习惯救过我很多次,尤其在服务器重启后忘记处理日志目录权限时,系统起来却默默报错,只有这种小验证能及时发现。希望帮到你,少走我走过的弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询