【问题标题】:How to use an environment variable as prefix path while configuring NGINX?配置 NGINX 时如何使用环境变量作为前缀路径?
【发布时间】:2019-01-28 17:14:34
【问题描述】:

我正在尝试使用$NGINX_PREFIX 作为日志记录的前缀。在运行时,链接编辑器应该展开$NGINX_PREFIX。我正在使用以下命令来构建 nginx:

./configure --prefix=\$NGINX_PREFIX --sbin-path=objs/nginx --conf-path=conf/nginx.conf --error-log-path=logs/error.log --http-log-path=logs/access.log

我使用环境变量是因为我想在不同的机器上重复使用构建的二进制文件。

但是当我使用构建二进制文件objs/nginx 时,它会显示以下内容:

nginx: [alert] could not open error log file: open() "$NGINX_PREFIX/logs/error.log" failed (2: No such file or directory)
2018/08/22 17:54:08 [emerg] 16060#0: open() "$NGINX_PREFIX/conf/nginx.conf" failed (2: No such file or directory)

现在请注意,我已经正确设置了环境变量,并且上面显示错误的文件已经存在。

我哪里出错了?是因为 ENV 变量吗?如果是,我怎样才能得到一个预先构建的 nginx 二进制文件,我可以在多台机器上重复使用它而无需一次又一次地构建它?

【问题讨论】:

  • 你为什么要逃避$?如果你想使用一个变量,你应该让 shell 插入它。将您的调用更改为 configure --prefix=$NGINX_PREFIX ...
  • 啊,我明白你在做什么,但是你做错了地方。您不想将前缀更改为configure。如果您想要一个可以安装在不同位置的预构建二进制文件,您需要将您的更改向上移动几层到包管理系统中。在安装过程中构建一个可重定位的 rpm 并使用备用目标目录。
  • nginx 提供 rpms。你总是可以从那里提取文件并安装它们。
  • 请记住,“预构建的压缩包”一个包管理系统。
  • 您可能需要修补 Nginx 源以从环境中获取路径(或修补配置文件以了解环境)。

标签: linux nginx build autotools configure


【解决方案1】:

我正在尝试使用$NGINX_PREFIX 作为日志记录的前缀。在运行时 链接编辑器应该展开$NGINX_PREFIX

这根本没有任何意义。链接编辑器(又名“链接器”)在编译时发挥其全部作用。它在运行时不涉及。根据可执行文件的形式,运行时可能会涉及到一个动态链接器,但这是一个有点不同的野兽。无论如何,这两种链接器都与在可执行文件或其地址空间中操作 data 无关。链接器是关于将符号与地址匹配。

我正在使用以下命令构建 nginx:

./configure --prefix=\$NGINX_PREFIX --sbin-path=objs/nginx --conf-path=conf/nginx.conf --error-log-path=logs/error.log --http-log-path=logs/access.log

这似乎不太可能做任何有用的事情,因为 Autotools 配置脚本的 --prefix 选项的主要目的是为安装目录设置前缀。默认值为/usr/local/usr 是常见的替代方案。如果您将前缀设置为不是有效的安装路径前缀,那么至少您会使包的安装目标无法正常工作。

我怎样才能得到一个预先构建的 nginx 二进制文件,我可以在多台机器上重复使用它而无需一次又一次地构建它?

这正是包和包管理的意义所在。构建 RPM、DEB 或目标系统所需的任何内容,并使用它来安装软件。您甚至可以找到为您的目标系统类型预先构建的此类包,和/或您可能会找到适合您用于构建您自己的自定义包的包源。或者发明自己的打包格式,这可能就像带有随附安装脚本的 tarball 一样简单。

但所有这些打包业务似乎都与您开始使用的日志记录前缀问题正交。如果目标日志目录被编译到软件中,并且还没有在运行时覆盖它的机制(配置文件、命令行选项、已经识别的环境变量……),那么你不能在. 你需要修改程序来引入这样的能力。

但请考虑根本不这样做。如果您愿意,可以在构建期间指定一个自定义日志目录——这非常好——但并非所有内容都必须在运行时进行配置。

【讨论】:

    【解决方案2】:

    我使用以下命令构建了 nginx:

    ./configure --error-log-path=stderr --http-log-path=stderr
    make
    

    然后我将配置文件中的所有必要路径设置为绝对路径。以下是配置文件内容:

    worker_processes  1;
    error_log /path/error.log;
    pid /path/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include mime.types;
        default_type  application/octet-stream;
    
        client_body_temp_path /path/client_body_temp;
        proxy_temp_path /path/proxy_temp;
        fastcgi_temp_path /path/fastcgi_temp;
        uwsgi_temp_path /path/uwsgi_temp;
        scgi_temp_path  /path/scgi_temp;
    
        sendfile  on;
        keepalive_timeout 65;
    
        upstream backend {
            server  127.0.0.1;
        }
    
        server {
            listen  3000;
            access_log  /path/access.log;
            location / {
                proxy_pass  http://backend;       
            }
        }
    }
    

    使用objs/nginx -t -c /path/nginx.conf 测试您的配置文件。 和objs/nginx -c /path/nginx.conf 启动nginx服务器。

    注意:配置文件中的所有路径以及您在 CLI 参数中传递的路径都必须是绝对路径。提供相对路径,至少在 1.14.0 版本中失败了,它会退回到您在构建 NGINX 时提供的默认路径

    【讨论】:

    • 要在运行时设置前缀,只需像这样调用 nginx nginx -p `pwd`/ -c nginx.conf。现在前缀参数仍然必须是绝对的,但你不必在配置文件中手动设置所有依赖前缀的路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2018-11-18
    • 2011-07-15
    • 2018-01-04
    • 2019-02-18
    • 2021-11-07
    相关资源
    最近更新 更多