SSL-сертификат не загружается с помощью Nginx в Docker

#docker #nginx #ssl

Вопрос:

У меня есть докеризованное веб-приложение, которое я пытаюсь развернуть. Я использую Nginx и uWSGI для обслуживания статических файлов и управления трафиком.

На какое-то время я застрял с проблемой. Я также хочу обслуживать приложение по протоколу HTTPS (очевидно).

Я добавляю сюда соответствующую информацию, и если потребуется что-то еще, пожалуйста, дайте мне знать.

Структура каталогов:

 root
|
'-> app (django app)
'-> proxy (nginx)
    '-> Dockerfile (calling it Nginx-Dockerfile in the remainder of the post)
    '-> data/certs/
        '-> example.com.crt
        '-> example.com.key
    '-> default.conf (configuration for nginx)
    '-> ... (some more files, irrelevant to the problem)
'-> docker-compose-deploy.yml
'-> Dockerfile (calling it root-Dockerfile in the remainder of the post)
'-> ... (some more files, irrelevant to the problem)
 

Как показано выше, я уже создал SSL-сертификаты.

Nginx-Докерфайл:

 FROM nginxinc/nginx-unprivileged:1-alpine
LABEL maintainer="hackacademy.in"

COPY ./default.conf.tpl /etc/nginx/default.conf.tpl
COPY ./uwsgi_params /etc/nginx/uwsgi_params
COPY ./data/certs/example.com.crt /etc/nginx/certs
COPY ./data/certs/example.com.key /etc/nginx/certs
COPY ./run.sh /run.sh

ENV LISTEN_PORT=8000
ENV APP_HOST=app
ENV APP_PORT=9000

USER root

RUN mkdir -p /vol/static amp;amp; 
    chmod 755 /vol/static amp;amp; 
    touch /etc/nginx/conf.d/default.conf amp;amp; 
    chown nginx:nginx /etc/nginx/conf.d/default.conf amp;amp; 
    chmod  x /run.sh amp;amp; 
    chmod  rx /etc/nginx/certs

VOLUME /vol/static

USER nginx

CMD ["/run.sh"]
 

по умолчанию.conf

 server {
        listen 443 ssl;
        server_name example.com;
        ssl_certificate /etc/nginx/certs/example.com.crt;
        ssl_certificate_key /etc/nginx/certs/example.com.key;

        location /static {
                alias /vol/web/;
        }

        location / {
                uwsgi_pass ${APP_HOST}:${APP_PORT};
                include /etc/nginx/uwsgi_params;
                client_max_body_size 10M;
        }
}

server {
        listen 80;
        server_name example.com;

        location / {
                return 301 https://$host$request_uri;
        }
}
 

Это успешно создает образ, но сервер nginx выдает ошибки и на самом деле не служит этой цели. Ошибка, отображаемая в журналах, такова

 nginx: [emerg] cannot load certificate "/etc/nginx/certs/example.com.crt": BIO_new_file() failed (SSL: error:02001014:system library:fopen:Not a directory:fopen('/etc/nginx/certs/example.com.crt','r') error:2006D002:BIO routines:BIO_new_file:system lib)

 

Я немного поэкспериментировал и погуглил, и я застрял здесь в какой-то петле. Я впервые развертываю веб-приложение, черт возьми, я даже не веб-разработчик (я учусь на ходу), поэтому, пожалуйста, помогите мне простыми словами. Буду очень благодарен.

Примечание: Я заменил свой домен на example.com в этом посте во всех местах.

Ответ №1:

Я нашел решение.

Я изменил файл Nginx-Dockerfile на

 FROM nginx:1.21.3
LABEL maintainer="hackacademy.in"

COPY ./default.conf.tpl /etc/nginx/default.conf.tpl
COPY ./uwsgi_params /etc/nginx/uwsgi_params
COPY ./data/certs/example.com.crt /etc/nginx/certs/
COPY ./data/certs/example.com.key /etc/nginx/certs/
COPY ./run.sh /run.sh

ENV LISTEN_PORT=8000
ENV APP_HOST=app
ENV APP_PORT=9000

RUN mkdir -p /vol/static amp;amp; 
    chmod 755 /vol/static amp;amp; 
    touch /etc/nginx/conf.d/default.conf amp;amp; 
    chown nginx:nginx /etc/nginx/conf.d/default.conf amp;amp; 
    chmod  x /run.sh amp;amp; 
    chmod  r /etc/nginx/certs/example.com.crt amp;amp; 
    chmod  r /etc/nginx/certs/example.com.key

VOLUME /vol/static

CMD ["/run.sh"]