Instalação do Servidor Standalone com Alma Linux 8 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.