CentOS, NGINX, Ubuntu, Веб Сервер        15 сентября 2019        28         0

Установка веб сервера NGINX + PHP7 + Let’s Encrypt + Certbot + HTTP/2 на Ubuntu 18 или Centos 7

В этой статье мы с вами разберём как установить веб сервер Nginx и получить на выходе эффективный рабочий веб сервер Nginx который работает по HTTPS в связке с PHP.

Содержание скрыть

Введение

Цель

Цель данной статьи получить на выходе эффективный рабочий веб сервер Nginx который работает по HTTPS в связке с PHP.

В этой статье мы не будем настраивать базу данных т.к. установка БД не зависит не от Nginx не от PHP и БД всегда можно в будущем установить и настроить. PHP также можно не устанавливать т.к. он работает в дополнение к Nginx, но т.к. настройка их совместной работы задевает конфигурационные файлы как Nginx так и PHP то я считаю, что устанавливать и настраивать их нужно вместе. Далее все конфигурации я буду отображать СРАЗУ с настройками данной связки.

Действующие лица

NGINX — программа «веб сервер». Даёт возможность «показывать» сайты с вашего сервера. Его задача принять и отдать данные вашему браузера.

PHP — препроцессор PHP кода. Нужен тогда когда, это нужно для вашего сайта. Для Nginx мы устанавливаем один из вариантов PHP который имеет название PHP-FPM ( PHP FastCGI Process Manager). Стоит в сторонке и ждёт когда Nginx передаст ему файлы на обработку.

Firewall — может испортить нам вечеринку если мы забыли его настроить. Он открывает или закрывает сетевые порты нашего сервера.

Доменное имя — необходимо если хотите, чтобы для доступа к сайту в браузере писали не ip адрес, а нормальное имя.

Сертификаты безопасности — нужны если хотите, чтобы ваш сайт работал по зашифрованному каналу HTTPS.

Let’s Encrypt Service + Certbot — их задача переодически генерировать нам доверенные сертификаты для нашего доменного имени. Нужен если вы хотите чтобы ваш сайт работал по HTTPS без уведомления в браузере, что данный сайт имеет не доверенный сертификат.

Перед установкой

Данные вашего сервера которые нужно знать\собрать:

  • какой именно firewall установлен и установлен ли он вообще
  • ip адрес нашего сервер
  • доменное имя (желательно, но не обязательно) нашего будущего сайта
  • проверить не установлен ли apache и если установлен то читаем тут как полностью его удалить

Действия которые мы должны знать и уметь делать

  • работать с командной строкой
  • устанавливать программы
  • пользоваться тестовым редактором nano или любым другим
  • знать как устроены конфигурационные файлы программ
  • знать что такое файл и папка
  • понимать понятие «прав доступа» в Linux
  • знать, что такое «доменное имя»
  • понимать разницу между HTTP и HTTPS
  • не бояться, не пугаться и не ругаться

Советы и рекомендации перед началом.

Если хотите, чтобы у вас всё заработало, то вам нужно придерживаться следующих правил

  1. Выполнять настройку ТОЛЬКО по данной инструкции от начала и до необходимого вам конца. Не нужно начинать процесс по инструкции с одного сайта, делать середину с этого, а заканчивать инструкцией с третье. Это верный путь ведущий в никуда.
  2. Всё делать последовательно. Делать от НАЧАЛА, а не от середины.
  3. После каждого нового действия нужно обязательно сделать проверку, чтобы понимать, что на данном этапе вы всё сделали правильно. Это очень важно т.к. как только проверка показала «что-то не то» вы не идёте дальше, а пытаетесь понять, что произошло не так.
  4. Не получилось в конце? Значит не следовали первым трём правилам.

Начинаем )

Установка NGINX + PHP7

Всё начинается как обычно с установки необходимых нам программ.

Команды установки для Ubuntu

или если у вас Centos.

