Статьи

Настройте автоматические виртуальные хосты с Nginx и Apache

При запуске новых приложений разработчику часто требуется настроить новый виртуальный хост. Это включает в себя настройку новых файлов конфигурации для Apache или новых записей сайта Nginx. Иногда вам нужно сделать это вручную. В других случаях это обрабатывается автоматически, если вы просто определяете сопоставление сайта с папкой. Но не будет ли это практичным, если бы мы могли пропустить этот шаг и просто .local.com URL-адрес, заканчивающийся, например, на .local.com для автоматического поиска его файлов, поэтому все, что нам нужно сделать, — это изменить наш файл etc/hosts только один раз ? Вау!

Mind blown

В этом руководстве мы настроим Nginx и Apache для автоматического просмотра определенных папок при обнаружении заданного формата URL-адреса. Например, URL mynewsite.local.com будет автоматически искать в DOC_ROOT/nynewsite/public файл index.php . После этого вы сможете определить другие шаблоны, подходящие для общих сценариев, стандартных приложений MVC ( public/index.php ) и приложений на основе Symfony / Silex ( web/app.php ) — все в зависимости от формата URL (например, mynewsite.sf2local.com может заглянуть внутрь web/ for app.php , что типично для этих фреймворков).

Этот учебник будет ориентирован на Unix, но подходит для Windows, если вы используете нашу коробку Homestead Improved .

Прежде чем мы начнем, убедитесь, something.local.com в вашем /etc/hosts есть something.local.com /etc/hosts , чтобы мы могли проверять этот URL по ходу работы. При желании измените его по своему вкусу. Я сосредоточусь на суффиксе local.com для запуска поиска Vhost в папке something в корне нашего документа, но это может быть буквально все, что допустимо в кодировке URL.

Настройка для Nginx

Nginx Logo

Предполагая, что у вас запущена установка Nginx, либо через Homestead Improved, либо любым другим способом, давайте создадим новую запись в папке, которую Nginx обычно использует для чтения конфигураций sites-available из: sites-available . В стандартной установке Nginx будет включать в себя все из папки sites-enabled в своей конфигурации. Размещение файла, который мы собираемся записать на sites-available , потребует от нас его активации позже.

 vim /etc/nginx/sites-available/wildcard.conf 

Сначала мы определяем блок server и говорим ему прослушивать порт 80:

 server { listen 80; } 

Все остальное, что мы напишем, будет помещено в блок сервера, ниже оператора listen .

 server_name ~^(www\.)?(?<sname>.+?).local.com$; 

Это прямо здесь, самая важная часть. Он сообщает Nginx: «Имя сервера будет представлено в форме этого регулярного выражения. sname бит sname , сохрани его на потом ».

 root /home/vagrant/Code/$sname; 

Это говорит Nginx «Корневая папка этого веб-приложения находится в этом месте». Так как он добавляет sname из приведенного выше регулярного выражения, путь становится динамическим, соответствующим URL. Если вы не используете виртуальную машину или у вас вообще настроена другая корневая папка, не стесняйтесь изменить это — просто убедитесь, что она заканчивается на $sname; , Если ваши приложения обычно имеют фронт-контроллер в public папке, не стесняйтесь добавлять public чтобы root оператор выглядел следующим образом:

 root /home/vagrant/Code/$sname/public; 

Этот подход я и буду использовать в окончательной версии файла.

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

 access_log /var/log/nginx/$sname-access.log; error_log /var/log/nginx/wildcard-error.log debug; 

Обратите внимание, что у нас не может быть переменной в журнале ошибок, только журнал доступа. Не уверен, почему это было реализовано так. К сожалению, это означает, что журналы ошибок с подстановочными символами будут объединены.

