Найти в Дзене
www.TechPlanet.pro

Подключение в PostgreSQL серверу из-под различных версий PHP-FPM под CentOS

Оглавление

В этой статье мы научимся устанавливать и одновременно подключаться к #PostgreSQL из различный версий #php-fpm под управление операционной системы #Centos 7 а таже добавим #pgAdmin

Предварительная подготовка

В предыдущей статье мы уже создавали виртуальную машины PHP-FPM версии 7.0 и 7.3 под CentOS 7 в яндекс облаке. Её и будет использовать для дальнейшей настройки.

Поставим пару пакетов, которые нам понадобится далее.

sudo yum install -y wget unzip

Установка PostgreSQL

Установим репозиторий PostgreSQL

sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

Установим сам PostgreSQL

sudo yum install -y postgresql12-server

Произведём инициализация, создав кластер баз данных.

sudo /usr/pgsql-12/bin/postgresql-12-setup initdb

Поставим в автозагрузку и запустим базу.

sudo systemctl enable postgresql-12
sudo systemctl start postgresql-12

Проверим работу базы, создав пользователя student с паролем mypass123.

[nikolai@centos ~]$ sudo -u postgres psql
psql (12.11)
Type "help" for help.
postgres=# CREATE ROLE student WITH SUPERUSER CREATEROLE CREATEDB LOGIN PASSWORD 'mypass123';
CREATE ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
student | Superuser, Create role, Create DB | {}

Для безопасности поменяем пароль для системного пользователя и пользователя базы postgres.

[nikolai@centos ~]$ sudo passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[nikolai@centos ~]$ sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'securep@sshere';"
ALTER ROLE

Если мы хотим подключаться не только локально, то разрешим прослушивать все ИП.

sudo sed -i 's/.*listen_addresses =.*/listen_addresses = \x27*\x27/' /var/lib/pgsql/12/data/postgresql.conf
sudo systemctl restart postgresql-12

Так же по умолчанию у нас разрешены только локальные подключения на основании индификации пользователя.

[nikolai@centos ~]$ sudo cat /var/lib/pgsql/12/data/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 ident

Есть разница как мы подключаемся. Если мы используем просто psql, то используется подключение по socket и будет учитываться TYPE local. А если по указываем ИП сервера psql -h 127.0.0.1, то уже соединение идёт по TCP IPv4 и будет учитываться TYPE host. Так же не забудьте поменять и для IPv6, если будете использовать localhost: psql -h localhost

Для локального подключения мы можем разрешить любое подключение без пароля.

sudo sed -i 's/host\s*all\s*all\s*127.0.0.1.*/host    all             all             127.0.0.1\/32            trust/' /var/lib/pgsql/12/data/pg_hba.conf
sudo sed -i 's/host\s*all\s*all\s*::1.*/host    all             all             ::1\/128                 trust/' /var/lib/pgsql/12/data/pg_hba.conf
sudo sed -i 's/local\s*all.*/local   all             all                                     trust/' /var/lib/pgsql/12/data/pg_hba.conf

А для внешнего подключения нам нужно добавить подключение по паролю.

sudo bash -c 'echo "host    all             all             0.0.0.0/0               md5" >> /var/lib/pgsql/12/data/pg_hba.conf'

Перезапустим базу и проверим различные типы подключения.

sudo systemctl restart postgresql-12
psql -U postgres -h localhost postgres
psql -U postgres -h 127.0.0.1 postgres
PGPASSWORD='mypass123' psql -U student -h 51.250.107.122 postgres

Работа с базой PostgreSQL

Скачаем демо базу.

wget https://edu.postgrespro.ru/demo-small.zip
unzip demo-small.zip

Внутри этого файла мы видим удаление(DROP DATABASE) базы demo, её создание(CREATE DATABASE), а так же создание таблиц(CREATE TABLE) и их наполнение(COPY).

