Затея может показаться странной, ведь в Linux и так без всяких извращений можно настроить веб-сервер. Но я так привык. Мне нравится отделять основную рабочую систему от той, в которой я веду веб-разработки. Во-первых, настроить изолированную систему я могу совершенно иначе. Во-вторых, возможность легко откатить её до любого состояния, используя снимки.

В качестве основной рабочей системы у меня Elementary OS 0.4 Loki, которая постоена на базе Ubuntu 16.04 LTS. Установить в неё VirtualBox можно из штатного AppCenter, либо, если хочется новейшую версию, тогда следуя инструкциям с официального сайта.

В качестве системы для веб-сервера традиционно Debian. Я использовал для установки образ debian-8.7.1-i386-netinst.iso. Найти его или другой подходящий вам можно здесь.

В предыдущей статье я уже описывал настройку веб-сервера на Debian, установленный в VirtualBox. Тогда в качестве основной системы была Windows 10. В этой статье я не буду повторяться. Цель приследуется аналогичная. Установка Debian в виртуальную машину — один к одному. Поэтому все подробности там. Здесь я уделю внимание лишь деталям, которые имеют место именно в случае работы под Linux.

Итак, порядок будет такой:

  • Устанавливаем Debian на вартуальную машину. Всё как и в предыдущей статье, но немного по-другому настраиваем проброс портов. Смотрите ниже.
  • Настраиваем в виртуальной машине доступ по SSH для root, устанавливаем дополнения гостевой ОС, появляется общая папка. Настраиваем веб-сервер и т.д. Внутри виртуальной машины ничего нового, всё аналогично можно делать! В том числе аналогично размещаются и настраиваются ваши локальные сайты. Едиственное, я сейчас начал использовать PHP7.1, вместо PHP5. Если для вас это актуально, то тоже смотрите ниже.
  • Настройка основной системы Linux, чтобы в ней без шаманств открывались сайты, работающие на локальном веб-сервере виртуальной машины.

Hosts-файл

В основной системе Linux ваши локальные сайты нужно будет прописывать в файл /etc/hosts в таком виде:

127.0.1.1 webdev.loc
127.0.1.1 d1mon.loc
127.0.1.1 other-site.loc

Оно сразу начинает работать.

Проброс портов

В Linux не получится пробросить для web из VirtualBox порт с 80 на 80. Точнее, это можно сделать, но для этого потребуется каждый раз запускать VirtualBox с правами root. Конечно, такое нафиг не надо, поэтому пробрасываем порт с 80 на 3080:

Пробрасываем порт с 80 на 3080

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

http://d1mon.loc:3080

Чтобы этого не делать и открывать локальные сайты просто по адресу потребуется настроить для них прокси в Nginx. Обращаю внимание, что речь идет об Nginx в основной системе, а не в виртуальной.

Чтобы не мучиться с sudo сразу:

sudo su

Устанавливаем Nginx:

apt-get install nginx

Создаём файл /etc/nginx/sites-available/webdev с настройками:

server {
    listen 80;
    server_name webdev.loc d1mon.loc other-site.loc

    location / {
        proxy_pass http://127.0.0.1:3080;
        proxy_redirect off;
        proxy_set_header Connection close;
        proxy_set_header Host $host;
    }
}

Таким образом, для всех своих локальных сайтов прописываем настройки прокси в одном файле.

Подключаем настройки:

ln -s /etc/nginx/sites-available/webdev /etc/nginx/sites-enabled/webdev

Перезапускаем Nginx:

/etc/init.d/nginx restart

Все! Теперь локальные сайты должны открываться по простому адресу.

HTTPS

Что делать если хочется, чтобы локальные сайты работали по https? Решение, как оказалось тоже довольно простое.

Первое — нужно создать самоподписанный SSL-сертификат. О том, как это делается в Debian я писал в этой статье. Обратите внимание, что этот сертификат мы будем подключать в основной системе!

Я сгенерировал сертификат в виртуальной машине, где у меня Debian, а потом скопировал созданные файлы в основную систему, в каталоги:

/etc/ssl/certs/server.crt
/etc/ssl/private/server.key

Второе — в файле /etc/nginx/sites-available/webdev, где мы настраивали прокси, добавляем отдельно настройки для сайта, работающего по https. Просто ниже первых настроек пишем:

server {
    listen 443;
    server_name https-site.loc;

    ssl on;
    ssl_protocols SSLv3 TLSv1;
    ssl_certificate /etc/ssl/certs/server.crt;
    ssl_certificate_key /etc/ssl/private/server.key;

    location / {
        proxy_pass http://127.0.0.1:3080;
        proxy_redirect off;
        proxy_set_header Connection close;
        proxy_set_header Host $host;
    }
}

