Docker部署Nginx启动报错:upstream指令参数数量无效求助
问题重现
你启动Nginx容器时遇到了这个明确的错误提示:
2019/08/09 11:37:18 [emerg] 1#1: invalid number of arguments in "upstream" directive in /etc/nginx/conf.d/default.conf:61 nginx: [emerg] invalid number of arguments in "upstream" directive in /etc/nginx/conf.d/default.conf:61
结合你贴出的生成后的upstream配置片段,问题的根源一眼就能看出来。
错误核心原因
看你提供的这段upstream代码:
upstream { # Cannot connect to network of this container server 127.0.0.1 down; # Cannot connect to network of this container server 127.0.0.1 down; ## Can be connected with "proxy" network server 10.0.35.3:8080; ... }
Nginx的upstream指令必须紧跟一个服务器组的名称,比如upstream my_web_service { ... }——这个名称是用来在后续的server块里通过proxy_pass http://my_web_service;来引用上游集群的。你现在的upstream后面是空的,完全没有指定名称,这直接触发了"参数无效"的错误。
为什么会生成无效的upstream?
你这套架构是用docker-gen自动生成Nginx配置的,出现空upstream大概率是以下两个原因之一:
- nginx.tmpl模板渲染出错:你使用的模板可能在获取容器标识(比如
VIRTUAL_HOST标签)时出现问题,导致生成upstream时没有填入正确的名称变量。 - 被代理容器的标签配置不全:docker-gen是依赖容器的
VIRTUAL_HOST等标签来生成对应配置的,如果某个需要代理的容器没正确设置这些标签,模板渲染时就可能输出空的upstream块。
解决步骤
1. 检查并修复nginx.tmpl模板
先确认你的模板是正确的,官方jwilder/nginx-proxy的模板里,upstream部分应该是类似这样的结构:
upstream {{ $upstream_name }} { {{ range .Servers }} server {{ .Address }}:{{ .Port }}; {{ end }} {{ if .UpstreamExtraConfig }}{{ .UpstreamExtraConfig }}{{ end }} }
如果你的模板被修改过或者拉取的版本有问题,重新拉取官方模板覆盖:
curl https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl > /var/lib/docker/volumes/proxy_tmpl/_data/nginx.tmpl
2. 检查所有被代理容器的标签
确保每个需要通过这个Nginx代理的容器都正确设置了VIRTUAL_HOST标签,比如在docker-compose里配置:
labels: - "VIRTUAL_HOST=your-domain.com"
缺少这个标签的容器,会导致docker-gen生成无效的配置片段。
3. 强制重新生成配置
重启dockergen服务,让它重新读取模板和容器信息,生成正确的Nginx配置:
docker service update proxy_dockergen --force
之后可以进入Nginx容器查看/etc/nginx/conf.d/default.conf,确认所有upstream块都有了正确的名称。
4. 临时应急修复(快速恢复用)
如果需要紧急启动Nginx,可以手动进入容器修改配置,给空的upstream加一个临时名称(比如upstream temp_fix { ... }),然后重启Nginx:
docker exec -it <nginx-container-id> vi /etc/nginx/conf.d/default.conf # 修改完成后重启Nginx docker exec -it <nginx-container-id> nginx -s reload
注意这只是临时方案,dockergen下次更新配置时会覆盖修改,还是要优先解决根源问题。
内容的提问来源于stack exchange,提问作者Felix

