配置 NGINX 时如何使用环境变量作为前缀路径?

How to use an environment variable as prefix path while configuring NGINX?

我正在尝试使用 $NGINX_PREFIX 作为日志记录的前缀。在运行时 link 编辑器应该展开 $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 二进制文件,我可以在多台机器上重复使用它而无需一次又一次地构建它?

I am trying to use $NGINX_PREFIX as a prefix to logging. At runtime the link editor should expand $NGINX_PREFIX.

这根本没有任何意义。 link 编辑器 (a.k.a. "linker") 在编译时发挥全部作用。 运行 时未涉及。根据可执行文件的形式,可能会在 link 时涉及一个动态 linker,但这是一个有点不同的野兽。无论如何,linker 的变体与在可执行文件或其地址 space 中操作 data 没有任何关系。链接器是关于匹配符号与 地址 .

I am using the following command to build 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 是常见的替代方法。如果您将前缀设置为不是有效安装路径前缀的内容,那么至少会使包的安装目标无法正常运行。

how can I get a pre-built nginx binary which I can re-use on multiple machines without building it again and again?

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

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

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

我使用以下命令构建了 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 时提供的默认路径