Instalação e Configuração do Nginx com PHP-fpm + MySQL + Debian Wheezy

E ai galera, aqui eu vou abordar a instalação e configuração do Nginx com suporte ao PHP utilizando php-fpm e adicionando o suporte do MySQL ao php no Debian Squeeze.

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialwheezy_en para que não falte nenhum pacote ou configuração.

Vamos mandar fazer um update dos repositórios e fazer um upgrade do sistema

aptitude update && aptitude dist-upgrade -y

Agora vamos adicionar o repositório que contem o php5-fpm

echo "deb http://packages.dotdeb.org stable all" >> /etc/apt/sources.list

Agora vamos obter e importar a chave GnuPG

wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | sudo apt-key add -
rm dotdeb.gpg

Agora vamos fazer um update dos repositórios

aptitude update

Agora vamos mandar instalar as bibliotecas do PHP e o MySQL

aptitude install php5 php5-fpm php-pear php5-common php5-mcrypt php5-mysql php5-cli php5-gd mysql-server -y

Aqui vamos ser questionados sobre a senha do MySQL então informe ela e confirme

Agora vamos mandar instalar o Nginx

aptitude install nginx -y

Agora vamos criar o arquivo de controle do php-fpm

vim  /etc/php5/fpm/php-fpm.conf
pm.max_children = 25
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_requests = 500
request_terminate_timeout = 30s

Agora vamos ajustar o arquivo para utilizar um socket tcp, vamos trocar a configuração do sock para o socket tcp, aqui ele vai escutar somente em localhost.

vi /etc/php5/fpm/pool.d/www.conf
[...]
;listen = /var/run/php5-fpm.sock #linha 33 do arquivo
listen = 127.0.0.1:9000
[...]

Agora vamos mandar reiniciar o php-fpm

/etc/init.d/php5-fpm restart

Agora vamos verificar se a porta 9000 está escutando

netstat -tulanp | egrep 9000
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               OUÇA       8476/php-fpm.conf)

Está ok a porta.

Agora vamos fazer um backup do arquivo de configuração do nginx

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bkp

Agora vamos deixar o arquivo como abaixo

vim /etc/nginx/nginx.conf
#/etc/nginx/nginx.conf
user www-data;

worker_processes 4;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        client_max_body_size 20M;
        client_body_buffer_size 128k;
        server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

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

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;


        ##
        # Virtual Host Configs
        ##
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Agora vamos mandar desabilitar o site default do Nginx

ngxdissite default

Agora vamos criar um VirtualHost

vim /etc/nginx/sites-available/www.douglasqsantos.com.br
server {
                #Qual porta o Nginx vai escutar 
                listen 80;
                #Name Server 
                server_name douglasqsantos.com.br www.douglasqsantos.com.br;
                #Controle dos logs
                access_log /var/log/nginx/www.douglasqsantos.com.br.access_log;
                error_log /var/log/nginx/www.douglasqsantos.com.br.error_log;
                #Document Root do site
                root /var/www/www.douglasqsantos.com.br;
                #Arquivos que vão ser utilizamos como indexes
                index index.php index.htm index.html;
                #Em caso de encontrar arquivos php como eles devem ser tratados
                location ~ .php$ {
                  fastcgi_pass   127.0.0.1:9000;
                  fastcgi_index  index.php;
                  fastcgi_param  SCRIPT_FILENAME /var/www/www.douglasqsantos.com.br$fastcgi_script_name;
                  include fastcgi_params;
                }
       }

Agora precisamos criar a estrutura de diretórios para o nosso site

mkdir -p /var/www/www.douglasqsantos.com.br

Agora precisamos acertar as permissões do diretório

chown -R www-data:www-data /var/www

Agora vamos criar um arquivo para testarmos o php

echo "<?php phpinfo(); ?>" > /var/www/www.douglasqsantos.com.br/index.php

Agora vamos criar um arquivo para testarmos o php com o MySQL

vim /var/www/www.douglasqsantos.com.br/mysql.php
<?php
$link = mysql_connect('localhost', 'root', 'senha');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>

Agora vamos ativar o nosso VirtualHost

ngxensite www.douglasqsantos.com.br
Site www.douglasqsantos.com.br installed; run invoke-rc.d nginx reload to enable.

Agora vamos reiniciar o Nginx para testar o php

/etc/init.d/nginx restart

Agora já podemos testar o PHP http://www.douglasqsantos.com.br/ ou http://ip_servidor/ caso não tenha configurado o DNS

Agora já podemos testar o PHP com MySQL http://www.douglasqsantos.com.br/mysql.php ou http://ip_servidor/mysql.php caso não tenha configurado o DNS

Agora vamos ver como habilitamos o https

Vamos criar o diretório para armazenar os nossos certificados

mkdir /etc/nginx/ssl

Agora vamos criar todas as chaves neste diretório

cd /etc/nginx/ssl

Gerando a key

openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
..............................++++++
.++++++
e is 65537 (0x10001)
Enter pass phrase for server.key: #senha
Verifying - Enter pass phrase for server.key: #senha

Vamos gerar agora a requisição de assinatura para o certificado

openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:BR
State or Province Name (full name) []:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) []:Douglas
Organizational Unit Name (eg, section) []:IT
Common Name (eg, fully qualified host name) []:www.douglasqsantos.com.br
Email Address []:douglas.q.santos@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Douglas

