机房断网怎么装服务?Nginx 源码编译 + 自建内网 yum 仓库从零手把手教学
文章目录
- Nginx 源码完整编译安装
- 一、实验整体思路 & 作用
- 1. 什么是源码安装?
- 2. 源码安装 Nginx 的优势(实验目的)
- 3. 完整四大阶段流程
- 二、分步拆解:每一条命令、参数、作用、为什么要执行
- 阶段 1:安装编译所需依赖包
- 整条命令逐词拆解
- 为什么要先执行这条?
- 阶段 2:下载 Nginx 官方源码包
- 逐词解释
- 执行目的
- 阶段 3:解压源码压缩包
- 参数逐字拆解
- 执行效果 & 作用
- 阶段 4:进入源码目录,执行 configure 配置
- 整条命令完整拆解
- 为什么要指定 prefix?
- 阶段 5:编译 + 安装
- `&&`符号作用
- 拆分两条命令分别解释
- 验证安装是否成功
- 阶段 6:配置全局环境变量(任意目录直接执行 nginx 命令)
- 第一条:临时生效环境变量
- 临时生效缺点
- 第二条:写入用户环境变量文件,永久生效
- 三、Nginx 基础使用命令 逐行详解
- 1. 启动 Nginx 服务
- 2. 验证 Nginx 是否正常运行
- 执行效果
- 3. 正常停止 Nginx(优雅关闭)
- 4. 四条核心操作命令完整总结
- 四、配置 systemd 系统服务(systemctl 管理 nginx)
- 步骤 1:复制 sshd 服务模板,新建 nginx 服务文件
- 步骤 2:编辑服务配置文件
- 步骤 3:重载 systemd 管理器,识别新服务
- 步骤 4:设置开机自启,并立刻启动 Nginx
- 配套 systemctl 操作命令(实验常用)
- 五、实验完整逻辑梳理
- YUM 自建本地网络仓库实验完整讲解
- 实验核心作用
- 整体四大步骤总思路
- 每一条命令:干什么 + 为什么这么写
- 📌第一部分:服务端操作(server 机器,搭建 yum 源)
- 1. 准备软件包
- 参数详解
- 2. 创建 yum 仓库索引
- 3.Nginx 配置,发布仓库(让网络上客户端可以 http 访问仓库)
- 📌第二部分:客户端操作(client 机器,使用自建 yum 源)
- 客户端配置验证
- ❗高频踩坑点
- 同步仓库
Nginx 源码完整编译安装
一、实验整体思路 & 作用
1. 什么是源码安装?
yum/rpm 安装是别人提前编译好的程序包,直接安装;源码安装:下载软件官方原始.tar.gz源代码,在你本机服务器上,经过「配置→编译→安装」三步,生成可执行程序。
2. 源码安装 Nginx 的优势(实验目的)
- 自定义安装路径:可以指定软件装在
/usr/local/nginx,方便统一管理;yum 安装默认分散在/usr/sbin、/etc/nginx等目录; - 自定义编译模块:编译时自由开启 / 关闭 Nginx 功能(反向代理、缓存、ssl、stream 四层代理等);
- 自由升级降级:不受 yum 软件源版本限制,可以安装官网任意版本;
- 企业生产环境常用,方便后期运维、二次开发扩展。
3. 完整四大阶段流程
- 安装编译依赖(系统缺少编译工具会报错)
- 下载 Nginx 源码压缩包、解压
./configure配置编译参数 →make编译代码 →make install安装程序- 配置环境变量、测试启停 Nginx
- 编写 systemd 服务文件,支持
systemctl start/stop/enable统一管理
二、分步拆解:每一条命令、参数、作用、为什么要执行
阶段 1:安装编译所需依赖包
[root@centos7 ~]# yum install gcc make pcre-devel zlib-devel整条命令逐词拆解
yum:CentOS7 系统软件管理器,用来在线安装 rpm 软件;install:yum 子命令,代表执行安装操作;每个依赖包详细解释,
缺一不可,漏装编译直接报错
:
gcc:C 语言编译器,Nginx 是 C 语言开发,没有 gcc 无法把源码转成可执行程序;make:编译自动化工具,配合 configure 生成编译脚本;pcre-devel:正则表达式库,Nginx 的rewrite地址重写功能依赖它;不带-devel只是运行库,源码编译必须带 devel 开发包;zlib-devel:压缩库,Nginx 网页 gzip 压缩功能依赖该开发库。
为什么要先执行这条?
源码编译需要编译工具和底层功能库,系统最小化安装默认没有,不安装后面./configure会直接抛出依赖缺失错误。
阶段 2:下载 Nginx 官方源码包
[root@centos7 ~]# wget https://nginx.org/download/nginx-1.24.0.tar.gz逐词解释
wget:Linux 网络下载工具,从指定网址下载文件到本地;https://nginx.org/download/nginx-1.24.0.tar.gz:Nginx 官方稳定版源码下载地址;nginx-1.24.0.tar.gz:压缩包文件名,.tar.gz是 Linux 标准源码压缩格式。
执行目的
把官方完整源代码下载到服务器本地,后续解压编译。
补充:无外网服务器,需要本地电脑下载压缩包,rz 上传到服务器。
阶段 3:解压源码压缩包
[root@centos7 ~]# tar -xf nginx-1.24.0.tar.gz参数逐字拆解
tar:Linux 归档解压工具;-x:extract,解压文件;-f:file,指定要操作的压缩包文件,-f 必须放在所有参数最后;nginx-1.24.0.tar.gz:待解压的压缩包。
执行效果 & 作用
解压后生成同名文件夹nginx-1.24.0,里面存放全部 Nginx 源代码、配置脚本、模块文件,必须进入该目录才能编译。
阶段 4:进入源码目录,执行 configure 配置
# 切换到源码文件夹[root@centos7 ~]# cd nginx-1.24.0/cd:change directory,切换工作目录;- 不进入源码目录,系统找不到
./configure脚本,命令报错。
[root@centos7 nginx-1.24.0]# ./configure --prefix=/usr/local/nginx整条命令完整拆解
./configure:源码目录自带的配置检测脚本,核心作用 2 点: ① 自动检测系统环境、依赖库是否齐全;缺包会直接提示错误; ② 根据我们传入的参数,自动生成Makefile编译脚本,后续 make 命令依靠这个文件编译;--prefix=/usr/local/nginx:
最重要编译参数
--prefix定义软件
安装根目录
,所有 Nginx 文件统一放到这个路径下:
- 程序二进制文件:
/usr/local/nginx/sbin/nginx - 配置文件:
/usr/local/nginx/conf/nginx.conf - 网页根目录:
/usr/local/nginx/html/ - 日志文件:
/usr/local/nginx/logs/
- 程序二进制文件:
为什么要指定 prefix?
yum 安装文件分散,不好管理;源码自定义统一目录,后期查找配置、日志、程序非常方便。
阶段 5:编译 + 安装
[root@centos7 nginx-1.24.0]# make && make install&&符号作用
前半段make执行成功,才会执行后半段make install;如果编译失败,不会执行安装,避免损坏文件。
拆分两条命令分别解释
make:编译阶段 读取configure生成的 Makefile,调用 gcc 编译器,把 C 语言源代码编译成二进制可执行程序; 耗时几秒~几十秒,屏幕会打印大量编译日志。make install:安装阶段 把编译好的程序、默认配置、网页模板、日志目录,全部复制到--prefix指定的/usr/local/nginx目录。
验证安装是否成功
[root@centos7 ~]# ls /usr/local/nginx/conf html logs sbinls查看目录,出现 4 个文件夹代表安装完成:
- conf:存放 nginx.conf 主配置文件
- html:网站静态页面存放目录
- logs:访问日志、错误日志
- sbin:nginx 主启动程序
阶段 6:配置全局环境变量(任意目录直接执行 nginx 命令)
第一条:临时生效环境变量
[root@centos7 nginx-1.24.0]# export PATH=$PATH:/usr/local/nginx/sbin/逐段拆解:
export:声明全局环境变量;PATH:系统命令搜索路径,系统执行命令时,只会去 PATH 里记录的文件夹查找程序;$PATH:保留原来系统自带的所有路径;:/usr/local/nginx/sbin/:追加 nginx 程序目录到 PATH。
临时生效缺点
只在当前终端窗口有效,关闭终端、重启服务器后失效。
第二条:写入用户环境变量文件,永久生效
[root@centos7 nginx-1.24.0]# echo 'export PATH=$PATH:/usr/local/nginx/sbin/' >> ~/.bashrc逐词拆解:
echo '内容':输出指定文本;>>:追加重定向,不覆盖文件原有内容;~/.bashrc:当前用户(root)登录时自动加载的环境变量配置文件;- 重启服务器、新开终端都会自动加载 PATH,任何位置直接输入 nginx 命令即可使用。
三、Nginx 基础使用命令 逐行详解
1. 启动 Nginx 服务
[root@server ~19:18:18]# nginx[root@server ~19:18:21]# ps -C nginxPID TTY TIME CMD7155? 00:00:00 nginx7156? 00:00:00 nginx# 查询nginx对应的端口号[root@server ~19:23:46]# ss -lntp | grep :80LISTEN0128*:80 *:* users:(("nginx",pid=7156,fd=6),("nginx",pid=7155,fd=6))# 关闭防火墙[root@server ~19:24:05]# systemctl disable firewalld.service --now- 原理:读取
/usr/local/nginx/conf/nginx.conf配置,后台 fork 主进程 + 工作进程,监听 80 端口; - 前提:环境变量配置成功,否则需要写全路径
/usr/local/nginx/sbin/nginx。
2. 验证 Nginx 是否正常运行
[root@centos7 ~]# curl -s http://localhost | grep Thank<p><em>Thank youforusing nginx.</em></p>命令拆解:
curl:Linux 网页访问工具,模拟浏览器发送 http 请求;-s:静默模式,不打印多余进度、错误信息;http://localhost:访问本机 80 端口 Nginx 服务;|管道符:把 curl 返回的网页内容传给后面命令;grep Thank:过滤包含 Thank 的字符串;
执行效果
输出<p><em>Thank you for using nginx.</em></p>代表页面正常返回,Nginx 启动成功。
3. 正常停止 Nginx(优雅关闭)
[root@centos7 ~]# nginx -s quit-s:signal,向 nginx 主进程发送信号;quit:优雅退出信号,Nginx 会等待当前已连接客户端请求全部处理完毕,再关闭进程,不会强制断开用户。
4. 四条核心操作命令完整总结
nginx:启动服务nginx -s quit:优雅停止,等待任务处理完再关闭nginx -s stop:强制立刻杀死进程,正在访问的用户会直接断开,生产环境不推荐nginx -s reload:平滑重载配置,不中断业务,修改 nginx.conf 后必须执行,加载新配置生效
四、配置 systemd 系统服务(systemctl 管理 nginx)
步骤 1:复制 sshd 服务模板,新建 nginx 服务文件
[root@centos7 ~]# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/nginx.service拆解:
cp:复制文件命令;/usr/lib/systemd/system/sshd.service:系统自带 ssh 服务模板,格式标准,直接复制改参数即可;/etc/systemd/system/nginx.service:自定义系统服务存放目录,文件名 nginx.service,后缀必须.service。
步骤 2:编辑服务配置文件
[root@centos7 ~]# vim /etc/systemd/system/nginx.servicevim文本编辑器,打开刚才复制的文件,删除原有 ssh 内容,写入下面配置:
[Unit]Description=Nginx server daemon[Unit]区块:服务基础描述
- Description:服务名称描述,systemctl status 时会显示
[Service]Type=forkingExecStart=/usr/local/nginx/sbin/nginx-c/usr/local/nginx/conf/nginx.confExecReload=/usr/local/nginx/sbin/nginx-sreloadExecStop=/usr/local/nginx/sbin/nginx-squit[Service]区块:服务启停、重载核心配置
Type=forking:Nginx 后台守护进程模式,主进程 fork 子进程,必须写 forking;ExecStart:systemctl start 执行的命令,指定 nginx 程序 + 完整配置文件路径;ExecReload:systemctl reload 执行的重载配置命令;ExecStop:systemctl stop 执行的优雅停止命令。
[Install]WantedBy=multi-user.target[Install]区块:开机自启配置
multi-user.target:系统多用户命令行模式,代表服务器开机进入命令行时自动启动该服务。
步骤 3:重载 systemd 管理器,识别新服务
[root@centos7 ~]# systemctl daemon-reload作用:新建 / 修改.service文件后,必须执行这条命令,让 systemd 系统管理器读取新的服务配置,否则 systemctl 找不到 nginx 服务。
步骤 4:设置开机自启,并立刻启动 Nginx
[root@centos7 ~]# systemctl enable nginx.service --now参数拆分:
enable:设置开机自启,服务器重启自动运行 nginx;--now:立刻执行 start,不用分开输入systemctl start nginx;
配套 systemctl 操作命令(实验常用)
- 查看运行状态:
systemctl status nginx - 停止服务:
systemctl stop nginx - 重载配置:
systemctl reload nginx - 关闭开机自启:
systemctl disable nginx
五、实验完整逻辑梳理
- 源码安装核心逻辑:装依赖 → 下源码 → 解压 → configure 检测环境定义路径 → make 编译 → make install 安装;
- 环境变量作用:简化命令,任意目录直接输入 nginx;
- nginx -s 信号:控制进程启停、重载配置;
- systemd 服务作用:统一用 systemctl 管理,支持开机自启、状态查看,企业标准运维方式;
- 源码安装对比 yum:高度自定义,版本自由,目录统一,适合生产环境搭建内网 yum 仓库、自定义 web 服务。
YUM 自建本地网络仓库实验完整讲解
实验环境:CentOS7 整体实验目标:自己搭建一台 YUM 软件源服务器,局域网内其他 Linux 客户端,可以通过 HTTP 网络,从你的服务器下载安装软件,不需要外网互联网。
实验核心作用
- 内网环境无互联网场景:服务器不能上外网,搭建内网 yum 源,局域网机器安装软件,不用外网。企业机房经常这么做。
- 自定义软件仓库,可以统一存放自己常用软件包。
- 理解 yum 工作原理:yum 不是直接下载 rpm,先读取 repomd.xml 索引获取软件依赖关系,再下载 rpm 包。
整体四大步骤总思路
- 准备 rpm 软件包:把需要的软件 rpm 安装包全部下载到服务器
- createrepo 生成 YUM 仓库索引(repomd.xml):Yum 靠这个索引知道仓库里有哪些包、依赖关系是什么。你刚才报错
Damaged repomd.xml就是这个索引文件损坏 / 缺失 - 用 Nginx 把目录发布成网页:让客户端能用 http 访问到 rpm 包和索引文件
- 客户端写 repo 文件,指向自建源,yum 安装测试
通俗类比: yum 仓库 = 网上软件商店; rpm 包 = 软件安装包; repomd.xml = 商店商品目录清单; nginx = 把商店对外开放; 客户端 tools.repo = 告诉 Linux:软件商店地址在哪里。
每一条命令:干什么 + 为什么这么写
📌第一部分:服务端操作(server 机器,搭建 yum 源)
1. 准备软件包
#创建rpms文件夹,用来临时存放下载的rpm包[root@server ~]# mkdir rpms#进入这个文件夹,后面下载的包全部存这里[root@server ~]# cd rpmsmkdir rpms:创建空文件夹,专门用来存放 rpm 包,方便管理cd rpms:切换工作目录,让下载命令把包下载到这个文件夹,而不是 root 家目录
#下载软件包,以及依赖的软件包[root@server rpms]# yum install --downloadonly --downloaddir . vim open-vm-tools vsftpd lrzsz bash-completion nginx httpd mariadb-server用ls 查看已安装的软件包
参数详解
yum install本来是安装软件--downloadonly:只下载,不要安装软件!非常关键,我们只想拿到 rpm 安装包,不把软件装到源服务器上--downloaddir .:.代表当前目录,下载的 rpm 全部保存到当前 rpms 文件夹- 后面一长串软件名:就是我们打算放到自建源里面,给客户端安装的软件
⚠️注意:这条命令执行成功前提:server 机器本身要有外网可用 yum 源,才能把 rpm 包下载下来。
# 创建网页发布目录[root@server ~]# mkdir /usr/local/nginx/html/tools#把下载好全部rpm包移动到网页目录下Packages文件夹[root@server ~]# mv rpms /usr/local/nginx/html/tools/Packagesmkdir /usr/local/nginx/html/tools/usr/local/nginx/html/是源码安装 nginx 的网页根目录,浏览器访问 nginx,读取的全部文件都放在这里。我们新建 tools 子目录专门放 yum 仓库。mv rpms /usr/local/nginx/html/tools/Packages把刚刚下载 rpm 包的 rpms 文件夹,移动并重命名为Packages。yum 仓库约定俗成 rpm 包放在 Packages 目录。
现在路径:
/usr/local/nginx/html/tools/Packages/xxx.rpm
2. 创建 yum 仓库索引
#安装createrepo工具[root@server ~]# yum install -y createrepocreaterepo是专门用来生成 yum 仓库元数据索引的工具,CentOS 系统默认没有安装,必须手动装。
# 创建仓库索引信息[root@server ~]# createrepo /usr/local/nginx/html/tools/createrepo 仓库根目录这条命令扫描tools目录下面所有 rpm 包,自动计算依赖关系,自动生成 repomd.xml 索引文件,存放在/usr/local/nginx/html/tools/repodata/下面。
✅
repomd.xml就是 yum 的商品清单! 如果这个文件损坏、缺失,客户端执行 yum 就报Damaged repomd.xml file错误。 每次新增 rpm 软件包之后,必须重新执行一次 createrepo 刷新索引,否则客户端看不到新包。
3.Nginx 配置,发布仓库(让网络上客户端可以 http 访问仓库)
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf# 在http块中新增一行autoindex on;http{autoindex on;.....}vim`编辑 nginx 主配置文件`autoindex on;- 默认 nginx 访问一个目录,如果下面没有 index.html,直接报 403 禁止访问。
autoindex on开启目录浏览功能:浏览器访问http://server.jhl.cloud/tools/,nginx 展示目录里面所有文件列表,客户端 yum 才能下载 rpm 包和索引文件。
❗不要写在 server {} 块外面!示例写 http 全局块所有站点全部开启目录浏览。
#重载nginx配置[root@server ~]# systemctl reload nginxreload平滑加载配置,不停止已经运行 nginx 进程。修改 nginx.conf 后必须 reload 配置才能生效。
如果写
restart nginx会直接停止 web 服务,业务中断,实验优先 reload。
✅到此服务端全部做完!现在浏览器访问
http://server.laoma.cloud/tools/,应该可以看到网页列出 repodata 文件夹、Packages 文件夹。
📌第二部分:客户端操作(client 机器,使用自建 yum 源)
客户端配置验证
#备份原有仓库[root@client ~]# mkdir /etc/yum.repos.d/old[root@client ~]# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/old/etc/yum.repos.d/:系统所有 yum 仓库配置文件全部放在这个目录!后缀必须是.repomkdir old创建备份文件夹mv *.repo old把系统原来所有 repo 源文件移动备份。
实验目的:把外网源全部移走,强制客户端只使用我们自己搭建的自建 yum 源,排除其他源干扰,做纯净测试。 如果不移动旧源,yum 会同时读取多个源,分不清软件来自哪个仓库。
#快速写入tools.repo仓库配置文件[root@client ~]# cat << 'EOF' > /etc/yum.repos.d/tools.repo[tools]name=centos7 tools from server.jiang.cloudbaseurl=http://server.jiang.cloud/tools/enabled=1gpgcheck=0EOFcat << 'EOF' >文件名:shell Here‑Doc 语法,把两行 EOF 中间内容直接写入文件,不用 vim 手动敲,实验脚本经常用。
repo 每一行详细解释(非常重要)
[tools]#仓库ID,名字随便起,唯一标识符,不能有空格name=centos7 tools from server.jiang.cloud#仓库描述名字,给人看,随便写baseurl=http://server.jiang.cloud/tools/#【最重要】yum仓库根地址!指向服务端nginx发布的仓库地址enabled=1#1启用这个源,0关闭gpgcheck=0#0关闭rpm数字签名校验;自建仓库没有数字签名,必须关闭,否则yum报错注意:
server.laoma.cloud需要做域名解析!要么修改客户端/etc/hosts把域名指向 server 服务器 IP,否则域名无法解析。也可以直接写 IP 地址baseurl=http://192.168.x.x/tools/
[root@client ~]# ls /etc/yum.repos.d/old tools.repo查看目录确认:现在只有 tools.repo 是激活的源,其他 repo 全部移动到 old 备份文件夹。
#测试安装软件[root@client ~]# yum install -y httpdyum 读取tools.repo里面 baseurl,访问 server 服务器repomd.xml索引,查找 httpd 软件包,下载 rpm 并且自动处理依赖完成安装。
❗高频踩坑点
- 服务端执行
createrepo失败,没有生成 repodata 文件夹,客户端直接报 xml 损坏 - nginx 没有配置
autoindex on,访问目录 403,yum 访问仓库失败 - baseurl 写错地址,末尾
/不能丢 - 新增 rpm 包忘记重新执行 createrepo,客户端看不到新增软件
- 客户端没有把旧 repo 移走,多个源混淆
- 域名无法解析:要么改 hosts,baseurl 直接写服务器 IP
- 防火墙:server 机器防火墙放行 80 端口,否则客户端访问不了 nginx 网页
排查思路 客户端报错 damaged repomd.xml:
- 在客户端浏览器访问 baseurl 地址,看能不能打开网页,能不能访问到
repodata/repomd.xml - 如果网页打不开:nginx 配置、防火墙、域名解析问题
- 如果网页打开但是没有 repomd.xml →服务端没有执行 createrepo
同步仓库
# 将仓库中软件包和元数据全部同步到本地[root@client ~]# reposync --repoid=tools[root@client ~]# createrepo tools[root@client ~]# ls tools/Packages repodata参考:yum-REPOSYNC(8)。