Соответственно надо добавить сайт https-site.loc в файл /etc/hosts основной системы, также, как мы делали это выше. Ну и, конечно, этот сайт должен быть у вас настроен на веб-сервере в виртуальной машине. Там это обычный сайт http. Совсем не обязательно настраивать ещё и там его, как https.

Не забывайте перезапускать Nginx после редактирования настроек.

Из основной системы сайт должен открываться по двум ссылкам:

http://https-site.loc:3080
https://https-site.loc

При такой настройке сайт будет открываться по https, но разные скрипты и т.д. будут считать, что он работает по http. В ряде случаев это не то, что требуется при разработке. Чтобы от этого избавиться придется дополнительно настроить https на веб-сервере в виртуальной машине. Также потребуется пробросить порт 443 на 3443 ну и чуть подправить под это настройки прокси.

PHP7.1

За PHP7 будущее и сайты на нём работают гораздо быстрее. Поэтому его стоит однозначно использовать для новых сайтов и, по возможности, переводить на него старые.

На текущий момент PHP7.1 отсутствует в репозиториях Debian 8.7.1, поэтому его установка чуточку сложнее. Ещё я сразу предупреждаю, что в отношении других пакетов, которые вы будете ставить на веб-сервер, тоже не помешает проявлять осторожность. Связанные с PHP пакеты из репозитория актуальной версии Debian по умолчанию будут пытаться установить вам заодно PHP5, ведь они будут видеть, что его нет в вашей системе. В приципе, таких пакетов обычно не много, и эту небольшую стложность тоже вполне можно пережить.

Перед установкой:

apt-get install apt-transport-https lsb-release ca-certificates
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt-get update

Я не рекомендую производить установку PHP7.1 одной командой:

apt-get install php7.1

Она сделает всё верно, но установит заодно и всякий хлам, типа Apache. А он нафиг не нужен на современном веб-сервере, использующем Nginx и php-fpm. Поэтому ставим только то, что реально нужно:

apt-get install php7.1-fpm php7.1-cgi

Требуемые дополнительно модули PHP устанавиливаются, как и раньше, просто везде добавляется 7.1, например:

apt-get install php7.1-gd php7.1-xml

Чтобы на ваших локальных сайтах работал PHP7.1 нужно немного изменить их конфиги Nginx. Вот простейший пример из предудущей статьи:

server {
  listen 80;
  server_name site.loc;
  root /var/www/site.loc;
  index index.php;

  location / {
    try_files $uri $uri/ =404;
  }

  location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
  }

  access_log /var/log/nginx/site.loc_access.log;
  error_log /var/log/nginx/site.loc_error.log;
}

Меняем одну строчку, было:

fastcgi_pass unix:/var/run/php5-fpm.sock;

Стало:

fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;

После не забудьте перезапустить Nginx.

База

По установке Percona Server ничего нового:

wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
apt-get update
apt-get install percona-server-server-5.7

А вот утилиту phpMyAdmin я предпочёл последний раз ставить используя Composer. Так я получил новую версию, работающую с PHP7.1 и MySQL5.7. Ничего лишнего в системе не появилось, нужные версии модулей PHP мы устанавиливаем предварительно сами:

apt-get install php7.1-mbstring php7.1-mysqli php7.1-xml php7.1-curl

Устанавливаем сам Composer, если ещё нет:

cd /usr/src
apt-get install curl php7.1-cli
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

Переходим в каталог, куда хотим установить, например:

cd /var/www/webdev.loc

Установка phpMyAdmin:

composer create-project phpmyadmin/phpmyadmin --repository-url=https://www.phpmyadmin.net/packages.json --no-dev

Он установится по пути /var/www/webdev.loc/phpmyadmin, соответственно, если у вас настроен локальный сайт webdev.loc, то открываем phpMyAdmin по ссылке:

http://webdev.loc/phpmyadmin

При авторизации внизу будет сообщение:

Хранилище конфигурации phpMyAdmin не полностью настроено, некоторые расширенные функции были отключены. Узнайте причину.

Ничего страшного. Просто нужно создать базу, в которую phpMyAdmin будет сохранять свои настройки. Следуем по ссылке в этом сообщении. И там нажимаем ссылку «Создать».

Внизу phpMyAdmin можно увидеть ещё одно сообщение:

В конфигурационном файле необходимо задать парольную фразу (blowfish_secret).

Создаём файл конфигурации из файла-примера (копируем):

cp /var/www/webdev.loc/phpmyadmin/config.sample.inc.php /var/www/webdev.loc/phpmyadmin/config.inc.php

В файле редактируем параметр:

$cfg['blowfish_secret'] = '5e4u6ir';

В качестве значения вписываете любые свои символы.

Теперь phpMyAdmin готов к полноценному использованию.