Como instalar o Nginx com PHP-FPM e WordPress no CentOS

Neste tutorial, vou mostrar como realizar a instalação do WordPress rodando sob o Nginx e PHP-FPM em um CentOS 6.3

Como tem algum tempo que não posto algo, preparei algo especial desta vez. Vou além da instalação do Nginx, WordPress e PHP-FPM. Faremos a instalação de algumas ferramentas que irão lhe auxiliar bastante na administração do seu servidor, além do Monit para monitorar seus processos e ainda lhe enviar e-mail no caso de algum problema.

No final ainda tem um script para rotação de logs, que de hora em hora é executado para compactar seus arquivos de log e remover os arquivos com mais de 30 dias. Então vamos começar!

Adicionar o repositório oficial do Nginx

Vamos criar o arquivo nginx.repo:

# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
priority=1

Adicionar o repositório Epel

Criando o arquivo repel.repo:

# vim /etc/yum.repos.d/epel.repo
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0

Adicionando ferramentas úteis

Eu costumo utilizar algumas ferramentas que facilitam a administração. Aqui vou abordar a instalação do Multitail, Iftop, Htop e o Monit. se não for interessante pra você pode pular esta parte.

Breve descrição de cada uma das ferramentas:

Multitail: Programa para monitorar múltiplos arquivos de log. – http://www.vanheusden.com/multitail/

Iftop: Basicamente é uma ferramenta para visualizar o consumo de banda em determinada interface de rede, mas tem muitas outras utilidades. –  http://www.ex-parrot.com/pdw/iftop/

Htop: É um top melhorado. Aliás, muito melhor. – http://htop.sourceforge.net/

Monit: Uma ferramenta que permite monitorar programas, processos, arquivos, diretórios e filesystems. Dependendo de como for configurado, caso um processo morra, ele reinicia ele pra você!  – http://mmonit.com/monit

O muultitail, iftop e htop, são utilitários do sistema e sua instalação não requer nenhum tipo de configuração. Então você pode instalar todos de uma vez:

# yum install multitail iftop htop

Instalando o Monit

# yum install monit

Neste caso, quero que ele monitore os processos do Nginx e do PHP-FPM. Se por algum motivo estes processos parem de funcionar ele irá reiniciá-los e me enviar um e-mail informando sobre o status da situação.

Calma! Eu sei que ainda não instalamos o Nginx e o PHP-FPM, mas já podemos deixar configurado.

Criamos agora então o arquivo de configuração para monitoração do Nginx.

# vim /etc/monit.d/nginx
check process nginx with pidfile /var/run/nginx.pid
start program = "/etc/init.d/nginx start"
stop program = "/etc/init.d/nginx stop"
group nginx
alert seuendereco@email.com
mail-format {
from: alerta@seudominio.com
subject: nginx $ACTION on $HOST at $DATE
message: This event occurred on $HOST at $DATE.
Event: $EVENT
Description: $DESCRIPTION
Action: $ACTION
}

E agora o arquivo de configuração do PHP-FPM

# vim /etc/monit.d/php-fpm
check process php-fpm with pidfile /var/run/php-fpm/php-fpm.pid
start program = "/etc/init.d/php-fpm start"
stop program = "/etc/init.d/php-fpm stop"
group php-fpm
alert seuendereco@email.com
mail-format {
from: alerta@seudominio.com
subject: php-fpm $ACTION on $HOST at $DATE
message: This event occurred on $HOST at $DATE.
Event: $EVENT
Description: $DESCRIPTION
Action: $ACTION
}

Configurando o envio dos alertas por e-mail

Vamos ao arquivo de configuração do monit, e informamos para utilizar a porta local 25. Você pode inserir a linha no final do arquivo.

# vim /etc/monit.conf
set mailserver localhost port 25

Agora instalamos o Exim e em seguida removemos o Sendmail (caso esteja instalado – no CentOS vem instalado por padrão). Apenas uma questão de preferência pessoal minha.

# yum install exim

A configuração do exim é feita no arquivo /etc/exim/exim.conf. Porém como a configuração padrão atende ao que queremos fazer, não vou modificar nada.

Removendo o Sendmail:

# yum remove sendmail

