Linux 新手求教一个编译 nginx 的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
daijinming
V2EX    程序员

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

  daijinming 2020-12-07 09:27:54 +08:00 4041 次点击
这是一个创建于 1852 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz
tar zvxf pcre-8.41.tar.gz
cd pcre-8.41
ll

./configure --prefix=/usr/local/ins/pcre-8.41

make && make install

ln -s /usr/local/ins/pcre-8.41 /usr/local/pcre
--------------------------------------------------------------
以上,是我在 centos6.10 下编译 nginx 依赖的一个例子,原理,上面的都说完了

zlib-1.2.11.tar.gz
openssl-1.1.0g.tar.gz
0ZXYDDu796nVCFxq
    22
0ZXYDDu796nVCFxq  
   2020-12-07 13:19:28 +08:00   2
@shlabc chmod -R 777 的勇士
这样干不会被开除吗
shlabc
    23
shlabc  
   2020-12-07 13:29:34 +08:00
@gstqc
仅供参考,没想手把手一点点教学,是我的疏忽。
这是我从虚拟机实验脚本里摘出来的。后面有删除或变更权限步骤,有检查脚本及步骤。
julyclyde
    24
julyclyde  
   2020-12-07 16:28:58 +08:00   1
@shlabc 不是手把手的问题,而是根本就是错的内容的问题
huangmingyou
    25
huangmingyou  
   2020-12-07 16:38:33 +08:00   1
1. 确保 /etc/apt/sources.list 里面有 deb-src 开头的源设置
2. sudo apt build-dep nginx

就会把编译 nginx 需要的所有依赖文件都安装好。
huangmingyou
    26
huangmingyou  
   2020-12-07 16:39:35 +08:00   1
root@desktop:/home/hmy# apt build-dep nginx
正在读取软件包列表... 完成
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
下列 [新] 软件包将被安装:
dh-systemd libluajit-5.1-dev libmhash-dev libpam0g-dev libperl-dev
升级了 0 个软件包,新安装了 5 个软件包,要卸载 0 个软件包,有 10 个软件包未被升级。
需要下载 2,566 kB/2,993 kB 的归档。
解压缩后会消耗 16.6 MB 的额外空间。
您希望继续执行吗? [Y/n]
daijinming
    27
daijinming  
OP
   2020-12-07 16:52:22 +08:00
@Mecool 你给的这个命令不错,不过还差 zlib 找不到
daijinming
    28
daijinming  
OP
   2020-12-07 16:56:45 +08:00
@diaryevil 感谢分享
yklaxds
    29
yklaxds  
   2020-12-08 01:14:21 +08:00 via Android
你这种需求试试 Gentoo… 如果不是非要 Linux,freebsd 也是可以的
buffzty
    30
buffzty  
   2020-12-08 01:39:16 +08:00   1
nginx 依赖那些是依赖他们的静态库或者动态库. 你用 apt install libxxx-dev 就能下载到, .so 和.a 会安装到 /usr/lib 目录
.h 头文件会安装到 /usr/include 目录. 这 2 个目录默认是在库搜索目录和头文件搜索目录里的,所以你不必指定库的目录. 如果你自己下载源码编译那么就要告诉系统去哪里找库文件(.so .a). 两者没有什么区别. 唯一的区别就是 apt 安装的库版本可能不是最新的, 你自己安装的可以是最新的.
daijinming
    31
daijinming  
OP
   2020-12-08 09:20:01 +08:00
@buffzty 感谢分享
weifan
    32
weifan  
   2021-01-22 16:30:55 +08:00
@gstqc 我也见过这种,太虎了。777 竟然还加 R
关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1156 人在线   最高记录 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 25ms UTC 17:17 PVG 01:17 LAX 09:17 JFK 12:17
Do have faith in what you're doing.
ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86