Налаштування nginx+php-fcgi для linux CentOS, Fedora, RedHat

Сервер можна значно розігнати та вивільнити додаткові ресурси як по пам’яті, так і по процесору, викинувши перемичку: веб-сервер Apache.

Для цього завантажимо необхідні вихідні коди або ж встановимо з допомогою Yum (тут розглядаю перший випадок):

Про установку РНР говорити не буду, є багато яскравих прикладів в мережі. Єдине: необхідно його скомпілити з підтримкою FastCGI.

Скачуємо бібліотеки zlib та prce:

cd /usr/local/src/
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.bz2
tar xjf pcre-8.00.tar.bz2
wget http://prdownloads.sourceforge.net/libpng/zlib-1.2.3.tar.gz?download
tar xzf zlib-1.2.3.tar.gz

Качаємо nginx та встановлюємо його:

wget http://sysoev.ru/nginx/nginx-0.7.64.tar.gz
tar xzf nginx-0.7.64.tar.gz
cd nginx-0.7.64
./configure —sbin-path=/usr/bin/nginx —conf-path=/etc/nginx/nginx.conf —pid-path=/var/log/nginx/nginx.pid —with-pcre=../pcre-8.00 —with-zlib=../zlib-1.2.3 —with-http_stub_status_module —without-http_autoindex_module —without-http_map_module —without-http_referer_module —without-http_proxy_module
make
make install

Так як складалося руками, то робимо конфігураційні файли nginx’а й php:

/etc/nginx/nginx.conf

### /etc/nginx/nginx.conf ###
user nobody;
# кількість процесів вибираємо по кількості ядер процесора
worker_processes 2;
error_log /var/log/nginx/error.log info;
worker_rlimit_nofile 8192;

events {
worker_connections 1024; # increase for more busy servers
# use rtsig; # you should use epoll here for Linux kernels 2.6.x
}

http {
server_names_hash_max_size 1024;
server_names_hash_bucket_size 512;
log_format main ‘$remote_addr — $remote_user [$time_local] $request ‘
‘»$status» $body_bytes_sent «$http_referer» ‘
‘»$http_user_agent» «$http_x_forwarded_for»‘;

include mime.types;
default_type application/octet-stream;

sendfile on;
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 10;
server_tokens off;

gzip on;
gzip_min_length 1100;
gzip_buffers 4 32k;
gzip_types text/plain application/x-javascript text/xml text/css;
ignore_invalid_headers on;

client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;

include «/usr/local/nginx/conf/vhost.conf»;
}

 

/etc/init.d/nginx

### /etc/init.d/nginx ###
#! /bin/bash
#
# nginx Start/Stop the nginx daemon.
#
# chkconfig: 2345 90 60
# description: nginx
# processname: nginx
# pidfile: $pidf

# Source function library.
. /etc/init.d/functions

# Progran name
prog=»nginx»
pidf=»/var/log/nginx/nginx.pid»
exe=»/usr/bin/nginx»

start() {
echo -n $»Starting $prog: «
if [ -e /var/lock/subsys/nginx ]; then
if [ -e $pidf ] && [ -e /proc/`cat $pidf` ]; then
echo -n $»cannot start $prog: nginx is already running.»
failure $»cannot start $prog: nginx is already running.»
echo
return 1
fi
fi
$exe
RETVAL=$?
[ $RETVAL -eq 0 ] && success $»$prog start» || failure $»$prog start»
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/nginx
echo
return $RETVAL
}

stop() {
echo -n $»Stopping $prog: «
if [ ! -e /var/lock/subsys/nginx ] || [ ! -e $pidf ]; then
echo -n $»cannot stop $prog: nginx is not running.»
failure $»cannot stop $prog: nginx is not running.»
echo
return 1
fi
PID=`cat $pidf`
if checkpid $PID 2>&1; then
kill -TERM $PID >/dev/null 2>&1
usleep 100000
if checkpid $PID && sleep 1 && checkpid $PID && sleep 3 && checkpid $PID; then
kill -KILL $PID >/dev/null 2>&1
usleep 100000
fi
fi
checkpid $PID
RETVAL=$((! $?))
[ $RETVAL -eq 0 ] && success $»$prog shutdown» || failure $»$prog shutdown»
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/nginx;
echo
return $RETVAL
}

status() {
status $prog
}

restart() {
stop
start
}

