Как настроить LEPP-стек с двумя узлами на CentOS 7

Вступление

Современные веб-приложения с высоким трафиком оснащены гладкими и быстродействующими веб-серверами, масштабируемыми базами данных корпоративного класса и динамическим контентом, обслуживаемым многофункциональными языками сценариев. Типичный стек веб-приложений для Linux соответствует архитектуре LAMP (Linux, Apache, MySQL и PHP / Python). Широко доступные учебники показывают, как эти компоненты могут быть установлены и настроены на одном сервере.

Это редко имеет место в реальной жизни. При профессиональной трехуровневой настройке серверная часть базы данных будет изолирована на своем собственном сервере; веб-сервер будет отправлять свои запросы на уровень приложений, выступающий в качестве промежуточного программного обеспечения между базой данных и веб-сайтом.

Хотя Apache по-прежнему является наиболее широко используемым веб-сервером, Nginx быстро завоевал популярность благодаря небольшому размеру и быстрому отклику. MySQL Community Edition по-прежнему является популярным выбором для баз данных, но многие сайты также используют другую платформу базы данных с открытым исходным кодом под названием PostgreSQL.

цели

В этом уроке мы создадим простое веб-приложение в двухуровневой архитектуре. Нашей базовой операционной системой для обоих узлов будет CentOS 7. Сайт будет работать на веб-сервере Nginx с PHP-кодом, который общается с базой данных PostgreSQL.

Вместо того, чтобы использовать подход «сверху вниз», который можно увидеть в других руководствах по LAMP или LEMP, мы будем использовать подход «снизу вверх»: сначала мы создадим уровень базы данных, затем веб-сервер, а затем посмотрим, как веб-сервер может подключиться. в базу данных.

Мы будем называть эту конфигурацию стеком LEPP (Linux, Nginx, PHP, PostgreSQL).

Предпосылки

Чтобы следовать этому уроку, вам понадобится следующее:

  • Две капли CentOS 7 с минимум 2 ГБ ОЗУ и 2 ядрами ЦП, по одному для сервера базы данных и веб-сервера.

Мы будем ссылаться на IP-адреса этих машин как ` и ` соответственно; Вы можете найти фактические IP-адреса этих машин на панели управления DigitalOcean.

  • Судо не-root пользователи на обеих каплях. Чтобы настроить это, следуйте th этот учебник.

Шаг первый - установка PostgreSQL

На этом этапе мы установим PostgreSQL на сервер базы данных.

Подключитесь к пустой, недавно установленной коробке CentOS 7, где вы хотите установить PostgreSQL. Его репозиторий не поставляется с CentOS 7 по умолчанию, поэтому сначала нам нужно загрузить RPM-репозиторий yum.

sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm

После сохранения RPM установите репозиторий.

sudo yum install pgdg-centos94-9.4-1.noarch.rpm -y

Наконец, установите сервер PostgreSQL 9.4 и его модули contrib.

sudo yum install postgresql94-server postgresql94-contrib -y

Шаг второй - Настройка PostgreSQL

На этом шаге мы настроим ряд постустановочных конфигураций для PostgreSQL.

В CentOS 7 расположение файлов данных и конфигурации PostgreSQL 9.4 по умолчанию - + / var / lib / pgsql / 9.4 / data / +, а расположение двоичных файлов программы - + / usr / pgsql-9.4 / bin / + , Каталог данных пуст в начале. Нам нужно запустить программу + initdb +, чтобы инициализировать кластер базы данных и создать в нем необходимые файлы:

sudo /usr/pgsql-9.4/bin/postgresql94-setup initdb

После инициализации кластера базы данных в папке данных будет находиться файл с именем + postgresql.conf +, который является основным файлом конфигурации для PostgreSQL. Мы изменим два параметра в этом файле. Используя + vi + или ваш любимый текстовый редактор, откройте файл для редактирования.

sudo vi /var/lib/pgsql/9.4/data/postgresql.conf

И измените следующие строки:

  • Измените + listen_addresses = '' + на + listen_addresses = '*' +

  • Измените + port = 5432 + на + port = 5432 +

