Nos últimos anos possuir um site otimizado se tornou praticamente crucial para o sucesso de um projeto. Para atingir este fim é necessário uma série de otimizações, seja a nível de código, seja a nível de servidor para que nossa hospedagem WordPress tenha performance.
Nesse capítulo você vai aprender a otimizar levemente o Nginx e o PHP do servidor. No entanto, as otimizações realizadas nesse capítulo não podem ser generalizadas a todo e qualquer projeto, muito menos a todo e qualquer servidor, para cada projeto e cada servidor, valores diferentes são utilizados.
Partimos do principio que estamos trabalhando com um site simples de pequeno porte e um servidor de 2GB e 1 núcleo de CPU.
Primeiro Benchmark: Teste de Carga e Análise de Performance
Antes de iniciarmos as otimizações no Nginx e PHP, vamos fazer alguns testes de performance e capacidade de carga do servidor, para termos um antes e depois e poder conferir as melhorias realizadas.
É muito difícil simular um tráfego real, não existe uma ferramenta que simule um acesso real de um cliente, mas podemos testar mesmo que robotizado esse processo.
Teste de Carga 100 pessoas simultâneas
Nosso teste de carga vai simular a entrada de 100 usuários simultâneos começando desde o primeiro usuário até o centésimo, tudo isso durante 1 minuto. Os “usuários” irão realizar requisições na pagina inicial do nosso site.

Mesmo sem otimizações o nosso servidor consumiu menos de 400MB de RAM, no entanto o único núcleo de CPU ficou em 100% de uso, apesar que eu já esperava pelo fato de termos apenas um único núcleo. O Load averange não cresceu praticamente nada.

Já analisando o relatório do teste pude perceber que não tive nenhum erro 400/500 e nenhum timeout. Todas as solicitações foram realizadas com sucesso, e na prática todos os 100 usuários conseguiram ficar online sem que o servidor caísse.

O único ponto negativo foi o tempo de resposta, tivemos um Average de 3323ms, ou seja, quando os 100 usuários estavam ao mesmo tempo no site, toda e qualquer página poderia estar muito lenta para uma boa navegação.
E se analisarem o gráfico, enquanto o número de clientes entravam no site aumentava o average aumentava proporcionalmente.
Análise de Performance
Sabemos que um template WordPress dos modelos default são bem otimizados e leves, e é justamente assim que os sites deveriam ser. Sempre priorizando o máximo de leveza para o usuário. O teste que realizamos não faz muito sentido eu realizar novamente, pois praticamente tiramos 100/100 em tudo.
Vale deixar claro que a localidade do servidor VPS e do servidor do Gtmetrix que realizou o teste pode influenciar na nota.

