内网服务器、政务云、金融机房,这些环境往往不允许直接连外网,yum源用不了,想在CentOS上部署Nginx就只能走离线安装这条路。离线安装的核心思路其实不复杂:把编译环境和依赖包提前在有网的机器上下载好,拷贝到目标服务器,再通过源码编译完成安装。这篇文章把整个过程和常见的坑都梳理一遍,照着做基本能一次成功。

一、为什么离线安装Nginx要准备那么多依赖
Nginx的官方发行包是源码形式,需要在本机编译后才能运行,而编译工作依赖几个基础组件。第一个是gcc编译器,没有它make这一步直接报错,提示找不到C编译器。第二个是openssl-devel,Nginx如果要开启HTTPS支持,编译时必须能找到openssl的头文件和库。第三个是pcre-devel,Nginx的rewrite模块依赖PCRE库来实现正则匹配,日常配置里的location规则、伪静态跳转都靠它。第四个是zlib-devel,gzip压缩功能需要这个库。
很多人在联网环境下用yum安装时感觉不到这些依赖的存在,因为yum会自动把依赖一并装上。但离线环境下没有这回事,缺一个包编译就会中断,所以提前把依赖备齐是整个流程中最关键的一步。可以简单记一个口诀:gcc管编译,openssl管HTTPS,pcre管rewrite,zlib管gzip,四个都不能少。
二、在联网机器上下载依赖包和源码包
找一台能联网的CentOS机器,系统版本尽量和目标服务器一致,比如都是CentOS 7.9。下载rpm依赖包有两种方式,推荐用yumdownloader,它能把rpm文件连同依赖一起下载到本地目录而不安装。如果系统里没有这个命令,先安装yum-utils包。
mkdir /root/nginx-offline-rpm cd /root/nginx-offline-rpm yum install -y yum-utils yumdownloader --resolve --destdir=/root/nginx-offline-rpm gcc gcc-c++ openssl-devel pcre-devel zlib-devel # 如果不装yum-utils,也可以用这条命令只下载不安装 yum install -y --downloadonly --downloaddir=/root/nginx-offline-rpm gcc gcc-c++ openssl-devel pcre-devel zlib-devel
源码包去Nginx官方站点下载即可,一般选择稳定版,比如nginx-1.24.0.tar.gz。下载完成后,把rpm目录和源码包一起用U盘或者scp拷贝到内网服务器上的某个目录,比如放在/root/nginx-offline下。
三、内网服务器上的完整安装步骤
先把依赖包装上。进入rpm所在目录,执行rpm批量安装,--force --nodeps参数可以避免个别包顺序问题导致的报错,依赖之间有前后关系时加上更稳妥。
cd /root/nginx-offline/nginx-offline-rpm rpm -Uvh *.rpm --force --nodeps # 验证编译器是否可用 gcc --version
接着解压源码包并编译。configure阶段的prefix参数指定安装目录,建议放在/usr/local/nginx,目录结构清晰,后续升级和排查都方便。如果明确不需要某些模块,可以加--without参数精简体积,一般默认配置就够用了。
cd /root/nginx-offline tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0 ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module make && make install
安装完成后,主程序在/usr/local/nginx/sbin/nginx,配置文件在/usr/local/nginx/conf/nginx.conf。为了方便直接敲nginx命令启动,可以做个软链接到系统PATH目录下,然后启动并验证。
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx nginx -t # 检查配置文件语法 nginx # 启动 curl http://127.0.0.1 # 本机验证,返回html内容即成功
四、配置systemd服务实现开机自启
源码安装的Nginx默认没有服务脚本,直接执行nginx命令启动虽然能用,但服务器重启后不会自动拉起。建议在/usr/lib/systemd/system目录下新建nginx.service文件,交给systemd统一管理。
vim /usr/lib/systemd/system/nginx.service
文件内容如下,注意pid文件路径要和nginx.conf里pid配置保持一致,否则restart时会报错找不到进程。
[Unit] Description=nginx - high performance web server After=network.target [Service] Type=forking ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target
保存后执行systemctl daemon-reload刷新配置,之后就可以用systemctl start nginx启动、systemctl enable nginx设置开机自启了。
五、常见报错和解决办法汇总
1、configure时报错C compiler cc is not found。说明gcc没有装上或者rpm安装失败,回到rpm目录重新执行安装命令,用rpm -qa | grep gcc确认包是否存在。
2、报错the HTTP rewrite module requires the PCRE library。这是pcre-devel没装或者装的是pcre而不是pcre-devel,devel包里才有编译需要的头文件,两者不能混用。同理,报错ssl modules require the OpenSSL library就是缺openssl-devel。
3、启动时报80端口被占用。内网服务器经常预装了httpd服务,用netstat -tlnp | grep 80或者ss -tlnp | grep 80查一下,被占用就停掉对应服务并禁用它:systemctl stop httpd && systemctl disable httpd,或者修改nginx.conf里的listen端口。
4、本机能访问但其他机器访问不通。大概率是防火墙问题,执行firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload放行端口。内网环境如果确认安全,也可以直接systemctl stop firewalld临时关闭验证。
5、修改配置后不生效。nginx重新加载配置用的是nginx -s reload,如果直接重复执行nginx会报端口占用错误,因为那会启动第二个进程。另外修改后先执行nginx -t检查语法是个好习惯。
六、离线升级和日常维护建议
离线升级Nginx版本时不需要卸载旧版,把新版本源码包按同样的configure参数编译,但make之后只执行make install覆盖安装,不要执行make clean之前的任何清理动作。覆盖前记得备份旧的sbin/nginx二进制文件和配置目录,万一新版本有问题可以快速回退。
日常运维中记住几个关键路径:日志在/usr/local/nginx/logs下,access.log和error.log分别记录访问和错误信息,排查问题时先看error.log往往最直接;网页根目录默认是/usr/local/nginx/html,上线业务时把静态文件放这里或者修改root指向业务目录即可。建议把logs目录加入日志切割计划,长期运行不清理日志会撑满磁盘,这在离线内网机器上尤其麻烦,因为排查起来更费周折。
CentOS离线安装nginxnginx离线部署Linux运维修改时间:2026-09-03 21:49:10