Итак, что мы сделали. Мы установили две программы на наш сервер. Программу Nginx и PHP-FPM. Сейчас вам нужно понять, что это две разные программы у каждой свои задачи. Каждая из этих программ может работать сама по себе не зависимо от другой, но в нашем решение мы будем использовать их вместе.

Давайте посмотрим, что произошло после установки программы Nginx. Как было сказано выше это программа «веб сервер» и её главная задача отвечать на запросы браузеров и передавать им информацию с вашего сервера. После установки у вас на сервере создались две основные папки которые требуют особого внимания:

/etc/nginx/ — в этой папке хранятся настройки программы Nginx. Всё что отсносится к тому КАК будет работать ваш сервер храниться в конфигурационных файлах в этой директории.

/var/www/html/ — эта директория в которой Nginx будет искать файлы для передачи их браузеру при запросе. Почему эта директория, а не другая? Потому, что именно она указана по умолчанию при установке программы Nginx в его настройках. Конечно её можно изменить при необходимости.

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

После установки сразу проверяем запустились ли наши новые сервисы.

Сервис Nginx проверяем командой

и мы получим следующий вывод

Как видно из вывода выше, сервис запущен и работает. Можно проверить на каком порту работает Nginx командой

получаем вывод

мы видим, что Nginx работает на 80 порту.

Теперь проверим PHP-FPM

и получаем следующий вывод

Вам нужно убедиться, что установка у вас прошла успешно и эти две программы запущены и работают. Убедились? Тогда идём дальше.

Настройка фаервола

Сразу после установки того или иного сервиса необходимо для надёжности настроить firewall. Чаще всего мы встретим либо ufw либо firewall-cmd либо ничего из этого.

Внимание! Эти действия можно можно пропустить, если у вас отключён фаервол. Вы всегда можете к ним вернуться и настроить в любой момент. Я написал о них в начале т.к. если вдруг у кого-то сервер с включённым фаерволом, то пока мы не добавим разрешения подключаться к портам 80 и 443 мы не проверим работу нашего «веб сервера» с помощью браузера.

ufw — фаервол от DigitalOcean

Если у вас установлен ufw то при установки Nginx это определит и сам о себе позаботится путём регистрации себя в сервисах ufw. Конечно мы всегда всё должны сами перепроверить =) Посмотрим список правил\профилей ufw

Среди них найдём правила которые относятся к Nginx

Как видно из этого вывода, Nginx «прописал» для себя 3 правила:

  • Nginx Full: этот профиль открывает порты 80 (обычный, не шифрованный веб-трафик) и 443 (трафик шифруется с помощью TLS/SSL)
  • Nginx HTTP: этот профиль открывает только порт 80 (обычный, не шифрованный веб-трафик)
  • Nginx HTTPS: этот профиль открывает только порт 443 (трафик шифруется с помощью TLS/SSL)

Список который мы видим говорит о наличие правил, но правила нужно активировать\применить. Мы с вами активируем правило «Nginx Full». Делаем это с помощью команды:

Как обычно сразу проверяем

Мы получим список активных правил и среди них мы увидим следующие строчки.

firewall-cmd

У этого фаервола список команд следующий:

и обязательно сразу проверяем командой

нормальный вывод будет в котором должно быть следующий два слова.

Если нам попалось «ничего»

В таком случае, мы либо установим фаервол на выбор из двух верхних, либо настроем сами правила iptables.

Проверка работы веб-сервера

Наберите полученный IP адрес или доменное имя в вашем веб-браузере.

http://ваш_ip_адрес/

У вас должна открыться страница с текстом.

Если вы видите подобную страницу в своём браузере, это означает, что

  • вы успешно установили Nginx
  • у вас правильно настроен ваш фаервол (как минимум для 80-го порта)

Настройка PHP

Nginx у нас работает, но нам нужно «прикрутить» его (ну или к нему) PHP. Для совместной работы PHP с Nginx нам нужно выполнить пару настроек в двух конфигурационных файлах.

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

