Збираємо php 5.3 та nginx докупи
php 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 :)



