Instalação completa de servidor web (nginx, mysql, php7, HTTP2, phpmyadmin, SSL) – Ubuntu 16.04

Este guia se refere ao Ubuntu 16.04, as outras versões serão feitas posteriormente.
1. Instalação do Nginx
Primeiramente vamos atualizar os repositórios:
sudo apt-get update
Depois vamos instalar o nginx:
sudo apt-get install nginx
Em seguida verificamos a versão do nginx com o comando:
nginx -v
Se obtivermos pelo menos a versão 1.10.0, está tudo certo.
2. Instalação do MySQL
O primeiro passo é instalar o servidor mysql:
sudo apt-get install mysql-server
Obviamente, é preciso preencher a senha do usuário root, com a qual deseja acessar o mysql posteriormente.
Para que as páginas PHP funcionem, você precisa instalar a versão 5 do php e o conjunto de instruções mysql correspondente:
sudo apt-get install php-fpm php-mysql
Para aumentar a segurança, é recomendável desativar a funcionalidade onde, se o php não encontrar o arquivo referenciado, ele executa o mais semelhante:
sudo nano /etc/php/7.0/fpm/php.ini
É necessário encontrar a parte onde está o cgi.fix_pathinfo, remover o ponto e vírgula (;) da frente, alterar o valor para 0 e salvar tudo.
cgi.fix_pathinfo=0
Para alterar o limite de upload, é preciso encontrar a linha upload_max_filesize e alterar o valor para o desejado (megabyte=M, gigabyte:G)
upload_max_filesize = 1G
Para alterar o limite de download, encontre e modifique a linha:
post_max_size = 1G
Feito isso, salve o arquivo e reinicie o php-fpm:
sudo systemctl restart php7.0-fpm
3. Configuração do Nginx
O arquivo de configuração básico pode ser editado assim:
sudo nano /etc/nginx/sites-available/default
O arquivo deve ficar parecido com isto por padrão:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ =404;
}
}Para HTTP simples, modifique o arquivo conforme abaixo:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/meusite;
index index.php index.htm index.nginx-debian.html;
server_name endereco_do_seu_site;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ /\.ht {
deny all;
}
}Para HTTPS (SSL) e HTTP2, modifique o arquivo conforme abaixo (se você não tem certificado SSL, mais abaixo encontrará um guia de como obter um gratuitamente por um ano):
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
root /var/www/meusite;
index index.php index.html index.htm;
server_name endereco_do_seu_site;
location / {
try_files $uri $uri/ /index.php?$args;
}
# indicação do local dos arquivos SSL se criados com letsencrypt
ssl on;
ssl_certificate /etc/letsencrypt/live/endereco_do_seu_site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/endereco_do_seu_site/privkey.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
# indicação dos parâmetros dh conforme descrito abaixo
ssl_dhparam {caminho para o arquivo dhparams.pem};
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
server {
listen 80;
listen [::]:80;
server_name endereco_do_seu_site;
return 301 https://$server_name$request_uri;
}O arquivo deve ser salvo e depois o nginx reiniciado:
sudo service nginx restart
4. Instalação do PHPMyadmin
Você pode instalar o pacote assim:
sudo apt-get install phpmyadmin
Durante a instalação, ele pedirá a senha do usuário root do mysql, forneça-a. A próxima pergunta é a senha da conta root do phpmyadmin. Forneça-a e, quando solicitado, confirme-a.
Depois, para acessar o phpmyadmin pelo seu site, é necessário criar um link simbólico:
sudo ln -s /usr/share/phpmyadmin /var/www/meusite/phpmyadmin
Depois você pode acessar o phpmyadmin no seu site:
http://meusite.com.br/phpmyadmin
5. Solicitação de certificado SSL
No caso de você ainda não possuir certificado SSL, uma boa solução para esse problema é o serviço StartSSL, dentro do qual você pode solicitar por 1 ano para 5 domínios. (depois você pode solicitar novamente) – ATUALIZAÇÃO: O StartSSL parou de funcionar em janeiro de 2018, recomendo o Let’s Encrypt em vez dele.
5.1 Solicitação de SSL Let’s Encrypt
Podemos solicitar SSL Let’s Encrypt com a ajuda do Certbot, que pode ser instalado e usado conforme abaixo:
sudo apt-get update sudo apt-get install software-properties-common sudo add-apt-repository ppa:certbot/certbot sudo apt-get update sudo apt-get install python-certbot-nginx
Quando terminar, execute o Certbot no modo de criação manual de certificado (não queremos que ele mexa no nosso arquivo de configuração nginx bem editado)
sudo certbot --nginx certonly
O processo é bastante intuitivo; é preciso fornecer o endereço de email e o domínio para o qual deseja solicitar o certificado SSL. Feito isso, ele informará a data de expiração e o local do arquivo de certificado:
/etc/letsencrypt/live/endereco_do_seu_site/
A configuração do nginx deve ser feita conforme o item 3, inserindo os nomes de arquivo já existentes.
5.2 Verificação da conexão SSL
É recomendável verificar se configuramos corretamente o uso de SSL no servidor web, o que pode ser feito no site https://www.ssllabs.com/ssltest/analyze.html.
Feito isso, tudo deve funcionar perfeitamente 🙂