Я не могу понять, в чем проблема с официальным образом 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;
}
}
Но соответствующий док-контейнер просто закрывается при запуске, заявляя о всевозможных ошибках конфигурации, которые заменяют друг друга в произвольном и неясном порядке, несмотря на мои правки. Ошибки, такие как дублирование восходящего потока, недопустимое количество аргументов в try_files
, отсутствующие переменные env и т. д. Я нашел несколько источников в Интернете, описывающих аналогичную проблему, но то, что там предлагается, не сработало для меня. Я попытался удалить объявление восходящего потока в настраиваемом файле конфигурации nginx, попытался указать точный env. переменная для замены в команде docker-compose для изображения nginx, например $$NGINX_HOST
и \$NGINX_HOST
- никакого эффекта, только одна ошибка вместо другой. Итак, как заставить контейнер nginx правильно работать с docker-compose.yml и файлами конфигурации, которые я предоставил?
PS: docker logs -t cont_id
дает ту же ошибку: nginx: [emerg] недопустимое количество аргументов в директиве try_files в /etc/nginx/conf.d/default.conf
Если кто-то сталкивается с подобной проблемой, я обнаружил, что это связано с переопределением переменных среды здесь command: /bin/sh -c "envsubst < /etc/nginx/conf.d/custom-nginx.conf > /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
. Это то, что другие люди писали в сети, но все их предложения не сработали для меня. В итоге я удалил эту часть envsubst < /etc/nginx/conf.d/custom-nginx.conf > /etc/nginx/conf.d/default.conf &&
и environment:
раздел в docker-compose.yml, хост и порт жесткого кодирования. Это позволило запустить nginx. Тогда у меня была ошибка:
upstream app_server {
server 127.0.0.1:7999;
}
Это должно быть имя адреса контейнера приложения в сети докеров.