PD
Preparando um servidor gabarito para o Adianti Framework (com Ubuntu 22.04 e PHP 8.1)
Para trabalharmos bem com uma ferramenta de desenvolvimento é fundamental a preparação do ambiente, e com o Adianti Framework não é diferente. Durante muitos anos, recebemos posts com dúvidas que não diziam respeito ao Framework, mas de detalhes no ambiente que não estavam corretamente configurados. Requisitos como a versão do PHP, a habilitação de logs de erros, configurações de uso de memória, de sessão, dentre outros, muitas vezes não estavam adequados. Além disso, algumas revendas de hospedagem agem restringindo algumas funções do PHP, o que também atrapalha o desenvolvedor. Felizmente hoje podemos instanciar um servidor na nuvem e configurá-lo do nosso jeito. É isso que eu explico neste tutorial. Como criar um servidor gabarito. Vamos preparar um servidor Ubuntu 22.04 server com PHP 8.1, e PostgreSQL 14 além de alguns controles de segurança, que serão explicados a seguir.
Na Adianti, usamos muito o DigitalOcean, que oferece servidores por preços previsíveis e módicos. O primeiro passo é criar a conta. Usando este link a seguir, você ainda ganha U$ 10,00 em créditos após validar a conta.
www.digitalocean.com/?refcode=1ae3426a91ab
O próximo passo é criar a instância de máquina virtual na nuvem, o que a Digital Ocean chama de Droplet. Você receberá a senha de superusuário (root) por e-mail após a criação do servidor. Em seguida, bastará fazer o acesso por SSH.
entrar com senha de root enviada por e-mail
Após o primeiro acesso, aproveite para definir uma senha definitiva:
Agora podemos iniciar as instalações. Vamos iniciar instalando Apache, PHP7, e alguns utilitários como rpl, zip, git, vim, e curl.
Habilitaremos módulos como opcache (aceleração), gd (imagens), sqlite3 (banco de dados), mcrypt (criptografia), e mbstring (unicode).
Em seguida, habilitaremos os módulos do apache, com destaque para o prefork:
Obs: Não é objetivo deste artigo entrar nos modos de operação do Apache, mas você pode ler esta discussão:
serverfault.com/questions/383526/how-do-i-select-which-apache-mpm-to
Configuração DEV
Agora vamos ajustar algumas configurações do PHP, para habilitar a exibição e log de erros, aumentar o limite de uso de RAM, o tempo de execução, o tempo de sessão, e definir limites de upload.
Quando a aplicação entrar em produção, desligue a exibição de erros. Você pode também ser mais tolerante quanto ao nível de erros a ser reportado.
Configuração PROD
Quando tudo estiver configurado, restarte o apache:
Agora vamos ao banco de dados. Eu utilizo PostgreSQL e sou apaixonado pelo banco de dados desde o ano 2000. Considero ele muito robusto, e já participei de mais de 40 projetos de sistema de gestão, sempre com PostgreSQL. Bancos com mais de 200 milhões de registros, bases com mais de 70Gb de dados, então me sinto confortável em recomendar sua utilização.
O primeiro passo é instalar o PostgreSQL, e o driver do PHP para acessá-lo. Aproveito para instalar o driver do Mysql:
Em seguida, vou reconstruir o arquivo de configuração de acesso, para permitir uma administração mais facilitada pela linha de comando, sem pedir senha para acesso local. Recomendo você estudar estas diretivas faz e não simplesmente manter essa configuração a longo prazo.
Agora vamos reiniciar o serviço.
Agora algumas configurações para manter o PHP mais seguro, principalmente para proteger as sessões. As seguintes configurações ajudam a diminuir significativamente a chance de ataques como session hijack e session fixation. Além disso, o nosso template de criação de aplicações já gera novos IDs de sessão a cada login (session_regenerate_id).
Agora vamos instalar o módulo Evasive, do Apache. Este módulo é utilizado para evitar ataques de negação DDOS:
Agora vamos habilitar este módulo.
Agora vamos definir os parâmetros do módulo Evasive para evitar ataques de negação DDOS:
Agora vamos alterar o Apache para ele ler os arquivos .htaccess presentes na estrutura de diretório do Framework. Estes arquivos protegem determinados diretórios do acesso indevido.
Agora vamos reinicar o Apache:
Neste ponto, você já terá um servidor Ubuntu 22.04 rodando Apache, PHP 8.1 e PostgreSQL 14, prontamente configurado. Agora vamos instalar o template de criação de aplicações do Adianti Framework, e criar as bases de dados para nosso primeiro projeto.
Antes de continuar, dê uma olhada no projeto LetsEncrypt, que distribui certificados HTTPS gratuitamente. É muito importante rodar a aplicação em HTTPS. Com o LetsEncrypt, você consegue fazer tudo da linha de comando:
letsencrypt
Agora vamos instalar o Template do Adianti Framework, que já vem com controle de login, permissões de acesso, gestão de documentos, comunicação entre usuários, dentre outros recursos comuns na criação de sistemas. Vamos supor que o mesmo encontra-se no diretório /tmp. Então vamos descompactá-lo e movê-lo para project1 (use qualquer nome para nomear seu projeto):
Agora vamos criar as bases de dados. Vamos simplificar e criar uma base de dados com o nome do projeto (project1) para armazenar as tabelas do projeto em si e também as tabelas de permissão (permission) e comunicação (communication). Mas o banco de logs (log) vamos manter separado, pois facilita o backup. Afinal, como o log crescerá rapidamente, não vamos querer fazer backup dele todo dia.
Para importar as bases de dados vamos utilizar os arquivos no formato SQL já distribuidos com o Framework no diretório app/database.
Agora que criamos as bases de dados, vamos recriar os arquivos de configuração de acesso (INI) para apontar para as novas bases recém criadas.
Após definirmos uma base de dados (permission), copiamos para os outros conectores (communication, e log). Ao final, utilizamos o comando RPL para fazer uma substituição em um arquivo.
Pronto, agora você poderá acessar o template e começar a criar sua aplicação utilizando o Adianti Framework por meio do IP disponibilizado pelo DigitalOcean.
<ip>/projeto1
Para ter maior propriedade ao desenvolver com o Adianti Framework, é fundamental conhecer sua arquitetura, fundamentos, compoentes, e filosofia de desenvolvimento.
Para tal, não deixe de ler o livro sobre o Framework: www.adianti.com.br/bkframe
Temos também o curso em videoaulas, uma metodologia mais dinâmica: www.adianti.com.br/framework-videoaulas
E também o Adianti Studio, a IDE aceleradora para desenvolvimento com o Framework: www.adianti.com.br/studio
Confira os produtos da Adianti em nossa loja virtual: www.adianti.com.br/store/
Obrigado,
Pablo
Criação da conta
Na Adianti, usamos muito o DigitalOcean, que oferece servidores por preços previsíveis e módicos. O primeiro passo é criar a conta. Usando este link a seguir, você ainda ganha U$ 10,00 em créditos após validar a conta.
www.digitalocean.com/?refcode=1ae3426a91ab
Criação da instância
O próximo passo é criar a instância de máquina virtual na nuvem, o que a Digital Ocean chama de Droplet. Você receberá a senha de superusuário (root) por e-mail após a criação do servidor. Em seguida, bastará fazer o acesso por SSH.
ssh root@<ip>
entrar com senha de root enviada por e-mail
Após o primeiro acesso, aproveite para definir uma senha definitiva:
passwd root
Básico Apache e PHP
Agora podemos iniciar as instalações. Vamos iniciar instalando Apache, PHP7, e alguns utilitários como rpl, zip, git, vim, e curl.
Habilitaremos módulos como opcache (aceleração), gd (imagens), sqlite3 (banco de dados), mcrypt (criptografia), e mbstring (unicode).
sudo apt-get update
sudo apt-get install apache2 php libapache2-mod-php
sudo apt-get install php-soap php-xml php-curl php-opcache php-gd php-sqlite3 php-mbstring
sudo apt-get install rpl zip unzip git vim curl
Em seguida, habilitaremos os módulos do apache, com destaque para o prefork:
a2dismod mpm_event
a2dismod mpm_worker
a2enmod mpm_prefork
a2enmod rewrite
a2enmod php8.1
Obs: Não é objetivo deste artigo entrar nos modos de operação do Apache, mas você pode ler esta discussão:
serverfault.com/questions/383526/how-do-i-select-which-apache-mpm-to
Configuração DEV
Agora vamos ajustar algumas configurações do PHP, para habilitar a exibição e log de erros, aumentar o limite de uso de RAM, o tempo de execução, o tempo de sessão, e definir limites de upload.
echo "" >> /etc/php/8.1/apache2/php.ini
echo "error_log = /tmp/php_errors.log" >> /etc/php/8.1/apache2/php.ini
echo "display_errors = On" >> /etc/php/8.1/apache2/php.ini
echo "memory_limit = 256M" >> /etc/php/8.1/apache2/php.ini
echo "max_execution_time = 120" >> /etc/php/8.1/apache2/php.ini
echo "error_reporting = E_ALL" >> /etc/php/8.1/apache2/php.ini
echo "file_uploads = On" >> /etc/php/8.1/apache2/php.ini
echo "post_max_size = 100M" >> /etc/php/8.1/apache2/php.ini
echo "upload_max_filesize = 100M" >> /etc/php/8.1/apache2/php.ini
echo "session.gc_maxlifetime = 14000" >> /etc/php/8.1/apache2/php.ini
Quando a aplicação entrar em produção, desligue a exibição de erros. Você pode também ser mais tolerante quanto ao nível de erros a ser reportado.
Configuração PROD
echo "display_errors = Off" >> php.ini
echo "error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE" >> php.ini
Quando tudo estiver configurado, restarte o apache:
service apache2 restart
Banco de dados
Agora vamos ao banco de dados. Eu utilizo PostgreSQL e sou apaixonado pelo banco de dados desde o ano 2000. Considero ele muito robusto, e já participei de mais de 40 projetos de sistema de gestão, sempre com PostgreSQL. Bancos com mais de 200 milhões de registros, bases com mais de 70Gb de dados, então me sinto confortável em recomendar sua utilização.
O primeiro passo é instalar o PostgreSQL, e o driver do PHP para acessá-lo. Aproveito para instalar o driver do Mysql:
sudo apt-get install postgresql php-pgsql php-mysql
Em seguida, vou reconstruir o arquivo de configuração de acesso, para permitir uma administração mais facilitada pela linha de comando, sem pedir senha para acesso local. Recomendo você estudar estas diretivas faz e não simplesmente manter essa configuração a longo prazo.
rm /etc/postgresql/14/main/pg_hba.conf
echo 'local all all trust' >> /etc/postgresql/14/main/pg_hba.conf
echo 'host all all 127.0.0.1/32 password' >> /etc/postgresql/14/main/pg_hba.conf
echo 'host all all ::1/128 password' >> /etc/postgresql/14/main/pg_hba.conf
echo 'host all all all password' >> /etc/postgresql/14/main/pg_hba.conf
Agora vamos reiniciar o serviço.
service postgresql restart
Segurança
Agora algumas configurações para manter o PHP mais seguro, principalmente para proteger as sessões. As seguintes configurações ajudam a diminuir significativamente a chance de ataques como session hijack e session fixation. Além disso, o nosso template de criação de aplicações já gera novos IDs de sessão a cada login (session_regenerate_id).
echo "session.name = CUSTOMSESSID" >> /etc/php/8.1/apache2/php.ini
echo "session.use_only_cookies = 1" >> /etc/php/8.1/apache2/php.ini
echo "session.cookie_httponly = true" >> /etc/php/8.1/apache2/php.ini
echo "session.use_trans_sid = 0" >> /etc/php/8.1/apache2/php.ini
echo "session.entropy_file = /dev/urandom" >> /etc/php/8.1/apache2/php.ini
echo "session.entropy_length = 32" >> /etc/php/8.1/apache2/php.ini
Agora vamos instalar o módulo Evasive, do Apache. Este módulo é utilizado para evitar ataques de negação DDOS:
sudo apt-get install libapache2-mod-evasive
Agora vamos habilitar este módulo.
a2enmod evasive
Agora vamos definir os parâmetros do módulo Evasive para evitar ataques de negação DDOS:
rm /etc/apache2/mods-enabled/evasive.conf
echo '<IfModule mod_evasive20.c>' >> /etc/apache2/mods-enabled/evasive.conf
echo ' DOSHashTableSize 2048' >> /etc/apache2/mods-enabled/evasive.conf
echo ' DOSPageCount 10' >> /etc/apache2/mods-enabled/evasive.conf
echo ' DOSSiteCount 200' >> /etc/apache2/mods-enabled/evasive.conf
echo ' DOSPageInterval 2' >> /etc/apache2/mods-enabled/evasive.conf
echo ' DOSSiteInterval 2' >> /etc/apache2/mods-enabled/evasive.conf
echo ' DOSBlockingPeriod 10' >> /etc/apache2/mods-enabled/evasive.conf
echo ' DOSLogDir "/var/log/apache2/evasive"' >> /etc/apache2/mods-enabled/evasive.conf
echo '</IfModule>' >> /etc/apache2/mods-enabled/evasive.conf
Agora vamos alterar o Apache para ele ler os arquivos .htaccess presentes na estrutura de diretório do Framework. Estes arquivos protegem determinados diretórios do acesso indevido.
rpl "AllowOverride None" "AllowOverride All" /etc/apache2/apache2.conf
Agora vamos reinicar o Apache:
service apache2 restart
Neste ponto, você já terá um servidor Ubuntu 22.04 rodando Apache, PHP 8.1 e PostgreSQL 14, prontamente configurado. Agora vamos instalar o template de criação de aplicações do Adianti Framework, e criar as bases de dados para nosso primeiro projeto.
Antes de continuar, dê uma olhada no projeto LetsEncrypt, que distribui certificados HTTPS gratuitamente. É muito importante rodar a aplicação em HTTPS. Com o LetsEncrypt, você consegue fazer tudo da linha de comando:
letsencrypt
Template
Agora vamos instalar o Template do Adianti Framework, que já vem com controle de login, permissões de acesso, gestão de documentos, comunicação entre usuários, dentre outros recursos comuns na criação de sistemas. Vamos supor que o mesmo encontra-se no diretório /tmp. Então vamos descompactá-lo e movê-lo para project1 (use qualquer nome para nomear seu projeto):
cd /var/www/html/
unzip /tmp/adianti-template-7.0.0.zip
mv template projeto1
cd projeto1
rpl "template" "projeto1" app/config/application.ini
Criando bases de dados (.sql)
Agora vamos criar as bases de dados. Vamos simplificar e criar uma base de dados com o nome do projeto (project1) para armazenar as tabelas do projeto em si e também as tabelas de permissão (permission) e comunicação (communication). Mas o banco de logs (log) vamos manter separado, pois facilita o backup. Afinal, como o log crescerá rapidamente, não vamos querer fazer backup dele todo dia.
Para importar as bases de dados vamos utilizar os arquivos no formato SQL já distribuidos com o Framework no diretório app/database.
psql template1 -Upostgres -c "create user projeto1 with password 'projeto1'"
psql template1 -Upostgres -c "create database projeto1 owner projeto1"
psql template1 -Upostgres -c "create database projeto1_log owner projeto1"
psql projeto1 -Uprojeto1 -c "\\i app/database/permission.sql"
psql projeto1 -Uprojeto1 -c "\\i app/database/communication.sql"
psql projeto1_log -Uprojeto1 -c "\\i app/database/log.sql"
Configurando acesso (.ini)
Agora que criamos as bases de dados, vamos recriar os arquivos de configuração de acesso (INI) para apontar para as novas bases recém criadas.
Após definirmos uma base de dados (permission), copiamos para os outros conectores (communication, e log). Ao final, utilizamos o comando RPL para fazer uma substituição em um arquivo.
rm app/config/permission.ini
echo "host = localhost" >> app/config/permission.ini
echo "port = 5432" >> app/config/permission.ini
echo "name = projeto1" >> app/config/permission.ini
echo "user = projeto1" >> app/config/permission.ini
echo "pass = projeto1" >> app/config/permission.ini
echo "type = pgsql" >> app/config/permission.ini
echo "prep = 1" >> app/config/permission.ini
cp app/config/permission.ini app/config/communication.ini
cp app/config/permission.ini app/config/log.ini
rpl "name = projeto1" "name = projeto1_log" app/config/log.ini
Pronto, agora você poderá acessar o template e começar a criar sua aplicação utilizando o Adianti Framework por meio do IP disponibilizado pelo DigitalOcean.
<ip>/projeto1
Para ter maior propriedade ao desenvolver com o Adianti Framework, é fundamental conhecer sua arquitetura, fundamentos, compoentes, e filosofia de desenvolvimento.
Para tal, não deixe de ler o livro sobre o Framework: www.adianti.com.br/bkframe
Temos também o curso em videoaulas, uma metodologia mais dinâmica: www.adianti.com.br/framework-videoaulas
E também o Adianti Studio, a IDE aceleradora para desenvolvimento com o Framework: www.adianti.com.br/studio
Confira os produtos da Adianti em nossa loja virtual: www.adianti.com.br/store/
Obrigado,
Pablo
Os parâmetros do php.ini abaixo, foram removidos no PHP 7.1.0
fonte: https://www.php.net/manual/pt_BR/session.configuration.php
Ao tentar rodar os comandos, o php instalado acaba sendo o 7.2
O script deve ser atualizado, pq aqui nao ta funcionando
Estou usando uma maquina na digital ocean. ubuntu 18.04 LTS
No caso do Emílio, é porque estais tentando instalar o PHP 8.1 em uma versão do Ubuntu que não tem suporte oficialmente.
No tutorial que o Pablo explica aqui é para a versão 22.04 do Ubuntu.
Para instalar o PHP no Ubuntu 18.04, você pode utilizar a repositório do ondrej.
Adiciona o repositório
Em seguida ai você poderá instalar o PHP 8.1
e para os pacotes adicionais
Bom dia!
Usar o mod_evasive juntamente com o mpm_prefork faz com que o DOSBlockingPeriod do evasive não funcione, exceto se configurar algumas opções do prefork com os mesmos valores, limitando seu poder de atuação, como descrito neste link: https://serverfault.com/questions/679928/apache-mod-evasive-with-mpm-prefork-settings-to-work
Tem alguma sugestão melhor de configuração para o funcionamento adequado? Eu por exemplo, pra não limitar o prefork, optei por criar um script que adiciona/remove regras de bolqueio no iptables, e configurá-lo no DOSSystemCommand do evasive. Funciona, mas tenho que fazer um sleep no script pelo tempo que quero bloquear, o que não é legal :(
Oi Marcelo, Pode ser worker também sem problemas. Ocorre que para sistemas internos (que não escalam para milhares de usuários), o prefork fornece maior isolamento e melhor tempo de resposta, por ter um processo pronto esperando para aquela conexão. O lado negativo é o grande consumo de memória. Para sistemas públicos e que escalam, realmente o worker ou event são melhores opções.
Prefork
With the Prefork module installed, Apache is a non-threaded, pre-forking web server. That means that each Apache child process contains a single thread and handles one request at a time. Because of that, it consumes more resources than the threaded MPMs: Worker and Event.
Prefork is the default MPM, so if no MPM is selected in EasyApache, Prefork will be selected. It still is the best choice if Apache has to use non-thread safe libraries such as mod_php (DSO), and is ideal if isolation of processes is important.
Worker
The Worker MPM turns Apache into a multi-process, multi-threaded web server. Unlike Prefork, each child process under Worker can have multiple threads. As such, Worker can handle more requests with fewer resources than Prefork. Worker generally is recommended for high-traffic servers running Apache versions prior to 2.4. However, Worker is incompatible with non-thread safe libraries. If you need to run something that isn’t thread safe, you will need to stick with Prefork.
Event
Each process under Event also can contain multiple threads but, unlike Worker, each is capable of more than one task. Apache has the lowest resource requirements when used with the Event MPM.
Event, though, is supported only on servers running Apache 2.4. Under Apache 2.2, Event is considered experimental and is incompatible with some modules on older versions of Apache. Nevertheless, on high-traffic Apache 2.2 servers where Apache has experienced issues with memory, upgrading Apache to take advantage of the Event MPM can yield significant results.
Fonte:
https://www.liquidweb.com/kb/apache-mpms-explained/