На просторах интернета не нашел единого рецепта по установке и настройке такого, довольно нестандартного сервера. Решил написать свой рецепт.
Принцип работы следующий:

Статические данные (файлы) отдает Nginx, а динамикой занимается Apache.
Начнем.
Нам нужно:
VirtualBox
Ubuntu Server 16.04.3 LTS (LTS — Long Time Support)
PuTTY
Перейдем в режим суперпользователя
Перейдем в корневой каталог
Добавим репозиторий PostgreSQL
Добавим репозиторий PHP
Сделаем update
Сделаем upgrade
У меня upgrade длился пять минут.
У становим python, он нам позже понадобится
Приступим к установке Apache, PHP и PostgreSQL
По умолчанию, в PostgreSQL нету однобайтовых и беззнаковых чисел, поэтому мы их установим.
Есть расширение для PostgreSQL, pguint — github.com/petere/pguint
Перейдем в созданный каталог
Теперь нам нужно скомпилировать это расширение (тут понадобится python, который мы установили ранее).
Теперь, на сервер PostgreSQL, в нужную базу данных, где хотим использовать беззнаковые и однобайтовые числа, отправим:
Вернемся в корневой каталог
Установим Nginx, но перед этим остановим Apache, дабы он не занимал порт 80, иначе Nginx не установится.
Установка Nginx
Отлично, теперь остановим и Nginx
Настройка Apache
Сменим порт Apache
Заменить
на
127.0.0.1 — означает то, что к Apache можно обратиться только по локальному адресу.
8080 — можете поставить любой свободный порт.
Перейдем в папку с доступными сайтами
Создадим конфигурационный файл нашего сайда
И привести его к такому виду:
Посмотрим, что у нас лежит в /var/www
Папка html, нам более не нужна, удалим ее вместе с содержимым
Создадим свою папку, со своим сайтом
Перейдем в папку с нашим сайтом
Создадим документ index.pnp
В него запишем:
С этим пока закончили.
Вернемся в корневой каталог
В apache стоит rpaf 0.6 и он не передаёт/принимает порт от nginx и не работает правильно, как надо. Поэтому его надо обязательно обновить.
Теперь скомпилируем
Выходим в корневой каталог
Хорошо, продолжим настройку Apache.
Заменить
на
Приведем в порядок rpaf.conf
Приведем его к такому виду:
Включим наш сайт в Apache.
И запустим наш Apache.
C Apache закончили.
Настроим Nginx
Привести к такому виду:
Теперь создадим символьную ссылку на этот файл
Отредактируем /etc/nginx/sites-available/default
Уберем default_server.
И вставим перенаправление с www. и ip
Запускаем Nginx.
Отлично, можем проверить как оно работает.
Но перед этим отредактируем файл хоста C:\Windows\System32\drivers\etc
Открыть файл hosts через текстовый редактор, и в самый низ вставить:
Заменив ip и домен на свои.
В браузере перейдем по domain-name.local, и если вы делали все по этому рецепту, мы должны увидеть страницу с phpinfo.
Отлично, дело осталось за малым.
Настроим PostgreSQL.
Создадим нового пользователя PostgreSQL
Войдем в СУБД
И сменим новому пользователю пароль
Теперь новому пользователю нужно сменить тип подключения, для этого нам нужно найти pg_hba.conf файл.
Пишем

Покидаем СУБД
И начинаем редактировать /etc/postgresql/10/main/pg_hba.conf
Ищем
Находим следующее:
Приводим к таком виду:
Перезагрузим PostgreSQL
Теперь войдем в СУБД через нового пользователя
Вводим пароль, и попадаем в СУБД.
Создадим тестовую базу данных
И сразу перейдем в нее
Подключим расширение pguint
И создадим тестовую таблицу
Заполним таблицу тестовыми данными
Посмотрим содержимое таблицы test_tb
Теперь попробуем вывести эти данные из php.
Закрываем соединение с СУБД
Откроем /var/www/domain-name.local/index.php
И приведем к следующему виду:
Теперь проверим, и убедимся, что это работает

