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