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