From b9c5ce136d0126a5654dc616bea2ab83d098af28 Mon Sep 17 00:00:00 2001 From: Vladimir Protsenko Date: Tue, 13 Sep 2022 16:43:31 +0400 Subject: [PATCH] Added tasks for nginx lesson. --- 07_file_permissions/solutions.md | 0 08_debian_package_management/solutions.md | 8 +- 09_nginx/tasks.md | 166 ++++++++++++++++++++++ 3 files changed, 170 insertions(+), 4 deletions(-) create mode 100644 07_file_permissions/solutions.md create mode 100644 09_nginx/tasks.md diff --git a/07_file_permissions/solutions.md b/07_file_permissions/solutions.md new file mode 100644 index 0000000..e69de29 diff --git a/08_debian_package_management/solutions.md b/08_debian_package_management/solutions.md index 568ad25..88047ea 100644 --- a/08_debian_package_management/solutions.md +++ b/08_debian_package_management/solutions.md @@ -76,10 +76,10 @@ $ sudo apt install Сохраните список выбранных действий (selections) для пакетов в системе утилитой dpkg в файл. ### 20. -Измените в сохранённом списке действие для пакета vim c текущего на deinstall (`man dpkg`, “Package selection states”). Перечитайте список командой `dpkg --set-selections`. +Измените в сохранённом списке действие для пакета vim c текущего на deinstall (`man dpkg`, “Package selection states”). Перечитайте изменённый список командой `dpkg --set-selections`. ### 21. -Запустите команду `apt-get dselect-upgrade`. Какие пакеты будут установлены или удалены? +Запустите команду `apt-get dselect-upgrade`. Не подтверждайте изменения. Какие пакеты будут установлены или удалены? ### 22. Настройте в `/etc/sudoers` конфигурационном файле для пользователя stud возможность выполнять команды от лица суперпользователя без запроса пароля: @@ -89,11 +89,11 @@ $ sudo apt install Удалите, а затем установите пакет sudo командой `apt remove`. Проверьте содержимое конфигурационного файла на изменения. Проделайте то же самое, но c командой `apt purge`. ### 23. -Удалите cmake и cmake-data с помощью apt. Найдите в репозиториях, какая версия cmake доступна. Создайте файл в директории `/etc/apt/apt.conf.d/default-release` с следующим содержимым (man apt.conf): +Удалите cmake и cmake-data с помощью apt. Найдите в репозиториях, какая версия cmake доступна. Создайте файл в директории `/etc/apt/apt.conf.d/default-release` со следующим содержимым (man apt.conf): ``` APT::Default-Release "stable"; ``` -Повторите поиск. Установите stable версию. Проверьте работоспособность команды и её версию `cmake --version`. Вы можете узнать значения текущих конфигурационных переменных `apt` командой `apt-conf dump`. +Повторите поиск. Установите stable версию. Проверьте работоспособность команды и её версию `cmake --version`. Вы можете узнать значения текущих конфигурационных переменных `apt` командой `apt-config dump`. ### 24. Заморозьте версию cmake командой `apt-mark` или с помощью `dpkg --get-selections`, `dpkg --set-selections`. Поменяйте умолчания `/etc/apt/apt.conf.d/default-release` на "unstable". Проведите обновление пакетов в системе. cmake должен сохранить stable версию. diff --git a/09_nginx/tasks.md b/09_nginx/tasks.md new file mode 100644 index 0000000..bdd41d7 --- /dev/null +++ b/09_nginx/tasks.md @@ -0,0 +1,166 @@ +# Задание + +### 1. +Установите пакет nginx. + +### 2. +Запустите исполняемый файл nginx. Проверьте, что он запустился `ps aux`. + +### 3. +После запуска nginx им можно управлять, вызывая исполняемый файл с параметром -s. Попробуйте команды: +- stop— быстрое выключение, +- quit — завершение работы с ожиданием завершения обслуживания текущих запросов рабочими процессами, +- reload — перезагрузка файла конфигурации, +- reopen — повторное открытие лог-файлов, +используя следующий синтаксис: +``` +nginx -s signal +``` +Команда должна выполняться под тем же пользователем, который запустил nginx. + +### 4. +Сигнал также может быть отправлен процессам nginx с помощью инструментов Unix, таких как утилита kill. Идентификатор процесса главного процесса nginx по умолчанию записывается в файл nginx.pid в каталоге /usr/local/nginx/logs или /var/run. + +Завершите корректно работу nginx командой `kill -s QUIT`. + +### 5. +Получите список всех запущенных процессов nginx утилитой ps. + +### 6. +Nginx состоит из модулей, которые управляются директивами, указанными в файле конфигурации. Директивы делятся на простые директивы и блочные директивы. Простая директива состоит из имени и параметров, разделенных пробелами, и заканчивается точкой с запятой (;). Блочная директива имеет ту же структуру, что и простая директива, но вместо точки с запятой она заканчивается набором дополнительных инструкций, заключенных в фигурные скобки ({ и }). Если директива блока может иметь другие директивы внутри фигурных скобок, она называется контекстом (примеры: события, http, сервер и местоположение). + +Директивы, размещенные в конфигурационном файле вне каких-либо контекстов, считаются находящимися в основном контексте. События и директивы http находятся в основном контексте, сервер — в http, а местоположение — в server. Оставшаяся часть строки после знака # считается комментарием. + +Откройте в любом редакторе файл /etc/nginx/nginx.conf, посмотрите настройки по-умолчанию. Обратите внимание, что в блок http включаются все файлы из директории sites-enabled. + +### 7. +Запустите команду `tree` для директории /etc/nginx. Следующие две директории будут представлять для нас интерес - sites-available и sites-enabled. Директория sites-available будет содержать наши конфигурации, а sites-enabled символические ссылки на них. Удалите ссылку по-умолчанию в папке sites-enabled перед следующим заданием. + +### 8.1 +Важной задачей веб-сервера является отдача статического содержимого (например, изображений или HTML-страниц). Сконфигурируем веб-сервер, в котором, в зависимости от запроса, файлы будут браться из разных локальных каталогов: /data/www (HTML-файлы) и /data/images (изображения). Для этого отредактируем файл конфигурации, настроем блок сервера внутри блока http, затем настроем два блока местоположения. + +Создайте каталог /data/www и поместите в него файл index.html с любым текстовым содержимым, создайте каталог /data/images и поместите в него несколько изображений. + +Далее откройте файл конфигурации static-server.conf в /etc/nginx/sites-available. Конфигурационный файл по умолчанию уже включает несколько примеров блока сервера, в основном закомментированных. Закомментируйте все такие блоки и запустите новый серверный блок: +``` +server { +} +``` + +### 8.2 +Файл конфигурации может включать в себя несколько серверных блоков, отличающихся портами, которые они прослушивают, и именами серверов. Как только nginx решает, какой сервер обрабатывает запрос, он проверяет URI, указанный в заголовке запроса, на соответствие параметрам директив местоположения, определенных внутри блока сервера. + +Добавьте внутрь предыдущего блока блок местоположения: +``` +location / { + root /data/www; +} +``` +Этот блок местоположения указывает префикс «/» относительно URI из запроса. Для совпадающих запросов к пути, указанному в корневой директиве, то есть к /data/www, будет добавлен URI для формирования пути к запрашиваемому файлу в локальной файловой системе. + +Если есть несколько совпадающих блоков местоположения, nginx выбирает блок с самым длинным префиксом. Для ссылки http://193.32.63.171/images/1.jpg подходят местоположения / и /images/. Выбрано будет последнее местоположение. + +### 8.3 +Добавьте второй блок местоположения: +``` +location /images/ { + root /data; +} +``` +Он будет соответствовать запросам, начинающимся с /images/ (местоположение / также соответствует таким запросам, но имеет более короткий префикс). + +В результате конфигурация блока сервера static-server.conf должна выглядеть так: +``` +server { + location / { + root /data/www; + } + + location /images/ { + root /data; + } +} +``` +Это уже рабочая конфигурация сервера, который слушает стандартный порт 80 и доступен на локальной машине по адресу http://localhost/. В ответ на запросы с URI, начинающимися с /images/, сервер будет отправлять файлы из каталога /data/images. Например, в ответ на запрос http://localhost/images/example.png nginx отправит файл /data/images/example.png. Если такого файла не существует, nginx отправит ответ с указанием ошибки 404. Запросы с URI, не начинающимися с /images/, будут отображаться в каталоге /data/www. Например, в ответ на запрос http://localhost/some/example.html nginx отправит файл /data/www/some/example.html. + +### 8.4 +Скачайте любую картинку в /data/images/: +``` +wget -O /data/images/example.jpg https://cdna.artstation.com/p/assets/images/images/052/919/542/large/yucong-tang-0818.jpg?1660995410 +``` + +Активируйте сервер, создав символическую ссылку на файл конфигурации в директории sites-enabled: +``` +ln -s /etc/nginx/sites-available/static-server.conf /etc/nginx/sites-enabled/static-server.conf +``` +Примените новую конфигурацию, запустите nginx, если он еще не запущен, или отправьте сигнал перезагрузки главному процессу nginx. + +Проверьте, что веб-сервер работает. Если что-то не работает должным образом, вы можете попытаться выяснить причину в файлах access.log и error.log в каталоге /usr/local/nginx/logs или /var/log/nginx. + +### 9. +Переведите веб-сервер на https. Измените порт прослушивания на `443 ssl`, сгенерируйте сертификаты и ключ командой openssl. Вам понадобятся следующие параметры в блоке server: +- listen, +- ssl_certificate, +- ssl_certificate_key. + +### 10.1 +Одним из частых применений nginx является его настройка в качестве прокси-сервера, что означает сервер, который получает запросы, передает их на проксируемые серверы, получает от них ответы и отправляет их клиентам. + +Настройте базовый прокси-сервер, который обслуживает запросы изображений с файлами из локального каталога и отправляет все остальные запросы на прокси-сервер. В этом примере оба сервера будут определены на одном экземпляре nginx. + +Для усложнения задания попробуйте выполнить задание на двух виртуальных машинах: 10.160.179.10+X для прокси сервера, 10.160.179.10+20+X для сервера с контентом. + +Сначала определите проксируемый сервер, добавив ещё один блок сервера в файл конфигурации nginx со следующим содержимым: +``` +server { + listen 80; + root /data/www; + + location / { + } +} +``` +Это будет простой сервер, который прослушивает порт 80 ( директиву listen можно не указывать, если используется стандартный порт 80) и отображает все запросы в каталог /data/www локальной файловой системе. Создайте этот каталог и поместите в него файл index.html. Обратите внимание, что корневая директива находится в контексте сервера. Такая корневая директива используется, когда блок местоположения, выбранный для обслуживания запроса, не включает собственную корневую директиву. + +### 10.2 +Используйте конфигурацию сервера из предыдущего задания 8 в качестве основы конфигурации прокси-сервера. В первый блок location поместите директиву `proxy_pass` с указанным в параметре протоколом, именем и портом проксируемого сервера (в вашем случае это http://10.160.179.10+X:80): +``` +server { + location / { + proxy_pass http://10.160.179.10+X:80; + } + + location /images/ { + root /data; + } +} +``` +### 10.3 +Изменим второй блок местоположения, который в настоящее время сопоставляет запросы с префиксом /images/ с файлами в каталоге /data/images, чтобы он соответствовал запросам изображений с типичными расширениями файлов. Измененный блок местоположения выглядит следующим образом: +``` +location ~ \.(gif|jpg|png)$ { + root /data/images; +} +``` +Параметр представляет собой регулярное выражение, соответствующее всем URI, оканчивающимся на .gif, .jpg или .png. Перед регулярным выражением должен стоять символ тильда ~. Соответствующие запросы будут сопоставлены с каталогом /data/images. + +Когда nginx выбирает блок местоположения для обслуживания запроса, он сначала проверяет директивы местоположения, которые указывают префиксы, запоминая местоположение с самым длинным префиксом, а затем проверяет регулярные выражения. Если есть совпадение с регулярным выражением, nginx выбирает это местоположение или, в противном случае, выбирает то, которое было запомнено ранее. + +### 10.4 +В результате конфигурация прокси-сервера будет выглядеть так: +``` +server { + location / { + proxy_pass http://10.160.179.10+X:80/; + } + + location ~ \.(gif|jpg|png)$ { + root /data/images; + } +} +``` +Этот сервер будет фильтровать запросы, оканчивающиеся на .gif, .jpg или .png, и сопоставлять их с каталогом /data/images (путем добавления URI к параметру корневой директивы) и передавать все остальные запросы на прокси-сервер, настроенный выше. + +Чтобы применить новую конфигурацию, отправьте сигнал перезагрузки в nginx, как описано в предыдущих разделах. Проверьте, что прокси сервер работает. + +Существует множество других директив, которые можно использовать для дальнейшей настройки прокси-соединения. \ No newline at end of file