Первый параметр указывает, какой IP-адрес будет прослушивать сервер базы данных. В качестве меры безопасности при стандартной установке Postgres разрешены только локальные хост-соединения. Если изменить это значение на «*», Postgres будет прослушивать трафик из любого источника. Второй параметр был включен, сняв маркер комментария (#); он определяет порт по умолчанию для Postgres.

Сохраните и выйдите из файла.

Далее мы отредактируем + pg_hba.conf +, который является файлом конфигурации PostgreSQL для Host Based Access (HBA). Он указывает, какие хосты и диапазоны IP-адресов могут подключаться к серверу базы данных. Каждая запись указывает, может ли соединение быть установлено локально или удаленно (хост), к какой базе данных оно может подключиться, к какому пользователю оно может подключиться, с какого IP-блока может поступить запрос и какой режим аутентификации следует использовать. Любые запросы на подключение, не соответствующие ни одной из этих записей, будут отклонены.

Откройте + pg_hba.conf для редактирования.

sudo vi /var/lib/pgsql/9.4/data/pg_hba.conf

Прокрутите до конца файла и добавьте эту строку:

host        all             all             /32          md5

Эта строка указывает PostgreSQL принимать подключения к базе данных, исходящие только с IP-адреса ++, используя стандартную контрольную сумму md5 для аутентификации по паролю. Соединение может быть установлено с любой базой данных как любой пользователь.

Сохраните и выйдите из файла.

Затем запустите сервис Postgres:

sudo systemctl start postgresql-9.4.service

А затем включите его:

sudo systemctl enable postgresql-9.4.service

Чтобы проверить, принимает ли сервер баз данных соединения, мы можем посмотреть последние несколько строк последнего файла журнала Postgres. Журналы ошибок базы данных сохраняются в каталоге + / var / lib / pgsql / 9.4 / data / pg_log +. Выполните следующую команду, чтобы увидеть файлы в этом каталоге.

sudo ls -l /var/lib/pgsql/9.4/data/pg_log

Имена файлов журналов имеют шаблон + postgresql-.log + (например, + postgresql-Wed.log +). Найдите файл журнала, соответствующий текущему дню, и посмотрите последние несколько строк последнего файла журнала.

sudo tail -f -n 20 /var/lib/pgsql/9.4/data/pg_log/postgresql-.log

Вывод должен показать что-то похожее на это:

...

< 2015-02-26 21:32:24.159 EST >LOG:  database system is ready to accept connections
< 2015-02-26 21:32:24.159 EST >LOG:  autovacuum launcher started

Нажмите * CTRL + C *, чтобы остановить вывод команды + tail +.

Шаг третий - Обновление брандмауэра сервера базы данных

Нам также необходимо разрешить прохождение трафика базы данных Postgres через брандмауэр. CentOS 7 реализует динамический межсетевой экран с помощью демона + firewalld +; службе не нужно перезапускаться, чтобы изменения вступили в силу. Сервис + firewalld + должен запускаться автоматически во время загрузки системы, но всегда полезно проверить.

sudo firewall-cmd --state

Состояние по умолчанию должно быть + выполняется, но если оно` + не выполняется`, запустите его с:

sudo systemctl start firewalld

Далее добавьте правила для порта 5432. Это порт для трафика базы данных PostgreSQL.

sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp

Затем перезагрузите брандмауэр.

sudo firewall-cmd --reload

Шаг четвертый - Создание и заполнение базы данных

На этом этапе мы создадим базу данных и добавим в нее некоторые данные. Это данные, которые наше веб-приложение будет динамически извлекать и отображать.

Первым шагом является изменение пароля суперпользователя Postgres, называемого * postgres *, который создается при первой установке PostgreSQL. Лучше всего, чтобы пароль пользователя изменялся в Postgres, а не в приглашении ОС. Для этого переключитесь на пользователя * postgres *:

sudo su - postgres

Это изменит командную строку на + -bash-4.2 $ +. Далее запустите встроенный клиентский инструмент.

psql

По умолчанию это регистрирует пользователя postgres в базе данных Postgres. Ваше приглашение изменится на + postgres = # +, приглашение psql, а не приглашение ОС. Выполнение команды + \ password + сейчас приведет к появлению запросов на изменение пароля.

\password

Укажите безопасный пароль для пользователя Postgres.

Затем создайте базу данных с именем * product *:

CREATE DATABASE product;

Затем подключитесь к базе данных * product *:

\connect product;

Затем создайте таблицу в базе данных с именем * product_list *:

CREATE TABLE product_list (id int, product_name varchar(50));

Выполните каждую из следующих команд по одной за раз. Каждая команда добавляет одну запись в таблицу + product_list +.

INSERT INTO product_list VALUES (1, 'Book');
INSERT INTO product_list VALUES (2, 'Computer');
INSERT INTO product_list VALUES (3, 'Desk');

Наконец, проверьте, что данные были добавлены правильно.

SELECT * FROM product_list;

Вывод должен выглядеть так:

id | product_name
----+--------------
 1 | Book
 2 | Computer
 3 | Desk
(3 rows)

Это все, что нам нужно сделать на сервере базы данных; Теперь вы можете отключиться от него.

Шаг пятый - Установка Nginx

Далее мы установим и настроим веб-сервер Nginx в другой Droplet. Подключитесь к другой пустой, недавно установленной коробке CentOS 7.

Как и PosgreSQL, репозиторий Nginx не поставляется с CentOS 7 по умолчанию. Сначала нам нужно будет загрузить RPM для репозитория yum.

sudo wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

После сохранения RPM установите репозиторий.

sudo yum install nginx-release-centos-7-0.el7.ngx.noarch.rpm -y

Наконец, установите веб-сервер Nginx.

sudo yum install nginx -y

Шаг шестой - Обновление брандмауэра веб-сервера

На этом этапе мы настроим брандмауэр для разрешения трафика Nginx и настроим некоторые конфигурации Nginx.

Нам нужно разрешить HTTP / HTTPS-трафику проходить через брандмауэр. Как и прежде, убедитесь, что служба + firewalld + работает.

sudo firewall-cmd --state

Состояние по умолчанию должно быть + running +, но если оно + не работает +, запустите его:

sudo systemctl start firewalld

Теперь добавьте правило брандмауэра для порта 80 (HTTP):

sudo firewall-cmd --permanent --zone=public --add-port=80/tcp

Добавьте еще один порт 443 (HTTPS):

sudo firewall-cmd --permanent --zone=public --add-port=443/tcp

Затем перезагрузите брандмауэр.

sudo firewall-cmd --reload

Далее запустите Nginx.

sudo systemctl start nginx.service

И включите его.

sudo systemctl enable nginx.service

При указании нашим браузером IP-адреса сервера должна появиться веб-страница по умолчанию:

изображение: https: //assets.digitalocean.com/articles/LEPP_CentOS7/1.jpg [веб-страница по умолчанию, обслуживаемая Nginx]

Шаг седьмой - Настройка Nginx

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

Общий файл конфигурации контролирует общие характеристики сервера. Nginx может обслуживать множество веб-сайтов, и каждый сайт называется блоком сервера (Apache называет их виртуальными хостами или vhosts). Конфигурация каждого сайта контролируется файлом конфигурации блока сервера.

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

sudo vi /etc/nginx/nginx.conf

Во второй строке файла измените параметр + worker_processes + с 1 на 2. Это говорит рабочим потокам Nginx использовать все доступные ядра ЦП. Сохраните и выйдите из файла.

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

sudo vi /etc/nginx/conf.d/default.conf

Содержание выглядит так. Части, которые вы будете редактировать, будут выделены.

server {
   listen       80;
   server_name  ;

   ...


       root   /usr/share/nginx/html;
       ;


   #error_page  404              /404.html;

   ...

   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
   #
   location ~ \.php$ {

       fastcgi_pass
       fastcgi_index        index.php;
       fastcgi_param        SCRIPT_FILENAME $fastcgi_script_name;
       include              fastcgi_params;
   }

...
}

Сделайте следующие правки:

  • Установите + server_name + из + localhost + в ++.

  • Добавьте + index.php к директиве` + index + , чтобы она читала + index.php index.html index.htm`.

  • Удалите строки + location / {+ и +} +, содержащие директивы + root и` + index`. Без этого изменения вы можете обнаружить, что ваша веб-страница не отображается в браузере и сообщения записи журнала ошибок Nginx, такие как `" Невозможно открыть основной скрипт: /etc/nginx/html/index.php (Нет такого файла или каталога) " `

  • Раскомментируйте блок + location ~ \ .php $ + (включая последнюю фигурную скобку) под * передачей сценариев PHP в комментарий FastCGI server *.

  • Удалите корневую директиву в том же блоке + location ~ \ .php $ +.

  • Измените значение директивы fastcgi_pass с +127.0.0.1: 9000 + на + unix: / var / run / php-fpm / php5-fpm.sock +. Это сделано для того, чтобы PHP FastCGI Process Manager (который мы установим на следующем шаге) будет прослушивать сокет Unix.

  • Измените значение директивы te + fastcgi_param + на + SCRIPT_FILENAME $ document_root $ fastcgi_script_name +. Это сообщает веб-серверу, что файлы сценариев PHP будут сохранены в корневом каталоге документа.

Как только вы закончите редактирование, файл должен выглядеть следующим образом:

server {
   listen       80;
   server_name  ;

   ...

   root   /usr/share/nginx/html;
   index   index.html index.htm;

   ...

   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
   #
   location ~ \.php$ {
       fastcgi_pass
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME $fastcgi_script_name;
       include        fastcgi_params;
   }

   ...

Сохраните и закройте файл, затем запустите веб-сервер.

sudo systemctl restart nginx.service

Шаг восьмой - Установка PHP

Теперь мы установим три компонента PHP на веб-сервере: сам механизм PHP, FastCGI Process Manager (FPM) и модуль PHP для PostgreSQL.

Сначала установите PHP.

sudo yum install php -y

Далее мы установим FastCGI Process Manager (FPM), который является собственной реализацией PHP FastCGI. FastCGI - это дополнение к вашему веб-серверу. Он работает независимо и помогает ускорить запросы пользователей, объединяя их в один процесс, тем самым ускоряя время отклика.

sudo yum install php-fpm -y

Наконец, установите модуль PHP Postgres:

sudo yum install php-pgsql -y

Шаг девятый - Настройка PHP

На этом шаге мы настроим PHP.

Откройте файл конфигурации PHP.

sudo vi /etc/php.ini

Сделайте следующие изменения:

  • Измените + expose_php = On + на + expose_php = Off +. Установка для этого параметра значения «+ Off +» означает, что PHP не добавляет свою подпись в заголовок веб-сервера и не раскрывает тот факт, что сервер работает под управлением PHP.

  • Измените +; cgi.fix_pathinfo = 0 + на +; cgi.fix_pathinfo = 1 +.

Сохраните и выйдите из файла. Затем отредактируйте файл конфигурации FPM.

sudo vi /etc/php-fpm.d/www.conf

Сделайте следующие изменения:

  • Измените + user = apache на` + user = nginx`.

  • Аналогично, измените + group = apache на` + group = nginx`.

  • Измените + listen = 127.0.0.1: 9000 + на + listen = / var / run / php-fpm / php5-fpm.sock +. Мы устанавливаем это же значение в файле конфигурации блока сервера Nginx по умолчанию.

Сохраните и выйдите из vi. Затем запустите PHP-FPM.

sudo systemctl start php-fpm.service

Затем включите его.

sudo systemctl enable php-fpm.service

Шаг десятый - Создание веб-приложения

У нас есть все готовые серверные компоненты в обоих узлах. Настало время создать наше PHP-приложение. Создайте файл с именем + index.php в` + / usr / share / nginx / html`.

sudo vi /usr/share/nginx/html/index.php

Вставьте следующее содержимое. Убедитесь, что вы заменили выделенные переменные на IP-адрес сервера базы данных и пароль Postgres соответственно.

<html>

<head>
   <title>LEPP Stack Example</title>
</head>

<body>

<h4>LEPP (Linux, Nginx, PHP, PostgreSQL) Sample Page</h4>
<hr/>
<p>Hello and welcome. This web page is dynamically showing a product list from a PostgreSQL database</p>

<?php

   $host = "";
   $user = "postgres";
   $password = "";
   $dbname = "product";

   $con = pg_connect("host=$host dbname=$dbname user=$user password=$password")
           or die ("Could not connect to server\n");

   $query = "SELECT * FROM product_list";
   $resultset = pg_query($con, $query) or die("Cannot execute query: $query\n");
   $rowcount = pg_numrows($resultset);

   for($index = 0; $index < $rowcount; $index++) {
           $row = pg_fetch_array($resultset, $index);
           echo $row["id"], "-", $row["product_name"];
           echo "<br>";
   }
?>

</body>
</html>

Это простая веб-страница со встроенным PHP-кодом. Во-первых, он определяет ряд параметров для строки подключения к базе данных. Затем устанавливается соединение (указанное с помощью + $ con +) к серверу базы данных. Запрос указывается и затем выполняется к таблице * product_list *. Он просматривает возвращенные результаты и печатает содержимое каждой строки в новой строке.

Как только файл будет записан и сохранен, откройте окно браузера и укажите его на «++». Содержимое должно выглядеть так:

изображение: http: //i.imgur.com/HDwygcq.jpg [PHP динамическая веб-страница с данными PostgreSQL]

Заключение

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

Related