nano /etc/php/7.2/fpm/pool.d/www.conf

а также в файле найти и отредактировать данные параметры.

nano /etc/php/7.2/fpm/php.ini

если у вас другая часовая зона, то вам нужно указать её вместо «Europe/Moscow»

После этого нам нужно перезагрузить сервисы PHP

Подкрутим файл конфигурации для сайта по умолчанию, чтобы он работал с PHP.

Прежде чем что-то добавлять или менять нужно знать, что после установки NGINX имеет файл конфигурации для одного сайта. Настройки хранятся в файле

/etc/nginx/sites-available/default

Именно благодаря этому файлу мы и можем видеть текст при переходе через браузер на ip адрес нашего сервера. Если посмотреть в конфигурацию данного файле, то там будет указано, что файлы сайта хранятся в директории /var/www/html/

Если вам нужен только один сайт, то можно ничего не усложнять и файлы вашего сайта скопировать в данную директорию.

Для того, чтобы Nginx начал работать совместно с PHP надо указать в настройках сайта, чтобы файлы с расширением .php перенаправлялись в PHP-FPM. Для этого приведём к следующему виду данный блок кода в файле

nano /etc/nginx/sites-available/default

Проверяем нашу работу.

Теперь надо проверить работу php. Для этого в папке /var/www/html/ создадим файл index.php с нужным нам содержимым

Перезагрузим наш Nginx

если всё сделали правильно то получим следующий вывод

затем в браузере наберём следующий путь

http://ваш_ip_адресс/index.php

У вас должна открыться страница которая начинается следующим образом

если видим эту картину, то мы понимаем что в данный момент всё сделали правильно.

Что мы имеем на данный момент.

На данном этапе мы имеем рабочий вариант веб сервера который может отработать статические страницы c php кодом внутри. Для некоторых задач этого будет достаточно и возможно не потребуется делать, что-то дальше. Вы можете скопировать файлы сайта в директорию /var/www/html/ и ваш сайт будет работать.

Если для вашей задачи этого достаточно то вы можете остановиться и дальше ничего не делать. Ну а если нет то мы будем проводить «нормальную» настройку, которая более сложная, но на выходе мы получим более эффективное решение. Вот, что мы получим если продолжим настраивать наш веб сервер.

  • работа по новому протоколу HTTP\2
  • работа по защищённому протоколу HTTPS
  • более удобную структуру директорий
  • возможность быстро добавлять новые сайты на наш сервер

Настройка нашего веб сервера NGINX

Мы переходим к более сложной части, это настройка нашего веб сервера. Настройка осуществляется путём редактирования специальных конфигурационных файлов. Настройки NGINX я разделяю два типа:

  • настройка главного сервиса NGINX
  • настройка файлов серверных блоков = сайтов

Настройка главного сервиса NGINX

«Договариваем на берегу» о структуре которая у нас будет. Вы должны точно понимать какая у Вас структура и знать за, что отвечает та или иная директория или файл. Я считаю, что это очень важный момент и понимание которого позволит вам в будущем легко находить причины той или иной проблемы.

Структура директорий и файлов веб сервера

Самая главная папка с которой всё начинается и в которой хранятся все файлы конфигурации это:

/etc/nginx/

Давайте пройдёмся по ключевым файлам и директориям которые находятся в этой папке:

  • /etc/nginx/nginx.conf — Главный файл конфигурации веб сервера Nginx. При запуски программы именно с него начинается загрузка конфигурации Nginx.
  • /etc/nginx/sites-available/ — В этой директории мы будем хранить конфигурации для каждого сайта. Каждый сайт в отдельном файле.
  • /etc/nginx/sites-enabled/ — Это интересная директория в которую мы будем прикреплять символьные ссылки на файлы конфигурации из директории /etc/nginx/sites-available/. Зачем так усложнять спросите вы? Всё дело в том, что в дальнейшем мы укажем в главном конфигурационном файле Nginx подгружать все файлы из директории /etc/nginx/sites-enabled/. Так вот в папке sites-available мы храним настроенные конфигурации сайтов и методом создания ссылок мы как бы включаем только те конфигурационные файлы которые нам нужны. Это даёт возможность все настройки так же хранить в одной место и выборочно подключать только те которые нам нужны. По этому мы создаём, редактируем в папке sites-available, но Nginx их не видит, а подгружает в себя только то, что мы «залинковали» в папку sites-enabled. Как то так…

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

