O Nginx (pronuncia-se “Enginex”) é um servidor web leve, que consome pouquíssimos recursos do servidor, e é muito utilizado para servir conteúdo estático, mas nada nos impede de o utilizarmos para servir conteúdo dinâmico, substituindo o Apache.
– Instalando – A instação do nginx é mais que tranquila, no meu Ubuntu, tive apenas que mandar:
$ sudo apt-get install nginx
Pronto, servido instalado. Se vc tiver o Apache ou outro servidor rodando, preste atenção, o nginx por padrão, vai tentar utilizar a porta 80, como todos. Com isso, já temos um servidor web, mas somente para conteúdo estático, vamos adicionar suporte a PHP. Primeiro vamos instalar o PHP, utilizando o jeito mais prático:
$ sudo apt-get install php5 php5-common php5-cgi php5-gd php5-mysql php5-sqlite
Temos agora, um PHP bem básico instalado, sem muitos módulos, pq não é o propósito deste artigo. Precisamos agora configurar o nginx para interpretar corretamente nossos scripts PHP, abra o arquivo “default” - aqui em /etc/nginx/sites-availabe - e cole o conteúdo abaixo.
server {
listen 80;
server_name localhost;
location / {
root /var/www; index index.php index.html index.htm;
autoindex off;
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi.pid;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
include fastcgi_params;
}
}
Essa é uma regrinha simples, que faz com que todos os arquivos com extensão “.php” requisitado pelo cliente, seja enviado e processado pelo php-cgi. É necessário também, habilitar uma linha no php.ini (/etc/php5/cgi/php.ini):
cgi.fix_pathinfo=1
Rodando o PHP como daemon No nosso caso, vamos utilizar o PHP no modo CGI,como você viu, as requisições a scripts PHP são encaminhadas via proxy para um socket. Cole o conteúdo abaixo em um aquivo vazio, vamos chamar de php-fcgi:
#!/bin/sh
#
# Author: Till Klampaeckel
#
# Credits
#
# * original script: http://unix.derkeiler.com/Mailing-Lists/FreeBSD/questions/2007-09/msg00468.html
# * improved: http://till.klampaeckel.de/blog/archives/30-PHP-performance-III-Running-nginx.html
# * all linux start script fu inspired by CouchDB's start script (by Noah Slater)
#
SCRIPT_OK=0
SCRIPT_ERROR=1
DESCRIPTION="php-fcgi super-duper-control thing"
NAME=php-fgcid
SCRIPT_NAME=$(basename $0)
WWW_USER=www-data
WWW_GROUP=www-data
PHP_CGI=/usr/bin/php-cgi
phpfcgid_children="2"
phpfcgid_requests="100"
log_daemon_msg () {
echo $@
}
log_end_msg () {
# Dummy function to be replaced by LSB library.
if test "$1" != "0"; then
echo "Error with $DESCRIPTION: $NAME"
fi
return $1
}
phpfcgid_start() {
echo "Starting $NAME with $phpfcgid_children children (req: $phpfcgid_requests)."
export PHP_FCGI_CHILDREN=$phpfcgid_children
export PHP_FCGI_MAX_REQUESTS=$phpfcgid_requests
su -m ${WWW_USER} -c "${PHP_CGI} -b /tmp/php-cgi.pid &"
}
phpfcgid_stop() {
echo "Stopping $NAME."
pids=`pgrep php-cgi`
pkill php-cgi
}
phpfcgid_status() {
log_daemon_msg "To be implemented: status"
log_end_msg $SCRIPT_ERROR
}
parse_script_option_list () {
case "$1" in
start)
log_daemon_msg "Starting $DESCRIPTION" $NAME
if phpfcgid_start; then
log_end_msg $SCRIPT_OK
else
log_end_msg $SCRIPT_ERROR
fi
;;
stop)
log_daemon_msg "Stopping $DESCRIPTION" $NAME
if phpfcgid_stop; then
log_end_msg $SCRIPT_OK
else
log_end_msg $SCRIPT_ERROR
fi
;;
restart|force-reload)
log_daemon_msg "Restarting $DESCRIPTION" $NAME
if phpfcgid_stop; then
if phpfcgid_start; then
log_end_msg $SCRIPT_OK
else
log_end_msg $SCRIPT_ERROR
fi
else
log_end_msg $SCRIPT_ERROR
fi
;;
status)
phpfcgid_status
;;
*)
cat <&2
Usage: $SCRIPT_NAME {start|stop|restart|force-reload|status}
EOF
exit $SCRIPT_ERROR
;;
esac
}
parse_script_option_list $@
Atribuímos permissão de execução e rodamos, pronto, suporte a PHP instalado. De quebra, já colocamos para iniciar logo após o boot.
$ chmod +x php-fcgi
$ sudo mv php-fcgi /etc/init.d/
$ sudo update-rc.d php-fcgi defaults
$ sudo /etc/init.d/php-fcgi start
$ sudo /etc/init.d/nginx restart
Conclusão — O nginx é um servidor web pronto que na minha opinião, já está pronto para substituir o Apache em aplicações de pequeno e médio porte, sites pessoais, blog e etc, onde se queira economizar ao máximo os recursos, ou mesmo servir conteúdo estático apenas. É difícil mensurar a carga máxima que ele pode aguentar, mas em todos os meus testes de carga, ele sempre respondeu muito bem.
No Wiki, há inclusive uma configuração que fizeram, utilizando FreeBSD, com 45k conexões ativas, vale a pena conferir.