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

Принцип работы следующий:


Статические данные (файлы) отдает Nginx, а динамикой занимается Apache.
Начнем.

Нам нужно:

VirtualBox
Ubuntu Server 16.04.3 LTS (LTS — Long Time Support)
PuTTY

Установим VirtualBox


  1. Запустим установщик VirtualBox.

    Установка VirtualBox. Шаг 1
  2. Настройки оставим по умолчанию.

    Установка VirtualBox. Шаг 2

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

    Установка VirtualBox. Шаг 4
  4. Начинаем установку.
    Установка VirtualBox. Шаг 5
  5. Финиш.

    Установка VirtualBox. Шаг 6

Подготовим VirtualBox к установке Ubuntu Server 16.04.3 LTS


  1. Загрузим образ ubuntu-16.04.3-server-amd64.iso
  2. Создадим виртуальную машину.

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


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

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

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

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

    VirtualBox

Установка Ubuntu Server 16.04.3 LTS


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

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

    Установка Ubuntu Server 16.04.3 LTS (Шаг 1)
    Жмем «Enter».
  3. Выбираем «Установить Ubuntu Server».

    Установка Ubuntu Server 16.04.3 LTS (Шаг 2)
  4. Выбираем страну.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 3)
    Важно: Читайте подсказку внизу экрана.
  5. Я не буду определять раскладку клавиатуры, мне это не нужно.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 4)
  6. Выбираем страну для которой предназначена клавиатура.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 5)
  7. Выбираем регион раскладки.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 6)
  8. Выбираем комбинацию клавиш, для переключения языка. Мне удобно через CTRL+
    SHIFT.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 7)
  9. Введем имя компьютера, под которым он будут известен в сети.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 8)
  10. Вводим имя админа.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 9)
  11. Вводим имя учетной записи админа (Будет использоваться как логин для входа в систему).

    Установка Ubuntu Server 16.04.3 LTS (Шаг 10)
  12. Вводим пароль от учетной записи админа.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 11)
  13. Повторяем пароль.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 12)
  14. Почему бы и нет..?

    Установка Ubuntu Server 16.04.3 LTS (Шаг 13)
  15. Выбираем часовой пояс.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 14)
  16. Пусть система автоматически использует весь диск.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 15)
  17. Диск для разметки, выбираем по умолчанию.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 16)
  18. Записываем изменения на диск.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 17)
  19. У нас нету прокси, оставляем поле пустым и продолжаем.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 18)
  20. Пусть система сама устанавливает обновления безопасности.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 19)
  21. Выбираем набор программ, которые будут установлены вместе с системой.
    Нам будет достаточно стандартного набора и OpenSSH Server.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 20)
  22. Установим GRUB главным.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 21)
  23. Отлично, почти готово.

    Установка Ubuntu Server 16.04.3 LTS (Шаг 22)
    Нам нужно изъять диск из привода.
    Устройства -> Оптические диски -> Изъять диск из привода

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

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

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

    VirtualBox
    Жмем клонировать. У меня клонирование длилось две минуты.

Установим PuTTY, для доступа через SSH


  1. Запустим установочный файл.

    Установка PuTTY (Шаг 1)
  2. Настройки оставим по умолчанию.

    Установка PuTTY (Шаг 2)

    Установка PuTTY (Шаг 3)
    Жмем «Install».
  3. Финиш.

    Установка PuTTY (Шаг 4)

Подключение через SSH к серверу


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


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

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

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

    PuTTY
    Вводим логин, после пароль.
    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, который мы установили ранее).
make

make 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:8080

127.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 start
C 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
Установить/заменить/переключить следующие параметры:
  1. listen=YES
  2. listen_ipv6=NO
  3. local_enable=YES
  4. write_enable=YES
  5. chroot_local_user=YES
  6. 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
Установим/добавим следующие параметры:
  1. ssl_enable=YES
  2. ssl_tlsv1=YES
  3. ssl_sslv2=NO
  4. ssl_sslv3=NO
  5. rsa_cert_file=/etc/ssl/private/vsftpd.pem
  6. rsa_private_key_file=/etc/ssl/private/vsftpd.key
  7. allow_anon_ssl=NO
  8. force_local_data_ssl=YES
  9. force_local_logins_ssl=YES
  10. ssl_ciphers=HIGH