reload() {
echo -n $»Reloading $prog: «
if [ ! -e /var/lock/subsys/nginx ] || [ ! -e $pidf ]; then
echo -n $»cannot reload $prog: nginx is not running.»
failure $»cannot reload $prog: nginx is not running.»
echo
return 1
fi
kill -HUP `cat $pidf` >/dev/null 2>&1
RETVAL=$?
[ $RETVAL -eq 0 ] && success $»$prog reload» || failure $»$prog reload»
echo
return $RETVAL
}

case «$1» in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
status)
status
;;
condrestart)
[ -f /var/lock/subsys/nginx ] && restart || :
;;
configtest)
$exe -t
;;
*)
echo $»Usage: $0 {start|stop|status|reload|restart|condrestart|configtest}»
exit 1
esac

 

/etc/nginx/vhost.conf

### /etc/nginx/vhost.conf ###
### віртуальні хости винесемо в окремий файл ###
server
{
listen $IP: 80;
server_name $DOMAIN ;
charset utf8;
location /
{
root $DOCUMENT_ROOT;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html
{
root /usr/local/nginx/htdocs;
}
location ~ \.php$
{
fastcgi_pass 127.0.0.1:8888;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $DOCUMENT_ROOT/$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht { deny all; }
}
Для налаштування РНР я рекомендую використати утиліту з lighthttpd — spawn-fcgi. Скачати її можна з багатьох репозиторіїв, або ж скомпілити lighttpd і забрати звідти цю утиліту.
Або ж скачати тут.
Качаємо її, наприклад, звідси і ставимо:

cd /usr/local/src
wget ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/lighttpd-fastcgi-1.4.19-2.el5.kb.i386.rpm
rpm -Uvh lighttpd-fastcgi-1.4.19-2.el5.kb.i386.rpm

Налаштовуємо конфігурацію:

 

/etc/nginx/php-fcgi

### /etc/nginx/php-fcgi ###
#!/bin/sh
#
# php-cgi — php-fastcgi swaping via spawn-fcgi
#
# description: Run php-cgi as app server
# processname: php-cgi
# config: /etc/sysconfig/phpfastcgi (defaults RH style)
# pidfile: /var/run/php_cgi.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ «$NETWORKING» = «no» ] && exit 0

spawnfcgi=»/usr/bin/spawn-fcgi»
php_cgi=»/usr/bin/php-cgi»
prog=$(basename $php_cgi)
server_ip=127.0.0.1
server_port=8888
server_user=nobody
server_group=nobody
# Про встановлення наступної опції раджу ознайомитися зі статтею розробників:
# http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:PerformanceFastCGI#How-many-PHP-processes-do-I-need
server_childs=4
PHP_FCGI_MAX_REQUESTS=1000
pidfile=»/var/run/php_cgi.pid»

# do not edit, put changes in /etc/sysconfig/phpfastcgi
[ -f /etc/sysconfig/phpfastcgi ] && . /etc/sysconfig/phpfastcgi

start() {
[ -x $php_cgi ] || exit 1
[ -x $spawnfcgi ] || exit 2
echo -n $»Starting $prog: «
daemon $spawnfcgi -a ${server_ip} -p ${server_port} -u ${server_user} -g ${server_group} -P ${pidfile} -C ${server_childs} -f ${php_cgi}
retval=$?
echo
return $retval
}

stop() {
echo -n $»Stopping $prog: «
killproc -p ${pidfile} $prog -QUIT
retval=$?
echo
[ -f ${pidfile} ] && /bin/rm -f ${pidfile}
return $retval
}

restart(){
stop
sleep 1
start
}

rh_status(){
status -p ${pidfile} $prog
}

case «$1» in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
rh_status;;
*)
echo $»Usage: $0 {start|stop|restart|status}»
exit 3
esac

Цей скрипт можна скачати також тут (там важливою є ієрархія функцій)
Справу майже завершено. Тепер потрібно лише налаштувати скрипти запуску nginx’а та рhp, і вимкнути apache (якщо необхідно).

chmod 755 /etc/init.d/nginx
chmod 755 /etc/nginx/php-fcgi
chkconfig —add nginx
chkconfig —add php-fcgi
chkconfig nginx on
chkconfig php-fcgi on
/etc/init.d/httpd stop
chkconfig httpd off

Запускаємо nginx i php, отримуємо наступне:

#netstat -npl | grep ‘nginx\|php’
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 31816/nginx
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 7324/php-cgi

Встановлюємо їх в автозавантаження при старті системи:

update-rc.d nginx defaults
update-rc.d php-fcgi defaults

І наостанок одна з особливостей цієї зв’язки: всі правила rewrite апача необхідно переписувати під nginx.

Опубликовано в Установка/Настройка ПО

Рубрики