(Publicado originalmente em 15 de janeiro de 2010 por Carlos André Ferrari) (Publicado originalmente em: http://ferrari.eti.br/php-5-3-php-fpm-xcache-nginx-no-debian-lenny-performance-extrema/)
Neste post vou exemplificar os passos para configurar um Webserver que consome poucos recursos e é extremamente rápido no Debian Lenny.
PHP-FPM: é um gerenciador de processos CGI do php, similar ao Phpcgi, porém com várias vantagens como:
- Gerenciador de Processos muito eficiente, com capacidade de parar e iniciar seus deamonscaso necessário
- Possibilidade de Iniciar processos com usuários diferentes e com arquivos php.ini diferentes
- Uploads otimizados
- Capacidade de reinicializar processos caso ocorra algum problema
- Escalabilidade de processos, ele pode criar mais processos de acordo com a demanda
- e muito mais.
XCache: é um gerenciador de cache, que armazena os scripts php em opcode para uso futuro, é extremamente rápido e muito usado no mundo em servidores com alta demanda.
Nginx: Conheci este webserver lendo o blog da boo-box, ele é um Servidor web e proxy reverso extremamente veloz e que vem ganhando mercado nos últimos meses devido a sua facilidade de uso e capacidade de carga.
Para agilizar a configuração, vamos usar alguns pacotes (php5.3, php-fpm) pré compilados e mantidos www.dotdeb.org. os testes que eu realzei usando estes pacotes tiveram um ganho de performance enorme.
Instalação:
Vamos começar adicionado os repositórios do dotdeb no /etc/apt/sources.list:
deb http://php53.dotdeb.org stable all deb-src http://php53.dotdeb.org stable all
Vamos instalar os pacotes e algumas dependências para o nginx:
aptitude update aptitude install php5 php5-fpm php5-xcache php5-gd php5-curl \ php5-mysql php5-pgsql libssl-dev libpcre3-dev build-essential -y
O único problema é que o pacote do php deles tem o apache2 como dependência e teremos que desativá-lo, pois não será usado:
apache2ctl stop chmod -x /etc/init.d/apache2 update-rc.d -f apache2 remove
Agora temos o php instalado, vamos compilar o nginx:
cd
mkdir src
cd src
wget http://nginx.org/download/nginx-0.7.64.tar.gz
tar -zxvf nginx-0.7.64.tar.gz
cd nginx-0.7.64
./configure --prefix=/usr/local/nginx --user=www-data --group=www-data \
--without-mail_pop3_module --without-mail_imap_module \
--without-mail_smtp_module --with-http_stub_status_module \
--with-http_ssl_module --http-log-path=/var/log/nginx/access.log \
--conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid
make
make install
Se tudo ocorreu bem, você já tem o nginx instalado, vamos apenas coloca-lo para inicializar automáticamente, crie o arquivo /etc/init.d/nginx e coloque o conteúdo:
#! /bin/sh
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the nginx web server
# Description: starts nginx using start-stop-daemon
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
. /etc/default/nginx
fi
set -e
case "$1" in
start)
echo -n "Starting $DESC: "
start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON -- $DAEMON_OPTS || true
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON || true
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON || true
sleep 1
start-stop-daemon --start --quiet --pidfile \
/var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
echo "$NAME."
;;
reload)
echo -n "Reloading $DESC configuration: "
start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
--exec $DAEMON || true
echo "$NAME."
;;
configtest)
echo -n "Testing $DESC configuration: "
if nginx -t > /dev/null 2>&1
then
echo "$NAME."
else
exit $?
fi
;;
*)
echo "Usage: $NAME {start|stop|restart|reload|force-reload|configtest}" >&2
exit 1
;;
esac
exit 0
depois vamos torna-lo executável e atualizar o rc.d:
chmod +x /etc/init.d/nginx update-rc.d nginx defaults
Com isso o processo de instalação está concluído, vamos configurar!
Configuração do XCache
Coloque a seguinte configuração no arquivo /etc/php5/fpm/conf.d/xcache.ini:
; configuration for php xcache module extension=xcache.so [xcache.admin] xcache.admin.user = "secom" ; xcache.admin.pass = md5($your_password) xcache.admin.pass = "" [xcache] ; ini only settings, all the values here is default unless explained ; select low level shm/allocator scheme implemenation xcache.shm_scheme = "mmap" ; to disable: xcache.size=0 ; to enable : xcache.size=64M etc (any size > 0) and your system mmap allows xcache.size = 64M ; set to cpu count (cat /proc/cpuinfo |grep -c processor) xcache.count = 1 ; just a hash hints, you can always store count(items) > slots xcache.slots = 8K ; ttl of the cache item, 0=forever xcache.ttl = 0 ; interval of gc scanning expired items, 0=no scan, other values is in seconds xcache.gc_interval = 0 ; same as aboves but for variable cache xcache.var_size = 64M xcache.var_count = 1 xcache.var_slots = 8K ; default ttl xcache.var_ttl = 0 xcache.var_maxttl = 0 xcache.var_gc_interval = 300 xcache.test = Off ; N/A for /dev/zero xcache.readonly_protection = Off ; for *nix, xcache.mmap_path is a file path, not directory. ; Use something like "/tmp/xcache" if you want to turn on ReadonlyProtection ; 2 group of php won't share the same /tmp/xcache ; for win32, xcache.mmap_path=anonymous map name, not file path xcache.mmap_path = "/dev/zero" ; leave it blank(disabled) or "/tmp/phpcore/" ; make sure it's writable by php (without checking open_basedir) xcache.coredump_directory = "" ; per request settings xcache.cacher = On xcache.stat = On xcache.optimizer = On [xcache.coverager] ; per request settings ; enable coverage data collecting for xcache.coveragedump_directory and xcache_coverager_start/stop/get/clean() functions (will hurt executing performance) xcache.coverager = Off ; ini only settings ; make sure it's readable (care open_basedir) by coverage viewer script ; requires xcache.coverager=On xcache.coveragedump_directory = ""
Configuração do Nginx
Edite o arquivo em /etc/nginx/nginx.conf:
user www-data;
#Coloque quantos processos simultaneos, o ideal é um para cada nucleo do sistema:
worker_processes 4;
error_log /var/log/nginx/error.log;
events {
# numero de conexões simultaneas por worker
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
sendfile on;
# isso é interessante, dá um ganho enorme na navegação, e o nginx aguenta tranquilamente
keepalive_timeout 60;
tcp_nodelay on;
## Compressão
gzip on;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_proxied any;
gzip_min_length 1100;
gzip_buffers 16 8k;
# mime types para zipar e adicionar header de cache
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/gif image/jpeg image/png;
# Desabilita compressão em algumas versões do IE6
gzip_disable "MSIE [1-6].(?!.*SV1)";
# Impede que servidores proxy mandem versões em gzip do arquivo para os IE6
gzip_vary on;
server {
root /var/www/;
server_name localhost;
listen 80;
location / {
index index.php index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
# Joga requisições para arquivos .php para o php-fpm
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
fastcgi_param SERVER_NAME $http_host;
fastcgi_ignore_client_abort on;
}
}
}
Configuração do php-fpm
Edite o arquivo: /etc/php5/fpm/php5-fpm.conf e faça os ajustes que você achar interessante, aqui eu só aumento os max_childrens (Numero de clientes CGI) de 5 para 50, esta configuração depende do seu hardware.
Configuração do Logrotate
Vamos configurar agora o logrotate para não enchermos os discos com logs do nginx, edite o arquivo /etc/logrotate.d/nginx:
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.p$
endscript
}
Finalizando
Agora que está tudo configurado, vamos reinicalizar os serviços:
/etc/init.d/php5-fpm restart /etc/init.d/nginx restart
crie um arquivo /var/www/index.php e vamos testar o php:
<?php phpinfo();
e acesse: http://ip_do_servidor/


Siga-nos no Twitter também!
