В этой статье мы научимся устанавливать и одновременно подключаться к #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, то найдём только это:
Поэтому нам нужно выбрать именно для наших версий.
[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.
Отлично, теперь можем добавить страницу выборку данных.
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
Работа через 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
Добавляем новый сервер Add New Server
name: local
Host name – 127.0.0.1
Maintenance Database – postgres
Username – postgres
Password – securep@sshere
Выберем airports и нажмём View Data
На этом всё. Пишите в комментариях, что ещё хотите изучить. Удачи!