V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
jakezh
V2EX  ›  程序员

老哥们, ubuntu 上自己修改打包编译的 nginx 怎么可以拷贝到另一台服务器上

  •  
  •   jakezh · 2019-10-21 08:40:56 +08:00 · 4717 次点击
    这是一个创建于 1885 天前的主题,其中的信息可能已经有所发展或是发生改变。

    两年前自己修改的 nginx 源码编译了一个 一直在阿里云账号 A 上面的几个服务器上跑, 现在需要在另一个阿里云账号 B 上面再设置几个类似的服务器 请问有办法把这个已经安装好的 nginx 从 A 里面拷贝到 B 里面吗 已经拷贝了 /usr/lib/nginx 和 /etc/nginx 但是发现没有用

    有办法直接把这个编译好的 nginx 拷贝过去,或者把阿里云账号 A 下的磁盘镜像导入到账号 B 下面吗

    25 条回复    2019-10-22 18:16:56 +08:00
    windyland
        1
    windyland  
       2019-10-21 08:51:31 +08:00 via Android
    编译完成的目录整个 tar.gz 打包,然后用 sftp 传一下
    windyland
        2
    windyland  
       2019-10-21 08:52:04 +08:00 via Android
    或者 rsync 简单粗暴解决战斗
    banxi1988
        3
    banxi1988  
       2019-10-21 08:52:14 +08:00
    先确定 A 上的服务器编译运行 nginx 的环境和依赖.
    主要是 Ubuntu 版本 , glibc 版本.其他一些依赖. 对得上一般可以,对不上兼容的也应该可以.
    然后看一下 标准的 nginx 编译之后安装时复制了哪些文件,是不是少复制了? 位置对不对?

    然后根据运行时候的具体错误信息再分析了.
    jakezh
        4
    jakezh  
    OP
       2019-10-21 08:52:24 +08:00
    @windyland #1 两年前编译的
    没 tm 存源文件和编译好的文件
    只剩下服务器上面安装好的可执行文件了
    我真是想捅死我自己
    jakezh
        5
    jakezh  
    OP
       2019-10-21 08:54:10 +08:00
    @banxi1988 #3
    版本已经对过了,依赖都从老服务器拉的版本
    哎。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    jakezh
        6
    jakezh  
    OP
       2019-10-21 09:11:23 +08:00
    全局搜索了一下
    对拷了所有路径里带 nginx 的文件,
    等会儿跑一下看看吧
    这是一个血淋淋的教学啊兄弟们
    以后一定要源代码做好版本控制
    MonoLogueChi
        7
    MonoLogueChi  
       2019-10-21 09:14:06 +08:00 via Android
    镜像可以共享,A 制作镜像,然后共享给 B,B 再使用自定义镜像安装
    jakezh
        8
    jakezh  
    OP
       2019-10-21 09:45:47 +08:00
    @MonoLogueChi #7
    多谢老哥 一会儿研究一下
    Linken404
        9
    Linken404  
       2019-10-21 10:31:54 +08:00
    但是直接重新按照需求装一个不比迁移简单吗...
    直接把配置文件拷贝过去就可以了,Nginx 这种东西装起来又不麻烦,需要什么功能编译安装的时候加上就可以了
    CivAx
        10
    CivAx  
       2019-10-21 10:36:48 +08:00   ❤️ 3
    nginx -V,看编译参数
    e.g.

    ```
    [docker@NGINX_1 ~]$dx tengine bash
    root@NGINX_1:/# nginx -V
    Tengine version: Tengine/2.3.1
    nginx version: nginx/1.16.0
    built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
    built with OpenSSL 1.1.0k 28 May 2019
    TLS SNI support enabled
    configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/etc/nginx/logs/error.log --http-log-path=/etc/nginx/logs/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-compat --with-file-aio --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_geoip_module=dynamic --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_slice_module --with-http_ssl_module --with-http_sub_module --with-http_secure_link_module --with-http_stub_status_module --with-http_v2_module --with-http_xslt_module=dynamic --with-luajit-lib=/usr/local/lib/ --with-luajit-inc=/usr/local/include/luajit-2.1/ --with-lua-inc=/usr/local/include/luajit-2.1/ --sbin-path=/usr/sbin/nginx --with-mail --with-mail_ssl_module --with-threads --with-pcre --with-stream --with-stream_geoip_module=dynamic --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --add-module=./modules/ngx_http_concat_module --add-module=./modules/ngx_http_upstream_check_module --add-module=./modules/ngx_http_proxy_connect_module --add-module=./modules/ngx_devel_kit --add-module=./modules/ngx_http_lua_module
    root@NGINX_1:/#
    ```

    拿着这套参数,在新机器上下载最新版的 NGINX,在 configure 阶段填入这套参数就行了。

    即做到更新了版本,又完成了配置统一。
    msg7086
        11
    msg7086  
       2019-10-21 10:39:39 +08:00   ❤️ 1
    如果你正常编译打包,出来的应该是 deb 文件。
    jakezh
        12
    jakezh  
    OP
       2019-10-21 10:41:24 +08:00
    @Linken404 #9
    @CivAx #10
    当时有一些奇怪的需求
    把其中几个 module 的源码改了改
    改动不大 但是地方挺多的
    本来以为就是个一锤子买卖 结果又给钱让部署一新的集群
    不好跟钱过不去
    哎 说到底还是因为穷
    jakezh
        13
    jakezh  
    OP
       2019-10-21 10:44:08 +08:00
    @msg7086 #11 没有 make install 不是编译 dpkg 包
    windyland
        14
    windyland  
       2019-10-21 10:45:24 +08:00 via Android
    直接根目录打包,然后 dd 写入
    CivAx
        15
    CivAx  
       2019-10-21 11:02:02 +08:00
    @jakezh #12 兄弟走点心,下回这种非原装代码的事情上 Docker 吧,留套镜像什么都好说
    Linken404
        16
    Linken404  
       2019-10-21 11:07:21 +08:00
    如果服务器上有以前的源码倒还好说 没有那确实是难搞了
    这种配依赖环境很容易出奇怪的问题的 感觉可以试试直接迁移整个系统 把当前系统做成镜像然后去重新安装
    反正我现在服务器上编译安装完什么东西 源码是打死都不会删的...
    Maco
        17
    Maco  
       2019-10-21 11:10:03 +08:00
    使用阿里云镜像服务打包成系统镜像
    ETiV
        18
    ETiV  
       2019-10-21 11:20:57 +08:00 via iPhone
    ldd,查找 so 依赖的命令

    把 nginx 可执行程序复制到一个新的环境,对它执行 ldd
    再把显示内容的 not found 从老的机器复制过来
    so 也有它自己的依赖,对这些 so 再递归地执行 ldd
    直到所有 not found 的 so 都复制过来

    复制过来如果还找不到的话,本机配一下 ldconfig

    还是建议你复制到新的 docker 里,打个镜像
    gesse
        19
    gesse  
       2019-10-21 11:28:34 +08:00
    src 包 make 完后,打包一份到目标机器, 直接进入解压后 src 包,然后 make install 就行了。
    然后有时间再学学 docker
    ysc3839
        20
    ysc3839  
       2019-10-21 12:28:11 +08:00 via Android
    建议编译为 dpkg 包,然后拷了直接安装。
    coolloves
        21
    coolloves  
       2019-10-21 12:35:09 +08:00
    相同环境,copy 过去可即食
    不同环境的话.src copy 过去,重新编译即可
    hardwork
        22
    hardwork  
       2019-10-21 14:47:46 +08:00
    cp `ldd nginx | grep -v vdso | grep -v lib64 | grep -v libc.so | grep -v libm.so | awk '{print $3}'` ./lib
    cjpjxjx
        23
    cjpjxjx  
       2019-10-21 14:51:02 +08:00 via iPhone
    快照或者镜像都可以吧
    forcecharlie
        24
    forcecharlie  
       2019-10-22 08:53:15 +08:00
    依赖的 zlib openssl pcre 等库使用 nginx 参数指定源码编译,然后发行版要接近,关于 prefix, 可以自己修改 nginx 源码修改搜索机制,否则只能 -P 显式指定或者保持 --prefix 一致。

    PS: 我们给私有化客户都是编译打包成 tar.gz 只要发行版接近,基本没啥问题。安装目录随意(我们使用了 C++17 开发模块)。
    julyclyde
        25
    julyclyde  
       2019-10-22 18:16:56 +08:00
    你既然都打包了……
    那么显然你没打包
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4896 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:47 · PVG 17:47 · LAX 01:47 · JFK 04:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.