Отлично, мы настроили (Nginx + Apache) + PostgreSQL + PHP и он исправно работает.
Установим FTP сервер
Остановим vsftpd перед настройкой
Откроем etc/vsftpd.conf
Установить/заменить/переключить следующие параметры:
Создадим нового пользователя для доступа через FTP
Установим для него пароль
Создадим домашнюю директорию пользователя
Установим для нее права
Создадим группу для пользователя
Добавим пользователя в группу
Поменяем владельца каталога
Создадим папку нашего сайта
Сменим у нее владельца
Смонтируем наши каталоги, откроем файл /etc/fstab
В самый низ вставим
Добавим владельца /var/www/domain-name.local
Назначим права
И запустим vsftpd
Проверим, я буду использовать FileZilla.

Все хорошо, попробуем создать каталог.

Работает.
Н��строим защищенное FTP соединение.
Остановим vsftpd
Сгенерируем сертификат
Тут вводим все, что вшей душе угодно
Откроем etc/vsftpd.conf
Установим/добавим следующие параметры:
Сохраним и запустим vsftpd
Давайте испытаем

Ура, все работает, можно приступать к разработке веб приложения.
P.S. Этот рецепт не претендует на звание единственно правильного и идеального. Если что то упустил или у вас есть предложения по дополнению этого рецепта, добро пожаловать в комментарии, приму любую критику. По мере роста моих навыков, этот рецепт будет дополняться и изменяться.
Принцип работы следующий:

Статические данные (файлы) отдает Nginx, а динамикой занимается Apache.
Начнем.
Нам нужно:
VirtualBox
Ubuntu Server 16.04.3 LTS (LTS — Long Time Support)
PuTTY
Установим VirtualBox
- Запустим установщик VirtualBox.

- Настройки оставим по умолчанию.


- Установщик временно отключит нас от сети. Жмем «Yes».

- Начинаем установку.

- Финиш.

Подготовим VirtualBox к установке Ubuntu Server 16.04.3 LTS
- Загрузим образ ubuntu-16.04.3-server-amd64.iso
- Создадим виртуальную машину.

- Имя: default_server
Тип: Linux
Версия: Ubuntu (64-bit)
Объем оперативной памяти: 2048 МБ
Важно: У меня 8 ГБ оперативной памяти, и в моем случае, двух гигабайт будет достаточно. У вас может быть иначе...

Размер жесткого диска: 15 ГБ
Другие параметры оставим по умолчанию.

Жмем «Создать».
- Сразу настроим сеть.

Сменим тип подключения с NAT на Сетевой мост.

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

Установка Ubuntu Server 16.04.3 LTS
- Выберем загрузочный диск с образом Ubuntu Server 16.04.3 LTS.

- Выбираем удобный язык, у меня это русский.

Жмем «Enter». - Выбираем «Установить Ubuntu Server».

- Выбираем страну.

Важно: Читайте подсказку внизу экрана.
- Я не буду определять раскладку клавиатуры, мне это не нужно.

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

- Выбираем регион раскладки.

- Выбираем комбинацию клавиш, для переключения языка. Мне удобно через CTRL+
SHIFT.

- Введем имя компьютера, под которым он будут известен в сети.

- Вводим имя админа.

- Вводим имя учетной записи админа (Будет использоваться как логин для входа в систему).

- Вводим пароль от учетной записи админа.

- Повторяем пароль.

- Почему бы и нет..?

- Выбираем часовой пояс.

- Пусть система автоматически использует весь диск.

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

- Записываем изменения на диск.

- У нас нету прокси, оставляем поле пустым и продолжаем.

- Пусть система сама устанавливает обновления безопасности.

- Выбираем набор программ, которые будут установлены вместе с системой.
Нам будет достаточно стандартного набора и OpenSSH Server.

- Установим GRUB главным.

- Отлично, почти готово.

Нам нужно изъять диск из привода.
Устройства -> Оптические диски -> Изъять диск из привода

Теперь жмем пр��должить. - Прекрасно, Ubuntu Server установлена.

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

Продолжаем.
Выбираем полное клонирование.

Жмем клонировать. У меня клонирование длилось две минуты.
Установим PuTTY, для доступа через SSH
- Запустим установочный файл.

- Настройки оставим по умолчанию.


Жмем «Install». - Финиш.

Подключение через SSH к серверу
- Запустим клон нашей машины, что бы узнать ее ip адрес.
Напишем команду:
ifconfig

На скриншоте я отметил место, где будет написан ваш ip адрес. У меня это: 192.168.0.103 (может смениться, пока писал ст��тью, у меня сменился на 192.168.0.101).
Теперь можно выйти из учетной записи, написав:
exit
- Переходим в PuTTY, вводим ip адрес, и имя для сохраняемой сессии.

