Збираємо php 5.3 та nginx докупи

Опубліковано: 2009-10-04   08:56:50

PHPphp 5.3 вийшов вже досить давно. Хоча лише невелика кількість хостерів оновлюється до нової версії, але рано чи пізно ця версія стане основною для більшості хостингів, особливо з огляду на те, що в ній з'явилась велика кількість приємних нововведень. Коли я працював з Mac OS X, я вже встиг познайомитись з php 5.3 (та ще й описати зміни з якими я зіткнувся), але не мав змоги поекспериментувати з новим функціоналом, перевірити всі самописні (і не тільки) бібліотечки, що я використовую, на сумісність з новою версією. А хочеться ж :)

Я вже встиг оновитись до бети Ubuntu, однак там все ще відсутній пакет для php-5.3. Оскільки й від версії 5.2 відмовлятись не хочеться, то я вирішив зібрати для експериметів зв'язку php-fastcgi+nginx.

Збираємо php

Оскільки готові пакети відсутні, то будемо збирати з вихідного коду. Завантажити його можна без жодних проблем. Розпаковуємо та переходимо для конфігурування. Кожен сам добре знає, які модулі йому потрібні. Особисто я зробив це так

./configure --prefix=/usr/local --with-mysql=/usr --with-mysqli=/usr/bin/mysql_config --with-pgsql=/usr --with-tidy=/usr --with-openssl-dir=/usr --with-zlib-dir=/usr --enable-mbstring --with-xpm-dir=/usr --with-pdo-pgsql=/usr --with-pdo-mysql=/usr --with-xsl=/usr --with-ldap --with-xmlrpc --with-iconv-dir=/usr --enable-exif --enable-calendar --with-bz2=/usr --with-mcrypt=/usr --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/usr --with-freetype-dir=/usr/lib --enable-mbstring --enable-zip --with-pear

Такий спосіб встановлення вимагає мати в системі досить багато додатково встановлений *-dev пакетів. Залишається зібрати та встановити:

make
sudo make install

Якщо все пройшло успішно, то ми маємо php встановлений з префіксом /usr/local.

Налаштування php-fastcgi

За основу для подальших маніпуляцій я взяв маетеріал з Codefront.net. Наступний крок - підготовка скрипта для завантаження php в якості демону fastcgi. Для тих хто не знає поясню, що fastcgi може працювати як окремий сервер, що через сокет отримує запит та параметри середовища, і як відповідь повертає результати свого виконання. Отже створюємо файл /etc/init.d/php-fastcgi з таким вмістом:

#! /bin/sh
### BEGIN INIT INFO
# Provides: php-fastcgi
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start and stop php-cgi in external FASTCGI mode
# Description: Start and stop php-cgi in external FASTCGI mode
### END INIT INFO

# Author: Kurt Zankl <[EMAIL PROTECTED]>

# Do NOT "set -e"

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="php-cgi in external FASTCGI mode"
NAME=php-fastcgi
DAEMON=/usr/bin/php-cgi
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
PHP_CONFIG_FILE=/etc/php5/cgi/php.ini

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

# If the daemon is not enabled, give the user a warning and then exit,
# unless we are stopping the daemon
if [ "$START" != "yes" -a "$1" != "stop" ]; then
log_warning_msg "To enable $NAME, edit /etc/default/$NAME and set START=yes"
exit 0
fi

# Process configuration
export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS
DAEMON_ARGS="-q -b $FCGI_HOST:$FCGI_PORT -c $PHP_CONFIG_FILE"

do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON \
--background --make-pidfile --chuid $EXEC_AS_USER --startas $DAEMON -- \
$DAEMON_ARGS \
|| return 2
}

do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE > /dev/null # --name $DAEMON
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac

Тепер треба створити конфігурацію за замовчуванням для fastcgi-демону, яка буде знаходитись в файлі /etc/default/php-fastcgi. Задамо користувача www-data за аналогом до стандартної кунфігурації apache, порт 9000 та ще деякі параметри:

START=yes
# Which user runs PHP? (default: www-data)
EXEC_AS_USER=www-data
# Host and TCP port for FASTCGI-Listener (default: localhost:9000)
FCGI_HOST=localhost
FCGI_PORT=9000
# Environment variables, which are processed by PHP
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=1000

Все готово для запуску демона. Тепер можна запустити демона:

sudo /etc/init.d/php-fastcgi start

Налаштування nginx

Встановимо сайтом за замовчуванням для nginx якийсь site-name, що буде виконуватись через php-fastcgi сервер, конфігурацію якого ми щойно провели. Для цого необхідно відредагувати файл /etc/nginx/sites-avaliable/default:

server {
listen 80;
server_name localhost;

access_log /var/log/nginx/localhost.access.log;

location / {
root /var/www/site-name;
index index.html index.htm;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/site-name$fastcgi_script_name;
include fastcgi_params;
}
}

Спочатку задаємо параметри серверу (ім'я та порт), логування, директорію сайту. Далі вказуємо додатковий location для обробки php. А тут в свою чергу fastcgi_pass вказує на адресу fastcgi-сервера, fastcgi_index на файл, о буде завантажуватись за замовчуванням, а далі слідує набор директив, що описують параметри, які мають передатись серверу fastcgi. Частина опису винесена в файл /etc/nginx/fastcgi_params:

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 SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

Тепер можна хапустити nginx:

sudo /etc/init.d/nginx start

І все

Тепер можна відкрити браузер та на localhost побачити ваш чудовий сайт :).Цього має бути цілком достатньо для початку роботи, а далі вже можно попрацювати з параметрами nginx та додати наприклад функціонал аналогічний до mod_rewrite і т.д. Головне, що я собі зробив таку от нотатку, та не забуду як проводити базове налаштування fastcgi та nginx :)

Теги: php , nginx
Коментарі: 0
 

Коментарі:

Додати коментар

user

email

url

text

Повідомляти про новікоментарі