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

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 OpenBSD.

Vamos setar o endereço do nosso repositório

export PKG_PATH=ftp://openbsd.locaweb.com.br/pub/OpenBSD/5.1/packages/`machine -a`/

Agora vamos mandar instalar as bibliotecas do PHP e o MySQL e o Nginx

pkg_add -v php-fpm php-mysql-5.3.10 mysql-server

Agora vamos acertar o link da bibliotecas do PHP-MySQL

ln -fs /etc/php-5.3.sample/mysql.ini         /etc/php-5.3/mysql.ini

Agora vamos mandar instalar os bancos padrões do MySQL

/usr/local/bin/mysql_install_db

Agora vamos mandar iniciar o MySQL

/etc/rc.d/mysqld start

Agora vamos setar uma senha para o root do MySQL

/usr/local/bin/mysqladmin -u root password 'senha'

Agora vamos mandar instalar o Nginx

pkg_add -v nginx-1.0.11

Agora vamos acertar a configuração do php-fpm.conf

vim  /etc/php-fpm.conf
[...]
;A linha abaixo precisamos comentar pois o nginx por padrão não trabalha em chroot
;chroot = /var/www
;Precisamos alterar o usuário e o grupo que vai executar o php-fpm
user = _nginx
group = _nginx
;as opções abaixo são para melhorar a performace do php com Nginx
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 mandar reiniciar o php-fpm

/etc/rc.d/php_fpm restart

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 _nginx;

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/sites-enabled/*;
}

Agora vamos criar dois diretórios para deixarmos mais organizada a configuração do Nginx

mkdir -p /etc/nginx/sites-enabled/
mkdir -p /etc/nginx/sites-available

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 _nginx:_nginx /var/www/www.douglasqsantos.com.br

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

ln -sf /etc/nginx/sites-available/www.douglasqsantos.com.br /etc/nginx/sites-enabled/www.douglasqsantos.com.br

Agora vamos reiniciar o Nginx para testar o php

/etc/rc.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: senha
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) [AU]:BR
State or Province Name (full name) [Some-State]:Parana
Locality Name (eg, city) []:Curitiba
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Douglas
Organizational Unit Name (eg, section) []:Douglas
Common Name (eg, YOUR 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 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 acertar as permissões das chaves

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

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/rc.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 deixar o nginx e o php_fpm na junto da inicialização do sistema

vim /etc/rc.conf
[...]
pkg_scripts="php_fpm nginx"

Agora se quiser reiniciar o servidor para testar ;)

shutdown -r now

Referências