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

Linux 如何在配置NGINX时使用环境变量作为前缀路径?,linux,nginx,build,autotools,configure,Linux,Nginx,Build,Autotools,Configure,我正在尝试使用$NGINX_PREFIX作为日志记录的前缀。在运行时,链接编辑器应展开$NGINX\u前缀。我正在使用以下命令构建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 ./configure --prefix=\$NGI

我正在尝试使用
$NGINX_PREFIX
作为日志记录的前缀。在运行时,链接编辑器应展开
$NGINX\u前缀
。我正在使用以下命令构建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
./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)
现在请注意,我已经正确设置了环境变量,上面显示的错误文件已经存在

我哪里做错了?是因为环境变量吗?如果是的话,我如何获得一个预构建的nginx二进制文件,我可以在多台机器上重复使用,而无需一次又一次地构建它

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

那完全没有道理。链接编辑器(又称“链接器”)在编译时完全有效。在运行时不涉及它。根据可执行文件的形式,运行时可能会涉及一个动态链接器,但这是一个有点不同的beast。无论如何,这两种链接器都与操作可执行文件或其地址空间中的数据无关。链接器是关于将符号与地址匹配的

我正在使用以下命令构建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
./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一样简单

但是,所有这些包装业务似乎都与您开始时遇到的日志前缀问题正交。如果目标日志目录被编译到软件中,并且在运行时还没有覆盖该目录的机制(配置文件、命令行选项、已识别的环境变量等等),那么您就无法在中实现这一点。您需要修改程序以引入这种功能


但是不要仅仅考虑不这样做。如果愿意,可以在构建过程中指定一个自定义日志目录——这很好——但并非所有内容都必须在运行时可配置。

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

为什么要转义
$
?如果要使用变量,应该让shell对其进行插值。将调用更改为
configure--prefix=$NGINX\u prefix啊,我知道你想做什么,但你做得不对。您不想将前缀更改为
configure
。如果您想要一个可以安装在不同位置的预构建二进制文件,那么您需要将更改向上移动到包管理系统的几个层中。构建可重新定位的rpm并在安装期间使用备用目标目录。nginx提供rpm。您始终可以从那里提取文件并原始安装。请记住,“预构建tarball”是一个包管理系统。您可能需要修补Nginx源以从环境获取路径(或修补配置文件以了解环境)。要在运行时设置前缀,只需像这样调用nginx
nginx-p`pwd`/-c nginx.conf
。现在prefix参数仍然必须是绝对的,但您不必在配置文件中手动设置依赖于prefix的所有路径。