如何修复 nginx 错误“参数数量无效”?

问题描述 投票:0回答:2

我尝试重定向到代理服务器 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)

docker nginx docker-compose reverse-proxy nginx-reverse-proxy
2个回答
9
投票

我使用 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 变量将被替换为空值


3
投票

扩展@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;'

这是经过数小时的挫折后对我有用的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.