Ниже приведен полный код файла конфигурации, который мы написали. В зависимости от вашей установки, некоторые другие вещи могут отличаться (например, строки php-fpm и т. Д.), Но это выходит за рамки данного руководства.

 ``` server { listen 80; server_name ~^(www\.)?(?<sname>.+?).local.com$; root /home/vagrant/Code/$sname/public; index index.html index.htm index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log /var/log/nginx/$sname-access.log; error_log /var/log/nginx/wildcard-error.log debug; error_page 404 /index.php; sendfile off; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location ~ /\.ht { deny all; } } 

Возможно, ваша установка Nginx настроена по-другому, поэтому вам, возможно, придется поискать файлы конфигурации сайта. Также возможно, что вся ваша конфигурация Nginx находится в одном файле, и в этом случае просто добавьте к нему указанную выше конфигурацию — это также может быть файл с именем default в папке, sites-available вашего sites-available . Неважно, где находится эта конфигурация, пока она загружена — посмотрите расположение авто-включения конфигурации, заглянув внутрь etc/nginx/nginx.conf .

Наконец, нам нужно включить новую конфигурацию, создав символическую ссылку в папке sites-enabled :

 sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp sudo service nginx restart 

Если вы сейчас посетите something.local.com в своем браузере vagrant/Code/something/public будут загружены файлы из (в моем случае) vagrant/Code/something/public .

Настройка для Apache

Apache Logo

В этом разделе я предполагаю, что у вас есть работающий экземпляр Apache, который обслуживает ваши сайты PHP как обычно. Это может быть через PuPHPet или с вашим дружественным стеком * AMP, неважно — до тех пор, пока он работает.

Во-первых, нам нужно убедиться, что mod_vhost_alias включен. Это мод Apache, используемый для предоставления нам необходимых функций. Есть два способа сделать это. В более упрощенных установках команда a2enmod будет доступна в терминале, и все, что нужно, это sudo a2enmod vhost_alias . В других, опять же из-за проклятия Linux, вам нужно заглянуть в основной файл конфигурации, либо /etc/apache2/apache2.conf либо /etc/apache2/httpd.conf либо им подобные. Если это ваш случай, попробуйте найти строку, содержащую mod_vhost_alias . Если его там нет, добавьте следующую строку:

 LoadModule vhost_alias_module modules/mod_vhost_alias.so 

Обратите внимание, что путь в конце должен соответствовать расположению модулей Apache в вашей системе. Это также зависит от проклятия Linux, но часто находится в /etc/apache2/mods-available .

Как и Nginx, Apache обычно загружает свои конфигурации Vhost из /etc/apache2/sites-available и с расширением /etc/apache2/sites-enabled . Обычно он также поставляется с модулем для легкого включения и отключения сайтов, например: sudo a2ensite mysite.conf . По сути, это идентично приведенному выше разделу Nginx по созданию символической ссылки для включения новой конфигурации. Он загружает их в алфавитном порядке, поэтому мы создадим новый файл конфигурации для sites-enabled (или сделаем это на sites-available и включим сайт впоследствии) с именем 000-default.conf .

Первое утверждение, которое мы добавим, будет:

 UseCanonicalName Off 

Это необходимо для того, чтобы мы могли динамически назначать псевдонимы URL-адресам, которые получает Apache. Затем мы определяем блок VirtualHost:

 <VirtualHost *:80> ServerName vhosts.fqdn ServerAlias *.local.com VirtualDocumentRoot /var/www/%1+ </VirtualHost> 

%1 означает «Возьмите первую часть разделенного точками доменного имени». Для других вариантов, и если вы хотите настроить его по-другому, см. Документы .

Если мы сейчас поместим что- something в папку /var/www и в нее index.php с некоторым содержимым Hello World, все должно работать. Но в этом случае он выведет содержимое файла PHP в виде текста. Нам нужно настроить остальные параметры VirtualHost как обычно. Я вставлю свою версию PuPHPet ниже — ваша конфигурация может отличаться.

 UseCanonicalName Off <VirtualHost *:80> ServerName vhosts.fqdn ServerAlias *.local.com VirtualDocumentRoot /var/www/%1 <Directory ~ "/var/www/.*"> Options Indexes FollowSymlinks MultiViews AllowOverride All Require all granted <FilesMatch "\.php$"> Require all granted SetHandler proxy:fcgi://127.0.0.1:9000 </FilesMatch> </Directory> </VirtualHost> 

Теперь, если вы перезагружаете конфигурацию Apache с помощью sudo service apache2 restart или какой-либо другой команды, работающей в вашем дистрибутиве, вы должны иметь возможность получить доступ к something.local.com в вашем браузере и снова увидеть, как он работает, если вы поместили несколько файлов PHP в var/www/something/public .

Необязательно: dnsmasq

По желанию, если вы используете Linux или OS X, вы можете установить dnsmasq .

Dnsmasq — это инструмент, который, помимо прочего, перенаправляет диапазон URL-адресов на заданный IP-адрес. Это как поддержка регулярных выражений для /etc/hosts . С помощью этого инструмента вы можете установить все URL-адреса, оканчивающиеся на .local.com или любые другие, которые вы решите перенаправить на IP-адрес вашей виртуальной машины или на .local.com . Это означает, что вам больше никогда не придется редактировать файл hosts — всякий раз, когда вы начинаете новый проект, ваши URL-адреса и Vhosts могут считаться готовыми, и вы можете сразу же начать работать, значительно сократив количество devops.

На OS X с менеджером пакетов Homebrew :

 brew install dnsmasq 

В ваших дистрибутивах Linux загрузите tarball .

Если вы хотите еще больше автоматизировать это, вы можете добавить dnsmasq в качестве плагина Vagrant .

Чтобы настроить dnsmasq для пересылки шаблона URL-адреса на ваш IP-адрес и настроить свою ОС на переадресацию всех вызовов URL-адреса на dnsmasq, чтобы он мог это сделать, см. Это превосходное руководство .

Вывод

В этом уроке мы узнали, как автоматизировать ту часть devops, с которой мы все регулярно имеем дело — настраивать новых Vhosts и их домены. На каждый проект уходит всего пара минут, особенно с такими пакетами, как Homestead Improved , но это все еще пара минут — и возможность быстро переключиться на другой фиктивный проект для тестирования того сценария, о котором вы только что подумали или который нужно опробовать, бесценно для рабочего процесса.

Этот урок помог вам? Хотели бы вы получить больше информации по определенным темам? Дайте нам знать!