Локальный веб-сервер в Linux с использованием VirtualBox

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

В качестве основной рабочей системы у меня Elementary OS, которая постоена на базе Ubuntu. Установить в неё VirtualBox можно из штатного AppCenter, либо, если хочется новейшую версию, тогда следуя инструкциям с официального сайта. В качестве системы для веб-сервера традиционно Debian. Я использовал для установки образ debian-*-netinst.iso. Найти его или другой подходящий вам можно здесь.

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

PHP 7

За PHP 7 будущее и сайты на нём работают гораздо быстрее. Поэтому его стоит однозначно использовать для новых сайтов и, по возможности, переводить на него старые. Сейчас актуален PHP 7.1. Эта версия ещё отсутствует в репозиториях Debian 8.7.1, поэтому его установка чуточку сложнее. Ещё я сразу предупреждаю, что в отношении других пакетов, которые вы будете ставить на веб-сервер, тоже не помешает проявлять осторожность. Связанные с PHP пакеты из репозитория актуальной версии Debian по умолчанию будут пытаться установить вам заодно PHP 5, ведь они будут видеть, что его нет в вашей системе. В приципе, таких пакетов обычно не много, и эту небольшую сложность тоже вполне можно пережить. Перед установкой:

apt 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 update

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

apt install php7.1

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

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

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

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

Чтобы на ваших локальных сайтах работал PHP 7.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.

SSHFS

SSHFS — это Secure SHell FileSystem, программа позволяющая монтировать удаленную файловую систему. Это можно использовать вместо «Общих папок» в VirtualBox.

Работает это очень быстро. Хотя у меня и случались проблемы, когда смонтированный каталог отваливался. Обычно это происходило, когда я начинал работать с каталогом, в котором очень много файлов. Типа проекта на 1С-битрикс, где порядка 500 тысяч файлов.

Пример подключения:

sshfs -o uid=1000 -o workaround=truncate:rename -o reconnect kornev@192.168.0.100:/var/www /home/kornev/Webdev/www

Важно указать uid — это id вашего пользователя. В данном случае нет никаких проблем с записью. В смонтированном каталоге можно спокойно работать.

Отключение:

fusermount -u /home/kornev/Webdev/www

NFS

NFS — это Network File System, протокол распределенной файловой системы, позволяющий получить доступ к файлам по сети. Смысл тот же. Можно использовать вместо «Общих папок» в VirtualBox.

Пример монтирования:

sudo mount -t nfs 192.168.0.157:/var/www /home/kornev/Webdev/www

Отключение:

sudo umount -f -l /home/kornev/Webdev/www

Комментарии