Tutorial instalar e configurar servidor web (HTTP) no Ubuntu com Apache, MySQL, PHP, FTP, TLS e PHP-FPM
Objetivos
- Entender o que é um servidor web
- Saber quais softwares básicos um servidor web precisa
- Passo a passo para configurar um servidor web instalando o MySQL, PHP, FTP com TLS, PHP-FPM e Apache
O que é um servidor web
Há certa ambiguidade ao se referir a um servidor web ou servidor http. Esta ambiguidade se deve ao fato de um servidor ser referido tanto ao seu aspecto de hardware, quanto de software.
Para facilitar o entendimento, um servidor web possui recursos como um computador pessoal: processador, armazenamento, memória ram, etc; estas características são referentes ao hardware do servidor web.
Um servidor no geral, provê serviços aos usuários, no caso do servidor web, ele provê o serviço de páginas de websites. Para ter esta funcionalidade, de prover páginas, o servidor precisa ter um software de servidor http instalado e configurado; desta forma, no aspecto de software, um servidor web pode ser entendido como o software de servidor http, como o : apache, nginx, lighttpd, iis, etc.
Saber quais softwares básicos um servidor web precisa
Caso o servidor web forneça somente páginas no formato html, é necessário somente instalar um software de servidor http, como dito anteriormente: nginx, iis, apache, etc.
Mas é muito comum os servidores utilizarem uma linguagem de programação, que pode ser o php, python, java, etc. Desta forma o servidor precisa ter suporte a estas linguagens também.
Alguns websites precisam de acesso ao banco de dados para armazenar informações, como sistema de login e senha, aplicativos em formato de site, etc. Desta forma, o suporte a um banco de dados também é pertinente, como exemplo temos o postgre, mysql, oracle, etc.
É comum também que se conecte no servidor por SSH ou FTP para a transferência de arquivos das páginas web. Então é necessário a instalação de softwares que oferecem este suporte de transferência de arquivos.
Boa parte dos sites na internet utilizam um sistema gerenciador de conteúdo (CMS). Como exemplo, temos o wordpress, que possui mais de 40% da fatia de mercado. Neste caso específico, para termos um servidor web que possa ser capaz de hospedar sites com a estrutura do wordpress, precisamos instalar:
- Servidor Http: o de sua preferência (apache, nginx, etc)
- Linguagem de programação: PHP
- Banco de dados: MySQL
- Transferência de arquivos: SSH ou SSH e FTP
Quais softwares vamos utilizar para o setup do servidor HTTP deste exemplo?
Neste exemplo será feito a instalação conhecida como LAMP:
- Linux
- Apache
- MySQL
- PHP
Lembrando que para este tutorial, levamos em conta que a instalação do sistema operacional com o Linux Ubuntu já foi realizada, juntamente com a instalação do OpenSSH. É possível rever estes passos neste Tutorial para Instalar Sistema Operacional para Servidor. Adicionalmente vamos realizar a instalação do FTP neste tutorial, juntamente com a opção de encriptação do FTP com TLS e a instalação do interpretador PHP-FPM Fast CGI.
Passo a passo para configurar um servidor web instalando o MySQL, PHP, FTP com TLS, Apache e PHP-FPM
Instalando servidor HTTP Apache
Passo 1
Primeiramente é necessário verificar os updates disponíveis com o comando:
sudo apt update
Em seguida, vamos realizar o upgrade dos softwares disponíveis:
sudo apt upgrade
Passo 2
Agora vamos instalar o software de servidor HTTP chamado apache:
sudo apt install apache2
Passo 3
Vamos verificar o IP do servidor com o comando:
ip a
Passo 4
Agora vamos digitar o IP do servidor em um browser de internet e verificar se a página padrão do apache irá aparecer.
Passo 5
Tudo certo! Software de servidor http apache instalado e funcionando corretamente! Servidor pronto para servir páginas em HTML.
Instalando Banco de Dados MySQL
Passo 6
Utilize o comando abaixo para instalar o MySQL:
sudo apt install mysql-server
Passo 7
Agora vamos definir a senha @@@senha123 para ser a senha do usuário root:
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '@@@senha123';"
Em um próximo passo vamos atualizar esta senha, então não se preocupe em trocar ela neste momento.
Passo 8
Agora vamos executar o seguinte comando para finalizar a instalação do banco de dados:
sudo mysql_secure_installation
Durante a execução do comando acima, será necessário realizar as operações:
- Digitar a senha de root previamente criada: @@@senha123
- Não habilitar componente para verificar força de senha. Este módulo geralmente causa bastante dor de cabeça na maioria das vezes. Recomendação é não habilitar.
- Agora é a oportunidade de trocar a senha do usuário root do banco de dados (não confundir com usuário root do login do sistema operacional). Lembre de anotar a senha em um local seguro, pois será necessária futuramente para criação de novos usuários e bancos de dados.
- Agora remova os usuários anônimos de teste.
- Remova acesso remoto de usuário root ao banco de dados.
- Remova banco de dados de teste.
- Atualize as tabelas de privilégios para que as mudanças tenham efeito imediato.
Instalando linguagem de programação PHP
Passo 9
Para instalar o suporte PHP para o servidor apache, utilize o comando:
sudo apt install php
Passo 10
Para instalar o software de manipulação de imagens ImageMagick, utilize o comando:
sudo apt install imagemagick
Passo 11
Para instalar o software de manipulação e criação de arquivos pdf e postscript, utilize o comando:
sudo apt install ghostscript
Passo 12
Para instalar pacotes adicionais do PHP que são recomendados para uma instalação do wordpress, utilize o comando:
sudo apt install php-{json,mysqli,curl,imagick,mbstring,xml,zip,memcache,opcache,redis,intl,ssh2,common}
Passo 13
Para instalar algumas extensões populares, utilize o comando:
sudo apt install php-{gd,cli,dev,imap,soap}
Passo 14
Para instalar alguns pacotes populares, utilize o comando:
sudo apt install openssl bc filter zlib1g wget unzip
Passo 15
Agora, com o comando abaixo, ele vai criar um arquivo chamado info.php que chama a função phpinfo() e mostra todas as configurações do php instalado. Este arquivo (info.php) poderá ser acessado pelo browser.
Passo 16
Para visualizar o arquivo info.php criado, abra o browser de intenet, digite o IP do seu servidor seguido de /info.php. Como exemplo, temos:
http://192.168.1.135/info.php
Instalando Interface de administração do MySQL (phpmyadmin)
Passo 17
O phpmyadmin é uma interface web para administração do banco de dados MySQL.
Para instalar o phpmyadmin, execute o comando:
sudo apt install phpmyadmin
Lembrando que o phpmyadmin necessita de extensões adicionais do PHP que foram previamente instaladas. Caso não tenha instalado, basta executar o comando:
sudo apt install php-mbstring php-zip php-gd php-json php-curl
Durante a instalação do phpmyadmin, será necessário definir algumas configurações de instalação:
- Será necessário informar qual servidor http temos configurado no servidor. Neste tutorial, estamos utilizando o servidor Apache (apache2). Atenção! Utilize as setas do teclado e fique em cima da seleção do Apache2 e tecle ESPAÇO uma vez para selecionar sua escolha. Somente após escolher a opção, tecle enter. É muito comum as pessoas apertarem ENTER sem selecionar o servidor Apache2 e ter que executar o dpkg-reconfigure phpmyadmin para refazer a instalação do phpmyadmin e selecionar corretamente o servidor http.
- Aceite a opção de utilizar o dbconfig-common para configurar o banco do phpmyadmin.
- Na última etapa é preciso escolher uma senha para o phpmyadmin se conectar ao banco de dados. Escolha uma senha forte. Esta senha será utilizada somente pelo phpmyadmin. Após escolher a senha, confirme ela novamente na próxima etapa. Caso deixe o campo em branco, uma senha aleatória será criada automaticamente.
Passo 18
Para acessar a interface do phpmyadmin, utilize o browser de internet, digite o IP do servidor seguido de /phpmyadmin. Como exemplo, temos:
http://192.168.1.104/phpmyadmin
É interessante realizar login com o usuário root e senha. E criar um login de usuário pessoal para o responsável por administrar o banco de dados. Evitar sempre que possível utilizar o login do usuário root no dia a dia. Lembre-se de garantir privilégios de administrador no momento da criação de seu novo usuário.
Passo 19
Como estamos utilizando o apache para nosso servidor http, uma opção possível, é criar uma segunda camada de login em cima do phpmyadmin. O phpmyadmin é um aplicativo muito conhecido e hackers podem buscar brechas de segurança para ter acesso ao bando de dados. Com uma segunda camada de login, aumentamos o nível de segurança do servidor. O Apache permite utilizarmos um arquivo .htaccess e .htpasswd para gerenciar permissões por diretório, neste caso, vamos criar permissões de acesso. Primeiramente vamos editar o arquivo de configuração do phpmyadmin com o comando:
sudo nano /etc/apache2/conf-available/phpmyadmin.conf
Procure a linha com o texto “DirectoryIndex index.php”. Abaixo desta linha vamos inserir o seguinte texto:
AllowOverride All
Salve as modificações e feche o nano.
Passo 20
Agora vamos reiniciar o Apache para que a modificação do passo anterior tenha efeito:
sudo service apache2 restart
Passo 21
Neste passo vamos criar um arquivo .htaccess dentro do diretório do phpmyadmin (/usr/share/phpmyadmin/) e configurar um método de login baseado em usuário e senha armazenado no arquivo .htpasswd. Isso tudo é feito com o comando:
echo -e 'AuthType Basic\nAuthName "Restricted Files"\nAuthUserFile /etc/phpmyadmin/.htpasswd\nRequire valid-user' | sudo tee -a /usr/share/phpmyadmin/.htaccess
Passo 22
Agora precisamos criar o arquivo .htpasswd com os usuários que têm permissão de acesso da página de login do phpmyadmin. Para criar o primeiro usuário, utilize o comando:
sudo htpasswd -c /etc/phpmyadmin/.htpasswd nomeusuario
Lembre-se de substituir o “nomeusuario” do comando acima, para o nome de usuário de sua escolha. Para criar os demais usuários, utilize sempre este segundo comando:
sudo htpasswd /etc/phpmyadmin/.htpasswd usuario2
O prefixo -c do primeiro comando entende que o arquivo .htpasswd não existe, e desta forma cria o arquivo. Porém, se o arquivo já exista, o comando -c irá apagar o arquivo original e criar um arquivo novo. Então preste bastante atenção ao criar os demais usuários para não sobrescrever o arquivo de usuário/senha (htpasswd).
Atenção! Anote os usuários e senhas criados nesta etapa, pois serão necessário para acessar a interface de login do phpmyadmin.
Passo 23
Agora vamos reiniciar o Apache para que a modificação do passo anterior tenha efeito:
sudo service apache2 restart
Passo 24
Agora acessando novamente o servidor pelo IP e url do phpmyadmin:
http://192.168.1.104/phpmyadmin
Repare que aparece um pedido de login antes da página de login do phpmyadmin. Esta primeira solicitação é diante do login criado na etapa do htpasswd. Este login do htpasswd fica salvo no cache, então, se estiver ativo no browser, provavelmente não pedirá login novamente se fechar e abrir a página do phpmyadmin. Mas se utilizar um browser diferente, reiniciar o computador, etc; será necessário realizar o login novamente.
Passo 25
Caso tenha realizado a etapa de segurança do .htaccess e .htpasswd corretamente e realizado a primeira etapa de login, agora basta inserir seu login e senha do phpmyadmin para acessar o banco de dados.
Instalação servidor FTP
Passo 26
Neste tutorial vamos utilizar o software proftpd como servidor de FTP. Existem outros softwares disponíveis para a mesma finalidade. Para instalar, utilize o comando:
sudo apt install proftpd
Passo 27
Para a conexão FTP no servidor é possível utilizar seu usuário pessoal de login do linux com a senha do sistema. É possível também criar uma lista de usuários independente, para acesso somente por conexão FTP. Neste exemplo optamos por criar um usuário de sistema do linux:
sudo useradd -m usuarioFTP1
Após criar o usuário, precisamos definir/alterar sua senha:
sudo passwd usuarioFTP1
Passo 28
No seu computador pessoal, recomendamos que instale o software cliente de FTP chamado de Filezilla. Segue url do site para download do software:
https://filezilla-project.org/download.php?type=client
Passo 29
No seu computador pessoal, execute o programa FileZilla. No campo de host, coloque o IP do seu servidor. No campo de login, coloque o usuário de teste criado usuarioFTP1. No campo de senha, coloque a senha que selecionou para este usuário. Clique agora em QuickConnect ou Conexão Rápida. É possível que apareça um popup perguntando se deseja salvar a senhas, etc. Por segurança, não recomendo salvar nenhuma senha.
Passo 30
Caso os passos tenham sido executados corretamente, a conexão entre cliente (computador pessoal) e servidor (servidor web) será bem sucedida. Para entender a interface do FileZilla, na figura do passo anterior, deixei selecionado em verde o lado esquerdo que são as pastas e arquivos do seu computador, e ao se conectar, do lado direito (em azul) serão as pastas e arquivos do servidor. Você poderá passar os arquivos de um lado para o outro como desejar. Caso apareça algum erro nessa operação de enviar arquivos, possivelmente é por permissão de escrita no diretório. Em um outro tutorial será explicado como entender tais permissões para organizar corretamente os arquivos. Mas por padrão, o usuário sempre terá acesso de leitura e escrita em sua pasta pessoal.
Passo 31
Uma etapa importante de segurança para o envio de arquivos por FTP é configurar encriptação TLS. No passo anterior o processo de envio e recebimento de arquivos já está funcional, mas os dados estão sendo enviados sem criptografia, podendo ser interceptados, assim como as credenciais de acesso ao servidor por FTP. Vamos então iniciar o processo de configuração de criptografia TLS, instalando o software openssl, caso ainda não tenha sido instalado:
sudo apt install openssl
Passo 32
Agora precisamos criar um certificado para ser utilizado na conexão. Vamos gerar uma chave de certificado e um certificado com validade de 10 anos:
sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/ssl/private/proftpd.key -out /etc/ssl/certs/proftpd.crt -nodes -days 3650
No processo de criação do certificado é necessário responder a estas perguntas:
- Sigla do País: BR
- Estado: (escreva o nome do estado onde você ou o servidor está)
- Cidade: (escreva o nome da cidade onde você ou o servidor está)
- Nome da sua empresa: (pode utilizar seu nome pessoal se não tiver empresa)
- Unidade da sua empresa: (matriz, filial, etc)
- Nome do seu domínio: (ou o seu nome se não tiver domínio registrado)
- Email: (usar um email ou um alias próprio para esta função, para evitar spam na sua caixa pessoal)
Passo 33
Com o certificado criado, precisamos definir as permissões de arquivo corretas para a chave e certificado:
sudo chmod 600 /etc/ssl/private/proftpd.key
sudo chmod 600 /etc/ssl/certs/proftpd.crt
Passo 34
Nesta etapa vamos editar o arquivo de configuração do proftpd.
sudo nano /etc/proftpd/proftpd.conf
Passo 35
Agora precisamos encontrar a linha: #Include /etc/proftpd/tls.conf e remover o caracter # do começo da linha. O caracter # transforma a linha em um “comentário”, desabilitando sua funcionalidade. Como queremos habilitar e encriptação TLS, precisamos “descomentar” a linha. Esta linha deve ficar da seguinte forma:
Include /etc/proftpd/tls.conf
Passo 36
No passo anterior habilitamos o proftpd a utilizar o arquivo de configuração tls.conf. Mas agora, precisamos editar este arquivo e verificar se as informações estão corretamente configuradas:
sudo nano /etc/proftpd/tls.conf
Com o arquivo aberto, precisamos descomentar as seguintes linhas:
#TLSEngine on #TLSLog /var/log/proftpd/tls.log #TLSProtocol SSLv23 #TLSRSACertificateFile /etc/ssl/certs/proftpd.crt #TLSRSACertificateKeyFile /etc/ssl/private/proftpd.key #TLSOptions AllowClientRenegotiations #TLSRequired on
Desta forma, é preciso remover o # destas linhas acima. Como resultado elas devem ficar:
TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSRSACertificateFile /etc/ssl/certs/proftpd.crt TLSRSACertificateKeyFile /etc/ssl/private/proftpd.key TLSOptions AllowClientRenegotiations TLSRequired on
Lembrando para não alterar as demais linhas do arquivo. Salve o arquivo e saia do editor nano.
Passo 37
Neste passo agora precisamos habilitar o módulo TLS dentro do arquivo modules.conf:
sudo nano /etc/proftpd/modules.conf
Agora encontre a linha #LoadModule mod_tls.c e remova o caracter #. Desta forma estamos “descomentando” a linha e habilitando o módulo mod_tls.c. Após editar a linha, esta deverá ficar como:
LoadModule mod_tls.c
Salve o arquivo e feche o editor nano.
Passo 38
Para o TLS agora funcionar no proftpd, precisamos instalar o seu módulo de encriptação com o comando:
sudo apt install proftpd-mod-crypto
Passo 39
Para finalizar a configuração da encriptação TLS no FTP, precisamos reiniciar o serviço:
sudo service proftpd restart
Passo 40
No seu computador pessoal agora conecte novamente ao seu servidor por FTP utilizando o FileZilla. Na primeira conexão será necessário aceitar o certificado criado. Repare no rodapé do FileZilla, ao se conectar no servidor com criptografia, um cadeado irá aparecer.
Instalando PHP FastCGI Process Manager: PHP-FPM
Passo 41
Nesta estapa opcional, como estamos utilizando o servidor http Apache, temos a opção de trocar o interpretador PHP do Apache, pelo FastCGI. É uma etapa recomendada, pois o PHP-FPM garante diversas vantagens para processamento dos arquivos PHP, além de auxiliar em permissões de arquivos gerenciadas pelo servidor HTTP. Se pretende utilizar WordPress em seu servidor, é uma etapa altamente recomendada, para não ter dor de cabeça com permissão de arquivos, instalação de plugins, temas, updates, etc.
Para instalar o PHP-FPM, utilize o comando:
sudo apt install php-fpm
Durante a instalação é importante reparar qual versão do PHP-FPM está sendo instalada, pois o número da versão impacta no caminho dos arquivos que vamos precisar editar e habilitar.
Passo 42
Agora precisamos habilitar alguns módulos do apache, utilizando o comando:
sudo a2enmod proxy_fcgi setenvif
Estes módulos servem para gerenciar o proxy interno utilizado pelo PHP-FPM e as variáveis de ambiente internas.
Passo 43
Agora vamos habilitar o PHP-FPM instalado. Como neste exemplo utilizamos a versão 8.1, o comando fica como:
sudo a2enconf php8.1-fpm
Passo 44
Agora é necessário reiniciar o servidor http, para que os módulos sejam ativados:
sudo service apache2 restart
Passo 45
Agora precisamos criar uma pool para o acesso a páginas php do servidor. Como não temos SSL instalado neste momento, nem mesmo um domínio, esta etapa surtirá efeito para o acesso ao servidor pelo IP, e sem ssl. Primeiramente vamos navegar até a pasta do php:
sudo cd /etc/php
Agora vamos verificar quais arquivos e diretórios existem dentro da pasta do php:
ls -lah
Neste exemplo, temos a versão 8.1 do php instalada, que podemos verificar pelo diretório presente.
Sabendo então qual a versão do php instalada, vamos direto para o diretório do PHP-FPM desta versão do php:
cd /etc/php/8.1/fpm/pool.d/
Agora precisamos criar/editar uma pool para o PHP-FPM. Vamos primeiro verificar se já existe alguma pool configurada dentro do diretório:
ls -lah
Verificamos a existência do arquivo www.conf. Que é a pool padrão ao instalar o PHP-FPM.
Passo 46
Vamos editar o arquivo de pool www.conf, com o editor nano:
sudo nano www.conf
Dentro do arquivo www.conf, temos a opção de alterar diversas configurações. Mas nesta etapa é importante mudar somente o usuário que será responsável em executar os arquivos pelo servidor HTTP. No meu caso, meu usuário de exemplo (viniciuspaes) é o responsável por todos os arquivos dentro da pasta /var/www/, onde são publicadas as páginas web do servidor. Como pretendo utilizar o wordpress neste servidor, já vou alterar esta pool, definindo o usuário como viniciuspaes. Posteriormente, quando tivermos vários domínios configurados no servidor, com permissão de usuário para cada pasta distinta de cada site, podemos criar uma pool individual para cada site e definir um usuário distinto. Pensando em um servidor compartilhado com várias equipes, faz sentido este setup posterior. Então, para este exemplo, vou alterar a linha user = www-data para:
user = viniciuspaes
Passo 47
Agora vamos habilitar suporte ao HTTP 2. Nesta etapa vamos habilitar o módulo:
sudo a2enmod http2
Passo 48
Agora precisamos reiniciar o serviço do PHP-FPM. Como estou com a versão 8.1 instalada, utilizo o comando:
sudo service php8.1-fpm restart
Passo 49
Como comentei em um dos passos anteriores, só estamos acessando o site pelo IP, pois não temos domínios configurados. Então neste momento, só vamos ativar o HTTP 2 para acesso por IP e sem criptografia SSL (https). Para isso, vamos editar o arquivo padrão de acesso ao servidor:
sudo nano /etc/apache2/sites-available/000-default.conf
Abaixo da linha DocumentRoot /var/www/html, insira o texto:
Protocols h2 http/1.1
Salve o arquivo e feche o editor nano.
Passo 50
Agora reinicie o servidor HTTP e o PHP-FPM:
sudo service php8.1-fpm restart
sudo service apache2 restart
Passo 51
Agora vamos verificar se a instalação do PHP-FPM está funcional. Caso não tenha um arquivo info.php criado na sua pasta de publicação de páginas do servidor, utilize o comando:
Passo 52
No seu computador pessoal, abra o browser de internet, acesse o IP do seu site seguido de /info.php. No meu exemplo, será:
http://192.168.1.104/info.php
Caso tenha feito os passos de forma correta, na linha Server API é possível verificar FPM/FastCGI. Desta forma o PHP-FPM foi instalado e configurado corretamente.
Considerações Finais – Questões de Segurança
- Criamos o usuarioFTP1 de exemplo para acesso ao FTP, se não for utilizá-lo, lembre-se de deletar o usuário:
sudo userdel usuarioFTP1
- Utilizamos uma senha padrão @@@mudar123 para o usuário root do MySQL. Se não atualizou esta senha para uma mais forte, lembre-se de fazer.
- Criamos o arquivo info.php para verificar a instalação do php. Lembre-se de remover este arquivo após o fim deste tutorial:
sudo rm /var/www/html/info.php
Conclusões
Partindo de base que já possui um computador local ou remoto com uma distribuição linux ubuntu instalada e com acesso SSH, este tutorial ensinou os passos para instalar uma configuração LAMP típica.
O servidor está pronto para receber e hospedar websites na pasta /var/www/html. Para os próximos passos, é importante entender como configurar domínios no servidor. Configurar uma pool distinta do PHP-FPM para cada domínio. Entender como funcionam as permissões de arquivos para que os websites fiquem funcionais. Caso tenha o desejo de utilizar sites com o CMS WordPress no seu servidor configurado, basta ficar atento nas publicações, que um tutorial está a caminho.
Revisando as instalações realizadas neste tutorial: Banco de Dados MySQL, Linguagem programação PHP, interface web para gerenciamento do banco de dados: Phpmyadmin, servidor HTTP apache (apache2), segunda camada de login no phpmyadmin com htaccess e htpasswd e interpretador php PHP-FPM FastCGI.