Montando Servidor PHP, Mysql e NodeJs
Estou trazendo esse topico por alguns motivos:
- Manter um histórico para que futuramente as vezes eu possa necessitar
- Caso alguem necessite =)
- Redução de custos e escabilidade
- Dificuldade encontradas no balanceamento do Nginx, Mysql e PHP-FPM
Hoje o cenário é que possuo vários sistemas todos na Hostinger porem esbarrei com algumas restrições que não foi tão agradavel, não falando mal apenas parou de atender o que eu precisava fiquei quase 4 anos com eles sem nenhum problema porem o projeto cresceu.
As LandsPages e gerenciamento de DNS continuam na Hostinger.
Os serviços englobam:
- Servidor de PHP
- Servidor Mysql
- Servidor NodeJs rodando Biblioteca WhatsApp - Baileys
- Sistema de Cobranças com ASAAS
- Sistema de Envio de mensagens
- Sistema e-commerce Local
- Servidor de DNS
- Servidor de CRON
As configurações foram
- Servidor dedicado da Contaboo (não me julguem hehe) 20 CPU e 256 GB Memoria R$ 800/Mês
- Nginx
- PHP-FPM 7.4
- Mysql
- UFW
- GIT
- NPM
- PM2
- CERTBOT
As configurações abaixo faz as instalações das bibliotecas e através do UFW faz a segurança de tudo liberando acesso apenas pelo http, https e SSH
sudo apt update
sudo apt upgrade
sudo apt install nginx
sudo apt install mysql-server
sudo apt install php-fpm
sudo apt install php7.4-fpm
sudo apt install phpmyadmin
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt install nodejs
sudo apt install ufw ##Firewall ufw, liberar https, http, e SSH
sudo ufw allow http
sudo ufw allow https
sudo ufw allow ssh
sudo ufw enable
sudo apt install git
sudo apt install npm
npm install pm2 -g
sudo apt install python3-certbot-nginx
Gerenciamento de DNS na Hostigner
- No painel administrativo ir até "Avançado"
- Editor de Zona DNS
- Apontar um subdominio para o servidor da Contabo
Tipo: A
Name: api.SITE.com.br
Aponta para: Servidor Contabo xxx.xxx.xxx.xxx
TTL: 14400
Configurações do NGINX e CERTBOT
- Apontamento das requisições para suas pastas
- Configuração do Nginx.conf
Item 1 - /etc/nginx/sites-available
sudo nano api
server {
server_name api.SITE.com.br;
root /var/www/api; # Diretório onde você vai armazenar seus arquivos PHP
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
# Configuração para capturar todas as solicitações PHP dentro do diretório svFrontend
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock; # Verifique o caminho do socket PHP-FPM
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# Aumentar o tempo limite para 2 minutos (120 segundos)
fastcgi_read_timeout 120s;
}
}
Agora cria uma copia da API na pasta sites-enabled
sudo ln -s /etc/nginx/sites-available/api /etc/nginx/sites-enabled
Confere configuração
sudo nginx -t
Reinicia Nginx
sudo service nginx restart
Roda o Certbot no Nginx
sudo certbot --nginx
Item 2 configurando o Nginx.conf
OBS: Foi aqui um dos maiores problemas enfrentados pois as configurações que estavam estava barrando as novas requisições
worker_processes 1024;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 8192;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 120;
types_hash_max_size 2048;
server_tokens off;
client_max_body_size 20M;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
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;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
Configurações do PHP-FPM
- Configuração do php.ini
- Configuração do usuário do PHP-FPM
Item 1 - PHP.INI
max_execution_time = 120
max_input_time = 120
memory_limit = 20GB ; aqui separei do servidor até 20 GB para trabalhar com o PHP
Item 2 - Configuração do Usuário
user = www-data
group = www-data
listen = /run/php/php7.4-fpm.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 500
pm.start_servers = 100
pm.min_spare_servers = 70
pm.max_spare_servers = 200
pm.max_requests = 650
php_admin_value[memory_limit] = 256M
Configuração do Servidor Mysql
Vídeo tutorial - AQUI
- Configuração dos limites
- Criação do usuário root
Item 1 - Configuração dos limites - Separei 100 GB para o BD
cd/etc/mysql/mysql.conf.d
sudo nano mysqld.cnf
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
key_buffer_size = 64M
innodb_buffer_pool_size = 100G
max_allowed_packet = 64M
myisam-recover-options = BACKUP
max_connections = 1000
max_binlog_size = 100M
*Item 2 - Criação do usuário *
sudo apt install mysql-server
sudo apt install phpmyadmin
mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'SENHA';
exit
mysql -u root -p
CREATE USER 'usuario'@'xxx.xxx.xxx.xxx' IDENTIFIED BY 'SENHA';
#aqui vai liberar que o usuário acesse somente pelo servidor especifico e abaixo da todos os privilégios para ele
GRANT ALL PRIVILEGES ON *.* TO 'usuario'@'xxx.xxx.xxx.xx' WITH GRANT OPTION;
flush privileges;
exit
Servidor NodeJS - WhatsApp
- Instalação da biblioteca open source WhatsApp
- PM2 para rodar a instância
- Configuração para reiniciar o servidor Node caso Servidor da Contaboo reinicie.
Neste caso o servidor esta rodando na porta 16001, pelo DNS da hostinger criei um subdominio servidor01.SITE.com.br apontando para Contaboo, e do Nginx quando tiver requisição através do servidor01.site.com.br apontará para o servidor localhost:16001.
Item 1 - Instalação da biblioteca open source WhatsApp
cd /home
git clone https://github.com/WhiskeySockets/Baileys.git servidor
cd servidor
npm install
Item 2 - Startar pelo Pm2
pm2 start disp1.js --name '16001-disparador' --watch 'watch/servidor_1' --cron-restart='*/7 * * * *'
Item 3 - Reinicio automático
pm2 save
pm2 startup
As configurações para rodar o servidor manualmente foram estas baseadas na capacidade do meu servidor.
Para cada novo sistema basta apontar o DNS para o servidor da contaboo , e no nginx apontar para pasta onde o sistema estará rodando.
Bom sucesso