Docker Nginx速率限制问题:参数数量无效

Docker Nginx速率限制问题:参数数量无效,docker,nginx,Docker,Nginx,我正在尝试向我的nginx web服务器添加速率限制支持,但不断出现以下错误: webserver_1 | 2017/10/24 11:27:40 [emerg] 6#6: invalid number of arguments in "limit_req_zone" directive in /etc/nginx/nginx.conf:7 webserver_1 | nginx: [emerg] invalid number of arguments in "limit_req_zone"

我正在尝试向我的nginx web服务器添加速率限制支持,但不断出现以下错误:

webserver_1  | 2017/10/24 11:27:40 [emerg] 6#6: invalid number of arguments in "limit_req_zone" directive in /etc/nginx/nginx.conf:7
webserver_1  | nginx: [emerg] invalid number of arguments in "limit_req_zone" directive in /etc/nginx/nginx.conf:7
isaserver_webserver_1 exited with code 1
这是我的nginx配置文件:

# normally you leave this at the default of 1024
events {
    worker_connections 1024;
}

http {
    limit_req_zone $binary_remote_addr zone=slow:10m rate=30r/s;

    # cf http://blog.maxcdn.com/accept-encoding-its-vary-important/
    gzip_vary on;
    gzip_proxied any;
    gzip_types *;

    # http://nginx.org/en/docs/http/configuring_https_servers.html#optimization
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 10m;

    server_tokens off;

    upstream django {
        server web:8000;
    }

    server {
        # rewrite all HTTP to HTTPS
        listen 80;
        server_name ${NGINX_SERVER_NAME};

        return 301 https://${NGINX_SERVER_NAME}$request_uri;
    }

    server {
        listen 443 ssl default_server;
        server_name ${NGINX_SERVER_NAME};

        # see http://nginx.org/en/docs/http/configuriNGINX_https_servers.html
        ssl_certificate /etc/ssl/certs/server.crt;
        ssl_certificate_key /etc/ssl/private/server.key;
        ssl_client_certificate /etc/ssl/certs/ca.crt;
        ssl_verify_client optional;

        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ie defaults minus SSLv3

        #Prevent serving of sysfiles / vim backup files
        location ~ /\.          { access_log off; log_not_found off; deny all; }
        location ~ ~$           { access_log off; log_not_found off; deny all; }

        location / {
            limit_req zone=slow nodelay;

            uwsgi_pass      django;
            include         uwsgi_params;
        }
    }
}
我不知道为什么会出现这个问题,因为我直接从官方文档中复制了limit_req_区域代码

我做错了什么

更新#1:

下面是我的nginx web服务器docker文件:

FROM nginx:1.13.5

# Add start script
ADD ./webserver/config/start.sh /
RUN chmod +x start.sh

ENV NGINX_CRT_NAME=localhost NGINX_KEY_NAME=localhost NGINX_SERVER_NAME=localhost

# Add nginx config file
ADD ./webserver/config/nginx.tmpl /

# Add SSL certs to location specified in nginx.conf
ADD ./webserver/config/*.crt /etc/ssl/certs/
ADD ./webserver/config/*.key /etc/ssl/private/

# Execute start script
CMD ["./start.sh"]
下面是docker compose文件:

version: '2.1'

services:
  web:
    image: xxxxxxxx/xxxxxxxxx
    build: .
    ports:
      - "8000:8000"
    extra_hosts:
      - "DB_HOST:192.168.1.xxxxx"

  webserver:
    build:
      context: .
      dockerfile: webserver/Dockerfile # This is the above dockerfile
    ports:
      - "80:80"
      - "443:443"
    links:
      - web:web
如果我删除这两条限制速率的线路,服务器就会运行,不会出现任何问题。然而,一旦我尝试启用速率限制,我就会收到上面提到的错误

更新#2:

以下是开始脚本:

#!/bin/bash
envsubst < nginx.conf > /etc/nginx/nginx.conf

nginx -g "daemon off;"
#/bin/bash
envsubt/etc/nginx/nginx.conf
nginx-g“守护进程关闭”

*注意:我已将nginx模板配置文件更改为以.conf结尾

您需要转义
$binary\u remote\u addr
,因为您正在使用某种模板语言将变量转换为零

也许是这样:

limit_req_zone $$binary_remote_addr zone=slow:10m rate=30r/s;
# with this ---^ 
我也遇到了同样的问题(虽然没有在Docker上运行),解决方案是用反斜杠ie来逃避美元\$

limit_req_zone \$binary_remote_addr zone=slow:10m rate=30r/s;

你重建了你的形象吗<代码>docker compose build是,错误来自此配置文件。确定。和nginx版本?我使用的是官方nginx docker容器的1.13.5版本,位于。我为问题添加了额外的配置信息,这可能会有帮助,并提供对问题的更多见解。嗯,我尝试添加了额外的$符号,但我遇到了一个错误:
2017/10/24 20:22:27[emerg]6#6:etc/nginx/nginx.conf:7中的变量名无效
。我还尝试将文件重命名为
nginx.conf
,但也没有成功。有趣的是,如果我运行,就不会出现错误。
start.sh
做什么?什么是模板语言?envsubst?我用start.sh代码更新了这个问题。是的,它正在使用envsubs。