Перед Праздником Весны я увидел 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. Справочная ссылка
- Tips for deploying nginx(official image) with docker, by Mario Ponticello
- How To Run Nginx in a Docker Container on Ubuntu 14.04, by Thomas Taege
- Official Docker Library docs, by Docker
- How To Create a Self-Signed SSL Certificate for Nginx in Ubuntu 16.04, by Justin Ellingwood
(Заканчивать)