Instalação do Servidor Standalone com Alma Linux 8
- Processo de Instalação
- Instalação Básica
- Instalação do DWService
- Instalação do MySQL
- Instalação do NGINX e PHP
- Instalação do ILLI
- Instalação do Agendador de Tarefas e Criação do Sync
Processo de Instalação
O processo de instalação do Alma Linux 8 é mais interativo que nas outras distribuições e versões, abaixo irei guiar para uma melhor configuração.
Iniciamos a instalação entrando com um pen drive bootavél com o instalador.
Esta tela é da seleção do idioma do servidor, no campo de pesquisa digite português clique em Português na lista do lado esquerdo e em Português (Brasil) na lista do lado direito e clique em Continuar.
Na tela principal, clique em REDE & NOME DO HOST.
No campo Nome do host digite o hostname e clique em Aplicar. Em seguida, ative a interface deseja, selecionando a interface na lista do lado esquerdo e no switch localizado no lado direito do nome (até ficar azul, conforme na imagem) e clica em Pronto.
Voltando para tela principal, clique em DESTINO DE INSTALAÇÃO.
Clique no disco desejado até ele ficar com um símbolo de marcado (uma bola preta, com um V em branco). Na sessão de particionamento, marque a opção personalizada em Configuração de armazenamento.
Remova todas as partições existentes, se existirem, e clique em "Clique aqui para criá-las automaticamente".
Selecione a partição /home e no botão de remover identificado com o símbolo de menos [ - ].
Selecione a partição / e no campo Capacidade desejada informa o total disponível (some o valor atual com o valor do espaço alocado anteriormente para partição /home) e clique fora do campo digitado.
- No caso da imagem colocamos um valor maior do que o espaço livre no disco, porém, o sistema irá recalcular e preencher o campo de acordo com o espaço livre no disco.
Clique em Pronto.
Nessa tela o sistema apenas informa as alterações feitas. Clique em Aceitar Alterações.
Voltando para tela principal, clique em "Iniciar a instalação" até abrir a tela acima.
A instalação será iniciada e ao finalizar o processo o botão "Reiniciar sistema" irá habilitar, clique.
Instalação Básica
Execute as seguintes instruções disponíveis no bloco abaixo:
dnf install -y net-tools && \
dnf install -y langpacks-pt_BR glibc-all-langpacks && \
dnf update -y && \
dnf remove -y httpd php* mysql* maria* epel* && \
dnf install -y cronie wget && \
dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && \
dnf install -y nano postfix crudini htop mlocate iperf logrotate bmon mtr screen chrony tar rsync zip unzip bind-utils python39 && \
echo "export VISUAL=\"nano\"" >> ~/.bash_profile && \
echo "export EDITOR=\"nano\"" >> ~/.bash_profile && \
crudini --set /etc/yum.repos.d/epel.repo epel priority 10 && \
timedatectl set-timezone America/Sao_Paulo && \
localectl set-locale LANG=pt_BR.UTF-8 && \
sed -i -e "s/.*SELINUX=enforcing.*/SELINUX=disabled/" /etc/sysconfig/selinux && \
sed -i -e "s/.*SELINUX=enforcing.*/SELINUX=disabled/" /etc/selinux/config && \
systemctl disable firewalld && \
systemctl stop firewalld && \
reboot
O servidor irá reiniciar.
Instalação do DWService
Execute as seguintes instruções disponível no bloco abaixo:
wget https://www.dwservice.net/download/dwagent.sh &&\
chmod +x dwagent.sh &&\
./dwagent.sh
Responsa o seguinte questionário:
- [...] 1. Instalar / 2. Executar / 3. Eu não aceito / Opção (3): 1
- Caminho (/usr/share/dwagent): pressione ENTER
- Você deseja instalar o DWAgent em '/usr/share/dwagent'? 1. Sim / 2. Não / Opção (2): 1
- Configurar o agente? 1. Insira o código de instalação / 2. Criar um novo agente / Opção (1): 1
- Inserir o código de instalação / Código: digite o código de instalação disponível na licença
Instalação do MySQL
Execute as seguintes instruções disponível no bloco abaixo:
cd ~ && \
dnf module disable mysql -y && \
dnf install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm && \
percona-release setup ps-80 && \
dnf install -y percona-server-client
Continue com a execução:
dnf install -y percona-server-client percona-server-server percona-xtrabackup-80 qpress && \
systemctl start mysql.service
Será necessário capturar a senha gerada automaticamente na instalação do serviço de MySQL, através do seguinte comando:
cat /var/log/mysqld.log | grep "temporary password is generated"
Com a senha temporária gerada que foi exibida pelo comando anterior, continue executando o seguinte comando abaixo:
/usr/bin/mysql_secure_installation
Responsa o seguinte questionário:
- Enter password for user root: digitar a senha temporária informada
- New password: digite a nova senha
- Re-enter new password: repita a nova senha
- Change the password for root? ((Press y|Y for Yes, any other key for No): Y
- New password: digite a nova senha novamente
- Re-enter new password: repita a nova senha novamente
- Do you wish to continue with the password provided? (Press y|Y for Yes, any other key for No): Y
- Remove anonymous users? (Press y|Y for Yes, any other key for No): Y
- Disallow root login remotely? (Press y|Y for Yes, any other key for No): No
- Remove test database and access to it? (Press y|Y for Yes, any other key for No): Y
- Reload privilege tables now? (Press y|Y for Yes, any other key for No): Y
É necessário executar as seguintes instruções por determinação do Percona (será solicitado a senha do usuário root do MySQL nos três comandos):
mysql -u root -p -e "CREATE FUNCTION fnv1a_64 RETURNS INTEGER SONAME 'libfnv1a_udf.so'" && \
mysql -u root -p -e "CREATE FUNCTION fnv_64 RETURNS INTEGER SONAME 'libfnv_udf.so'" && \
mysql -u root -p -e "CREATE FUNCTION murmur_hash RETURNS INTEGER SONAME 'libmurmur_udf.so'"
Continue executando as seguintes instruções disponível no bloco abaixo:
crudini --set /etc/my.cnf mysqld sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION && \
crudini --set /etc/my.cnf mysqld max_allowed_packet 64M && \
crudini --set /etc/my.cnf mysqld bind-address 0.0.0.0 && \
crudini --set /etc/my.cnf mysqld binlog_expire_logs_seconds 21600 && \
crudini --set /etc/my.cnf mysqld max_binlog_size 500M && \
crudini --set /etc/my.cnf mysqld skip-external-locking 1 && \
crudini --set /etc/my.cnf mysqld skip-host-cache 1 && \
crudini --set /etc/my.cnf mysqld skip-name-resolve 1 && \
crudini --set /etc/my.cnf mysqld performance_schema 1 && \
crudini --set /etc/my.cnf xtrabackup open-files-limit 2000000 && \
crudini --set /etc/systemd/system/mysql.service Service LimitNOFILE 650000 && \
crudini --set /etc/my.cnf mysqldump max-allowed-packet 128M && \
crudini --set /etc/my.cnf mysqldump quick 1 && \
crudini --set /etc/my.cnf mysqldump quote-names 1 && \
sed -i -e "s/.*skip-external-locking.*/skip-external-locking/" /etc/my.cnf && \
sed -i -e "s/.*skip-host-cache.*/skip-host-cache/" /etc/my.cnf && \
sed -i -e "s/.*skip-name-resolve.*/skip-name-resolve/" /etc/my.cnf && \
sed -i -e "s/.*performance_schema.*/performance_schema/" /etc/my.cnf && \
sed -i -e "s/.*quick.*/quick/" /etc/my.cnf && \
sed -i -e "s/.*quote-names.*/quote-names/" /etc/my.cnf
echo "fs.file-max=5000000" >> /etc/sysctl.d/99-sysctl.conf && \
echo "fs.nr_open=2000000" >> /etc/sysctl.d/99-sysctl.conf && \
echo "mysql hard nofile 2000000" >> /etc/security/limits.conf && \
echo "mysql soft nofile 2000000" >> /etc/security/limits.conf && \
sysctl -w fs.file-max=5000000 && \
sysctl -w fs.nr_open=2000000 && \
systemctl daemon-reload
Precisamos corrigir o acesso do usuário root do MySQL, com as seguintes instruções (deve ser executada individualmente):
mysql -h localhost -u root -p mysql -e "SET GLOBAL validate_password.policy = 0;"
mysql -h localhost -u root -p mysql -e "UPDATE user SET Host = '%' WHERE user.Host = 'localhost' AND user.User = 'root' LIMIT 1;"
Continue executando o seguinte comando abaixo para definir a senha do root (a mesma definida no MySQL Secure Installation):
Se houver uma exclamação ( !senha ), deverá colocar o contra barra antes ( \!senha ).
mysql -h localhost -u root -p mysql -e "ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'SENHA';"
Observe que este comando poderá retornar um erro, e você deverá executar novamente para confirmar a operação, aonde retornará mensagem de sucesso.
Finaliza a instalação do MySQL reiniciando o serviço:
systemctl stop mysql.service && \
systemctl start mysql.service
Instalação do NGINX e PHP
Inicie executando as seguintes instruções disponível no bloco abaixo:
dnf -y install http://rpms.remirepo.net/enterprise/remi-release-8.rpm && \
dnf makecache -y && \
dnf module install php:remi-7.3
Será solicitado uma confirmação, aceite.
dnf install -y nginx git && \
dnf install -y php-fpm php-cli php-mysqlnd php-gd php-curl php-imap php-zip php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-pdo-dblib php-snmp php-soap php-tidy php-sqlite3 php-opcache && \
dnf install -y php-apcu php-mcrypt && \
sysctl -w net.ipv6.conf.all.disable_ipv6=1 && \
sysctl -w net.ipv6.conf.default.disable_ipv6=1 && \
pecl channel-update pecl.php.net && \
systemctl enable nginx.service && \
systemctl enable php-fpm && \
systemctl start nginx.service && \
systemctl start php-fpm.service
Agora, vamos preparar pasta do serviço para receber o ILLI e definir as configurações.
Execute as seguintes instruções disponível no bloco abaixo:
mv /var/www /var/www.old && \
ln -s /usr/share/nginx/html /var/www && \
echo ":)" > /usr/share/nginx/html/index.html && \
cp -f /etc/php.ini /etc/php.ini.sample && \
cp -f /etc/php-fpm.conf /etc/php-fpm.conf.sample && \
sed -i -e "s/.*cgi.fix_pathinfo =.*/cgi.fix_pathinfo = 0/" /etc/php.ini && \
sed -i -e "s/.*date.timezone =.*/date.timezone = America\/Sao_Paulo/" /etc/php.ini && \
sed -i -e "s/.*upload_max_filesize =.*/upload_max_filesize = 500M/" /etc/php.ini && \
sed -i -e "s/.*post_max_size =.*/post_max_size = 500M/" /etc/php.ini && \
sed -i -e "s/.*memory_limit =.*/memory_limit = 1024M/" /etc/php.ini && \
sed -i -e "s/.*max_execution_time =.*/max_execution_time = 1800/" /etc/php.ini && \
sed -i -e "s/.*max_input_time =.*/max_input_time = 1800/" /etc/php.ini && \
sed -i -e "s/.*emergency_restart_threshold =.*/emergency_restart_threshold = 3/" /etc/php-fpm.conf && \
sed -i -e "s/.*emergency_restart_interval =.*/emergency_restart_interval = 1m/" /etc/php-fpm.conf && \
sed -i -e "s/.*process_control_timeout =.*/process_control_timeout = 5s/" /etc/php-fpm.conf && \
cd ~ && \
dnf install -y xorg-x11-server-Xvfb && \
dnf install -y https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox-0.12.5-1.centos8.x86_64.rpm && \
echo 'exec xvfb-run -a -s "-screen 0 1280x1024x16" wkhtmltopdf "$@"' | tee /usr/local/bin/wkhtmltopdf.sh >/dev/null && \
chmod a+x /usr/local/bin/wkhtmltopdf.sh && \
sed -i -e "s/.*opcache.enable=.*/opcache.enable=1/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.save_comments=.*/opcache.save_comments=1/" /etc/php.d/10-opcache.ini && \
sed -i -e "s/.*opcache.revalidate_freq=.*/opcache.revalidate_freq=1/" /etc/php.d/10-opcache.ini && \
git config --global --add safe.directory '*'
Para configurar o NGINX, precisamos substituir o arquivo de configuração principal, através do comando:
echo "" > /etc/nginx/nginx.conf && \
nano /etc/nginx/nginx.conf
Inserindo o seguinte conteúdo:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
multi_accept on;
}
http {
log_format main '"$remote_addr" $host [$time_local] '
'"$request" $status $body_bytes_sent '
'$request_length $bytes_sent "$http_referer" '
'"$http_user_agent" $request_time "$gzip_ratio"';
access_log off;
sendfile on;
tcp_nopush off;
tcp_nodelay on;
keepalive_requests 100;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip off;
open_file_cache max=2000 inactive=20s;
open_file_cache_valid 60s;
open_file_cache_min_uses 5;
open_file_cache_errors off;
client_max_body_size 500M;
large_client_header_buffers 4 64k;
server_tokens off;
include /etc/nginx/conf.d/*.conf;
}
Criar o arquivo /etc/nginx/fastcgi_params.conf com os comandos abaixo:
nano /etc/nginx/fastcgi_params.conf
Insira o conteúdo conforme abaixo:
try_files $uri =404;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_connect_timeout 1800s;
fastcgi_send_timeout 1800s;
fastcgi_read_timeout 1800s;
fastcgi_buffer_size 4096k;
fastcgi_buffers 128 4096k;
fastcgi_busy_buffers_size 4096k;
include fastcgi_params;
Criar o arquivo /etc/nginx/default.d/proxy.conf com os comandos abaixo:
nano /etc/nginx/default.d/proxy.conf
Insira o conteúdo conforme abaixo:
proxy_redirect off;
proxy_http_version 1.1;
proxy_buffering on;
proxy_buffer_size 4096k;
proxy_buffers 128 4096k;
proxy_busy_buffers_size 4096k;
proxy_connect_timeout 1800s;
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
send_timeout 1800s;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
Criar o arquivo /etc/nginx/default.d/default.conf com os comandos abaixo:
nano /etc/nginx/default.d/default.conf
Insira o conteúdo conforme abaixo:
location / {
index index.php index.html index.htm;
rewrite ^/gestor/(.*)$ /gestor/index.php?u=$1 last;
try_files $uri $uri/ /index.php?$args;
proxy_buffering on;
proxy_buffer_size 4096k;
proxy_buffers 128 4096k;
proxy_busy_buffers_size 4096k;
proxy_connect_timeout 1800s;
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
send_timeout 1800s;
}
location ^~ /frontend/ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
application/atom+xml
application/javascript
application/json
application/rss+xml
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/svg+xml
image/x-icon
text/css
text/plain
text/x-component;
}
location ^~ /database {
deny all;
return 404;
}
location ~ \.cnf$ {
deny all;
return 404;
}
location ~ \.log$ {
deny all;
return 404;
}
location ~ \.sh$ {
deny all;
return 404;
}
location ~ cookie_(.*)$ {
deny all;
return 404;
}
location ~ config_local_(.*)$ {
deny all;
return 404;
}
location ^~ /.git/ {
deny all;
return 404;
}
location ^~ /backend/ {
deny all;
return 404;
}
location ^~ /documentacao/ {
deny all;
return 404;
}
location ^~ /migrations/ {
deny all;
return 404;
}
location ^~ /extras/nfe/ {
deny all;
return 404;
}
location ^~ /extras/nfephp/ {
deny all;
return 404;
}
error_page 404 /404.html;
location = /40x.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
Criar o arquivo /etc/nginx/default.d/php.conf com os comandos abaixo:
echo "" > /etc/nginx/default.d/php.conf && \
nano /etc/nginx/default.d/php.conf
Insira o conteúdo conforme abaixo:
location ~ \.php$ {
fastcgi_pass unix:/var/lib/php/php-fpm-illi.sock;
include fastcgi_params.conf;
}
Criar o arquivo /etc/nginx/default.d/php-sincronismo.conf com os comandos abaixo:
nano /etc/nginx/default.d/php-sincronismo.conf
Insira o conteúdo conforme abaixo:
location ~ \.php$ {
fastcgi_pass unix:/var/lib/php/php-fpm-illi-sincronismo.sock;
include fastcgi_params.conf;
}
E finalizamos com a preparação das pastas de trabalho, com os seguintes comandos:
mkdir -p /var/lib/php/sessions && \
mkdir -p /var/lib/php/operacional && \
mkdir -p /var/lib/php/sincronismo && \
mkdir -p /var/lib/php/relatorios && \
chown root:apache /var/lib/php/session && \
chown root:apache /var/lib/php/sessions && \
chmod 777 /var/lib/php/session && \
chmod 777 /var/lib/php/sessions
Instalação do ILLI
Primeiro, vamos precisar clonar o repositório do ILLI, através das instruções:
cd /var/www && \
git clone https://git.pdv.moda/publico/standalone.git illi && \
chmod +x illi/*.sh && \
chown -Rf apache:apache .
Agora vamos criar a instância do ILLI dentro do NGINX, com o seguinte comando:
echo "" > /etc/nginx/conf.d/illi.conf && \
nano /etc/nginx/conf.d/illi.conf
Insira o conteúdo conforme abaixo:
upstream ws-illi {
ip_hash;
server 127.0.0.1:7088;
}
server {
listen 8088;
server_name _;
error_log /var/log/nginx/illi-error.log error;
location / {
root /usr/share/nginx/html/illi;
include /etc/nginx/default.d/default.conf;
}
location ~ \.php$ {
root /usr/share/nginx/html/illi;
include /etc/nginx/default.d/php.conf;
}
location /sincronismo {
include /etc/nginx/default.d/proxy.conf;
proxy_pass http://127.0.0.1:9088;
}
location /ws {
proxy_redirect off;
proxy_http_version 1.1;
proxy_connect_timeout 1800s;
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
send_timeout 1800s;
proxy_set_header Host $http_host;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://ws-illi;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
server {
listen 9088;
server_name _;
error_log /var/log/nginx/illi-error.log error;
location / {
root /usr/share/nginx/html/illi;
include /etc/nginx/default.d/default.conf;
}
location ~ \.php$ {
root /usr/share/nginx/html/illi;
include /etc/nginx/default.d/php-sincronismo.conf;
}
}
Em seguida, vamos criar a instância do ILLI dentro do PHP-FPM, com o seguinte comando:
echo "" > /etc/php-fpm.d/www.conf && \
nano /etc/php-fpm.d/illi.conf
Insira o conteúdo conforme abaixo:
[illi]
listen = /var/lib/php/php-fpm-illi.sock
listen.allowed_clients = 127.0.0.1
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = apache
group = apache
pm = ondemand
pm.max_children = 24
pm.max_requests = 200
pm.process_idle_timeout = 10s
security.limit_extensions = .php
php_admin_value[error_log] = /var/log/php-fpm/illi-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/sessions
env[PATH] = '/usr/local/bin:/usr/bin:/bin'
[illi-sincronismo]
listen = /var/lib/php/php-fpm-illi-sincronismo.sock
listen.allowed_clients = 127.0.0.1
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = apache
group = apache
pm = ondemand
pm.max_children = 5
pm.max_requests = 50
pm.process_idle_timeout = 10s
security.limit_extensions = .php
php_admin_value[error_log] = /var/log/php-fpm/illi-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/sessions
env[PATH] = '/usr/local/bin:/usr/bin:/bin'
E reiniciamos os serviços o ambiente através dos seguintes comandos, para levantarmos o ambiente:
systemctl stop nginx.service && \
systemctl stop php-fpm.service && \
systemctl start php-fpm.service && \
systemctl start nginx.service
Instalação do Agendador de Tarefas e Criação do Sync
Abra o editor do CRONTAB com o comando abaixo:
crontab -e
Insira a seguinte instrução abaixo na última linha:
* * * * * /usr/bin/sudo -u apache /usr/bin/php /var/www/illi/index.php cron executar;
Saia do editor com a sequência CTRL + X, e execute o comando abaixo:
systemctl restart crond.service
Com o agendador de tarefas criado, podemos seguir para a criação do Sync.
Primeiro pegamos o ip do servidor, jogamos no navegador e no final adicionamos a porta :8088. No navegador irá abrir a seguinte tela:
Preencha de acordo com as informações que possui:
Servidor (hostname): localhost
Usuário: root
Alias da senha: !@A7v400mx
Banco de dados: illi
Base de instalação: /usr
Por fim clique em Configurar e a tela irá mudar para essa solicitando a Licença criada pro cliente, coloque e Registre.