Agora vamos acertar as permissões das chaves

chmod 0400 server.*
cp server.key server.key.orig

Agora vamos auto assinar o nosso certificado

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=BR/ST=Parana/L=Curitiba/O=Douglas/OU=Douglas/CN=www.douglasqsantos.com.br/emailAddress=douglas.q.santos@gmail.com
Getting Private key
Enter pass phrase for server.key: senha

Agora vamos tirar a senha do certificado assinado para que o apache não fique pedindo senha a cada vez que for inicializar

openssl rsa -in server.key.orig -out server.key
Enter pass phrase for server.key.orig: senha
writing RSA key

Vamos acertar as permissões de todas as chaves

chmod 0400 /etc/nginx/ssl/* 

Agora vamos ajustar o nosso virtualhost

vim /etc/nginx/sites-available/www.douglasqsantos.com.br
server {
                #Qual porta o Nginx vai escutar 
                listen 80;
                #Name Server 
                server_name douglasqsantos.com.br www.douglasqsantos.com.br;
                #Controle dos logs
                access_log /var/log/nginx/www.douglasqsantos.com.br.access_log;
                error_log /var/log/nginx/www.douglasqsantos.com.br.error_log;
                #Document Root do site
                root /var/www/www.douglasqsantos.com.br;
                #Arquivos que vão ser utilizamos como indexes
                index index.php index.htm index.html;
                #Em caso de encontrar arquivos php como eles devem ser tratados
                location ~ .php$ {
                  fastcgi_pass   127.0.0.1:9000;
                  fastcgi_index  index.php;
                  fastcgi_param  SCRIPT_FILENAME /var/www/www.douglasqsantos.com.br$fastcgi_script_name;
                  include fastcgi_params;
                }
       }
 
server {
                #Qual porta o Nginx vai escutar 
                listen 443;
                #Habilitando o ssl
                ssl on;
                #Definindo a localização dos certificados
                ssl_certificate /etc/nginx/ssl/server.crt;
                ssl_certificate_key /etc/nginx/ssl/server.key;
                #Name Server 
                server_name douglasqsantos.com.br www.douglasqsantos.com.br;
                #Controle dos logs
                access_log /var/log/nginx/www.douglasqsantos.com.br-ssl.access_log;
                error_log /var/log/nginx/www.douglasqsantos.com.br-ssl.error_log;
                #Document Root do site
                root /var/www/www.douglasqsantos.com.br;
                #Arquivos que vão ser utilizamos como indexes
                index index.php index.htm index.html;
                #Em caso de encontrar arquivos php como eles devem ser tratados
                location ~ .php$ {
                  fastcgi_pass   127.0.0.1:9000;
                  fastcgi_index  index.php;
                  fastcgi_param  SCRIPT_FILENAME /var/www/www.douglasqsantos.com.br$fastcgi_script_name;
                  include fastcgi_params;
                }
       }

Agora precisamos mandar reiniciar o nginx

/etc/init.d/nginx restart

Agora já podemos testar o PHP https://www.douglasqsantos.com.br/ ou https://ip_servidor/ caso não tenha configurado o DNS

Agora já podemos testar o PHP com MySQL https://www.douglasqsantos.com.br/mysql.php ou https://ip_servidor/mysql.php caso não tenha configurado o DNS

Agora vamos habilitar a visualizaçao de status do php-fpm

sed -i 's/;pm.status_path/pm.status_path/g' /etc/php5/fpm/pool.d/www.conf

Agora vamos precisar adicionar um bloco na configuração do nosso VirtualHost

vim /etc/nginx/sites-available/www.douglasqsantos.com.br
server {
                #Qual porta o Nginx vai escutar
                listen 80;
                #Name Server
                server_name douglasqsantos.com.br www.douglasqsantos.com.br;
                #Controle dos logs
                access_log /var/log/nginx/www.douglasqsantos.com.br.access_log;
                error_log /var/log/nginx/www.douglasqsantos.com.br.error_log;
                #Document Root do site
                root /var/www/www.douglasqsantos.com.br;
                #Arquivos que vão ser utilizamos como indexes
                index index.php index.htm index.html;
                #Em caso de encontrar arquivos php como eles devem ser tratados
                location ~ .php$ {
                  fastcgi_pass   127.0.0.1:9000;
                  fastcgi_index  index.php;
                  fastcgi_param  SCRIPT_FILENAME /var/www/www.douglasqsantos.com.br$fastcgi_script_name;
                  include fastcgi_params;
                }
                #Acesso a página de status
                location ~ ^/(status|ping)$ {
                     access_log off;
                     allow 127.0.0.1;
                     allow 192.168.1.0/24;
                     deny all;
                     include fastcgi_params;
                     fastcgi_pass 127.0.0.1:9000;
                }
       }

Note que temos o bloco location ~ ^/(status|ping)$ { aqui estamos habilitando a visualização da página de status e note que temos os allow ali libere somente quem vai precisar de acesso eu liberei para a minha LAN 192.168.1.0/24

Agora vamos reiniciar o php-fpm

/etc/init.d/php5-fpm restart

Agora vamos reiniciar o nginx para ele recarregar a nova configuração

/etc/init.d/nginx restart

Agora podemos acessar:

Referências