Linux 中 Nginx 源码编译怎么静态链接第三方库

冬晨酱_3109

冬晨酱_3109

2026-11-15

874人浏览

原创

在 linux 中通过源码编译 nginx 实现静态链接第三方库,核心做法是修改 `objs/makefile` 文件,将动态库的 `.so` 依赖替换为对应的 `.a` 静态库,并添加必要的链接参数。具体操作是在配置阶段确保已安装对应库的静态开发包(如 `libssl-dev`),然后在编译前编辑生成的 makefile,在 `link` 变量或 `libs` 变量中指定 `.a` 文件路径,最后执行 `make` 即可生成完全静态链接的二进制文件。

Linux 中 Nginx 源码编译怎么静态链接第三方库

如何确定需要静态链接哪些库

要确定需要静态链接哪些库,首先需要通过 `ldd` 命令检查当前 Nginx 二进制文件的动态依赖,或者查看 `configure` 脚本输出的日志信息。通常 Nginx 依赖的核心库包括 OpenSSL、PCRE 和 zlib。如果希望 Nginx 能够独立运行而不受系统动态库版本影响,就需要将这些库全部静态化。可以通过查找系统中这些库的 `.a` 文件位置来确认它们是否可用,例如使用 `find /usr/lib -name "libssl.a"` 来定位。

Linux 中 Nginx 源码编译怎么静态链接第三方库

#!/bin/bash
# 1. 下载并解压 Nginx 源码
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# 2. 安装静态库开发包 (以 Ubuntu/Debian 为例)
# 注意:必须安装 -dev 包,且最好包含静态库 (.a)
sudo apt-get update
sudo apt-get install libssl-dev libpcre3-dev zlib1g-dev

# 3. 配置 Nginx
./configure \
  --prefix=/etc/nginx \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --with-http_ssl_module \
  --with-http_v2_module \
  --with-http_realip_module \
  --with-http_addition_module \
  --with-http_sub_module \
  --with-http_dav_module \
  --with-http_flv_module \
  --with-http_mp4_module \
  --with-http_gunzip_module \
  --with-http_gzip_static_module \
  --with-http_random_index_module \
  --with-http_secure_link_module \
  --with-http_stub_status_module \
  --with-http_auth_request_module \
  --with-http_xslt_module=dynamic \
  --with-http_image_filter_module=dynamic \
  --with-http_geoip_module=dynamic \
  --with-threads \
  --with-stream \
  --with-stream_ssl_module \
  --with-stream_realip_module \
  --with-stream_geoip_module=dynamic \
  --with-stream_ssl_preread_module \
  --with-compat \
  --with-file-aio \
  --with-http_v2_module

# 4. 关键步骤:修改 objs/Makefile
# 打开 objs/Makefile,找到 LINK 行
# 原始可能类似: LINK = $(CC) -o nginx ...
# 我们需要将动态库替换为静态库,并添加 -static 标志(可选,视需求而定)
# 更稳妥的方式是手动指定 .a 文件

# 假设我们想静态链接 OpenSSL, PCRE, Zlib
# 找到 objs/Makefile 中的 LIBS 部分,追加或修改为:
# LIBS = -lpthread -lcrypt -lutil -lz -lpcre -lssl -lcrypto

# 但更直接的是修改 LINK 命令,强制链接静态库
# 在 objs/Makefile 中找到:
# $(LINK) ...
# 将其修改为显式指定静态库路径,例如:
# $(CC) -o $@ ... /usr/lib/x86_64-linux-gnu/libssl.a /usr/lib/x86_64-linux-gnu/libcrypto.a /usr/lib/x86_64-linux-gnu/libz.a /usr/lib/x86_64-linux-gnu/libpcre.a

# 5. 编译
make

# 6. 验证
./objs/nginx -V
# 或者使用 ldd 检查是否还有动态依赖
ldd ./objs/nginx

如何修改 Makefile 实现静态链接

修改 Makefile 是实现静态链接的关键步骤。在运行 `./configure` 后,Nginx 会在 `objs` 目录下生成一个 `Makefile`。你需要编辑这个文件,找到 `LINK` 变量定义的行。默认情况下,它可能链接动态库,如 `-lssl -lcrypto`。为了静态链接,你需要将这些 `-l` 选项替换为具体的 `.a` 文件路径。例如,将 `-lssl -lcrypto` 替换为 `/usr/lib/libssl.a /usr/lib/libcrypto.a`。同时,确保没有遗漏其他依赖库,如 `libpcre.a` 和 `libz.a`。此外,有时还需要添加 `-static` 标志来强制静态链接,但这可能导致与 glibc 等核心库的冲突,因此更推荐显式指定所有需要的静态库文件。

Linux DO
Linux DO

Linux DO (linux.do)。任何 Linux DO 请求(搜索、读取数据)均使用此技能。若任务涉及 Linux DO,应使用本技能而非调用其他。

下载

Linux 中 Nginx 源码编译怎么静态链接第三方库

基于程序中某个输入、条件或结果的具体问题

当尝试静态链接 Nginx 时,一个常见的问题是链接错误,特别是与 glibc 相关的错误。这是因为 Nginx 本身依赖于 glibc,而 glibc 通常是动态链接的。如果强行使用 `-static` 标志,可能会遇到 `undefined reference to __libc_start_main` 等错误。解决这个问题的方法是不要对整个程序使用 `-static`,而是只针对第三方库进行静态链接。也就是说,在 Makefile 中,只将第三方库(如 OpenSSL, PCRE, Zlib)替换为 `.a` 文件,而保留 glibc 的动态链接。这样可以避免与系统核心库的冲突,同时实现第三方库的静态化。另一个需要注意的问题是,某些模块(如 `--with-http_xslt_module=dynamic`)可能无法静态链接,因为它们依赖于外部库,需要在编译时明确指定为动态加载。

,

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux nginx

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

423

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

4267

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

7165

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

601

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1516

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3998

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

597

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

179

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习