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-develHTTPS支持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脚本主要执行以下工作:

  1. 检查系统环境是否符合编译要求
  2. 检测依赖库的可用性及路径
  3. 根据参数生成适配当前系统的Makefile
  4. 确定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命令,系统会:

  1. 解析Makefile中的构建规则
  2. 根据规则编译各个模块的源代码
  3. 生成中间对象文件(.o)和最终二进制文件

典型的编译安装命令序列:

make sudo make install

在遇到没有规则可以创建default需要的目标build错误时,本质上是因为Makefile中缺少build目标的定义规则。这种情况通常源于:

  1. configure执行不完整,未能正确生成Makefile
  2. 关键依赖缺失导致Makefile生成异常
  3. 源码包损坏或不完整

系统化解决方案

  1. 彻底清理之前的配置缓存:
make distclean
  1. 重新运行configure并检查输出:
./configure --with-http_ssl_module
  1. 检查生成的Makefile是否包含build规则:
grep "build:" Makefile
  1. 完整编译安装流程:
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

安全加固建议

  1. 修改默认的worker进程运行用户:
user nginx;
  1. 禁用server_tokens避免版本信息泄露:
server_tokens off;
  1. 限制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