Жмем «Save».
- Теперь, при двойном клике по имени сохраненной сессии.

Мы должны наблюдать следующее:

Вводим логин, после пароль.
SSH соединение успешно настроено, теперь можно приступать к настройке (Nginx + Apache) + PostgreSQL + PHP.
Установка и настройка (Nginx + Apache) + PostgreSQL + PHP
Перейдем в режим суперпользователя
sudo suПерейдем в корневой каталог
cd /Добавим репозиторий PostgreSQL
wget -q https://www.postgresql.org/media/keys/ACCC4CF8.asc -O - | sudo apt-key add -sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'Добавим репозиторий PHP
add-apt-repository ppa:ondrej/phpСделаем update
apt-get updateСделаем upgrade
apt-get upgradeУ меня upgrade длился пять минут.
У становим python, он нам позже понадобится
apt-get install pythonПриступим к установке Apache, PHP и PostgreSQL
apt-get install apache2 php7.2 php7.2-cli php7.2-curl php7.2-fpm php7.2-pgsql postgresql postgresql-contrib postgresql-server-dev-10 libapache2-mod-rpaf build-essential apache2-devПо умолчанию, в PostgreSQL нету однобайтовых и беззнаковых чисел, поэтому мы их установим.
Есть расширение для PostgreSQL, pguint — github.com/petere/pguint
git clone https://github.com/petere/pguint.git /pguintПерейдем в созданный каталог
cd /pguintТеперь нам нужно скомпилировать это расширение (тут понадобится python, который мы установили ранее).
makemake installТеперь, на сервер PostgreSQL, в нужную базу данных, где хотим использовать беззнаковые и однобайтовые числа, отправим:
CREATE EXTENSION uint;Вернемся в корневой каталог
cd /Установим Nginx, но перед этим остановим Apache, дабы он не занимал порт 80, иначе Nginx не установится.
service apache2 stopУстановка Nginx
apt-get install nginxОтлично, теперь остановим и Nginx
service nginx stopНастройка Apache
a2dismod mpm_event
a2enmod mpm_worker
a2enmod proxy_fcgi
a2enconf php7.2-fpmСменим порт Apache
nano /etc/apache2/ports.confЗаменить
Listen 80на
Listen 127.0.0.1:8080127.0.0.1 — означает то, что к Apache можно обратиться только по локальному адресу.
8080 — можете поставить любой свободный порт.
Перейдем в папку с доступными сайтами
cd /etc/apache2/sites-availableСоздадим конфигурационный файл нашего сайда
nano domain-name.local.confИ привести его к такому виду:
<VirtualHost 127.0.0.1:8080>
ServerName domain-name.local
ServerAlias www.domain-name.local
ServerAdmin admin@domain-name.local
DocumentRoot /var/www/domain-name.local
ErrorLog ${APACHE_LOG_DIR}/domain-name.local_error.log
CustomLog ${APACHE_LOG_DIR}/domain-name.local_access.log vhost_combined
</VirtualHost>Посмотрим, что у нас лежит в /var/www
cd /var/www/
ls -FПапка html, нам более не нужна, удалим ее вместе с содержимым
rm -R htmlСоздадим свою папку, со своим сайтом
mkdir domain-name.local/Перейдем в папку с нашим сайтом
cd domain-name.local/Создадим документ index.pnp
nano index.phpВ него запишем:
<?php
phpinfo();
?>С этим пока закончили.
Вернемся в корневой каталог
cd /В apache стоит rpaf 0.6 и он не передаёт/принимает порт от nginx и не работает правильно, как надо. Поэтому его надо обязательно обновить.
wget -O rpaf_v0.8.4.tar.gz https://github.com/gnif/mod_rpaf/archive/v0.8.4.tar.gz
gunzip rpaf_v0.8.4.tar.gz
tar xvf rpaf_v0.8.4.tar
cd mod_rpaf-0.8.4/Теперь скомпилируем
make
make installВыходим в корневой каталог
cd /Хорошо, продолжим настройку Apache.
nano /etc/apache2/apache2.confЗаменить
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combinedна
LogFormat "%v:%p %{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combinedПриведем в порядок rpaf.conf
nano /etc/apache2/mods-available/rpaf.confПриведем его к такому виду:
<IfModule rpaf_module>
RPAF_Enable On
RPAF_ProxyIPs 127.0.0.1 ::1
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
RPAF_ForbidIfNotProxy Off
RPAF_Header X-Forwarded-For
</IfModule>Включим наш сайт в Apache.
a2ensite domain-name.local.confИ запустим наш Apache.
service apache2 startC Apache закончили.
Настроим Nginx
nano /etc/nginx/sites-available/domain-name.localПривести к такому виду:
server {
listen 80;
listen [::]:80;
root /var/www/domain-name.local;
index index.php index.html index.htm;
server_name domain-name.local www.domain-name.local;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass_header Set-Cookie;
}
location ~ /\.ht {
deny all;
}
location ~* \.(ico|docx|doc|xls|xlsx|rar|zip|jpg|jpeg|txt|xml|pdf|gif|png|css|js|html)$ {
root /var/www/domain-name.local;
}
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header Content-Security-Policy "block-all-mixed-content";
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
resolver 8.8.8.8;
}Теперь создадим символьную ссылку на этот файл
ln -s /etc/nginx/sites-available/domain-name.local /etc/nginx/sites-enabled/domain-name.localОтредактируем /etc/nginx/sites-available/default
nano /etc/nginx/sites-available/defaultУберем default_server.
И вставим перенаправление с www. и ip
server {
listen 80;
listen [::]:80;
server_name www.domain-name.local;
return 301 http://domain-name.local$request_uri;
}
server {
listen 80;
listen [::]:80;
server_name 192.168.0.101;
return 301 http://domain-name.local$request_uri;
}Запускаем Nginx.
service nginx startОтлично, можем проверить как оно работает.
Но перед этим отредактируем файл хоста C:\Windows\System32\drivers\etc
Открыть файл hosts через текстовый редактор, и в самый низ вставить:
192.168.0.101 domain-name.local
192.168.0.101 www.domain-name.localЗаменив ip и домен на свои.
В браузере перейдем по domain-name.local, и если вы делали все по этому рецепту, мы должны увидеть страницу с phpinfo.
Отлично, дело осталось за малым.
Настроим PostgreSQL.
Создадим нового пользователя PostgreSQL
sudo -u postgres createuser --superuser test-userВойдем в СУБД
sudo -u postgres psqlИ сменим новому пользователю пароль
\password test-userТеперь новому пользователю нужно сменить тип подключения, для этого нам нужно найти pg_hba.conf файл.
Пишем
SHOW hba_file;
Покидаем СУБД
\qИ начинаем редактировать /etc/postgresql/10/main/pg_hba.conf
nano /etc/postgresql/10/main/pg_hba.confИщем
# Database administrative login by Unix domain socketНаходим следующее:
# Database administrative login by Unix domain socket
local all postgres peerПриводим к таком виду:
# Database administrative login by Unix domain socket
local all postgres peer
local all test-user md5Перезагрузим PostgreSQL
service postgresql restartТеперь войдем в СУБД через нового пользователя
psql test-user -h 127.0.0.1 -d postgresВводим пароль, и попадаем в СУБД.
Создадим тестовую базу данных
CREATE DATABASE test_db;И сразу перейдем в нее
\c test_dbПодключим расширение pguint
CREATE EXTENSION uint;И создадим тестовую таблицу
CREATE TABLE test_tb(
id uint4 PRIMARY KEY,
title TEXT
);Заполним таблицу тестовыми данными
INSERT INTO test_tb(id, title) VALUES (1, 'Бла бла бла 1'), (2, 'Бла бла бла 2'), (3, 'Бла бла бла 3'), (4, 'Бла бла бла 4'), (5, 'Бла бла бла 5'), (6, 'Бла бла бла 6'), (7, 'Бла бла бла 7'), (8, 'Бла бла бла 8'), (9, 'Бла бла бла 9'), (10, 'Бла бла бла 10'), (2147483642, 'Бла бла бла 2147483642'), (2147483643, 'Бла бла бла 2147483643'), (2147483644, 'Бла бла бла 2147483644'), (2147483645, 'Бла бла бла 2147483645'), (2147483646, 'Бла бла бла 2147483646'), (2147483647, 'Бла бла бла 2147483647'), (2147483648, 'Бла бла бла 2147483648'), (2147483649, 'Бла бла бла 2147483649'), (2147483650, 'Бла бла бла 2147483650'), (2147483651, 'Бла бла бла 2147483651'), (2147483652, 'Бла бла бла 2147483652'), (4294967286, 'Бла бла бла 4294967286'), (4294967287, 'Бла бла бла 4294967287'), (4294967288, 'Бла бла бла 4294967288'), (4294967289, 'Бла бла бла 4294967289'), (4294967290, 'Б��а бла бла 4294967290'), (4294967291, 'Бла бла бла 4294967291'), (4294967292, 'Бла бла бла 4294967292'), (4294967293, 'Бла бла бла 4294967293'), (4294967294, 'Бла бла бла 4294967294'), (4294967295, 'Бла бла бла 4294967295') RETURNING id, title;Посмотрим содержимое таблицы test_tb
SELECT * FROM test_tb;Теперь попробуем вывести эти данные из php.
Закрываем соединение с СУБД
\qОткроем /var/www/domain-name.local/index.php
nano /var/www/domain-name.local/index.phpИ приведем к следующему виду:
<?php
$dbh = new PDO('pgsql:host=localhost port=5432 user=test-user dbname=test_db password=password');
$test = $dbh->prepare('SELECT * FROM test_tb;');
$test->execute();
echo "<pre>";
print_r($test->fetchAll(PDO::FETCH_ASSOC));
echo "</pre>";
?>Теперь проверим, и убедимся, что это работает

