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

uelo1irk  于 2023-10-16  发布在  Docker
关注(0)|答案(2)|浏览(136)

我尝试重定向到代理服务器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} = correctry在脚本中更改

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;

需要多少simvols后)

ljsrvy3e

ljsrvy3e1#

我使用envsubst进行环境替换,这个实用程序尝试了swap $host和其他nginx env,解决了:

envsubst '\$WP \$PMA' < nginx.template.conf > nginx.ready.conf; rm nginx.template.conf

所以我专门设置了我想要替换的变量,避免了对nginx变量的一般替换,比如$host,$remote_addr等。如果你不指定你想要替换的变量,nginx变量将被替换为空值。

7lrncoxx

7lrncoxx2#

扩展@mikhail-prigorodov的工作答案:
OP描述的情况出现在使用Nginx Docker容器和Docker Compose时。在documentation中,它写道:
Nginx开箱即用,不支持大多数配置块中的环境变量。但是这个镜像有一个函数,它会在nginx启动之前提取环境变量。
所以,如果你在docker-compose.yml中使用环境变量作为12-Factor App设计的一部分,你必须弄清楚如何将它们正确地放入Nginx配置文件。
Nginx Docker文档中的解决方案是在模板配置文件上运行envsubst,并将输出发送到Nginx配置文件。在this GitHub issue中提到的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;'

这是在经历了几个小时的挫折后对我起作用的解决方案。

相关问题