/etc/nginx/ownconfig/

В этой директории у нас будут находится следующие файлы с кусками конфигураций:

  • /etc/nginx/ownconfig/letsencrypt.conf — в этом файле мы опишем блок кода необходимый для получения сертификатов безопасности.
  • /etc/nginx/ownconfig/security.conf — тут будут храниться настройка SSL.
  • /etc/nginx/ownconfig/php_fastcgi.conf — этот файл для настроек php-fpm.
  • /etc/nginx/ownconfig/general.conf — В этом файле мы будет хранить шаблоны настроек которые можно применять к каждому отдельному сайту. Нужен для того, чтобы мы не прописывали многие шаблонные настройки в каждый конфигурационный файл отдельного сайта.

Файлы логирования нашего веб сервера Nginx

  • /var/log/nginx/access.log — в этом файле будет храниться лог запросов от браузеров на веб сервер. Ответы веб сервера хранятся тоже тут.
  • /var/log/nginx/error.log — в этот файл будет сохранятся ошибки. Если вдруг Nginx не запустился то нужно искать причину именно здесь. Очень важный файл.

Структура директории для файлов сайта.

Структура директорий где будут храниться непосредственно файлы нашего\наших сайтов будет следующей. Всё будет начинаться с этой папки.

/mnt/srv/www/

Внутри каждый сайт будет иметь директорию со своим имен. Например для сайта «ownsite.site» мы создадим директорию

/mnt/srv/www/ownsite.site/

Внутри директории сайта будет находится две папки

  • /mnt/srv/www/ownsite.site/public/ — точка отсчёта нашего сайта. Здесь будет наш index.html или index.php и все остальные файлы и каталоги нашего сайта.
  • /mnt/srv/www/ownsite.site/log/ — здесь будут храниться логи только сайта ownsite.site

И именно в такой структуре мы будет добавлять ещё сайты если нам понадобиться.

Приступаем к настройке

Сразу отключим файл конфигурации по умолчанию /etc/nginx/sites-available/default 

Создадим директорию где будем хранить наши «куски» конфигураций

также создадим директорию на будущее которая нам понадобиться для получения сертификата SSL и сразу присвоим этой директории нужные права

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

Cоздадим файл который нам также понадобится для работы HTTPS

увидите как бегут точки ) это нормально и вам нужно подождать пока они перестанут бегать.

Теперь можно приступать к конфигурационным файлам Nginx

nano /etc/nginx/ownconfig/security.conf

nano /etc/nginx/ownconfig/php_fastcgi.conf

nano /etc/nginx/ownconfig/general.conf

nano /etc/nginx/ownconfig/letsencrypt.conf

Далее можно начинать настройку основного конфигурационного файла.

Давайте переименуем действующий файл под другим именем, чтобы если что-то пойдёт не так, мы всегда могли его вернуть.

Ниже привожу мой пример главного конфигурационного файла. Считаю его оптимальным и универсальным. Конечно если хотите то можете его «подкрутить» под себя.

nano /etc/nginx/nginx.conf

Настройка серверных блоков.

Для удобства управления каждый сайт нужно выделать в отдельные конфигурационные файлы. Все эти файлы должны находится директории /etc/nginx/sites-available/ и заканчиваться на .conf

Настройка другого\нового серверного блока = сайта

Создадим директории для ownsite.site

