Исторически PHP работал, используя CGI, Common Gateway Interface.
При каждом запросе веб-сервер:
$_SERVER
попадают из переменных окружения) с характеристиками запросаИменно из CGI PHP унаследовал модель работы Designed To Die.
FastCGI - современная, улучшенная версия CGI, в которой:
Однако некоторые недостатки FastCGI привели к появлению...
Улучшенный FastCGI. Этот способ в основном используется в связке с nginx
mod_php
Классика, самый обычный способ конфигурации PHP с веб-сервером Apache. Кодовая база PHP подключается как модуль веб-сервера и работает "изнутри" веб-сервера. Достоинство этого подхода в простоте настройки и скорости работы. Недостатки же вытекают из достоинств: слабая масштабируемость, зависимость от веб-сервера, меньшая безопасность, отсутствие возможности гибко конфигурировать версии PHP.
Часто используемый для обычных проектов и разработки веб-сервер. PHP обычно неплохо работает с настройками по умолчанию.
Для подключения PHP в настройках где-то (обычно в /etc/apache2/) должна быть следующая строка, или строка, подобная этой:
LoadModule php5_module modules/mod_php.so
Эти же строки добавляют связь между расширением файла и модулем php для обрабоки этих файлов:
<FilesMatch "\.(php|php[57]|phtml)$">
SetHandler application/x-httpd-php
</FilesMatch>
DirectoryIndex
указывают веб-серверу, что кроме index.html
нужно обрабатывать и index.php
:
DirectoryIndex index.php index.phtml
Работает как модуль mod_vhost_alias. Перед настройкой убедитесь что этот модуль подключен.
Обычно в дистрибутивах linux с apache домены настраиваются путем копипасты конфига домена в папке на подобие /etc/apache2/sites.d/. Возможна так же папка /etc/apache2/sites.enabled.d/ в которой хранятся симлинки на включенные сайты. Сайты из sites.d без симлинка в этой папке выключены. Enabled сайты подключаются в основной конфиг apache через директиву Include (в конце файла).
Однако есть альтернатива: Virtual mass hosting.
Этот способ отличается упрощенным созданием и удалением доменов. Работает он благодаря следующим возможностям DNS и apache2:
# 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 и так далее:
Таким образом вы можете использовать более удобные имена директорий.
Подробнее: https://httpd.apache.org/docs/2.4/vhosts/mass.html
.htaccess
Эти файлы являются способом установки локальных настроек для директории и её поддиректорий. Синтаксис в них такой же как и в других конфигах apache. Для изменения настроек PHP вы можете использовать директиву php_value
согласно синтаксису php.ini
.
mod_rewrite
Еще один модуль apache для отвязывания адреса URL от реальной файловой системы. Часто вызывает боль при попытках отладить сложные конфигурации. Для отладки можно включить логгирование, но только при конфигурировании mod_rewrite
в конфиге apache, а не в
.htaccess
.
Данную опцию надо занести в конфиг виртуального хоста, поэтому он несовместим с Mass Virtual Hosting:
LogLevel alert rewrite:trace3
Умолчательный .htaccess для перенаправления всех запросов к index.php для дальнейшего роутинга средствами MVC-фреймворка:
RewriteEngine on
# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php [L]
Учтите, что для работы .htaccess вы должны разрешить изменения конфигурации для конкретной директории. Делается это с помощью следующих настроек веб-сервера в секции Directory:
AllowOverride all
Require all granted
Однако в целом Apache изначально задуман для отображения папок реальных файлов, и данные костыли выглядят чужеродно. Более органичен для таких целей NGINX и PHP-FPM.
Легковесный быстродействующий веб-сервер, популярный для высоконагруженных решений. Конфигурация скорее настраивает доменные имена и их обработчики, чем файлы и директории. В этом контексте NGINX является reverse-proxy, т. е. фасадом перед реальным веб-сервером, обрабатывающим запросы. Тем не менее NGINX без проблем раздает файлы и может сильно оптимизировать раздачу статики и загрузку файлов. На данный момент в NGINX даже есть внутренний скриптовый язык, базированный на JS.
php-fpm
Типичная конфигурация nginx+php реализуется через php-fpm. В отличие от Apache, в котором mod_php является частью процесса веб-сервера, при работе с php-fpm нужно два процесса (демона), которые обрабатывают запросы. Первый - веб-сервер, который обрабатывает входящие запросы, привязывает веб-приложение к домену, зачастую отдает статические файлы и так далее. Второй процесс - сервер приложения, к которому веб-сервер обращается для обработки запросов.
php-fpm
Файл php-fpm.conf хранит основные настройки:
user = nobody
group = nobody
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
user,group
- пользователь и группа, из под которых будет запускаться сервер приложенийlisten
- адрес и порт. Обычно используется 127.0.0.1 для безопасности. Запомните эти параметры.server {
listen 164.138.30.21; //внешний IP
server_name yieldmap.helium.asmer.org.ua; //домен
root /var/www/gorobets/yieldmap.helium.asmer.org.ua; //DocumentRoot
location / { //корень сайта
try_files $uri $uri/ /index.php;
autoindex on;
}
location ~ \.php$ { //все PHP на fpm
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/run/php-fpm.socket;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
}
параметром fastcgi_pass
указывается сокет в файловой системе (или сетевой, 127.0.0.1:9000, например)
php.ini
Это файл конфигурации собственно php. Большинство настроек можно узнать используя phpinfo()
в коде.
Учтите, что для каждого варианта запуска php скорее всего будет свой php.ini. Т. е. настройки, которые работают в консоли, вовсе не обязательно что совпадают с mod_php или php-fpm.
Важные конфигурационные параметры:
short_open_tag = Off
Опция включает или выключает короткие php-тэги <?
и ?>
max_execution_time = 30
время работы скрипта. Имеет смысл для разгрузки веб-серерва и никакого смысла для работы скриптов в консоли.
memory_limit = 128M
Лимит памяти. Может грохнуть скрипт, который ворочает большим объемом данных, например генерирует прайс в xls, или ORM по большому набору данных в БД.
error_reporting = E_ALL
Какие ошибки логгировать.
display_errors = On
Показывать ошибки в выводе или нет. Удобно видеть ошибки в перемешку с HTML при отладке, но недопустимо в продакшене.
log_errors = On
Опция полезна для записи ошибок в лог-файл на продакшене
Forbidden
и права доступаУчтите, что для работы вашего проекта, нужно что бы файлы были доступны для соответственного процесса. Например, если вы отдаете статику с помощью NGINX, а php обрабатываете через php-fpm, вы должны удостовериться, что у этих процессов доступ к статическим и PHP-файлам соответственно.
Логи - это важно и интересно. Обычно находятся в /var/log/apache*/*
, /var/log/nginx/*
, /var/log/php*/*