Сохраним и запустим vsftpd
service vsftpd start
Давайте испытаем

Ура, все работает, можно приступать к разработке веб приложения.

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

Комментарии (31)


  1. kvazimoda24
    18.03.2018 09:33

    Чтобы IP-адрес не менялся, а тем более, вы его в кучу конфигов жёстко прописали, вам надо было статикой сетевые настройки прописать, либо указать DHCP-серверу, что этому MAC-адресу всегда выдавать один и тот же IP. Иначе, вы сами пишите, что адрес может меняться, и вы потом замучаетесь разбираться, чего это вдруг всё перестало работать. И при клонировании виртуалки, неплохо было бы поставить галочку "Сгенерировать новые MAC адреса...", вдруг вы захотите две таких виртуалки одновременно запустить.
    Ну, и если это всё расчитано на такого новичка, что ему необходимо показывать каждый скриншот установки Убунту, то вряд ли он будет "разрабатывать приложения"


  1. Waki
    18.03.2018 09:45

    vagrant homestead
    гораздо легче ставится и работаешь с локальными файлами, а не «где-то» по фтп


  1. redfs
    18.03.2018 09:46

    На просторах интернета не нашел единого рецепта по установке и настройке такого, довольно нестандартного сервера
    Хм. Вообще это очень распространенная стандартная двухуровневая конфигурация nginx+apache. Интересно — а зачем вам Apache?

    В конфиге nginx — хедеры для безопасности и сразу после них строчка resolver 8.8.8.8; дырка в безопасности оставленная собственными руками. Из документации: для предотвращения DNS-спуфинга рекомендуется использовать DNS-серверы в защищённой доверенной локальной сети.


    1. TyVik
      18.03.2018 12:20

      Самого смутил этот момент, но Apache, к сожалению, бывает нужен для .htaccess — там правила по роутингу, которые намертво прибиты к некоторым продуктам. Во всех остальных случаях можно обойтись только Nginx, как мне кажется.


      1. redfs
        18.03.2018 13:55

        Как уже отметили, это не проблема в большинстве случаев. Да и ресурсов на эту тему хватает. Например, вот:
        Nginx configurations for most popular CMS/CMF/Frameworks based on PHP


    1. nikitasius
      18.03.2018 23:06

      строчка resolver 8.8.8.8; дырка в безопасности оставленная собственными руками

      От себя добавлю, что детали вот тут, правда не все актуальны. Благо решение много есть не просит:


      • поставить dnsmasq
      • /etc/dnsmasq.conf:
        port=53
        listen-address=127.0.0.1
        interface=lo
        bind-interfaces
        dnssec
        resolv-file=/etc/resolv.dnsmasq.conf
      • /etc/resolv.conf:
        nameserver 127.0.0.1
      • /etc/resolv.dnsmasq.conf
        nameserver 8.8.8.8
        nameserver 8.8.4.4
      • resolver 127.0.0.1; в nginx


      1. nikitasius
        18.03.2018 23:39

        забыл в /etc/dnsmasq.conf


        trust-anchor=.,19036,8,2,49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
        trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D

        отсюда https://data.iana.org/root-anchors/root-anchors.xml


  1. artsavel
    18.03.2018 12:35

    Для большинства готовых продуктов из коробки, есть стандартные конфигурации nginx для роутинга, в замен .htaccess


  1. AlexLeonov
    18.03.2018 13:08

    Круто, куча картинок, всё очень подробно. Но зачем нужен Apache? Я один не понимаю?

    И да. Не пишите закрывающий тег ?> если он последний в файле. Это стандарт.


  1. Akdmeh
    18.03.2018 13:16

    На просторах интернета не нашел единого рецепта по установке и настройке такого, довольно нестандартного сервера

    1) плохо искали
    2) в чем нестандартность? Обычная документация же, у меня только в закладках несколько подобных статей!
    3) Vagrant
    4) Apache не нужен, давным давно уже пора переходить на более понятную и быструю связку Nginx+PHP-FPM72. «Продукты прибиты к .htaccess» не аргумент, аргумент «лень изучить, как быстро переписать реврайты Apache на nGinx», что на самом деле несложно, если разобраться


    1. TyVik
      18.03.2018 14:40

      Если нужен конкретный пример, то можно взять PrestaShop. У него из админки генерируется только .htaccess файл. Есть даже конверторы .htaccess -> nginx rules, но на той теме, с которой я разбирался, они все либо валились, либо не до конца отрабатывали. Вот лишь небольшой пример исходного файла. и ладно бы он был один, так там в каждом каталоге по правилу. В данной ситуации проще поставить Apache, нежели настраивать nginx и молиться, чтобы исходный htaccess никто не трогал.


      1. remzalp
        19.03.2018 10:03

        Даже в этом случае самый разумный конфиг — nginx стоит спереди, отдаёт статику сам, динамику передаёт апачу на фоне. В этом случае апач хотя бы не будет форкать свои 40+ мегабайт оперативной памяти для отдачи favicon.ico


  1. kotomyava
    18.03.2018 14:01

    Зачем вам вообще нужен apache, если вы при этом используете php-fpm? А если всё-же нужен, то тогда уж mod_php уместнее.
    Зачем вам вообще ftp пусть даже ftps, когда есть sftp?
    rpaf+remoteip работают из коробки, никакие телодвижения по установке из исходников rpaf не нужны, да и нельзя попросту так это делать, раз у вас пакетный дистрибутив…
    Чтобы не менялся ip надо правильно настроить сеть.

    Зачем вообще эта статья? В ней нет ничего не стандартного, и вообще хоть сколько-нибудь оригинального, кроме множества ошибок.
    Кроме того, подобные step by step «руководства» больше вреда приносят, чем пользы, т.к. не описывают границы применимости и пишутся, зачастую теми, кто с трудом сам может хоть что-то настроить.


    1. redfs
      18.03.2018 14:32

      тогда уж mod_php уместнее
      Он тянет за собой mpm_prefork. Для нагруженных и тяжелых проектов mod_php вообще противопоказан.


      1. kotomyava
        18.03.2018 15:13

        Это так, только если у вас апач напрямую торчит наружу.
        Нет никаких особых проблем с prefork/itk, раз у нас nginx на фронте. А с worker + fastcgi, появляется совершенно лишнее межпроцессное взаимодействие, которое отнюдь не бесплатно.
        Тогда уж вообще надо исключить apache, как я выше и писал…


        1. redfs
          18.03.2018 16:09

          Это так, только если у вас апач напрямую торчит наружу
          Видимо, я непонятно выразил мысль. Второе предложение не вытекает из первого, они независимы.
          С mod_php большая проблема — использование оперативной памяти.


          1. kotomyava
            18.03.2018 18:05

            А где именно, её используется больше?
            У вас процесс самого apache + mod_php, против потока апача + php-fpm. На самом деле, будет то же самое суммарно. Во втором случае, меньше оверхед в апаче, но он добавляется в php-fpm.

            Только если апач торчит наружу, в случае mpm_prefork будет заметно больше памяти использоваться, т.к. толстые процессы apache будут не только php скрипты обрабатывать, но и всю статику + долго висеть при отдаче медленным клиентам.

            Зато apache + mod_php обмениваются данными внутри приложения, а при использовании worker + php-fpm у вас есть лишнее звено в виде fastcgi.


            1. redfs
              18.03.2018 18:42

              А где именно её используется больше?
              Естественно на конфигурации apache+mod_php. Вы удивитесь, но на нагруженных тяжелых проектах разница — «разы». Завтра с работы попробую продемонстрировать наглядно — графиками munin (если интересно). Просто за счет отказа от mod_php на бэкенде нам на том же самом железе удавалось увеличивать производительность (количество обслуживаемых запросов в единицу времени) в несколько раз (естественно, с нормализацией) только за счет освобождения оперативной памяти.

              Следующим шагом всегда шел отказ от Apache (что логично), если только не использовались специфические или самописные модули для него.


              1. kotomyava
                18.03.2018 19:50

                Это могло быть в случае не правильной настройки mpm_prefork, и правильной php-fpm, по количеству процессов, и возможно, количества запросов на жизнь процесса. Иначе никакого «в разы» взять просто не откуда.


                1. redfs
                  18.03.2018 21:53

                  А давайте, вы не будете гадать? Было бы вежливо попросить показать конфиги и на основании их уже строить какие-то умозаключения. Ну, отвечу в таком же стиле — с конфигами все нормально.

                  Я просто оставлю этот график мониторинга одного из бэкендов за год здесь. Простая замена mod_php на php-fpm на бэкенде и переход с prefork на event в связи с тем, что prefork стал не нужен, в январе без изменения производительности бэкенда. Видно, что добавили немного оперативки, но могли этого не делать.

                  График
                  image


                  1. kotomyava
                    20.03.2018 19:49

                    Тогда просто объясните, хотя бы себе, а чем собственно, была занята вся эта память…


        1. splby
          19.03.2018 14:54

          Apache уже давно умеет event, это на много быстрее и по тестам не отстаёт от связки на основе nginx. Видел тесты, где apache при работе в режиме event и статику отдавал наравне, а иногда и быстрее nginx.


  1. mikkisse
    18.03.2018 16:48
    +1

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


    1. nikitasius
      18.03.2018 21:47

      Боже мой, шифрование каталога на виртуалке в virtualbox. Из темы про "у нас много ЦПУ и много ССД". Тут все можно раскритиковать. Выше по топику уже начали.


      Похвально ли использовать apache там, где nginx вылезает? Полноте. Похвально если он расскажет и переводе .htaccess в конфиг nginx. Там ничего сложного нет. Я сам мигрировал 20кб (если не больше) htaccess 6кб nginx. На "зеленом" все лаконичнее.


  1. nikitasius
    18.03.2018 21:44

    Жутно бредовая, бредовая, бредовая статья.


    На просторах интернета не нашел единого рецепта по установке и настройке такого, довольно нестандартного сервера.

    Мало материала, когда virtialbox ставят на линукс, а следом выдают виртуалке отдельный айпи. Раньше там было ужасное шаманство для весьма узких целей.


  1. KirEv
    19.03.2018 07:24

    я лично — никогда не любил и не понимал виртуал бокс, у нас за последние года 3 были образы сначала на убунте, потом на suse, и в каждом случае VB часто вел себя странно, то какие то ошибки, то еще чтото, совершенно нестабильная работа, причем на разных PC, и на разных виртуалках… в отличии от VMWare, но это так…

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


    1. nikitasius
      19.03.2018 15:33

      и в каждом случае VB часто вел себя странно, то какие то ошибки, то еще чтото

      На моей памяти только сеть отваливалась периодически, но это был зарепорченный баг.


      я вот чего не понимаю, влепили -26 в карму

      В статью. Не в карму. Комменты достаточно прочитать.


  1. MasMaX
    19.03.2018 09:11

    А зачем русский язык на Ubuntu? Странно что еще графику туда не поставили… в статье много воды, а конец сжат.


  1. Buchachalo
    19.03.2018 12:13

    ИМХО больше статей, и хороших и плохих. Если статья чем то плоха, осветите в комментариях, они на хабре ценнее чем статья зачастую. Для начинающих DevOps вполне сойдет. На чем то парням тренироваться нужно.

    И еще одно не популярное мнение. Господа пишущие «Зачем вообще эта статья? В ней нет ничего не стандартного, и вообще хоть сколько-нибудь оригинального, кроме множества ошибок.», но у которых за душой не одной статьи для сообщества, ну вы бы таких громких слов постеснялись бы говорить. Человек старался, делал материал, наверняка найдет свое ЦО. Мое ИМХО, внесите свой вклад, потом оценивайте чужой, а то ваши статьи вполне могут оказаться уровнем ниже чем топикстартера.


  1. mistergonza
    19.03.2018 14:55
    +1

    Молодость прям вспомнил =)


  1. gavrilovm
    19.03.2018 15:47

    Разве nginx не умеет справляться с динамичными страницами? Для чего дополнительно апач мастерить?