Отлично, мы настроили (Nginx + Apache) + PostgreSQL + PHP и он исправно работает.
Настроим FTP доступ к сайту
Установим FTP сервер
apt-get install vsftpdОстановим vsftpd перед настройкой
service vsftpd stopОткроем etc/vsftpd.conf
nano etc/vsftpd.confУстановить/заменить/переключить следующие параметры:
- listen=YES
- listen_ipv6=NO
- local_enable=YES
- write_enable=YES
- chroot_local_user=YES
- pam_service_name=ftp
Создадим нового пользователя для доступа через FTP
useradd -d /home/domain-name -s /sbin/nologin domain-nameУстановим для него пароль
passwd domain-nameСоздадим домашнюю директорию пользователя
mkdir -p /home/domain-nameУстановим для нее права
chmod a-w /home/domain-nameСоздадим группу для пользователя
groupadd ftpsДобавим пользователя в группу
usermod -G ftps domain-nameПоменяем владельца каталога
chown -R domain-name:ftps /home/domain-nameСоздадим папку нашего сайта
mkdir /home/domain-name/domain-name.localСменим у нее владельца
chown -R domain-name:ftps /home/domain-name/domain-name.localСмонтируем наши каталоги, откроем файл /etc/fstab
nano /etc/fstabВ самый низ вставим
/var/www/domain-name.local /home/domain-name/domain-name.local none bind 0 0Добавим владельца /var/www/domain-name.local
chown www-data:domain-name /var/www/domain-name.local/ -RНазначим права
find /var/www/domain-name.local -type d -exec chmod 775 {} \;
find /var/www/domain-name.local -type f -exec chmod 664 {} \;И запустим vsftpd
service vsftpd startПроверим, я буду использовать FileZilla.

Все хорошо, попробуем создать каталог.

Работает.
Н��строим защищенное FTP соединение.
Остановим vsftpd
service vsftpd stopСгенерируем сертификат
openssl req -x509 -nodes -days 720 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.pemТут вводим все, что вшей душе угодно
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
Откроем etc/vsftpd.conf
nano etc/vsftpd.confУстановим/добавим следующие параметры:
- ssl_enable=YES
- ssl_tlsv1=YES
- ssl_sslv2=NO
- ssl_sslv3=NO
- rsa_cert_file=/etc/ssl/private/vsftpd.pem
- rsa_private_key_file=/etc/ssl/private/vsftpd.key
- allow_anon_ssl=NO
- force_local_data_ssl=YES
- force_local_logins_ssl=YES
- ssl_ciphers=HIGH
Сохраним и запустим vsftpd
service vsftpd startДавайте испытаем

Ура, все работает, можно приступать к разработке веб приложения.
P.S. Этот рецепт не претендует на звание единственно правильного и идеального. Если что то упустил или у вас есть предложения по дополнению этого рецепта, добро пожаловать в комментарии, приму любую критику. По мере роста моих навыков, этот рецепт будет дополняться и изменяться.