[nikolai@centos ~]$ grep -e 'DATABASE demo;' -e 'CREATE TABLE' -e 'COPY' demo-small-20170815.sql
DROP DATABASE demo;
CREATE DATABASE demo;
CREATE TABLE aircrafts_data (
CREATE TABLE airports_data (
CREATE TABLE boarding_passes (
CREATE TABLE bookings (
CREATE TABLE flights (
CREATE TABLE seats (
CREATE TABLE ticket_flights (
CREATE TABLE tickets (
COPY aircrafts_data (aircraft_code, model, range) FROM stdin;
COPY airports_data (airport_code, airport_name, city, coordinates, timezone) FROM stdin;
COPY boarding_passes (ticket_no, flight_id, boarding_no, seat_no) FROM stdin;
COPY bookings (book_ref, book_date, total_amount) FROM stdin;
COPY flights (flight_id, flight_no, scheduled_departure, scheduled_arrival, departure_airport, arrival_airport, status, aircraft_code, actual_departure, actual_arrival) FROM stdin;
COPY seats (aircraft_code, seat_no, fare_conditions) FROM stdin;
COPY ticket_flights (ticket_no, flight_id, fare_conditions, amount) FROM stdin;
COPY tickets (ticket_no, book_ref, passenger_id, passenger_name, contact_data) FROM stdin;

Импортируем базу demo в нашу систему.

PGPASSWORD='mypass123' psql -U student -h 51.250.107.122 postgres -f demo-small-20170815.sql

Сделаем выборку данных.

[nikolai@centos ~]$ PGPASSWORD='mypass123' psql -U student -h 51.250.107.122 demo
psql (12.11)
Type "help" for help.
demo=# SELECT airport_code, airport_name,city FROM airports LIMIT 3;
airport_code | airport_name | city
--------------+-----------------+-----------
YKS | Якутск | Якутск
MJZ | Мирный | Мирный
KHV | Хабаровск-Новый | Хабаровск
(3 rows)

PHP-FPM и PostgreSQL

Если бы использовали одну стандартную версию PHP-FPM, то нам достаточно было уставить библиотеку работы с PostgreSQL только одной версии.

sudo yum install php-pgsql

Однако мы используем другие версии и если поискать, что у нас есть по PostgreSQL в http://php70.51.250.107.122.nip.io/info.php, то найдём только это:

-2

Поэтому нам нужно выбрать именно для наших версий.

[nikolai@centos ~]$ sudo yum list php7[0-9]-php-pgsql.x86_64
Available Packages
php70-php-pgsql.x86_64
php71-php-pgsql.x86_64
php72-php-pgsql.x86_64
php73-php-pgsql.x86_64
php74-php-pgsql.x86_64

Установим для php 7.0 и 7.3

[nikolai@centos ~]$ sudo yum install -y php70-php-pgsql.x86_64 php73-php-pgsql.x86_64

Не забудем перегрузить php-fpm.

[nikolai@centos ~]$ sudo systemctl restart php70-php-fpm
[nikolai@centos ~]$ sudo systemctl restart php73-php-fpm

Ещё раз проверим http://php70.51.250.107.122.nip.io/info.php, нажав F5.

-3

Отлично, теперь можем добавить страницу выборку данных.

sudo bash -c 'cat >/var/www/php70.51.250.107.122.nip.io/demo.php<<EOF
<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>Список аэропортов</title>
 </head>
 <body>
  <table border="1">
   <caption>Список аэропортов</caption>
   <tr>
    <th>airport code</th>
    <th>airport name</th>
    <th>city</th>
   </tr>
<?php
  pg_connect("host=127.0.0.1 dbname=demo user=student   password=mypass123");
  \$result = pg_query("SELECT airport_code, airport_name,city FROM airports;");
  while (\$row = pg_fetch_row(\$result)) {
    echo "   <tr><td>\$row[0]</td><td>\$row[1]</td><td>\$row[2]</td></tr>\n";
  }
?>
  </table>
 </body>
</html>
EOF'

Проверяем http://php70.51.250.107.122.nip.io/demo.php

-4

Работа через pgAdmin

Как дополнительный инструмент, мы может установить pgAdmin.

Добавим репозиторий.

sudo yum install -y https://ftp.postgresql.org/pub/pgadmin/pgadmin4/yum/pgadmin4-redhat-repo-2-1.noarch.rpm

Установим пакет pgAdmin.

sudo yum install -y pgadmin4

Запустим скрипт установки pgAdmin.

[nikolai@centos ~]$ sudo /usr/pgadmin4/bin/setup-web.sh
Email address: admin@51.250.107.122.nip.io
Password: yJA4df6c-Jnbb_GPB
Retype password: yJA4df6c-Jnbb_GPB
The Apache web server is running and must be restarted for the pgAdmin 4 installation to complete. Continue (y/n)? y

Проверяем http://www.51.250.107.122.nip.io/pgadmin4

Email address: admin@51.250.107.122.nip.io
Password: yJA4df6c-Jnbb_GPB
-5

Добавляем новый сервер Add New Server

name: local

Host name – 127.0.0.1

Maintenance Database – postgres

Username – postgres

Password – securep@sshere

-6

Выберем airports и нажмём View Data

-7

На этом всё. Пишите в комментариях, что ещё хотите изучить. Удачи!