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:
- http://www.douglasqsantos.com.br/status para obter o status simples
- http://www.douglasqsantos.com.br/status?json para obter o status simples no formato json
- http://www.douglasqsantos.com.br/status?html para obter o status simples no formato html
- http://www.douglasqsantos.com.br/status?xml para obter o status simples no formato xml
- http://www.douglasqsantos.com.br/status?full para obter informações mais detalhadas
- http://www.douglasqsantos.com.br/status?json&full para obter informações mais detalhadas no formato json
- http://www.douglasqsantos.com.br/status?html&full para obter informações mais detalhadas no formato html
- http://www.douglasqsantos.com.br/status?jxml&full para obter informações mais detalhadas no formato xml