我正在尝试优化我的 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
答案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
据我所知,您可以根据需要使用任意数量的环境变量。