Aqui mais uma configuração útil para economizar espaço em disco. Deixar apenas as duas últimas versões de Kernel utilizadas. Isto evita ficar armazenando kernel antigo após algumas atualizações. Nada impede de deixar apenas a atual, fica a gosto do cliente:

# package-cleanup –-oldkernels –-count=2
# vim /etc/yum.conf
installonly_limit=2

Ajuste fino no Kernel. Adicione as linhas abaixo no final do arquivo:

# vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

Instalando e configurando o Nginx, PHP-FPM, etc…

# yum install nginx php-fpm php-gd php-mysqlnd php-mbstring php-xmlrpc php php-mysql

Criando o diretório onde estará hospedado o WordPress:

# mkdir /usr/share/nginx/www

Configurando o  PHP-FPM:

# cd /etc/php-fpm.d
# mv www.conf www.disabled

Criar o arquivo de configuração do Nginx no PHP-FPM:

# vim /etc/php-fpm.d/nginx.conf
[nginx]
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = nginx
group = nginx
pm = dynamic
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
chdir = /usr/share/nginx/www
php_admin_value[open_basedir] = /usr/share/nginx/www/:/tmp

Ajustando parâmetros no PHP:

# vim /etc/php.ini
cgi.fix_pathinfo=0
upload_max_filesize = 64M

Inicializar o PHP-FPM:

# service php-fpm start
# chkconfig php-fpm on

Configurando o Nginx:

Você pode substituir o conteúdo original do arquivo por este. Se comparar com o original vai ver algumas diferenças. São modificações que fiz para melhorar a performance.

# vim /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
worker_rlimit_nofile 16384;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 16384;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
include /etc/nginx/conf.d/*.conf;
}

Removendo a configuração default:

# rm -rf /etc/nginx/conf.d/default.conf
# rm -rf /etc/nginx/conf.d/example_ssl.conf
# rm -rf /usr/share/nginx/html

Colocando a configuração para nosso WordPress no Nginx

# vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name ricardomartins.com.br;
root /usr/share/nginx/www/ ;

client_max_body_size 64M;

# Deny access to any files with a .php extension in the uploads directory
location ~* /(?:uploads|files)/.*.php$ {
deny all;
}

location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}

location ~* .(gif|jpg|jpeg|png|css|js)$ {
expires max;
}

location ~ .php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Alguns ajustes de Tunning para permitir grandes números de acessos:

# vim /etc/security/limits.conf
nginx soft nofile 20000
nginx hard nofile 20000

Criar o arquivo /etc/default/nginx com o valor de ulimit conforme abaixo, para aumentar a quantidade de conexões simultâneas abertas:

# vim /etc/default/nginx
ulimit -a 65535

Inicializar os serviços e garantir que sejam iniciados no boot:

# service nginx start
# chkconfig nginx on
# service monit start
# chkconfig monit on
# service exim start
# chkconfig exim on

Se tudo estiver correto até aqui, seu Nginx já está rodando. Você pode acessar o ip do servidor para conferir. Provavelmente você vai receber uma mensagem de erro 403.  Isto é normal, já que o diretório que definimos como raiz do site (/usr/share/nginx/www/), ainda não tem nada.

Instalando e configurando o MySQL

# yum -y install mysql-server mysql
# service mysqld start
# mysqladmin -u root password ‘definaumasenhaparaorootnomysql’
# chkconfig mysqld on

Agora vamos logar no mysql e criar um usuário. Este usuário, será o que vamos definir para ser utilizado pelo WordPress. Mais tarde vamos informar este usuário e senha para o WordPress

# mysql -u root -p
> create database wordpress;
> grant all privileges on wordpress.* to 'usuarioquedesejacriarnomysql'@'localhost' identified by 'senhadousuarioquedesejacriarnomysql';
> exit

Instalar e configurar o WordPress

# cd /tmp
# wget http://wordpress.org/latest.zip
# unzip -q latest.zip
# mv wordpress/* /usr/share/nginx/www/
# rm -rf wordpress latest.zip
# cd /usr/share/nginx/www/

Copiar o arquivo de modelo para o wp-config.php:

# cp wp-config-sample.php wp-config.php

Editar o arquivo e informar o nome do database, usuário, senha e endereço do host:

# vim wp-config.php
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'seuusuariomysql');
/** MySQL database password */
define('DB_PASSWORD', 'senhadoseuusuariomysql');