Далее настроим права доступа для созданной директории для пользователя www-data

Теперь права должны для корневой директории быть настроены правильным образом при условии, что вы не меняли своё значение umask. На всяких случай мы можем удостовериться в этом командой:

Далее создадим файл index.php с нужным для проверки содержимым:

Cоздадим новый конфигурационный файл для нашего будущего сайта

nano /etc/nginx/sites-available/ownsite.site.conf

Скопируйте следующий текст настроек серверного блока в созданный файл:

В этом файле вам везде нужно заменить «ownsite.site» на ваше доменное имя.

Теперь активируем файл путём создания ссылки на него в директории /etc/nginx/sites-enabled/, которую Nginx проверяет при старте:

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

Новый сервисный блок будет работать только после перезагрузки Nginx.

На данном этапе наш веб сервер запуститься, но при попытке зайти на наш сайт через браузер, браузер будет выдавать ошибку «ERR_SSL_PROTOCOL_ERROR». Это связанно с тем, что все запросы на сервер перенаправляются на 443 порт HTTPS, а т.к. мы ещё не получили сертификаты, то дальше браузер будет выдавать ошибку. Но нам сейчас нужно чтобы наш веб сервер работал, чтобы мы могли получить сертификаты.

Финишная прямая. HTTPS на NGINX для вашего сайта

Мы добрались до HTTPS… сразу скажу, что в данный блок возможно вам зайдёт не сразу, но я попробую вам его разжевать.

Самое главное для того, чтобы наш сайт работал по протоколу HTTPS мы должны нашему веб серверу предоставить сертификаты безопасности. Это специальные файлЫ с определённым текстом внутри. Эти сертификаты можно получить несколькими способами:

  • Сгенерировать\создать вручную
  • Купить у сервисов которые продают сертификаты
  • Получить бесплатные с помощью сервиса Let’s Encrypt

Кода мы говорим в контексте интернета и сайтов, существует два вида сертификатов.

  • доверенные
  • сюрприз… не доверенные

Доверять или не доверять сертификату решаете не вы, а ваш браузер. Когда браузер пытается зайти на сайт по защищённому протоколу HTTPS он запрашивает сертификат безопасности от сервера. Сервер передаёт сертификат браузеру и браузер решает доверять сертификату или нет. Его решение основывается на том кто именно создал этот сертификат. Если его создал тот кому браузер доверяет, то тогда браузер считает этот сертификат доверенным и продолжает работу без всяких проблем. Ну а если он не доверяет тому кто его создал, то вы увидите предупреждение от браузера, что данный сертификат не является одобренным и для перехода на такой сайт браузер потребует от вас подтвердить желание перейти на него. Визуально это выглядит вот так:

Думаю вы встречали такое сообщение от браузера когда пытались зайти на некоторые сайты. Вообщем нам для нашего сайта такое не нужно и для этого мы можем либо купить сертификаты либо воспользоваться специальным сервисом Let’s Encrypt который предоставляет возможность получать каждые три месяца сертификаты которым доверяют все браузеры. Самодельные сертификаты всегда для браузера будут не доверенными и по этому я не буду описывать данный вариант. Также я не буду рассказывать вариант с покупкой сертификата… возможно в будущем напишу. Наша цель с вами получать бесплатный сертификат )

Для браузера доверительный сертификат безопасности всегда связан с доменным именем. Без доменного имени вы можете использовать только самодельные сертификаты. Значит перед тем как переходить дальше у вас должно быть доменное имя, а также были правильно настроены DNS записи для вашего доменного имени. Проверка достаточно проста, командой

у вас должен быть ответ от ip адреса вашего сервера.

Убедитесь в том, что ip адрес который отображён в выводе команды ping совпадает с ip адресом вашего сервера. Если не совпадает то вам нужно найти причину и разобраться с ней.

