Настройка php cgi windows

wiki.sys-adm.org.ua

Инструменты пользователя

Инструменты сайта

Содержание

Nginx+php-cgi: настройка автоматического запуска при старте Windows

Введение

На одном из проектов мы используем windows server 2008 в качестве операционной системы, так как работа проекта связанна с конвертацией графических форматов, для чего мы используем Adobe Illustrator. К сожалению Inkskape/ImageMagick/GraphicsMagick, которые отлично работают на linux, нам не подходят из-за ряда проблем с конвертацией, так что приходится страдать. И вот появилась необходимость в использовании php. Вариантов как бы немного:

К сожалению, официальных сборок apache под windows больше не выпускает, последняя официальная сборка 2.2.25 от 2013 года. Но правда есть т.н. 3rd party сборки:

C IIS я работал очень мало, и честно говоря, особого желания нет. А вот опыт работы с nginx + php-cgi/fpm более чем достаточный. Так что остановился на этом варианте. Особенно учитывая тот факт, что в ближайшем будущем скорее всего будем мигрировать с Windows/AI на Linux/Inkskape/ImageMagick/GraphicsMagick/etc.

Казалось бы простая задача, установить и настроить nginx + php-cgi, которая в linux занимает 10-15 минут, на windows платформе заняла у меня на порядок больше времени из-за своей особенности и специфики.

Установка и настройка сервера php-cgi

Идем на страницу php.net и выбираем нужную версию php. PHP поставляется в двух вариантах

Если кратко, то TS версию следует использовать, если у вас php используется в качестве модуля apache. NTS версия должна быть использована, если вы используете php как cgi. Более подробно о различиях NTS от TS версии можно почитать на stackoverflow

Итак скачиваем архив, в моем случае это был файл php-5.6.21-nts-Win32-VC11-x86.zip и распаковываем в любое удобное для вас место. В рамках данной статьи я буду использовать следующий путь — C:\php-5.6.x-nts-vc11-x86\ . Так же для избежания множества ошибок, советую добавить данный путь в переменную окружения PATH.

Так же не забываем о том, что для корректной работы php необходимо установить пакет Visual C++ Redistributable for Visual Studio 2012, если у вас такой не стоит в системе, иначе при запуске будем получать ошибку вида

Проверяем что переменная PATH применилась и работает

После распаковки копируем файл php.ini-production в php.ini и правим под свои нужды. Ниже я приведу лишь те строки, которые я менял

Если вы все правильно настроили, то команда php-cgi.exe -m должна выдать примерно такой список

Если вы где то допустили ошибку, то в файле php-error.log появятся соответствующие предупреждения/ошибки. Например, ошибка вида

Если ошибок нет, то запускаем наш cgi сервер из командной строки

Теперь переходим к настройке nginx.

Установка и настройка nginx

Установка аналогична php, скачиваем архив с официального сайта, распаковываем в нужную нам папку, правим конфигурационный файл под свои нужды и запускаем. В рамках данной статьи я буду использовать следующий путь — C:\nginx-1.8.x\

Ниже привожу минимально необходимые настройки, которые необходимо внести в файл nginx.conf

После этого можно запустить nginx, для этого выполнив следующую команду

Не забываем открыть 80й порт

Проверяем в командной строке или в любом проводнике, если вы не используете cmder

Ну а для проверки php, создаем тестовый файл с выводом phpinfo. В результате мы должны увидеть примерно такую страницу

Настройка автоматического запуска при старте

Сама связка у нас настроена и работает, но проблема в том, что как только вы закроете сеанс или перезагрузите сам сервер, то придется заново запускать в ручном режиме, что очень не удобно, а иногда и не приемлемо. К сожалению сам php-cgi.exe и nginx.exe не поддерживают работу в виде службы, можно конечно использовать и сторонние утилиты, но большинство из них платные, или глючные. Немного поискав в google, нашел интересную утилиту от автора Jenkins — winsw (Windows Service Wrapper). Эта небольшая утилита

Читайте также:  Параметры входа windows 10 без пароля

58 Кбайт, которая представляет собой один исполняемый файл — winsw-1.18-bin.exe.

Итак, для настройки нам необходимо скопировать winsw-1.18-bin.exe в папку с nginx.exe и переименовать во что то осмысленное (на самом деле переименовывать не обязательно, просто так будет удобней). Я буду использовать C:\nginx-1.8.x\winsw-nginx.exe для запуска nginx и C:\php-5.6.x-nts-vc11-x86\winsw-php.exe для запуска php-cgi.exe соответственно. После копирование файла в папки nginx и php создаем там же xml файлы с точно таким же названием как и сам exe — winsw-nginx.xml и winsw-php.xml с таким содержимым

Думаю xml говорит сам за себя, по сути мы указываем как и с какими параметрами нам надо запускать и останавливать нашу службу. Так как php-cgi.exe не имеет ключа для остановки, то приходится его останавливать при помощи taskkill, вот такая небольшая хитрость. Обратите внимание на то, что папка, указанная в logpath должна быть создана до запуска службы.

После этого необходимо создать сами службы, для этого выполним следующие команды

После чего, в Service Manager на закладке Services вы должны увидеть две новые службы

Запускаем соответствующие службы и проверяем работу. Так как Startup type у этих служб по умолчанию будет Automatic, то после перезагрузки сервера они запустятся автоматически.

Так же советую обратить внимание на утилиту nssm, которая имеет очень интересное описание

Так же представляет из себя один exe файл, и даже имеет графический интерфейс, мелочь, а приятно.

А нашел я ее случайно, когда начал поиск возможности запуска bitvise ssh клиента при старте системы. К сожалению с помощью winsw мне это сделать не получилось, а вот с помощью nssm все запустилось в течение 5 минут.

Установка PHP как FastCGI под Apache (Windows 10)

При установке Битрикс столкнулся с необходимостью изменять настройки PHP в файле php.ini . Например, вот эти

Но, поскольку у меня PHP установлен как модуль Apache, эти изменения затронули все виртуальные хосты. Из-за этого перестал работать phpMyAdmin. Пришлось устанавливать PHP как FastCGI, чтобы для каждого виртуального хоста был свой файл php.ini .

Интерфейс FastCGI — клиент-серверный протокол взаимодействия вебсервера и приложения, дальнейшее развитие технологии CGI. По сравнению с CGI является более производительным и безопасным.

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

FastCGI убирает это ограничение, сохраняя процесс запущенным и передавая запросы этому постоянно запущенному процессу. Это позволяет не тратить время на запуск новых процессов.

В то время как CGI-программы взаимодействуют с сервером через STDIN и STDOUT запущенного CGI-процесса, FastCGI-процессы используют Unix Domain Sockets или TCP/IP для связи с сервером. Это значит, что FastCGI-программы могут быть запущены не только на этом же сервере, но и где угодно в сети. Также возможна обработка запросов несколькими FastCGI-процессами, работающими параллельно.

Для начала скачиваем модуль mod_fcgid с сайта apachelounge.com, распаковываем и кладем в директорию modules сервера Apache. У меня это C:/wamp/apache/modules . Далее, переходим в директорию apache/conf и вносим изменения в файл конфигурации Apache httpd.conf :

В конец файла дописываем:

Последняя директива означает, что файл php.ini расположен в директории C:/wamp/php71 . Это будет файл конфигурации PHP по умолчанию. Строки, которые отвечают за работу PHP как модуля Apache, удаляем или комментируем:

Теперь редактируем файл виртуальных хостов httpd-vhosts.conf . У меня он расположен в C:/wamp/apache/conf/extra :

Для каждого виртуального хоста добавляем одну строчку, которая переопределяет переменную среды PHPRC . После этого берем дефолтный php.ini из директории C:/wamp/php71 и копируем в директорию каждого хоста. У меня это

  • D:/work/localhost
  • D:/work/localhost1
  • D:/work/localhost2
  • D:/work/localhost3

В каждом файле php.ini находим строки

и установливаем значение doc_root :

Теперь у каждого виртуального хоста будет свой php.ini . Осталось только перезапустить Apache, чтобы изменения вступили в силу.

Читайте также:  Rundll32 exe c windows system32 shimgvw dll imageview

Разные версии PHP

Если для какого-то проекта нужно использовать другую версию PHP, вносим изменения в файл httpd-vhosts.conf

У меня PHP 5.6 установлен в директории C:/wamp/php56 , поэтому именно оттуда я взял php.ini и скопировал в D:/work/localhost4 .

Чуть позже столкнулся с ошибкой при тестировании системы в Битрикс (Настройки • Инструменты • Проверка системы):

Проверил настройки php.ini , связанные с загрузкой файлов:

Вроде все в порядке. Тогда посмотрел еще логи Apache, и там увидел ошибку:

Значение по умолчанию FcgidMaxRequestLen равно 131072 байт (128 Кб). Добавил в конец файла httpd.conf :

Этого должно быть достаточно, но есть еще и другие настройки:

Менеджер процессов FastCGI (FPM)

Содержание

FPM (FastCGI Process Manager, менеджер процессов FastCGI) является альтернативной реализацией PHP FastCGI с несколькими дополнительными возможностями обычно используемыми для высоконагруженных сайтов.

Эти возможности включают в себя:

продвинутое управление процессами с корректной (graceful) процедурой остановки и запуска;

возможность запуска воркеров с разными uid/gid/chroot/окружением, а также запуска на различных портах с использованием разных php.ini (замещение safe_mode);

логирование стандартных потоков вывода (stdout) и ошибок (stderr);

аварийный перезапуск в случае внезапного разрушения opcode-кеша;

поддержка ускоренной загрузки (accelerated upload);

«slowlog» — логирование необычно медленно выполняющихся скриптов (не только их имена, но также и их трассировки. Это достигается с помощью ptrace и других подобных утилит для чтения данных исполнения удалённых процессов);

fastcgi_finish_request() — специальная функция для завершения запроса и сброса всех буферов данных, причём процесс может продолжать выполнение каких-либо длительных действий (конвертирование видео, обработка статистики и т.п.);

Динамическое/статическое порождение дочерних процессов;

Базовая информация о статусе SAPI (аналогично Apache mod_status);

Конфигурационный файл, основанный на php.ini.

User Contributed Notes 8 notes

Init script setup
===

You will probably want to create an init script for your new php-fpm. Fortunately, PHP 5.3.3 provides one for you, which you should copy to your init directory and change permissions:

/sapi/fpm/init.d.php-fpm.in /etc/init.d/php-fpm
$ chmod 755 /etc/init.d/php-fpm

It requires a certain amount of setup. First of all, make sure your php-fpm.conf file is set up to create a PID file when php-fpm starts. E.g.:
—-
pid = /var/run/php-fpm.pid
—-
(also make sure your php-fpm user has permission to create this file).

Now open up your new init script (/etc/init.d/php-fpm) and set the variables at the top to their relevant values. E.g.:

prefix=
exec_prefix=
php_fpm_BIN=/sbin/php-fpm
php_fpm_CONF=/etc/php-fpm.conf
php_fpm_PID=/var/run/php-fpm.pid

Your init script is now ready. You should now be able to start, stop and reload php-fpm:

$ /etc/init.d/php-fpm start
$ /etc/init.d/php-fpm stop
$ /etc/init.d/php-fpm reload

The one remaining thing you may wish to do is to add your new php-fpm init script to system start-up. E.g. in CentOS:

$ /sbin/chkconfig php-fpm on

Disclaimer: Although I did just do this on my own server about 20 mins ago, everything I’ve written here is off the top of my head, so it may not be 100% correct. Also, allow for differences in system setup. Some understanding of what you are doing is assumed.

Настройка php cgi windows

Используя установку CGI, ваш сервер открыт перед несколькими возможными уязвимостями. Пожалуйста, ознакомьтесь с разделом «Безопасность CGI» чтобы узнать, как можно защитить себя от таких атак.

Тестирование

Если вы собрали PHP как CGI, вы можете протестировать вашу сборку командой make test. Тестирование вашей сборки — всегда хорошая идея. Таким образом вы сможете раньше обнаружить проблемы PHP на вашей платформе, вместо того, чтобы бороться с ними позже.

Использование переменных

Некоторые переменные окружения сервера не определены в текущей » спецификации CGI/1.1. Определены только следующие переменные: AUTH_TYPE , CONTENT_LENGTH , CONTENT_TYPE , GATEWAY_INTERFACE , PATH_INFO , PATH_TRANSLATED , QUERY_STRING , REMOTE_ADDR , REMOTE_HOST , REMOTE_IDENT , REMOTE_USER , REQUEST_METHOD , SCRIPT_NAME , SERVER_NAME , SERVER_PORT , SERVER_PROTOCOL и SERVER_SOFTWARE . Все остальное должно обрабатываться как дополнительные расширения (vendor extensions).

Читайте также:  Windows неправильно показывает процессор

User Contributed Notes 7 notes

additionnal information to fastcgi.

the compilation of fastcgi library is not nessesary, php include a modified version of this library,
and fastcgi module have this own implementation of the protocole fastcgi.

on the first server (where apache are!) the uid and gid of apache instance of the fastcgi module
must be the same on the php file to execute.
without that they dont work.
the module refuse to send the request to the fastcgi php server.

Have noticed on debian now, and may be true of other builds, that if you are using php as a command line language, you don’t need the -q ie: #!/usr/bin/php -q anymore.

What really took me ages to work out was how to the use php in cgi mode (ie in a cgi-bin directory) as it doesn’t send http headers by default. It also fails to populate $_GET and $_POST arrays.

Turns out debian php build comes with /usr/bin/php-cgi

Use this in your shebang if running CGI scripts!

I understand now — but had to figure this out myself!

Keywords I tried to solve this problem with were:

PHP, CGI, no $_GET array, Premature end of script headers, No http Headers, debian

Hopefully this post might save someone many hours of frustration, if they are googling the above words!

for using fastcgi external server in place of cgi or mod php with php:

to compile fastcgi librairie:

to compile the fastcgi apache module:

wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.2.tar.gz
tar xvzf mod_fastcgi-2.4.2.tar.gz
cd mod_fastcgi-2.4.2
path/to/apache/bin/apxs -i -A -n fastcgi -o mod_fastcgi.la -c *.c

after you must modify the http.conf to add that:

# load fcgi module
LoadModule fastcgi_module modules/mod_fastcgi.so

# authorization to execute fcgi on tree «/fcgi-bin/»

Options ExecCGI
SetHandler fastcgi-script

# define fastcgi external serveur for virtual path «/fcgi-bin/phpfcgi» to execute on targetmachinehost with targetport
FastCgiExternalServer /fcgi-bin/phpfcgi -host targetmachinehostname:targetport

# mime type definietion for some extention
AddType application/x-httpd-fastphp .php .cphp .php4

#define apache cgi regirection with the virtual action script /fcgi-bin/phpfcgi associated with the defined mime type.
Action application/x-httpd-fastphp /fcgi-bin/phpfcgi

compile php with —enable-cgi and —enable-fastcgi=/to/lib/fastcgi

start on target machine php with «php -b ip:port» for ear request from mod_fastcgi.

some aditional thing are in sapi/cgi/README.FastCGI of php src tree.

the document root of the apache machine must be synchronous with the php target machine. with the same tree.

and with that solution you can mixe php5 and php4 with different extention of apache directory limitation to one or another version.

with performance like mod_php!

Thanks nordkyn, this one was very helpful.
Please note that the kernel has to be compiled with misc binary support, which is activated on most distributions like Debian.
You would have to please these two lines in a script to run it after every reboot, on debian I propose /etc/init.d/bootmisc.sh
You could place this lines at the end but before : exit 0

# Install PHP as binary handler

mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
echo «:PHP:E::php::/usr/bin/php4:» > /proc/sys/fs/binfmt_misc/register

And please remember that the package management would override the file on the next distribution upgrade 🙂

Dug out from the discussion at the site below is a good tip: if you are working with an existing PHP installation which did not build either the commandline or CGI servers, you can use the lynx non-graphical web browser to get the web server to execute php scripts from the command line (or cron jobs, etc):

>If you wish to use PHP as a scripting language, a good article to read is >http://www.phpbuilder.com/columns/darrell20000319.php3

>note that the article is aimed at *nix not win32, but most of it still applies

Оцените статью