# Web-servers && .htaccess ## PHP Исторически **PHP** работал, используя **CGI**, Common Gateway Interface. При каждом запросе **веб-сервер**: - Принимал соединение, определял по адресу или конфигурации, что данный запрос является **CGI** - Создавал набор переменных окружения (например данные в `$_SERVER` попадают из переменных окружения) с характеристиками запроса - Запускал процесс, обрабатывающий **CGI** запрос, передавая ему на стандартный ввод тело **HTTP** запроса - Процесс обрабатывал **HTTP** запрос, стандартный вывод процесса перенаправлялся **веб-сервером** клиенту в браузер. По окончанию обработки запроса процесс прекращал свою работу. Именно из **CGI** **PHP** унаследовал модель работы *Designed To Die*. ### Современные интерфейсы между **PHP** и **веб-сервером** #### FastCGI **FastCGI** - современная, улучшенная версия **CGI**, в которой: - Для ускорения обработки запросов *процессы не запускаются при каждом запросе, а постоянно работают, обрабатывая множество запросов* - Общение с процессом происходит не через стандартные потоки ввода-вывода, а через сокеты (сетевые соединения или сокеты в файловой системе), что позволяет разнести **FastCGI** процессы на множество других серверов Однако некоторые недостатки **FastCGI** привели к появлению... #### PHP FastCGI Process Manager (php-fpm) Улучшенный **FastCGI**. Этот способ в основном используется в связке с **nginx** #### `mod_php` Классика, самый обычный способ конфигурации **PHP** с **веб-сервером** **Apache**. Кодовая база **PHP** подключается как модуль **веб-сервера** и работает "изнутри" веб-сервера. Достоинство этого подхода в простоте настройки и скорости работы. Недостатки же вытекают из достоинств: слабая масштабируемость, зависимость от **веб-сервера**, меньшая безопасность, отсутствие возможности гибко конфигурировать версии **PHP**. ## Apache Часто используемый для обычных проектов и разработки **веб-сервер**. **PHP** обычно неплохо работает с настройками по умолчанию. ### Основные настройки Для подключения **PHP** в настройках где-то (обычно в /etc/apache2/) должна быть следующая строка, или строка, подобная этой: ``` LoadModule php5_module modules/mod_php.so ``` Эти же строки добавляют связь между расширением файла и модулем php для обрабоки этих файлов: ``` SetHandler application/x-httpd-php ``` `DirectoryIndex` указывают **веб-серверу**, что кроме `index.html` нужно обрабатывать и `index.php`: ``` DirectoryIndex index.php index.phtml ``` ### Virtual mass hosting Обычно в дистрибутивах linux с apache домены настраиваются путем копипасты конфига домена в папке на подобие /etc/apache2/sites.d/. Возможна так же папка /etc/apache2/sites.enabled.d/ в которой хранятся симлинки на включенные сайты. Сайты из sites.d без симлинка в этой папке выключены. Enabled сайты подключаются в основной конфиг apache через директиву Include (в конце файла). Однако есть **альтернатива**: **Virtual mass hosting**. Этот способ отличается упрощенным созданием и удалением доменов. Работает он благодаря следующим возможностям **DNS** и **apache2**: - В DNS конфигурации прописывается звездочка для поддомена: *.dev.galera.com ссылается на IP-адрес вашего сервера с apache2. Таким образом *любой* поддомен типа superproject.dev.galera.com будет адресован на один сервер. - На этом сервере имя поддомена превращается в имя папки, из которой беруться файлы сайта. ``` # get the server name from the Host: header UseCanonicalName Off # this log format can be split per-virtual-host based on the first field # using the split-logfile utility. LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon CustomLog "logs/access_log" vcommon # include the server name in the filenames used to satisfy requests VirtualDocumentRoot "/www/hosts/%0/docs" VirtualScriptAlias "/www/hosts/%0/cgi-bin" ``` Вместо $0 подставляется имя сервера из HTTP-заголовка. Таким образом создание нового поддомена для проекта сводится к созданию директории с именем домена. Есть так же другие переменные, %1, %2 и так далее: - %1 - первый поддомен ("www" в "www.google.com", "superproject" в "superproject.dev.galera.com") - %2 - второй поддомен ("google" в "www.google.com", "dev" в "superproject.dev.galera.com") Таким образом вы можете использовать более удобные имена директорий. Подробнее: https://httpd.apache.org/docs/2.4/vhosts/mass.html ### `.htaccess` ## NGINX