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

时间:2018-08-22 12:28:09

标签: linux nginx build autotools configure

我正在尝试使用$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二进制文件,该二进制文件可以在多台计算机上重复使用,而无需一次又一次地构建它?

2 个答案:

答案 0 :(得分:0)

  

我正在尝试使用$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或目标系统所需的任何东西,然后使用它来安装软件。您甚至可以找到针对目标系统类型预先构建的此类软件包,和/或找到适合您用于构建自己的自定义软件包的打包源。或发明自己的包装格式,就像带附带安装脚本的压缩包一样简单。

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

但是请考虑完全不要这样做。如果需要的话,可以在构建过程中指定一个自定义日志目录-很好-但并非必须在运行时配置所有内容。

答案 1 :(得分:0)

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