Использование FastCGI для хостинга PHP приложений на IIS 7.0

Использование FastCGI для хостинга PHP приложений на IIS 7.0

Автор: Руслан Якушев

Данная статья описывает конфигурацию модулей FastCGI и PHPдля хостинга PHP приложений на IIS 7.0

clip_image001Важно: Данная статья содержит инструкции по установке компонента FastCGI в операционных системах Windows Server 2008 и Windows Vista SP1. Обратите внимание: на Windows Vista должен быть установлен SP1.

Содержание

  • Краткий Обзор
  • Включение поддержки FastCGI в IIS 7.0
    • Windows Server 2008
    • Windows Vista SP1
    • Обновление модуля FastCGI
    • Administration Pack для IIS 7.0
  • Установка и настройка PHP
  • Настройка IIS 7.0 для обработки PHP запросов
    • Используя консоль управления IIS
    • Используя командную строку
  • Рекомендуемые руководства по конфигурированию FastCGI и PHP
    • Безопасная изоляция для PHP Web сайтов
    • Режим рециркуляции PHP процессов
    • Версионность PHP
    • Рекомендации по безопасности PHP
  • Конфигурирование PHP на уровне сайтов
  • Модуль URL rewriting для PHP приложений
  • Полезные ресурсы

Краткий обзор

Благодаря модулю FastCGI в IIS поддерживается большинство популярных приложений коллективной работы, которые используют протокол FastCGI для хостинга на Web сервере IIS высокопроизводительных и надёжных средств. FastCGI предоставляет высокопроизводительную альтернативу CGI (Common Gateway Interface), стандартного средства, являющегося интерфейсом между внешними приложениями и Web серверами, которые поддерживаются как часть возможностей IIS начиная с первых версий сервера.

Программы CGI выполняются на сервере при каждом запросе, это позволяет обработать запросы, динамически сгенерировать ответы и возвратить их обратно клиентам. Из-за того, что многие приложения коллективной работы не поддерживают исполнения сразу нескольких потоков, CGI позволяет надежно исполненять нескольких процессов под управлением IIS, обрабатывая по одному запросу на процесс. К сожалению это приводит к снижению производительности из-за высоких накладных расходов связанных с необходимостью запуска и остановки процессов при обработке каждого запроса.

FastCGI является более производительным по сравнению с CGI, механизм его работы выглядит так – один и тот же процесс используется для обработки множество поступивших запросов. FastCGI так же поддерживает работу с библиотеками не умеющими безопасно работать в многопоточной среде. При работе с набором повторно используемых процессов мы можем быть уверены в том, что каждый процесс будет обрабатывать не более одного запроса в каждый момент времени.

Включение поддержки FastCGI в IIS 7.0

WindowsServer 2008

Добавьте роль CGI сервиса через меню Server Manager -> Roles -> Add Role Services. Этим мы включим поддержку двух сервисов CGI и FastCGI:

clip_image003

Windows Vista SP1

Добавьте расширение CGI, используя Control Panel -> Programs and Features -> Turn Windows features on or off. Этим мы включим поддержку двух сервисов CGI и FastCGI:

clip_image005

clip_image001[1]Важно: Установка обновлений для модуля 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 гарантирует однопоточное исполнение процессов, в окружении сервера.

  1. Загрузите последнюю версию non-thread safe пакета, включая бинарные файлы, по следующей ссылке http://www.php.net/downloads.php.
  2. Распакуйте файлы в директорию (например C:\PHP). Переименуйте файл php.ini-recommended в php.ini.
  3. Откройте переименованный файл php.ini, уберите комментарии с нижеперечисленных строк и измените значения в соответствии с предложенными:
    • Установите fastcgi . impersonate = 1. Модуль FastCGI для IIS может исполнять роль выдачи ключей безопасности для вызовов клиента. Это позволяет IIS определять контекст безопасности для выполняемых запросов.

    • Значение cgi . fix _ pathinfo =1. cgi.fix_pathinfo обеспечивает поддержку *реальных путей* PATH_INFO/PATH_TRANSLATED для CGI. В предыдущих версиях PHP значение PATH_TRANSLATED указывало на SCRIPT_FILENAME, и не затрагивало директивы PATH_INFO. Дополнительную информацию о PATH_INFO смотрите в документации cgi. Установка данного значения в 1 решает проблему задаваемых путей PHP CGI изменяя пути так чтобы они соотвествовали спецификации.

    • Установите cgi.force_redirect = 0.

    • Установите для директивы open _ basedir путь к папке или сетевому ресурсу на котором расположены Web сайт(ты).

    • Директива extension _ dir определяет расположение расширений для PHP. Обычно, для PHP версий 5.2.X значение для данной директивы устанавливается в extension _ dir = "./ ext "

    • Для включения необходимых расширений PHP уберите комментарии в файле php.ini с соответствующих строчек, к примеру:
      extension=php_mssql.dll
      extension=php_mysql.dll

  4. Для проверки удачной установки PHP выполните следующую команду:

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” на уровне управления сервером:

clip_image007

Запустите “Add Module Mapping” для конфигурации, представленной на рисунке ниже:

clip_image009

  • Запрашиваемый путь: *.php
  • Модуль: FastCgiModule
  • Приложение обработчик: " C :\[путь установки PHP ]\ php - cgi . exe "
  • Имя: PHP via FastCGI

Нажмите OK. На запрос о создании приложения FastCGI нажмите Yes.

clip_image010

Протестируйте корректную привязку заголовков, созданием файла phpinfo.php в папке C:\inetpub\wwwroot, используя следующий код:

<?php phpinfo(); ?>

Откройте браузер и перейдите по ссылке http://localhost/phpinfo.php. Если установка прошла корректно, то вы увидите стандартную страницу конфигурации PHP:

clip_image012

Примечание: Если Вы не видите в списке модулей "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 приложений в среде общего хостинга .

Безопасная изоляция для PHPWeb сайтов

Рекомендации по изоляции PHP Web сайтов в среде общего хостинга согласуются с общей безопасностью изоляции, рекомендованной для IIS 7.0. В особенности следует обратить внимание на следующее:

  • Используйте один пул приложений на один Web сайт
  • Используйте выделенный аккаунт пользователя для пула приложений
  • Используйте анонимного пользователя для идентификации пула приложений
  • Убедитесь в том, что реализация FastCGI включена в файле php.ini (fastcgi.impersonate=1)

Более подробно о безопасной изоляции в окружении общего хостинга написано в документации «Изолирование сайтов с пулами приложений»

Режим рециркуляции PHP процессов

Убедитесь в том, что FastCGI всегда рециркулирует (перезагружает - прим.перевод) процессы php-cgi.exe, прежде чем завершается работа основного PHP процесса. Режим рециркуляции процессов FastCGI контролируется параметром конфигурации, который называется instanceMaxRequests(максимальное кол-во запросов на экземпляр приложения -прим.перевод). Данное значение определяет, какое кол-во запросов выполнит FastCGI, прежде чем произойдёт рециркуляция. В PHP так же существует функция рециркуляции, которая контролируется параметром PHP _ FCGI _ MAX _ REQUESTS. Установка наименьшего значения для instanceMaxRequestsили подобного параметраPHP _ FCGI _ MAX _ REQUESTS, гарантирует, что основной PHP процесс не будет закончен преждевременно.

Свойства для FastCGI могут быть изменены при помощи IIS Manager или командной строки, используя приложение appcmd.

Использование IISmanager

Для настройки процесса рециркуляции FastCGI, используя IIS Manager, вам необходимо установить Административный пакет для IIS 7.0 и выбрать на уровне севера меню FastCGI settings (параметры FastCGI):

clip_image014

Далее необходимо выбрать приложение FastCGI, которое вы хотите настроить и нажать "Edit..." в панели Actions:

clip_image016

В окне "Edit FastCGI application" установите для параметра instanceMaxRequest значение 10000 нажмав кнопку обзора в меню EnvironmentVariables:

clip_image018

Добавьте переменную PHP _ FCGI _ MAX _ REQUESTS,установив для неё значение в 10000:

clip_image020

Примечение: Если вы не установите данные значения, то по умолчанию они будут следующими: 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:10000
C:\>%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 на уровне сайтов не представляется возможным.

Модуль URLrewriting для 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 вы можете прочитать на следующих ресурсах:

Схожие ресурсы

Статьи