nginx 在位置设置变量

nginx 在位置设置变量

我正在尝试优化我的 nginx 配置,这样就可以设置一个变量,所有位置路径都会自动更新。我有四行问题:

server_name php.domain.com;
root /srv/web/vhosts/php/web;
error_log /srv/web/vhosts/php/logs/error.log;
access_log /srv/web/vhosts/php/logs/access.log;

我想要实现的是设置一个变量(在本例中为“php”)并将其包含在配置中。

set $variable "php";
server_name $variable.domain.com;
root /srv/web/vhosts/$variable/web;
error_log /srv/web/vhosts/$variable/logs/error.log;
access_log /srv/web/vhosts/$variable/logs/access.log;

但是 nginx 似乎忽略了此配置中的变量。是我做错了什么,还是无法在位置路径中使用变量?

答案1

变量不能在任何地方声明,也不能在任何指令中使用。

作为文献set指令是:

Syntax:   set $variable value;
Default:  —
Context:  server, location, if

直接的后果是您不能在http块中使用自定义变量。

更新:经过讨论和实验亚历克斯坦在此聊天室

  • access_log可以包含有限制的变量。其中,缺少缓冲和事实上,前导斜杠不能在变量中声明
  • error_log根本不能与变量一起使用。
  • root指令可以包含变量。
  • server_name指令仅允许严格$hostname值作为类似变量的符号。

答案2

您可以使用通过 声明的变量map这个 Stackoverflow 答案讨论在位置块的表达式部分使用自定义变量:

虽然已经晚了很多年,但既然我找到了解决方案,我就把它发布在这里。通过使用地图可以按照要求进行操作:

map $http_host $variable_name {
    hostnames;

    default       /ap/;
    example.com   /api/;
    *.example.org /whatever/;
}

server {
    location $variable_name/test {
        proxy_pass $auth_proxy;
    }
}

如果您需要在多台服务器之间共享同一个端点,您也可以通过简单地将值设置为默认值来降低成本:

map "" $variable_name {
    default       /test/;
}

Map 可用于根据字符串的内容初始化变量,并可在http范围内使用,从而使变量成为全局变量并可在服务器之间共享。

答案3

您可以使用docker来完成此操作!

据我所知,这是 Nginx 发布的 docker 镜像的一个功能,但也可能是 docker 本身的一个功能。我肯定有人会纠正我。但是,我知道它可以与 docker 一起使用,所以我会提出这个建议。

Nginx 定期更新docker 镜像中心上的 docker 文件。他们放出的图像让你创建“模板”文件,基本上将你想要的任何变量传递到你的配置文件中

例如,假设我希望我的 conf 文件看起来像这样:

http {
  server {
    server {
      # Redirect http to https
      listen 80;
      listen [::]:80;
      server_name www.example.com example.com;

      root /etc/nginx/www;
      index index.html;

      location / {
          try_files $uri $uri/ =404;
      }
    }
  }

您要做的是创建一个“模板”文件default.conf.template/etc/nginx/templates如果您愿意,您实际上可以对其进行配置),如下所示:

http {
  server {
    server {
      # Redirect http to https
      listen ${NGINX_PORT};
      listen [::]:${NGINX_PORT};
      server_name www.${NGINX_HOST} ${NGINX_HOST};

      root ${NGINX_ROOT};
      index index.html;

      location / {
          try_files $uri $uri/ =404;
      }
    }
  }

然后,创建一个docker-compose.yml文件(您也可以从命令行执行此操作,但看起来不太漂亮),如下所示:

services:
  web:
    image: nginx:latest
    volumes:
      - /etc/nginx/templates:/etc/nginx/templates:ro
      - /etc/nginx/www:/etc/nginx/www:ro
    ports:
      - "8080:80"
    environment:
      - NGINX_HOST=example.com 
      - NGINX_PORT=80
      - NGINX_ROOT=/etc/nginx/www

只需启动 docker compose 即可运行它: docker compose up -d

检查容器是否正在运行docker container list

如果您愿意,可以通过将文件从正在运行的容器中复制出来来验证 conf 文件是否被正确评估(从上一个命令中仔细检查这里的容器名称):docker cp docker-web-1:/etc/nginx/conf.d/default.conf . && cat default.conf

据我所知,您可以根据需要使用任意数量的环境变量。

相关内容