вторник, 26 октября 2021 г.

Веб-сервер на базе Raspberry Pi Zero W. Часть 2: Установка HTTP-сервера

И снова здравствуйте! 

В прошлый раз мы установили на нашу "малинку" Rapberry Pi OS и подготовили ее для дальнейшей настройки для работы в качестве полноценного web-сервера. И сегодня пришло время установить на нее "сердце" любого веб-сервера - сервер HTTP(S). 

Тот, кто уже не первый раз работает с Linux системой, может предположить, что мы будем устанавливать популярный в веб-разработке HTTP-сервер Apache, но это не так. Принимая во внимание ограниченные аппаратные ресурсы Raspberry Pi Zero W, нашей задачей является использование программного обеспечения, потребляющего как можно меньше этих самых "ресурсов". И из всего доступного многообразия HTTP-серверов, самыми производительными и "легковесными" можно считать два их них - Lighttpd и nginx. У каждого из них есть и свои "плюсы" и свои "минусы" и, пожалуй, сложно отдать предпочтение какому-то одному из них - ибо каждый из них хорош по-своему. Что использовать на "боевом" сервере решает уже администратор, исходя из специфики размещаемого веб-контента и ожидаемой модели обращения к серверу. 

Сегодня же мы будем устанавливать и настраивать HTTP-сервер nginx. Почему? Просто потому, что данный HTTP-сервер с каждым годом набирает все большую популярность во всех сегментах веб-серверов от "домашних" до высоконагруженных промышленных и знакомство с ним будет определенно не лишним ;-). 

Чтож, приступим!  

Итак, для начала нам необходимо обновить мета-данные репозитория и обновить все установленные на нашей Raspberry Pi пакеты (как устанавливать подключение к девайсу по протоколу SSH было описано ранее). Для этого подключаемся к "малинке", авторизуемся и вводим последовательно две команды:

sudo apt-get update

sudo apt-get upgrade

Дожидаемся окончания процесса обновления установленных пакетов и переходим непосредственно к установке HTTP-сервера nginx. Для этого в окне терминала вводим команду:

sudo apt-get nginx


После установки nginx и всех зависимых пакетов, systemd штатно должен запустить процесс nginx в работу. Проверить его состояние Вы можете командой:

systemctl status nginx

В терминале Вы должны увидеть подобную картину:


Осталось проверить непосредственно в браузере. Для этого в любом веб-браузере в адресной строке наберите: http://IP_адрес_RaspberryPi. Где IP_адрес_RaspberryPi, соответственно, IP адрес, который ваша "малинка" получила в вашей wi-fi сети. Например, в моем случае это - 192.168.1.71:


Если Вы увидели подобную тестовую страницу, значит на данный момент Вы все сделали правильно, и мы можем приступать к конфигурированию сервера nginx.

Следует сразу оговориться, что далее будет представлен вариант с настройкой HTTP-сервера nginx с двумя виртуальными серверами: один на стандартном порту 80, а другой на порту 8080. Делается это с одной целью - получить один виртуальный сервер исключительно как "девелоперский", на порту 8080, доступ к которому будет открыт только из внутренней сети, а другой виртуальный сервер - своеобразный "продакшн" сервер, на порту 80, доступ к которому можно открыть и из внешней сети. Это для случая, если Вы решите из своей Raspberry Pi Zero W сделать полноценный веб-сервер, на котором будет хостится ваш проект или домашняя страничка. Если в Ваши задачи входит только организация тестового веб-сервера, можете смело отбрасывать те настройки, которые будут относится ко второму виртуальному серверу (на порту 8080).

И еще один занудный дисклеймер :-))). Зачем вся эта "пляска" с портами? - можете спросить Вы. А затем, что HTTP-сервер должен понимать к какому именно "виртуальному серверу" Вы обращаетесь, учитывая, что на одном IP-адресе их может находиться несколько (вплоть до сотен). В таком случае, общепринятая практика сводится к тому, что HTTP-сервер идентифицирует нужный "виртуальный сервер" по доменному имени, которое регистрируется в специализированном сервисе DNS. Процедура эта, зачастую, требует финансовых вложений и однозначна необходима лишь для публичных серверов, которые будут доступны любому пользователю Интернет (в одной из последующих статей мы рассмотрим, как можно зарегистрировать свое доменное имя и "прикрутить" его к своему серверу). Но для процедуры создания тестового сервера совершенно не требуется. Поэтому, если на нашем компьютере планируется использовать более одного "виртуального сервера" (читай "размещать более одного сайта"), то нам необходимо указать HTTP-серверу как именно их различать. Для этого, в целом, есть два способа: 