Tendo esses dados em mente, vamos partir para as otimizações e comparar no final do capítulo os resultados.
Otimizando o Nginx
O Nginx possui um arquivo de configuração principal que está localizado em: /etc/nginx/nginx.conf. Nesse arquivo podemos configurar e definir várias opções de otimizações que vão instruir como o Nginx vai trabalhar e processar as requisições.
Por padrão o Nginx já possui um arquivo default, mas vamos remover todo o conteúdo dele e recria-lo bem personalizado. Para isso, acesse o arquivo e apague todo o conteúdo do nginx.conf
nano /etc/nginx/nginx.conf
Uma vez que foi apagado todo o conteúdo, copie e cole o conteúdo abaixo no arquivo de configuração do nginx. Mas lembre de alterar o usuário em negrito pelo usuário que você criou anteriormente.
user alex;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log crit;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 2000;
use epoll;
multi_accept on;
}
http {
##
# Basic Settings
##
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
access_log off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_names_hash_bucket_size 64;
server_name_in_redirect off;
reset_timedout_connection on;
client_body_timeout 15;
send_timeout 5;
keepalive_requests 60;
client_max_body_size 16M;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# `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;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Salve o arquivo usando CTRL + X seguido de Y e Enter. E não esqueça de reiniciar o nginx:
sudo /etc/init.d/nginx restart
No vídeo onde gravamos a aula deste capítulo eu explico melhor sobre as diretivas que fazem parte desde arquivo de configuração e as otimizações que realizamos para garantir o máximo de performance.
Otimizando o PHP e PHP-FPM
Ajustes no PHP.INI
O PHP.INI é um arquivo de configurações do PHP, possui diretivas de como o PHP deve trabalhar e se comportar em relação ao uso de memória RAM, módulos e extensões instaladas, límites de usos e execuções, uploads e muito mais.
No geral, ele possui configurações que vão funcionar bem para projetos pequenos, mas pensando em projetos wordpress precisamos realizar minimamente algumas alterações visando otimizar nosso PHP.
Localize o arquivo php.ini e realize as seguintes alterações:
nano /etc/php/8.0/fpm/php.ini
post_max_size = 80M
upload_max_filesize = 80M
date.timezone = America/Sao_Paulo
max_execution_time = 600
max_input_vars = 1000
memory_limit = 256M
max_input_time = 600
Procure linha por linha e altere os valores, caso uma linha não exista, insira no final do arquivo. Você pode pesquisar por uma determinada palavra digitando no terminal CTRL + W , nome da diretiva e Enter.

Explicação:
- post_max_size: Configura o tamanho máximo dos dados postados. Esta configuração também afeta o upload de arquivos.
- upload_max_filesize: Tamanho máximo de um arquivo suportado no upload.
- date.timezone: Configura o fuso horário padrão utilizado por todas as funções de data e hora em um script
- max_execution_time: Isso configura o tempo máximo, em segundos, que um script é permitido executar antes de ser terminado.
- max_input_vars: Configura quantas variáveis de entrada serão aceitas, com o limte aplicado a cada super global $_GET, $_POST e $_COOKIE separadamente).
- memory_limit: Define a quantidade máxima de memória em bytes que um script pode alocar. Isto ajuda a prevenir que scripts mal escritos consumam toda a memória disponível no servidor.
- max_input_time: Configura o tempo máximo, em segundos, que um script é permitido dispender interpretando dados de entrada, como GET e POST.
PHP-FPM
O PHP-FPM é um gerenciador de processos que gerencia e trabalha com o FastCGI SAPI (Server API) em PHP. Ele funciona como um serviço independente, e pode ser utilizado em qualquer servidor web que seja compatível com o FastCGI, ex: Nginx.
Em servidores de hospedagem WordPress, o PHP-FPM deve ser otimizado visando garantir um pouco mais de performance para que um site WordPress consiga operar sem muitos esforços, uma vez que o WordPress é um CMS que pode rapidamente ficar denso e pesado.
Para o PHP-FPM precisamos otimizar o pool do PHP, que está localizado em:
nano /etc/php/8.0/fpm/pool.d/www.conf
Servidor com 1GB de RAM: (O PHP pode consumir até 512M de RAM, e só será usado se precisar)
pm = ondemand
pm.max_children = 2
pm.process_idle_timeout = 5s
# Comente as linhas abaixo para não quebrar seu FPM
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Servidor com 2GB de RAM: (O PHP pode consumir até 1G de RAM, e só se precisar)
pm = ondemand
pm.max_children = 5
pm.process_idle_timeout = 5s
# Comente as linhas abaixo para não quebrar seu FPM
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
Servidor com 4GB de RAM: (O PHP pode consumir até 2.5G de RAM, no entanto mesmo sem uso já consome recursos, modelo indicado para lojas e portais)
pm = dynamic
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 1
pm.max_spare_servers = 5
Salve o arquivo usando CTRL + X seguido de Y e Enter.
Otimização OPCACHE
O OPcache melhora o desempenho do PHP armazenando bytecode de script pré-compilado na memória compartilhada, eliminando assim a necessidade do PHP carregar e analisar scripts em cada solicitação.
Para configurarmos o desempenho do PHP utilizando o opcache realize os passos abaixo:
nano /etc/php/8.0/fpm/conf.d/10-opcache.ini
Insira o conteúdo abaixo:
zend_extension=opcache.so
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 4
opcache.max_accelerated_files = 60000
opcache.max_wasted_percentage = 5
opcache.use_cwd = 1
opcache.validate_timestamps = 0
opcache.validate_root= 1
opcache.file_update_protection = 2
opcache.revalidate_path = 0
opcache.save_comments = 1
opcache.load_comments = 1
opcache.fast_shutdown = 1
opcache.enable_file_override = 0
opcache.optimization_level = 0xffffffff
opcache.inherited_hack = 1
opcache.max_file_size = 0
opcache.consistency_checks = 0
opcache.force_restart_timeout = 60
opcache.error_log = "/var/log/php-fpm/opcache.log"
opcache.log_verbosity_level = 1
opcache.preferred_memory_model = ""
opcache.protect_memory = 0
Salve o arquivo usando CTRL + X seguido de Y e Enter. E reinicie o PHP:
/etc/init.d/php8.0-fpm restart
Segundo Benchmark: Teste de Carga
Agora que já otimizamos o nosso Nginx e PHP, podemos partir para um segundo teste de carga no servidor.
Esse segundo teste o servidor consumiu levemente alguns megas de RAM a menos, e o consumo de CPU e Load Average praticamente iguais ao teste anterior.

Já o relatório de carga também foi bem parecido, a diferença é que dessa vez os 100 usuários tiveram uma leve diminuição no tempo de resposta e consequentemente conseguiram realizar mais solicitações na página.

Se eu mudasse a quantidade de usuários no teste para números como 300/500/1000 usuários, os dados poderiam ser bem diferentes. Mas estamos baseando em projetos pequenos que poderiam ter até 100 usuários.
Conclusão
Nesse capítulo realizamos uma série de otimizações no Nginx, PHP, FPM e Opcache.
No próximo capítulo vamos continuar nossas otimizações, mas agora ativando o cache e você vai ficar impressionado com os resultados de um bom cache configurado no servidor.