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源以从环境获取路径(或修补配置文件以了解环境)。要在运行时设置前缀,只需像这样调用nginxnginx-p`pwd`/-c nginx.conf
。现在prefix参数仍然必须是绝对的,但您不必在配置文件中手动设置依赖于prefix的所有路径。