Учебное пособие по контейнерам Nginx — Руан Ифэн

HTTP Docker Nginx

Перед Праздником Весны я увидел NginxПрисоединяйсяЯ хочу попробовать функцию push сервера HTTP/2.

Как раз в эти дни я учусьDocker, я думал использоватьКонтейнер Nginx. Если что-то пойдет не так, просто удалите его и перезапустите контейнер.

Ниже описан процесс настройки контейнера Nginx и добавления сертификата SSL. Вы увидите новые функции, которые Docker использует для тестирования программного обеспечения, которые действительно удобны и заслуживают изучения. Если вы еще не знаете Docker, вы можете сначала прочитать егоНачало работы с Докером, очень просто, можно научиться менее чем за полчаса.

1. HTTP-сервис

Самая большая роль Nginx — создание веб-сервера. С контейнером сервер настраивается всего одной строкой команды, и настройка вообще не требуется.


$ docker container run \
  -d \
  -p 127.0.0.2:8080:80 \
  --rm \
  --name mynginx \
  nginx

Приведенная выше команда загружает и запускает официальныйNginx image, по умолчанию используется последняя версия (последняя), на данный момент 1.13.9. Если на этом компьютере была установлена ​​предыдущая версия, удалите ее и переустановите, так как push-уведомление сервера поддерживается только в версии 1.13.9.

Значение каждого параметра приведенной выше команды следующее.

  • -d: работать в фоновом режиме
  • -p: контейнер80порт сопоставлен с127.0.0.2:8080
  • --rm: автоматически удалять файлы контейнера после прекращения работы контейнера.
  • --name: Имя контейнераmynginx

Если ошибки нет, вы можете открыть браузер для доступа к 127.0.0.2:8080. Обычно отображается страница приветствия Nginx.

Затем этот контейнер завершается из-за--rmФункция параметра, файл-контейнер будет автоматически удален.


$ docker container stop mynginx

2. Отображение веб-каталога

Файлы веб-страниц все находятся в контейнере и не могут быть изменены напрямую, что, очевидно, очень неудобно. Следующим шагом является создание каталога, в котором находятся веб-файлы./usr/share/nginx/htmlКарта на местную.

Сначала создайте новый каталог и войдите в него.


$ mkdir nginx-docker-demo
$ cd nginx-docker-demo

Затем создайте новыйhtmlподкаталог.


$ mkdir html

Внутри этого подкаталога поместитеindex.htmlфайл, содержание следующее.


<h1>Hello World</h1>

Затем вы можете поместить этот подкаталогhtml, который сопоставляется с каталогом файлов веб-страницы контейнера/usr/share/nginx/html.


$ docker container run \
  -d \
  -p 127.0.0.2:8080:80 \
  --rm \
  --name mynginx \
  --volume "$PWD/html":/usr/share/nginx/html \
  nginx

Откройте браузер, посетите 127.0.0.2:8080, и вы сможете увидеть Hello World.

3. Скопируйте конфигурацию

Недостаточно изменить файлы веб-страницы, но также изменить файл конфигурации Nginx, иначе поддержка SSL не может быть добавлена ​​позже.

Сначала скопируйте файл конфигурации Nginx из контейнера в файл local.


$ docker container cp mynginx:/etc/nginx .

Смысл приведенной выше команды заключается в том, чтобы поставитьmynginxконтейнер/etc/nginxСкопируйте в текущий каталог. Не пропустите последний пункт.

После завершения выполнения в текущем каталоге должен быть еще одинnginxподкаталог. Затем переименуйте этот подкаталог вconf.


$ mv nginx conf

Теперь контейнер можно закрыть.


$ docker container stop mynginx

В-четвертых, каталог конфигурации сопоставления

Перезапустите новый контейнер, на этот раз сопоставив не только веб-каталог, но и каталог конфигурации.