Точно такую же проверку вам нужно сделать для домена www.ownsite.site потому, что фактически ownsite.site и www.ownsite.site это два разных домена и нам нужно будет для них два разных сертификата =)

Установка Certbot

Установим Certbot привычными нам командами для Ubuntu

или для Centos

Получаем сертификаты

Команда на получение сертификатов для нашего домена

Тут внимание! Для того, чтобы команда выполнилась успешно, но чтобы она могла подключиться к вашему серверу по доменным именам которые были указаны в параметрах. Чтобы операция прошла наверняка поднадобится время пока ваше доменное имя зарегистрируется на нужных DNS серверах. Вы можете получать ошибки типа если ваши доменные имена не зарегистрировались на нужных DNS серверах.

Даже если вы успешно пингуете свой сервер по доменному имени не факт, что всё пройдёт успешно. Иногда нужно подождать. Иногда нужно подождать довольно долго т.е. несколько часов или сутки. Бывает и такое.

После того как всё прошло успешно вы увидите следующий вывод

Увидели? Это очень хорошо и можем двигаться дальше.

На будущее сразу добавим скрипт который после получения нового сертификата будет перезагружать наш Nginx. Он нужен потому, что когда у вас измениться сертификат на новый сервер Nginx пока не перезагрузится будет работать со старым сертификатом, даже если его уже нету.

Далее проверим появились ли наши сертификаты в папке

/etc/letsencrypt/live/ownsite.site/

У нас там должно быть четыре файла один в один как на примере выше.

Если они на месте это значит, что мы процедура получения сертификатов прошла успешна и дальше нам нужно вернуть параметры в конфигурации нашего сайта у Nginx которые мы немного раньше закомментировали.

Делаем это командой

и опять т.к. мы изменили настройки в конфигурационных файлах мы перезагружаем наш сервер

После перезагрузки проверяем, что всё у нас работает. Проверку делаем попыткой зайти на наш сайт через браузер. Мы должны убедиться, что сайт работает через HTTPS, для этого убедимся о наличие замочка в адресной строки браузера как на картинке.

Сайт использует нормальный сертификат безопасности

Если замочек на месте, то мы всё сделали правильно и мы наконец завершили настройку нашего сервера. Нам осталось провести некоторые небольшие процедуры с нашим сервером на будущее, чтобы всё работало как часы и не требовалось от наш дальнейшего вмешательства.

Добавляем проверку сертификатов в Cron

Как уже было сказано выше сервис Let’s Encrypt будет выдавать сертификаты сроком действия на 3 месяца. Чтобы получить новые сертификаты вам надо вручную делать запрос на сервис. Мы можем автоматизировать этот процесс если добавим в планировщик задач Cron задание на периодический запрос новых сертификатов.

Сначала нам нужно открыть файл заданий Cron

Если вы первый раз запускаете эту команду то вас спросят каким текстовым редактором вы будете редактировать файл конфигурации планировщика

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

Проверим всё ли вы правильно сделали командой

вы увидите вывод где в самом низу будет ваша добавленная строчка. Если она там то значит вы всё сделали правильно.

Теперь ваш сервер будет переодически запрашивать новые сертификаты и как только сервис Let’s Encrypt посчитает нужны выдать вам новые, программа Certbot загрузит их на сервер и перезагрузит Nginx уже с новыми сертификатами.

Управление процессом Nginx

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

Для остановки веб-сервера используйте команду:

Для запуска остановленного веб-сервера наберите:

Для перезапуска веб-сервера можно использовать следующую команду:

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

По умолчанию Nginx настроен на автоматический старт при запуске сервера. Если такое поведение веб-сервера вам не нужно, вы можете отключить его следующей командой:

Для повторного включения запуска Nginx при старте сервера введите:

Tweaks

Redirect All HTTP \ NGINX

Благодарности

Спасибо сервису https://nginxconfig.io/ у которого я подсмотрел интересную для меня структуру дополнительных файлов Nginx, а также многие команды.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *