ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: "Konstantin A. Lepikhov" <lakostis@altlinux.org>
To: ALT Linux Devel Mailing List <devel@altlinux.ru>
Subject: [devel] как использовать php в режиме FastCGI на всю мощь или долой apache!
Date: Thu, 14 Jul 2005 01:52:28 +0400
Message-ID: <20050713215228.GB22719@lks.home> (raw)

[-- Attachment #1: Type: text/plain, Size: 4581 bytes --]

Hi!

Данная заметка лишь для того, чтобы все стали обращать внимание на пакеты,
которые есть в Сизифе (или обратили внимание на их необычные свойства).
Итак, кажется я уже жаловался в Сизифе на притеснение cgi версии php и о
том, что это вполне себе engine для рендеринга. К частью, скоро в Сизиф
будет залит новый php с починенным fcgi и все станет намного лучше.

Итак, что мы будем делать. Мы будем делать web сервер без apache. Почему?
Ну во-первых, он не всегда нужен, а во-вторых он плохо работает с fcgi
приложениями (да да, все хаки в sapi/cgi именно для mod_fcgi ;) Кроме
того, в Сизифе уже давно есть альтернатива - это nginx. Это просто радость
для параноидальных и рукастых hostmaster'ов. Кроме того, оно умеет
работать с FastCGI (например с php-cgi c поддержкой fastcgi) или как
frontend proxy для медленного backend'а (например httpd-perl).

Поехали. Наша цель - nginx + php-cgi + imp (типа будем им читать почту
вместо thunderbird ;)

Подготовка.
-----------

Ждем нового php-cgi или исправляем существующий. Что нужно поправить в
существующем:

1) заменить старые CFLAGS на новые вида export CFLAGS="%optflags
-DPHP_FASTCGI -DDEBUG_FASTCGI"

2) добавить в configure параметры --enable-discard-path и
--enable-force-cgi-redirect. Все это превратит php-cgi в полноценный
FastCGI сервер, а не в жалкую перделку для apache.

3) Добавить в php.ini.cgi.alt строку cgi.fix_pathinfo=1. Для чего - см. 2)

Ставим nginx

Теперь самое веселое - нам нужно самостоятельно чем-то запускать собранный
php-cgi. Для этих целей все рекомендуют использовать spawn-fcgi из пакета
lighttpd, фиг с ним, будем использовать его. Но тут есть одна трабла -
конечно, можно spawn'ить его руками (через .sh обвязку вида spawn-php.sh
из того же lighttpd), но это некошерно. Поэтому я маленько подхачил
spawn-fcgi, чтобы он умел делать pidfile. Патчик есть тут -
http://lakostis.elektrostal.ru/patches/spawn-fcgi.c-pidfile.diff
Далее уже дело техники, и вот, у нас есть init.d запускалка fcgi
приложений - http://lakostis.elektrostal.ru/src/spawn-fcgi и ее
конфигурационный файл
http://lakostis.elektrostal.ru/src/spawn-fcgi.sysconfig (кладется в
/etc/sysconfig под именем spawn-fcgi).

Настройка
----------

- Редактируем php.ini по-вкусу.
- Редактируем /etc/sysconfig/spawn-fcgi по-вкусу
- Создаем /var/run/spawn-fcgi && service spawn-fcgi start и смотрим, что
  php-cgi у нас теперь болтается в памяти
- Редактируем файл nginx.ini. У меня секция про FastCGI такого вида:

.....

		location ~* ^.+\.php$ {

	    	fastcgi_pass   <fcgi host>:<fcgi port>;
	    	fastcgi_index  index.php;
		
	    	fastcgi_param  SCRIPT_FILENAME  /var/www/html/forum$fastcgi_script_name;
	    	fastcgi_param  QUERY_STRING     $query_string;
	    	fastcgi_param  REQUEST_METHOD   $request_method;
	    	fastcgi_param  CONTENT_TYPE     $content_type;
	    	fastcgi_param  CONTENT_LENGTH   $content_length;
		
		# жрет ресурсы, без нужды не использоват
	    	fastcgi_param  REMOTE_ADDR      $remote_addr;
		
	    	fastcgi_param  SERVER_PORT	    $server_port;
		fastcgi_param  REDIRECT_STATUS  200;

		# специально для php-cgi без этого PHP_SELF пустая
		fastcgi_param  SCRIPT_NAME	$fastcgi_script_name;

		}

- Запускаем nginx, проверяем что FastCGI работает (например, через
  тествую страницу с phpinfo()
  
- Ставим imp, рисуем там ящики и работаем ;) Для него с nginx есть
  несколько хаков в конфиге:


...
	root /var/www/html/addon-modules/horde;
	index index.php;

	location = / {
	    root /var/www/html/addon-modules/horde/imp;
	    index index.php;
	}    
	
	location / {
	    rewrite ^/horde(.*)$ $1 break;
	    rewrite ^/favicon.ico$ /graphics/favicon.ico break;
	}

	location ~* \.php {

	    rewrite ^/horde(.*) $1 break;
	    .....

	}

Заходить на http://..../imp.
  
Заключение
----------

Собвственно оно работает. Даже неплохо. Можно поставить phpa и даже немного
ускорить процесс. Из замеченных неприятностей - теперь php лучше лишний
раз не дергать (ибо слишком много запросов на порт залипает). workaround -
использовать сокет, но это не совсем удобно. т.к придется тогда и nginx
под пользвателем fcgi запускать, что несекурно. Зато теперь можно
мониторить fcgi через monit или запускать его как все взрослые сервисы
через rc.d
  
-- 
WBR, Konstantin	      chat with ==>ICQ: 109916175
     Lepikhov,	      speak  to ==>JID: lakostis@jabber.org
aka L.A. Kostis       write  to ==>mailto:lakostis@pisem.net.nospam

...The information is like the bank... 			  (c) EC8OR

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

             reply	other threads:[~2005-07-13 21:52 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-07-13 21:52 Konstantin A. Lepikhov [this message]
2005-07-14 10:49 ` Alexey Gladkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050713215228.GB22719@lks.home \
    --to=lakostis@altlinux.org \
    --cc=devel@altlinux.ru \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git