1 способ: как говорят администраторы, "повесить" сайты на разные порты (что мы и будем делать далее). В этом случае HTTP-сервер прослушивает кроме стандартного (80 порта, используемого для HTTP) еще и иные порты, и, в случае обращения к ним, перенаправляет все запросы на требуемый "виртуальный сервер". Может быть это и "страшно" звучит, но на практике все очень просто :-)). При данном способе, при обращении к нужному "виртуальному серверу", нам всего лишь будет достаточно в адресной строке браузера после указания IP-адресе сервера указать символ ":" и номер порта. Например, в моем случае это будет: http://192.168.1.71:8080.   

2 способ: базируется на основной логике дифференциации сервером всех имеющихся у него "виртуальных серверов" - непосредственно по их доменным именам. Для этого нам необходимо будет придумать некое доменное имя, которые мы будем использовать в качестве адреса нашего "виртуального сервера", и принудительно прописать его в локальной службе DNS, которую используют компьютеры нашей локальной сети. Что, непонятно звучит? :-)))). То ли еще будет... :-D. Это можно сделать также несколькими способами: можно прописать в службе DNS на роутере (если он поддерживает данный функционал), можно прописать на сервере DNS основного сервера (если, вдруг, у вас целая сеть, которая управляется, например, MS Server), а можно указать в локальном файле hosts (в ОС MS Windows он располагается по адресу: Windows\System32\drivers\etc\hosts, в ОС Linux: /etc/hosts).

Какой способ использовать - решает каждый сам за себя. Для меня проще и быстрее разнести "виртуальные сервера" по разным портам. При данном подходе необходимо все настройки сделать лишь на компьютере, который выступает сервером, и совершенно не важно с какого устройства, в последствии, будет происходить подключение к этому серверу. Главное - знать, на каком порту у нас "висит" требуемый "виртуальный серверок" :-))).

Продолжим. Как уже было написано ранее, мы будем конфигурировать nginx  с двумя виртуальными серверами, а для этого нам необходимо определиться с местоположением файлов каждого виртуального сервера. Как это исторически сложилось, все каталоги и файлы веб-сервера в Linux размещаются в директории /var/www/. Если Вы посмотрите содержимое этого каталога после установки nginx, то увидете, что в нем появился новый каталог html, содержащий файл index.nginx-debian.html. Собственно, содержимое этого файла мы уже видели ранее, когда проверяли успешность установки и запуска http-сервера nginx (см. скриншот выше).

Создадим в каталоге /var/www/ два подкаталога: server80 - для первого виртуального сервера, и server8080 - для второго. Для этого используем команду mkdir с привилегиями суперпользователя, т.к. по умолчанию в директории /var/www/ у всех остальных пользователей доступ только на "чтение":

sudo mkdir /var/www/server80

sudo mkdir /var/www/server8080

В итоге директория /var/www/ будет содержать следующие поддиректории:

Для проверки корректного конфигурирования nginx, создадим в каждой из вновь созданных директорий по простенькому файлу index.html, примерно следующего содержания:

Для директории /var/www/server80/

<html>
<meta charset="UTF-8">
<head>
	<title>Сервер 80 порта</title>
</head>
<body>
<h1>Сервер 80 порта </h1>

</body>
</html>

Для директории /var/www/server8080/

<html>
<meta charset="UTF-8">
<head>
	<title>Сервер 8080 порта</title>
</head>
<body>
<h1>Сервер 8080 порта </h1>

</body>
</html>

Создать данные файлы Вы вправе любым удобным способом (не забываем про необходимость использования привилегий суперпользователя), главное, чтобы они назывались index.html. Например, я создавал следующим образом. Сначала командой touch создал непосредственно файл index.html:

sudo touch /var/www/server80/index.html

А затем, используя редактор nano, наполнил его содержимым:

sudo nano /var/www/server80/index.html


Соответственно, аналогичные действия необходимо проделать для создания файла index.html в директории /var/www/server8080/.


Осталось самое интересное - сконфигурировать nginx для работы с двумя виртуальными серверами. И вот тут, мой дорогой читатель, я хотел бы сразу тебя предупредить, что ниже будут указаны самые базовые настройки, которые позволяют фактически "поднять" в работу два виртуальных сервера на базе nginx. И данный вариант конфигурации не закрывает все вопросы безопасности использования такого web-сервера. Nginx обладает очень гибкими настройками, и как любой подобный инструмент, обладает кучей своих нюансов и "специфичных фич", которые нужно знать, чтобы не попасть в просак. В последствии, я еще вернусь к вопросам безопасности его работы, но это будет не в этой заметке. 

Как и большинство программ в ОС Linux, сервер nginx хранит все свои конфигурационные файлы в директории /etc. А если уж совсем точнее, то в /etc/nginx. Все основные настройки собраны в самом главном конфигурационном файле - nginx.conf. Пока мы этот файл оставим без внимания - базовые настройки полностью удовлетворяют поставленной задаче.

В рамках данной заметки, нас интересует две поддиректории: sites-available и sites-enabled. Как можно понять из названий указанных директорий, в sites-available размещаются конфигурационные файлы всех возможных (допустимых) хостов (виртуальных серверов). А вот в директории sites-enabled помещаются символические ссылки на конфигурационные файлы из sites-available, которые считаются "активными". Т.е. те виртуальные серверы, которые nginx должен считать рабочими и обращения к которым он должен обрабатывать. 


После установки сервера nginx  в директории sites-available Вы найдете один единственный конфигурационный файл - default. Символическая ссылка на этот файл помещена, соответственно, в директорию sites-enabled. Наша задача, как Вы уже могли догадаться, это создать два новых конфигурационных файла в директории sites-available (по одному для каждого виртуального сервера) и разместить символические ссылки на них в директории sites-enabled.

Но самое первое, что нам необходимо сделать, это удалить символическую ссылку из sites-enabled на конфигурационный файл default. Для этого перейдем в терминале в директорию /etc/nginx/sites-enabled и выполним команду:

sudo rm default

И не забываем, что все работы на файловом уровне в данной директории должны вестись с правами суперпользователя.

Учитывая, что многие параметры конфигурации виртуальных серверов могут быть совершенно идентичными, хорошей практикой является вынесение таких параметров в отдельные файлы конфигурации и, впоследствии, включение их в нужный конфигурационный файл директивой include (как это свойственно многим языкам программирования).

В нашем конкретном случае, например, совершенно идентичными будут параметры, относящиеся к указанию страницы каталога по умолчанию (т.н. "индексная" страница). Так что давайте и вынесем эту конфигурацию в отдельный файл, а потом уже подключим его в файле конфигурации конкретного виртуального сервера.

Создавать такие общие файлы конфигурации Вы можете где угодно, главное исключить возможность доступа к ним посторонних лиц (в т.ч. "извне"). Опять же, хорошей практикой является помещение их в директории common, что будет сразу указывать, что тут располагаются общие файлы конфигурации, которые используются в нескольких местах. Поэтому, перейдем в терминале в каталог /etc/nginx и выполним следующую команду с привилегиями суперпользователя:

sudo mkdir common

Можно теперь создавать общие файлы конфигурации непосредственно в директории common, а можно немного пойти дальше и создать в ней поддиректорию, соответствующую контексту, для которого создается общий файл конфигурации. В нашем случае мы будем создать общий файл конфигурации для контекста location, который определяет "маршрутизацию", если так можно выразиться, на сервере. Поэтому перейдем в каталог /etc/nginx/common и создадим в нем поддиректорию locations следующей командой:

sudo mkdir locations

У Вас должно получиться нечто подобное:


Перейдем в созданную директорию locations и создадим файл конфигурации common.inc, в котором опишем настройки индексных страниц для наших виртуальных серверов. Проделаем манипуляции, аналогично проделанным нами ранее при создании файлов index.html. Сначала создадим сам файл командой touch:

sudo touch common.inc

А затем, используя редактор nano, внесем необходимые параметры в файл common.inc:

sudo nano common.inc

Непосредственно в качестве содержимого файла необходимо внести следующий текст:

location "/" {
        index index.html index.htm;
        try_files       $uri $uri/      =404;
}


Данные опции определяют (опция index) в качестве индексных файлов корневого каталога два вида файла: index.html и index.htm. А так же устанавливают (опция try_files), что nginx должен проверить существование запрашиваемого файла или каталога и, в случае неуспеха, вернуть ошибку "404" (страница не найдена).

Не забываем сохранить внесенные изменения в файл common.inc и переходим в директорию /etc/nginx/sites-available.

В данном каталоге нам необходимо уже создать два конфигурационных файла, отвечающих за наши виртуальные сервера. 

Первым создадим конфигурационный файл для виртуального сервера, который будет располагаться на стандартном 80-м порту. Уже знакомой нам командой touch сначала создадим файл server80:

sudo touch server80

А затем, используя редактор nano, внесем требуемые параметры:

server {
        listen  80;
        root    /var/www/server80;
        server_name     _;
        include common/locations/*.inc;
}


Полагаю, тут комментарии излишни.

Теперь создадим конфигурационный файл для второго виртуального сервера, который будет располагаться на порту 8080. Аналогично только что проделанной работе, командой touch создадим файл server8080:

sudo touch server8080

И снова воспользуемся редактором nano, чтобы внести необходимые параметры создаваемого виртуального сервера:

server {
        listen  8080;

        allow   192.168.1.53;
        deny    all;

        root    /var/www/server8080;
        server_name     _;
        include common/locations/*.inc;
}


Наблюдательный читатель мог заметить, что помимо измененного номера порта, который будет слушать nginx, и главной (root) директории виртуального сервера, в конфигурации появились еще две строчки:

        allow   192.168.1.53;
        deny    all;

Для чего они? Благодаря этим параметрам, мы ограничиваем круг ip-адресов с которых можно зайти на данный виртуальный сервер, только одним адресом внутренний сети - 192.168.1.53 (компьютер, с которого я в основном работаю с raspberry pi). Все попытки обратиться к нему с других адресов, nginx будет беспощадно пресекать посылая сообщение со статусом 403 (Forbidden). Это очень удобная и очень важная с точки зрения базовой сетевой безопасности настройка. Особенно, если в итоге Вы планируете сделать свой web-сервер публичным. Если же для Ваших целей это лишнее, можете просто проигнорировать эти две строчки :))).

Чтож, мы создали два конфигурационных файла для двух разных виртуальных серверов. Осталось дело за малым: создать символические ссылки на эти файлы в директории sites-enabled (см. выше) и дать команду nginx перечитать конфигурацию.

Перейдем в директорию sites-enabled:

cd /etc/nginx/sites-enabled/

и последовательно введем команды:

sudo ln -s /etc/nginx/sites-available/server80 /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/server8080 /etc/nginx/sites-enabled/

Для верности убедимся, что все прошло успешно и наши ссылки на месте, введем команду ls:

ls

В окне терминала Вы должны увидеть список из двух файлов, как на скриншоте ниже:


Ну, а теперь, момент истины - даем команду nginx перечитать конфигурационные файлы:

sudo nginx -s reload


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

И, конечно же, самое ожидаемое - проверка работоспособности. Наберите сначала в браузере просто IP-адрес вашей "малинки" (в моем случае это - 192.168.1.71). Вы должны увидеть нечто подобное:

А потом дополните IP-адрес в конце символом ":" и тестом "8080" (например, http://192.168.1.71:8080):


Если вашему взору предстала аналогичная картина - поздравляю, Вы все сделали правильно :))).


А на сегодня это все. В следующий раз мы добавим нашему веб-серверу "динамичности" - "прикрутим" к нему движок PHP, что позволит создавать динамические сайты, либо сразу установить полноценную CMS.



 



Комментариев нет:

Отправить комментарий