Linux 新手求教一个编译 nginx 的问题

2020-12-07 09:27:54 +08:00
 daijinming

我想在一台树莓派上编译 nginx,在执行 ./Configure 的时候发现 linux 缺少 openssl 、pcre 、zlib 等库,无法编译通过,采用 apt install 也没能安装上这些组件,非常无助。我主要不理解这个编译的过程,有几个问题想求教下:1 、openssl 、pcre 、zlib 这些组件如何可以安装到 linux 下, 他们是以什么形式存在于 linux 的那个目录下 2 、我看网上也有采用下载 openssl 、pcre 、zlib 源码的方式,在编译 nginx 的时候指定源码目录,这种方式和安装二进制的组件有什么异同 3 、nginx 编译后,是不是 这些组件也会编译进二进制程序中??不吝赐教

3414 次点击
所在节点    程序员
32 条回复
37Y37
2020-12-07 09:38:54 +08:00
直接 apt 安装即可,会自动安装所有依赖
bleepbloop
2020-12-07 09:42:45 +08:00
试一下是不是叫 openssl-dev 、pcre-dev 、zlib-dev 。。。。
另外 g++、make 、autoconf 之类应该也得装,不过树莓派可能自带
bleepbloop
2020-12-07 09:43:28 +08:00
或者 libopenssl 、libpcre 、libzlib 或者 libopenssl-dev 、libpcre-dev 、libzlib-dev
zliea
2020-12-07 09:52:54 +08:00
zlib1g openssl libpcre3
zliea
2020-12-07 09:56:26 +08:00
@ztechstack 回复错了,这个是直接安装 nginx 的依赖包,包名。
jimrok
2020-12-07 10:01:37 +08:00
因为 nginx 用的是静态编译,直接将这些代码编译进 nginx 里,不再依赖系统的库,这样保证进程的稳定性
mingl0280
2020-12-07 10:02:55 +08:00
树莓派不知道你用的啥系统,但是如果是 Debian 系极端不建议编译安装。debian 系就好好去用 apt install nginx
fanlis
2020-12-07 10:09:09 +08:00
编译安装 nginx 的时候,一般都是缺少哪个依赖,就单独去下载编译具体的依赖。确保在环境里面有依赖就行

这种直接搜索离线安装 nginx 就行,资料还挺多的
daijinming
2020-12-07 10:17:42 +08:00
@fanlis 追问下朋友,比如我下载了 PCRE 的源码,是不是我要把 PCRE 编译成 .so 放到 lib64 就行??
aflow
2020-12-07 10:26:03 +08:00
只是想安装使用的话,用 docker 安装,方便快捷
smilzman
2020-12-07 10:34:54 +08:00
./configure --help 看一下,可以直接指定源码路径
--------------------------
--with-openssl=DIR
--with-pcre=DIR
--with-zlib=DIR

DIR 是 openssl 等源码的路径~
fanlis
2020-12-07 10:47:14 +08:00
@daijinming
@smilzman
#11 这样指定就行,其它的依赖直接
make
make install 就行,
具体要看具体的依赖的安装位置,很多依赖的 install 默认路径本来就是 gcc 的环境中
Mecool
2020-12-07 10:47:35 +08:00
如果是 deb 系包管理工具,那就 apt install build-essential libpcre3 libpcre3-dev openssl libssl-dev 安装依赖
love
2020-12-07 10:56:07 +08:00
哪个 linux 没有带 nginx 包?
即使你要改一下编译参数,那也可以看一下此 linux 原始包编译脚本看看依赖什么库
diaryevil
2020-12-07 11:03:28 +08:00
说的简单点:
1. openssl,pcre 等组件(我一般把它们叫库),通过 apt-get install 获取的一般是“可执行的二进制+库文件”(有的可能连二进制都没有,有的 dev 库还会带各种头文件),比如 openssl,install 后你就可以使用 openssl 命令行了(可执行的命令行就是可执行二进制文件);存放位置常见的是 /usr/bin (二进制),/lib/(库文件)等等

2. 编译不需要可执行二进制文件,主要是要组件库,比方说 nginx 的 SSL 功能就需要 openssl 组件库,编译后这个库就会被编进去。所以下载组件源码后-->编译组件-->获得组件库-->编译 nginx 时候将组件库路径指定好(或者放在默认的 PATH 下)-->编译 nginx 就把组件带进去了,这是静态编译,动态编译会稍微有些不同

3. 当然,你要是采用动态编译的方式,你自己了解之后自行定夺,就像 6L 说的,静态编译不再依赖系统的库,动态编译放弃了这方面的稳定性换来一定程度上的自主性。
diaryevil
2020-12-07 11:04:17 +08:00
@diaryevil 如果有说的不对的也望各位不吝赐教
0ZXYDDu796nVCFxq
2020-12-07 11:16:12 +08:00
更正 jimrok 的说法
dev 或 devel 的包并不提供源码,只有头文件
只是告诉编译器,系统的这些动态链接库有哪些变量、函数等等

静态编译依赖库需要下载包的源码并在编译过程中编译这些库并静态链接进 nginx 的二进制文件
cmostuor
2020-12-07 11:16:19 +08:00
@fanlis 不建议 make install 这样安装 不好管理
creanme
2020-12-07 11:23:43 +08:00
别编译了,以前我不懂,照着 csdn 上面写的编译 nginx,在云服务器上编译了一个多小时都没编译好,而且服务器直接给我限制了 cpu 频率。
vincenttone
2020-12-07 12:22:18 +08:00
是因为你编译 nginx 需要依赖这些库,所以你需要编译这些库,也就是自己下对应的源码再编译一下,路径的话默认路径就可以了。
还可以直接使用对应的软件管理器安装,具体看你的 linux 发行版( debian 的 apt 、centos 的 yum 、arch 的 pacman 等),可以使用对应的命令 search 一下 dev 包,比如 openssl-dev 之类的,不同的包管理器名字不一样,安装完编译就可以了。
也可以干脆直接使用包管理器安装 nginx,不一定需要自行编译,还要考虑依赖。自己编译可能为了更好的掌控或者研究源码,不然胡乱./configure 你自己都不知道你在做什么。
实在要自己编译,最好有点 c 语言和操作系统知识。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/732768

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX