V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daijinming
V2EX  ›  程序员

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

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

    我想在一台树莓派上编译 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
        14
    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 语言和操作系统知识。
    shlabc
        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   ·   实用小工具   ·   3570 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:45 · PVG 18:45 · LAX 02:45 · JFK 05:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.