Использование FastCGI для хостинга PHP приложений на IIS 7.0
Автор: Руслан Якушев
Данная статья описывает конфигурацию модулей FastCGI и PHP для хостинга PHP приложений на IIS 7.0
Важно: Данная статья содержит инструкции по установке компонента FastCGI в операционных системах Windows Server 2008 и Windows Vista SP1. Обратите внимание: на Windows Vista должен быть установлен SP1.
Содержание
Краткий обзор
Благодаря модулю FastCGI в IIS поддерживается большинство популярных приложений коллективной работы, которые используют протокол FastCGI для хостинга на Web сервере IIS высокопроизводительных и надёжных средств. FastCGI предоставляет высокопроизводительную альтернативу CGI (Common Gateway Interface), стандартного средства, являющегося интерфейсом между внешними приложениями и Web серверами, которые поддерживаются как часть возможностей IIS начиная с первых версий сервера.
Программы CGI выполняются на сервере при каждом запросе, это позволяет обработать запросы, динамически сгенерировать ответы и возвратить их обратно клиентам. Из-за того, что многие приложения коллективной работы не поддерживают исполнения сразу нескольких потоков, CGI позволяет надежно исполненять нескольких процессов под управлением IIS, обрабатывая по одному запросу на процесс. К сожалению это приводит к снижению производительности из-за высоких накладных расходов связанных с необходимостью запуска и остановки процессов при обработке каждого запроса.
FastCGI является более производительным по сравнению с CGI, механизм его работы выглядит так – один и тот же процесс используется для обработки множество поступивших запросов. FastCGI так же поддерживает работу с библиотеками не умеющими безопасно работать в многопоточной среде. При работе с набором повторно используемых процессов мы можем быть уверены в том, что каждый процесс будет обрабатывать не более одного запроса в каждый момент времени.
Включение поддержки FastCGI в IIS 7.0
Windows Server 2008
Добавьте роль CGI сервиса через меню Server Manager -> Roles -> Add Role Services. Этим мы включим поддержку двух сервисов CGI и FastCGI:
Windows Vista SP1
Добавьте расширение CGI, используя Control Panel -> Programs and Features -> Turn Windows features on or off. Этим мы включим поддержку двух сервисов CGI и FastCGI:
Важно: Установка обновлений для модуля FastCGI
Обновление модуля FastCGI сервера IIS 7.0 решает некоторые проблемы совместимости с популярными PHP приложениями. Установите данное обновление из следующих источников:
Установка пакета администрирования для IIS 7.0
Примечание: Данный шаг не обязателен (опционален).
Из большого числа полезных функций административного пакета IIS 7.0 можно выделить интерфейс конфигурирования модуля FastCGI. Административный пакет может быть установлен из следующих источников:
Установка и настройка PHP
Рекомендуется использовать сборку non-thread safe PHP с модулем FastCGI сервера IIS 7.0. Эта сборка PHP дает значительный прирост производительности в отличие от стандартной сборки, т.к не производит проверок thread-safety, которые не требуются, так как сам FastCGI гарантирует однопоточное исполнение процессов, в окружении сервера.
C:\PHP>php –info
Если PHP вместе со всеми компонентами от которых он зависит был установлен корректно, то данная команда выдаст информацию о текущей конфигурации PHP.
Настройка IIS 7.0 для обработки PHP запросов
Для того чтобы приложения PHP корректно работали на IIS 7.0 необходимо настраивать привязку к запрашиваемым файлам, посредством которых IIS будет пропускать специфические PHP запросы к PHP приложениям, используя протокол FastCGI.
Прим.переводчика: при запросе клиентом файла с расширением *.php с Web сайта/сервера, расположенного на IIS 7.0, сервер будет «отдавать» обработку php файлов приложению, отвечающему за обработку php файлов.
Используя консоль управления IIS
Откройте IIS Manager и выберете “Handler Mappings” на уровне управления сервером:
Запустите “Add Module Mapping” для конфигурации, представленной на рисунке ниже:
Нажмите OK. На запрос о создании приложения FastCGI нажмите Yes.
Протестируйте корректную привязку заголовков, созданием файла phpinfo.php в папке C:\inetpub\wwwroot, используя следующий код:
<?php phpinfo(); ?>
Откройте браузер и перейдите по ссылке http://localhost/phpinfo.php. Если установка прошла корректно, то вы увидите стандартную страницу конфигурации PHP:
Примечание: Если Вы не видите в списке модулей "FastCgiModule", то это означает, что модуль не зарегистрирован, либо не включен. Для того, чтобы проверить, зарегистрирован ли модуль FastCGI откройте конфигурационный файл IIS по следующему адресу: %WINDIR%\windows\system32\config\applicationHost.config и проверьте присутствие значения в следующей секции:
<globalModules>:
<add name="FastCgiModule" image="%windir%\System32\inetsrv\iisfcgi.dll" />
Также, в этом же файле, убедитесь в том, что модуль FastCGI добавлен в секцию <modules>:
<add name="FastCgiModule" />
Используя командную строку
Альтернативой предыдущим шагам может служить использование команды appcmd.
Для создания пула приложений FastCGI выполните следующую команду:
C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\{php_folder}\php-cgi.exe']
После этого создайте привязку заголовков:
C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/handlers /+[name='PHP_via_FastCGI',path='*.php',verb='*',modules='FastCgiModule',scriptProcessor='c:\{php_folder}\php-cgi.exe',resourceType='Unspecified']
Примечание: Если вы используете PHP версий 4.X,то вместо php-cgi.exe необходимо использовать php.exe.
Рекомендуемые руководства по конфигурированию FastCGI и PHP
Данная ссылка содержит zip архив с файлом презентаций руководств, по разворачиванию хостинга PHP приложений в среде общего хостинга .
Безопасная изоляция для PHP Web сайтов
Рекомендации по изоляции PHP Web сайтов в среде общего хостинга согласуются с общей безопасностью изоляции, рекомендованной для IIS 7.0. В особенности следует обратить внимание на следующее:
Более подробно о безопасной изоляции в окружении общего хостинга написано в документации «Изолирование сайтов с пулами приложений»
Режим рециркуляции PHP процессов
Убедитесь в том, что FastCGI всегда рециркулирует (перезагружает - прим.перевод) процессы php-cgi.exe, прежде чем завершается работа основного PHP процесса. Режим рециркуляции процессов FastCGI контролируется параметром конфигурации, который называется instanceMaxRequests (максимальное кол-во запросов на экземпляр приложения - прим.перевод). Данное значение определяет, какое кол-во запросов выполнит FastCGI, прежде чем произойдёт рециркуляция. В PHP так же существует функция рециркуляции, которая контролируется параметром PHP_FCGI_MAX_REQUESTS. Установка наименьшего значения для instanceMaxRequests или подобного параметра PHP_FCGI_MAX_REQUESTS, гарантирует, что основной PHP процесс не будет закончен преждевременно.
Свойства для FastCGI могут быть изменены при помощи IIS Manager или командной строки, используя приложение appcmd.
Использование IIS manager
Для настройки процесса рециркуляции FastCGI, используя IIS Manager, вам необходимо установить Административный пакет для IIS 7.0 и выбрать на уровне севера меню FastCGI settings (параметры FastCGI):
Далее необходимо выбрать приложение FastCGI, которое вы хотите настроить и нажать "Edit..." в панели Actions:
В окне "Edit FastCGI application" установите для параметра instanceMaxRequest значение 10000 нажмав кнопку обзора в меню EnvironmentVariables:
Добавьте переменную PHP_FCGI_MAX_REQUESTS,установив для неё значение в 10000:
Примечение: Если вы не установите данные значения, то по умолчанию они будут следующими: instanceMaxRequests = 200, PHP_FCGI_MAX_REQUESTS = 500 (для большинства сборок PHP).
Использование командной строки:
Для конфигурирования процессов рециркуляции FastCGI и PHP посредством appcmd, используйте следующие команды:
C:\>%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /[fullPath='c:\{php_folder}\php-cgi.exe'].instanceMaxRequests:10000C:\>%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10000']"
Версионность PHP
Большинство PHP приложений могут зависеть от функций или расширений доступных только в определённой версии PHP. Если такие приложения должны быть размещены на одном сервере хостинга, то необходимо чтобы на данном сервере одновременно поддерживались и работали разные версии PHP. Обработчик FastCGI в IIS 7.0 полноценно поддерживает одновременную работу различных версий PHP на одном сервере.
К примеру, допустим что на своём Web сервере вы планируете поддерживать следующие сборки: PHP 4.4.8, PHP 5.2.1 и PHP 5.2.5 non-thread safe. Для включения данной возможности вы должны положить соответствующие исполняемые файлы PHP в различные папки на файловой системе (к примеру C:\php448\, C:\php521\ и C:\php525nts) и создать соответствующие пулы приложений для каждой версии:
C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php448\php.exe']C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php521\php-cgi.exe']C:\>%windir%\system32\inetsrv\appcmd set config /section:system.webServer/fastCGI /+[fullPath='c:\php525nts\php-cgi.exe']
Так, если у вас есть 3 Web сайта (site1, site2, site3), каждый из которых должен использовать различные версии PHP, вы можете задать соответствие заголовков для каждого из сайтов, создав соответствующий пул приложений FastCGI.
Примечание: Каждый пул приложений процессов FastCGI будет идентифицируется уникально - комбинацией полного пути и свойствами аргументов.
C:\>%windir%\system32\inetsrv\appcmd set config site1 –section:system.webServer/handlers /+”..[name=’PHP448_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php448\php.exe’,resourceType=’Either’]C:\>%windir%\system32\inetsrv\appcmd set config site2 –section:system.webServer/handlers /+”..[name=’PHP521_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php521\php-cgi.exe’,resourceType=’Either’]C:\>%windir%\system32\inetsrv\appcmd set config site3 –section:system.webServer/handlers /+”..[name=’PHP525nts_via_FastCGI’,path=’*.php’,verb=’*’,modules=’FastCgiModule’,scriptProcessor=’c:\php525nts\php-cgi.exe’,resourceType=’Either’]
Рекомендации по безопасности PHP
Следующие настройки могут быть использованы для улучшения безопасности установленного PHP. Следуя рекомендациям найдите и измените в файле php.ini следующие значения:
Значение
Описание
allow_url_fopen=Offallow_url_include=Off
Отключение удалённых URLs для функций управления файлами, которые могут быть использованы во вредоносном коде.
register_globals=Off
Отключение register_globals.
open_basedir="c:\inetpub\"
Определение директории, в которой процессы PHP могут читать и записывать на файловой системе.
safe_mode=Offsafe_mode_gid=Off
Ограничение безопасного режима.
max_execution_time=30max_input_time=60
Лимит времени выполнения
memory_limit=16Mupload_max_filesize=2Mpost_max_size=8Mmax_input_nesting_levels=64
Лимит на использование размеров памяти и файлов.
display_errors=Offlog_errors=Onerror_log="C:\path\of\your\choice"
Настройка сообщений об ошибках и ведения логов.
fastcgi.logging=0
Модуль FastCGI для IIS может обрабатывать запросы с ошибками, если PHP отправляет данные в stderr (стандартный поток ошибок – прим.перевод) используя протокол FastCGI. Отключение ведения логов FastCGI предотвращает отправку приложением PHP сообщений об ошибках, используя stderr, генерируя при этом ошибку с кодом 500 для клиентов.
expose_php=Off
Скрытие присутствия PHP
Конфигурирование PHP на уровне сайтов
Данная секция описывает процедуры, которые необходимы для настройки PHP на уровне сайтов. Хочется обратить внимание на то, что данная рекомендация обнародована и проверена Radney Jasmin совместно с хостинг провайдером GoDaddy.com, который официально поддерживает PHP хостинг на Windows Server 2008 посредством FastCGI.
Пулы процессов PHP на уровне сайтов
Когда каждый Web сайт имеет собственный пул приложений (это является рекомендованной практикой для IIS 7.0), появляется возможность ассоциировать выделенный пул процессов FastCGI с каждым Web сайтом. Пул приложений процессов FastCGI идентифицируется уникально - комбинацией полного пути и атрибутами аргументов. Итак, если необходимо создать несколько процессорных пулов FastCGI для некоторого исполняемого процесса, такого как php-cgi.exe,то атрибуты аргументов могут использоваться для разграничения процессорных пулов. В дополнении процессы php-cgi.exe с применением ключа командной строки «-d», могут использоваться для определения INI записи в процессе PHP. Данный ключ может быть использован для установки различных значений PHP, которые позволяют задавать уникальность аргументов для каждого пула.
К примеру, если двум Web сайтам "website1" и "website2" необходимо использовать собственные настройки PHP, то нужно изменить пул процессов FastCGI следующим образом:
<fastCgi> <application fullPath="C:\PHP\php-cgi.exe" arguments="-d open_basedir=C:\Websites\Website1" /> <application fullPath="C:\PHP\php-cgi.exe" arguments="-d open_basedir=C:\Websites\Website2" /></fastCgi>
В данном примере настройки PHP, в частности директива open_basedir, используются для разграничения процессорных пулов. В дополнении это заставляет PHP процесс выполняться для каждого пула процессов только в той директории, в которой расположен корневой Web сайт.
Тогда website1 может иметь сопоставление PHP заголовков, как показано ниже:
<system.webServer> <handlers accessPolicy="Read, Script"> <add name="PHP via FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\PHP\php-cgi.exe|-d open_basedir=C:\Websites\Website1" resourceType="Unspecified" requireAccess="Script" /> </handlers></system.webServer>
и website2 может иметь следующее сопоставление PHP заголовков:
<system.webServer> <handlers accessPolicy="Read, Script"> <add name="PHP via FastCGI" path="*.php" verb="*" modules="FastCgiModule" scriptProcessor="C:\PHP\php-cgi.exe|-d open_basedir=C:\Websites\Website2" resourceType="Unspecified" requireAccess="Script" /> </handlers></system.webServer>
Определение месторасположения файла php.ini
Во время запуска процесс PHP определяет месторасположение файла конфигурации php.ini используя различные настройки. В официальной документации PHP детально описан процесс инициализации (начального запуска) процесса PHP. Так, одним из мест поиска процессом PHP своего файла конфигурации (php.ini) может быть директива PHPRC (PHPRC – это переменная среда ОС, как TMP или Temp – прим.перевод). Если процесс PHP находит файл конфигурации, определённый в вышеописанной директиве, то он начинает использовать данный файл конфигурации, игнорируя путь заданный по умолчанию в файле php.ini. Данная директива полезна для пользователей хостинга, они могут применять свои собственные настройки php.ini на уровне своих сайтов.
К примеру, существует два Web сайта: website1 и website2; расположенных по следующим путям C:\WebSites\website1 и C:\WebSites\website2, тогда пул процессов php-cgi.exe в секции <fastCgi> файла applicationHost.config должен иметь следующий вид:
<fastCgi> <application fullPath="C:\PHP\php-cgi.exe" arguments="-d open_basedir=C:\Websites\Website1"> <environmentVariables> <environmentVariable name="PHPRC" value="C:\WebSites\website1" /> </environmentVariables> </application> <application fullPath="C:\PHP\php-cgi.exe" arguments="-d open_basedir=C:\WebSites\Website2"> <environmentVariables> <environmentVariable name="PHPRC" value="C:\WebSites\website2" /> </environmentVariables> </application></fastCgi>
В данном случае WebSite1 имеет свои настройки php.ini файла, который расположен в директории C:\WebSites\website1, тогда как WebSite2 имеет свои настройки файла php.ini, который расположен в директории C:\WebSites\website2. Данная конфигурация так же предполагает что значение PHPRC не задано, иначе сделать уникальные установки файла php.ini на уровне сайтов не представляется возможным.
Модуль URL rewriting для PHP приложений
Большинство популярных PHP приложений используют функциональность URL rewriting на Web серверах, которая предоставляет отображение дружественных ссылок и более корректное предоставление информации для поисковых машин (ссылки вида http://site.name/page123,а не http://site.name/mod_content/page.php=id123&disp - прим.перевод). В IIS 7.0 поддержка URL rewriting (перезапись ссылок) поддерживается посредством модуля URL rewrite.
В следующих статьях представлено подробное описание данного модуля:
Полезные ресурсы
Дополнительную информацию о хостинге PHP приложений на IIS 7.0 вы можете прочитать на следующих ресурсах:
Схожие ресурсы
Статьи