$ docker container run \
  --rm \
  --name mynginx \
  --volume "$PWD/html":/usr/share/nginx/html \
  --volume "$PWD/conf":/etc/nginx \
  -p 127.0.0.2:8080:80 \
  -d \
  nginx

В приведенном выше коде--volume "$PWD/conf":/etc/nginxУказывает каталог конфигурации контейнера/etc/nginx, который сопоставляется с локальнымconfподкаталог.

Браузер обращается к 127.0.0.2: 8080. Если вы видите веб-страницу, это означает, что локальная конфигурация вступила в силу. В этот момент контейнер можно закрыть.


$ docker container stop mynginx

5. Самоподписанный сертификат

Теперь, чтобы добавить в контейнер поддержку HTTPS, в первую очередь необходимо сгенерировать закрытый ключ и сертификат. Официальный сертификат нуждается в подписи центра сертификации (ЦС), здесь для тестирования достаточно самоподписанного сертификата.

Ниже я ссылаюсь наDigitalOceanруководство. Во-первых, убедитесь, что ваша машина установленаOpenSSL, а затем выполните следующую команду.


$ sudo openssl req \
  -x509 \
  -nodes \
  -days 365 \
  -newkey rsa:2048 \
  -keyout example.key \
  -out example.crt

Значение каждого параметра приведенной выше команды следующее.

  • req: обрабатывает запросы на подпись сертификата.
  • -x509: создание самозаверяющего сертификата.
  • -nodes: Пропустить этап установки пароля для сертификата, чтобы Nginx мог напрямую открыть сертификат.
  • -days 365: Сертификат действителен в течение одного года.
  • -newkey rsa:2048: Генерация нового закрытого ключа, используемый алгоритм — 2048-битный RSA.
  • -keyout: Вновь сгенерированный файл закрытого ключа находится в текущем каталоге.example.key.
  • -out: вновь созданный файл сертификата находится в текущем каталоге.example.crt.

После выполнения в командной строке появится множество вопросов, на которые вы должны ответить, например, в какой стране вы находитесь, ваш адрес электронной почты и т. д.

Одним из наиболее важных вопросов является Common Name, Обычно необходимо заполнить доменное имя. Здесь вы можете заполнить 127.0.0.2.


Common Name (e.g. server FQDN or YOUR name) []:127.0.0.2

После ответа на вопрос в текущем каталоге должно быть еще два файла:example.keyиexample.crt.

confСоздайте новый подкаталог в каталогеcerts, поместите два файла в этот подкаталог.


$ mkdir conf/certs
$ mv example.crt example.key conf/certs

6. Настройка HTTPS

С закрытым ключом и сертификатом вы можете включить HTTPS для Nginx.

Во-первых, откройтеconf/conf.d/default.confфайл, добавьте следующую конфигурацию в конце.


server {
    listen 443 ssl http2;
    server_name  localhost;

    ssl                      on;
    ssl_certificate          /etc/nginx/certs/example.crt;
    ssl_certificate_key      /etc/nginx/certs/example.key;

    ssl_session_timeout  5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

Затем запустите новый контейнер Nginx.


$ docker container run \
  --rm \
  --name mynginx \
  --volume "$PWD/html":/usr/share/nginx/html \
  --volume "$PWD/conf":/etc/nginx \
  -p 127.0.0.2:8080:80 \
  -p 127.0.0.2:8081:443 \
  -d \
  nginx

В приведенной выше команде отображается не только порт 80 контейнера, но и порт 443, который является выделенным портом для HTTPS.

Откройте браузер и посетите https://127.0.0.2:8081/. Поскольку используется самозаверяющий сертификат, браузер сообщит, что он небезопасен. Оставьте это в покое, выберите «Продолжить», и вы сможете увидеть Hello World.

На данный момент поддержка HTTPS контейнера Nginx готова. С этим контейнером в следующей статье я поэкспериментирую с функцией push сервера HTTP/2.

7. Справочная ссылка

(Заканчивать)