我尝试重定向到代理服务器 nginx。
location /phpmyadmin {
proxy_http_version 1.1;
proxy_pass https://${PMA}:5000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
但是我收到错误:
nginx: [emerg] invalid number of arguments in "proxy_set_header" directive in /etc/nginx/nginx.conf:26
此清单中检查错误的完整代码,因为我真的找不到某些错误($ {env} =脚本中的正确更改
user root;
worker_processes auto;
pcre_jit on;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
keepalive_timeout 3000;
sendfile on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/ssl/nginx.crt;
ssl_certificate_key /etc/ssl/nginx.key;
root /home;
index default.html /default.html;
location /phpmyadmin {
proxy_http_version 1.1;
proxy_pass https://${PMA}:5000/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}
location /wordpress {
return 307 http://${WP}:5050/;
}
location / {
try_files /default.html default.html default.htm;
}
}
server {
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
}
}
daemon off;
邮寄需要多少simvol)
我使用 envsubst 进行环境替换,这个 util 尝试交换 $host 和其他 nginx env,解决方法:
envsubst '$WP $PMA' < nginx.template.conf > nginx.ready.conf; rm nginx.template.conf
这将仅替换 nginx.template.conf 文件中的
$WP
和 $PMA
变量,并将输出写入 nginx.ready.conf。避免一般替换所有 nginx 变量,例如 $host、$remote_addr 等。如果您不指定要替换的变量,nginx 变量将被替换为空值
扩展@mikhail-prigorodov 的工作答案:
OP 描述的情况是在将 Nginx Docker 容器与 Docker Compose 一起使用时出现的。在文档中,内容如下:
开箱即用,nginx 不支持大多数配置块内的环境变量。但是这个镜像有一个功能,会在nginx启动之前提取环境变量。
因此,如果您在
docker-compose.yml
中使用环境变量作为 12-Factor App 设计的一部分,您必须弄清楚如何将它们正确地放入您的 Nginx 配置文件中。
Nginx Docker 文档中的解决方案是在模板配置文件上运行
envsubst
并将输出发送到 Nginx 配置文件。 这个GitHub问题中提到的Dockerfile语法是:
CMD envsubst < /etc/nginx/templates/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'
但是,如果您的配置模板中有 Nginx 定义的变量 AND 环境变量占位符,那么该解决方案就会遇到问题。在我构建 Nginx 容器的目录(我的 Dockerfile 所在的位置)中,我有一个
templates
目录,其中包含一个名为 default.conf.template
的文件,如文档中所述。该文件包含 Nginx 变量和环境变量。例如:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
location /static {
alias /usr/share/nginx/html/${STATIC_DIR};
}
问题(我认为)是
envsubst
正在寻找标记环境变量开始的“$”字符。无论如何,你会发现成功运行 envsubst
后,当你尝试启动 Nginx 时,新的 Nginx 配置文件中模板中包含 Nginx 定义的变量(前导“$”)的每一行都会出错。
要解决此问题,请使用@mikhail-prigorodov 提供的语法。应用于我的例子:
CMD envsubst '\$STATIC_DIR' < /etc/nginx/templates/default.conf.template > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'
这是经过数小时的挫折后对我有用的解决方案。