Nginx 1.13.7安装踩坑实录:如何解决‘make: *** 没有规则可以创建default需要的目标build‘错误
Nginx编译安装实战指南:从依赖缺失到服务部署的全流程解析
在Linux环境下手动编译安装Nginx是开发者必须掌握的基础技能之一,但这个过程往往伴随着各种依赖问题和配置挑战。最近在为某企业级应用搭建Web服务器时,我选择了Nginx 1.13.7版本进行源码编译安装,却在执行make命令时遭遇了经典的make: *** 没有规则可以创建default需要的目标build错误。这个看似简单的错误信息背后,实际上隐藏着编译环境配置、依赖管理、Makefile机制等多个技术层面的问题。
本文将基于Anolis OS(龙蜥操作系统)环境,详细拆解Nginx编译安装的全过程,不仅解决这个特定错误,更会系统性地梳理编译安装Web服务器的完整知识体系。无论你是刚接触Linux服务部署的新手,还是需要排查复杂环境的老手,都能从中获得可立即落地的实用方案。
1. 编译环境准备:构建稳健的基础设施
在开始Nginx编译之前,确保编译环境的完整性是避免后续问题的关键第一步。Anolis OS作为RHEL/CentOS系的衍生发行版,使用yum作为包管理工具,我们需要通过它来安装必要的开发工具链。
基础开发工具组安装:
sudo yum groupinstall 'Development Tools' -y这个命令会安装包括gcc、make、autoconf等在内的完整开发工具链,它们是编译任何开源软件的基础。安装完成后,建议验证gcc的可用性:
gcc --version # 期望输出类似:gcc (GCC) 8.5.0但仅仅安装开发工具组还不够,Nginx有自己特定的依赖要求。以下是Nginx编译所需的专项依赖库:
| 依赖库 | 作用 | 安装命令 |
|---|---|---|
| pcre-devel | 正则表达式支持 | sudo yum install pcre-devel -y |
| zlib-devel | 压缩功能支持 | sudo yum install zlib-devel -y |
| openssl-devel | HTTPS支持 | sudo yum install openssl-devel -y |
在实际操作中,我推荐使用组合命令一次性安装所有必需依赖:
sudo yum install -y gcc make pcre-devel zlib-devel openssl-devel注意:生产环境中建议指定软件包版本以避免兼容性问题,例如
openssl-devel-1.1.1k
2. 源码配置阶段:解密configure的幕后工作
获取Nginx源码通常有两种方式:从官网下载稳定版本,或从Git仓库克隆最新开发版。对于生产环境,我们选择1.13.7稳定版本:
wget http://nginx.org/download/nginx-1.13.7.tar.gz tar -zxvf nginx-1.13.7.tar.gz cd nginx-1.13.7进入源码目录后,./configure脚本是编译前的关键步骤。这个shell脚本主要执行以下工作:
- 检查系统环境是否符合编译要求
- 检测依赖库的可用性及路径
- 根据参数生成适配当前系统的Makefile
- 确定Nginx的模块组成和安装路径
一个典型的带模块的配置命令如下:
./configure \ --with-http_stub_status_module \ --with-http_ssl_module \ --prefix=/usr/local/nginx-custom这里有几个实用参数值得关注:
--prefix:指定安装路径,避免污染系统默认目录--with-http_ssl_module:启用HTTPS支持--with-http_stub_status_module:启用状态监控接口
常见配置问题排查表:
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| "./configure: error: C compiler cc is not found" | gcc未安装 | 安装gcc套件 |
| "the HTTP rewrite module requires the PCRE library" | pcre-devel缺失 | 安装pcre-devel |
| "the HTTP gzip module requires zlib library" | zlib-devel缺失 | 安装zlib-devel |
配置成功后,终端会输出汇总信息,包括安装路径、启用模块等重要配置。务必检查这些信息是否符合预期。
3. 编译与安装:深入Makefile机制
当configure阶段顺利完成后,目录下会生成适配当前环境的Makefile文件。此时执行make命令,系统会:
- 解析Makefile中的构建规则
- 根据规则编译各个模块的源代码
- 生成中间对象文件(.o)和最终二进制文件
典型的编译安装命令序列:
make sudo make install在遇到没有规则可以创建default需要的目标build错误时,本质上是因为Makefile中缺少build目标的定义规则。这种情况通常源于:
- configure执行不完整,未能正确生成Makefile
- 关键依赖缺失导致Makefile生成异常
- 源码包损坏或不完整
系统化解决方案:
- 彻底清理之前的配置缓存:
make distclean- 重新运行configure并检查输出:
./configure --with-http_ssl_module- 检查生成的Makefile是否包含build规则:
grep "build:" Makefile- 完整编译安装流程:
make -j$(nproc) sudo make install提示:使用
-j$(nproc)参数可以并行编译,大幅加快编译速度
4. 安装后配置:安全与优化实践
Nginx安装完成后,位于/usr/local/nginx目录(或configure指定的路径)。接下来需要进行一系列生产级配置:
目录结构说明:
/usr/local/nginx/ ├── sbin/ # 主程序目录 │ └── nginx # 可执行文件 ├── conf/ # 配置文件目录 │ ├── nginx.conf # 主配置文件 │ └── ... ├── logs/ # 日志目录 └── html/ # 默认网站根目录防火墙配置(针对Anolis OS的firewalld):
sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --reload系统服务化配置(创建systemd单元文件):
sudo tee /etc/systemd/system/nginx.service <<-'EOF' [Unit] Description=The nginx HTTP and reverse proxy server After=network.target [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStartPre=/usr/local/nginx/sbin/nginx -t ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target EOF启用并启动服务:
sudo systemctl enable nginx sudo systemctl start nginx安全加固建议:
- 修改默认的worker进程运行用户:
user nginx;- 禁用server_tokens避免版本信息泄露:
server_tokens off;- 限制HTTP方法只允许必要的方法:
limit_except GET POST { deny all; }5. 高级调试技巧:当问题依然存在时
即使按照上述步骤操作,在某些特殊环境下可能仍会遇到问题。以下是几个高级调试方法:
方法一:详细日志分析
在configure时启用调试模式:
./configure --with-debug make然后运行nginx时获取详细日志:
/usr/local/nginx/sbin/nginx -g "error_log stderr debug;"方法二:静态链接关键库
对于依赖库路径复杂的环境,可以考虑静态编译:
./configure \ --with-http_ssl_module \ --with-pcre=../pcre-8.45 \ --with-zlib=../zlib-1.2.11 \ --with-openssl=../openssl-1.1.1l方法三:使用strace追踪系统调用
当nginx启动失败时:
strace -f /usr/local/nginx/sbin/nginx这个方法可以显示所有系统调用,帮助定位文件缺失或权限问题。
常见问题速查表:
| 现象 | 诊断命令 | 可能解决方案 |
|---|---|---|
| 端口占用 | ss -tulnp | grep :80 | 停止占用进程或修改nginx端口 |
| 权限拒绝 | namei -l /usr/local/nginx/logs/ | 调整目录权限或SELinux设置 |
| 模块缺失 | nginx -V 2>&1 | grep module | 重新编译包含所需模块 |
在完成所有配置后,建议使用自动化测试工具验证Nginx的安装质量:
# 基础响应测试 curl -I http://localhost # SSL测试(如果配置了HTTPS) openssl s_client -connect localhost:443 -servername localhost