Finalizando a configuração do WordPress:

Acesse http://endereco-do-site/ e finalize as configurações definindo o título do site, usuário para administração, senha deste usuário e um endereço de e-mail.

Configurar rotação de logs do Nginx

Finalizada a parte do WordPress, agora vamos criar um script, que será executado de hora em hora, para compactar os arquivos de log e remover arquivos de log antigos. No exemplo, a cada hora ele irá procurar arquivos de log criados há mais de 30 dias e apagá-los.

# vim /etc/cron.hourly/log.nginx
#!/bin/bash
cd /var/log/nginx
rm -f access.log.`date +%H`.gz
rm -f error.log.`date +%H`.gz
mv -f access.log access.log.`date +%H`
mv -f error.log error.log.`date +%H`
kill -USR1 `cat /var/run/nginx.pid`
sleep 2
gzip access.log.`date +%H`
gzip error.log.`date +%H`
for lista in `find /var/log/nginx/*.gz -mtime +30`; do
rm -rf ${lista}
done

Ajustar permissões do script:

# chmod 700 /etc/cron.hourly/log.nginx

Para finalizar, vamos testar se está recebendo os alertas?

Faça o seguinte:

# /etc/init.d/nginx restart

Você deverá receber um e-mail informando que o PID do processo do nginx foi alterado, ou seja, o Nginx foi reiniciado.

Por hoje é só. Espero que tenham gostado desse tutorial.

 

  • Sandro

    Só um detalhe…

    # rm -rf /etc/nginx/conf.d/ example_ssl.conf

    … vai apagar a parta inclusive! Tem um espaço a mais aí!!

    • Obrigado pela correção Sandro. Foi um erro na digitação. Já corrigido!

  • Anderson

    Boa noite, como colocaria o phpmyadmin para rodar neste caso?
    Desde já, parabéns pelo artigo, nota 10000000

  • Paulo

    Ricardo, este post vai me servir muito para iniciar meu aprendizado, mas gostaria de aprender a adm um servidor web do zero.
    Você indica alguma escola ou curso especializado?
    Como sempre usei apenas hospedagem compartilhada, meu nível é iniciante em Linux e servidores web.

  • Zeca

    Por que as subpastas não funcionam ?
    /usr/share/nginx/www/subpasta

    sempre que é colocado alguma coisa em PHP
    ele baixa o index e não faz mais nada ??

    E por que não tem material nenhum no google que ensine a arrumar isso ?
    abraços

  • Diego Aragão

    Fala Ricardo, estou com a mesma dúvida do zeca acima, vc achou alguma coisa zeca? Pode dar uma luz? obrigado

  • Diego Aragão

    Oi Ricardo! Quero agradecer muito o tutorial! muito bom, aqui funcionou direitinho. Porem tenho outras duas dúvidas, a mesma dúvida do zeca como postei acima (não está funcionando em subpastas) e tenho uma dificuldade com o php: estou usando este tutorial para testar o magento porém a magento acusa que duas funcoes php não estao rodando: dom e mcrypt. Já verifiquei e estas extensoes estao instaladas, ja modifiquei o php.ini mas continua o erro. Estou usando o Centos 6, um amigo disse que poderia ser um bug no proprio centos (e no ubuntu) em que falta links simbolicos, alguem já ouviu falar disto? Não sei se to postando no lugar certo, já q estou mudando o assunto, qualquer coisa me avise, alguém pode dar uma luz? obrigado

  • Diego Aragão

    Fala Zeca, recebi uma dica em relação a dúvida:

    “Por que as subpastas não funcionam ?
    /usr/share/nginx/www/subpasta
    sempre que é colocado alguma coisa em PHP
    ele baixa o index e não faz mais nada ??”

    Eu conversando com o “outro” Ricardo Martins e ele disse que pode ser por faltar algumas bibliotecas, é só descer até o final dos comentários. No inicio do tutorial dele ele ensina a instalar as bibliotecas. Vamos ver se é isto.
    http://ricardomartins.net.br/magento-2/configurando-magento-com-nginx-na-amazon/#comment-170806