我无法弄清楚 docker 的官方 nginx 镜像有什么问题。我在 docker-compose.yml 文件中使用它,如官方镜像页面所示:
web:
image: nginx
volumes:
- ./custom-nginx.conf:/etc/nginx/conf.d/custom-nginx.conf
ports:
- "80:80"
environment:
- NGINX_HOST=mysite.com
- NGINX_PORT=80
command: /bin/sh -c "envsubst < /etc/nginx/conf.d/custom-nginx.conf > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
custom-nginx.conf 文件如下所示:
upstream app_server {
server 127.0.0.1:7999;
}
server {
listen ${NGINX_PORT};
server_name ${NGINX_HOST};
root /var/www/app/;
gzip_static always;
access_log /var/log/nginx/app.access.log;
error_log /var/log/nginx/app.error.log;
client_max_body_size 5000M;
proxy_connect_timeout 6000;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
send_timeout 6000;
location / {
# checks for static file, if not found proxy to app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
proxy_pass http://app_server;
}
location /media/ {
internal;
error_page 401 403 404 = @proxy_to_app;
}
location /favicon.ico {
alias ../static/favicon.ico;
}
}
但是相应的 docker 容器在启动时就退出了,并声称存在各种配置错误,尽管我进行了编辑,但这些错误仍然以某种随机且不明确的顺序相互替代。错误包括重复的上游、无效的参数数量try_files
、缺少环境变量等。我在互联网上找到了几个描述类似问题的资料,但那里建议的对我来说不起作用。我试图删除 nginx 自定义配置文件中的上游声明,试图在 docker-compose 命令中为 nginx 映像指示要替换的确切环境变量,如$$NGINX_HOST
和\$NGINX_HOST
- 没有效果,只是一个错误而不是另一个错误。那么,如何使用我提供的 docker-compose.yml 和配置文件使 nginx 容器正常工作?
PS:还是docker logs -t cont_id
报同样的错误:nginx:[emerg] /etc/nginx/conf.d/default.conf 中“try_files”指令的参数数量无效
答案1
万一有人遇到类似的问题,我发现这与此处覆盖环境变量有关command: /bin/sh -c "envsubst < /etc/nginx/conf.d/custom-nginx.conf > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
。这就是其他人在网上写的,但他们的所有建议对我来说都不起作用。我最终删除了docker-compose.yml中的这部分envsubst < /etc/nginx/conf.d/custom-nginx.conf > /etc/nginx/conf.d/default.conf &&
和environment:
部分,硬编码主机和端口。它允许nginx启动。然后我在这里遇到一个错误:
upstream app_server {
server 127.0.0.1:7999;
}
它必须是 docker 网络内应用程序容器地址的名称。