Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Informações
titleAtençãoNota:

Esta página foi revisada para considerar as configurações de server do TOTVS Fluig Plataforma para a atualização 1.6.3 ou superiores.


Índice
outlinetrue
exclude.*ndice
stylenone


Pré-requisitos

...

Para atualizar os parâmetros de configuração, deve-se obedecer aos seguintes pré-requisitos:

  • O usuário deve ser administrador da plataforma;
  • O usuário deve ter acesso aos arquivos de configuração da plataforma;
  • Possuir o NGINX na versão 1.20.1 ou superior instalado. Detalhes de instalação e configuração do NGINX estão disponíveis na documentação oficial;
  • Possuir a configuração de proxy reverso;
  • Possuir o nginx-sticky-module-ng (módulo externo), para implementar o comportamento de sticky sessions sem o uso do Nginx NGINX Plus, esse . Esse procedimento só é necessário realizar na versão open-source do NginxNGINX.
Aviso
titleImportanteAtenção!

Antes de prosseguir com as instruções descritas nessa página, siga com atenção as instruções contidas na documentação Alta disponibilidade e Balanceamento de carga.


Considerações iniciais

...

A configuração de balanceamento de carga (load balance) é a forma mais simples de se obter distribuição de carga e algum nível de alta disponibilidade.

Nota
titleImportante!

Em ambientes com load balance, é muito importante manter todos os servidores com o horário sincronizado.

A grande desvantagem é a necessidade de afinidade de sessão, ou seja, uma vez que o usuário foi autenticado em uma instância, sempre será direcionado para a mesma instância. Nesse caso, se essa instância ficar indisponível, o usuário terá que logar se autenticar novamente na aplicação.


Instalando a primeira instância

...

Siga os procedimentos abaixo para realizar a instalação da primeira instância do Fluig em um ambiente load balance.

Deck of Cards
historyfalse
idFirstNode
Card
defaulttrue
id1
labelPasso 1



Card
id2
labelPasso 2


  • Abra em um editor de texto o arquivo arquivo [diretório_instalação]/appserver/domain/configuration/domain.xml e em um editor de texto e altere as seguintes configurações:Localize
    • localize a propriedade de binding "java:global/wcm/globalDataDir" e altere-a informando o caminho da pasta compartilhada entre as instâncias;

      Bloco de código
      languagehtml/xml
      <simple name="java:global/wcm/globalDataDir" value="GLOBAL_DATA_DIR/wcmdir"/>
  • Localize
    • localize o subsystem "urn:com.totvs.technology.wcm:1.0" e altere-o informando o caminho da pasta compartilhada entre as instâncias

  • ;
    • .

      Bloco de código
      languagehtml/xml
      <subsystem xmlns="urn:com.totvs.technology.wcm:1.0" dir="GLOBAL_DATA_DIR/apps" refresh="15"/>


Card
id3
labelPasso 3

  • Mova o conteúdo da pasta [diretório_instalação]/repository/wcmdir para a pasta GLOBAL_DATA_DIR/wcmdir.
  • Mova o conteúdo da pasta [diretório_instalação]/appserver/apps para a pasta GLOBAL_DATA_DIR/apps.


Card
id4
labelPasso 4


  • Configure o servidor de indexação (fluig Fluig Indexer) para ser executado em servidor separado, conforme instruções aquiinstruções descritas em Servidor de indexação único.


Card
id5
labelPasso 5

  • Inicie os serviços fluig_Indexer, fluig_RealTime e e em seguida, inicie o fluig Fluig.
  • Acesse a plataforma com o usuário "wcmadmin", crie uma nova empresa (tenant) e realize as configurações necessárias.
  • Pare o fluig Fluig e os serviços do fluig_RealTime fluig_Indexer.


Criando uma segunda instância na mesma instalação

...

O Fluig permite executar uma segunda instância na mesma instalação, ou seja, sem a necessidade de instalar tudo novamente.

Deck of Cards
historyfalse
idSecondInstance
Card
defaulttrue
id1
labelPasso 1


  • Abra em um editor de texto o arquivo arquivo [diretório_instalação]/appserver/domain/configuration/host.xml em um editor de texto.
  • Localize a tag <servers>. Dentro dela haverão existem tags chamadas <server>.
  • Adicione uma nova tag <server>, conforme o exemplo:
Bloco de código
languagexml
themeEclipse
titlehost.xml
<server auto-start="false" group="fluig" name="fluig2">
    <socket-bindings port-offset="150" socket-binding-group="full-sockets"/>
    <jvm name="default">
        <heap max-size="12g" size="4g"/>
        <jvm-options>
            <option value="-Dfile.encoding=utf8"/>
            <option value="-Djsse.enableSNIExtension=false"/>
            <option value="-XX:MaxMetaspaceSize=1024m"/>
            <option value="-Djavamelody.disabled=true"/>
        </jvm-options>
    </jvm>
</server>
Card
id2
labelPasso 2


  • Certifique-se de que o atributo name contenha um valor que jamais será repetido em outra instância.
  • A primeira instância sempre deverá se chamar "fluig1", enquanto as demais instâncias podem ter qualquer nome definido.


Card
id3
labelPasso 3

  • O atributo auto-start indica se a instância deve (true) ou não (false) ser iniciada imediatamente quando o Fluig for iniciado. Se informado false, será preciso iniciá-la manualmente posteriormente, usando a ferramenta jboss-cli.
    A recomendação é que a primeira instância seja iniciada sozinha e posteriomente posteriormente sejam iniciadas as demais instâncias.


Card
id4
labelPasso 4

  • Caso Se desejar ou for necessário, altere o atributo port-offset da tag socket-bindings. Cada nova instância precisa de um valor diferente (múltiplos de 150 são uma boa indicação).


Card
id5
labelPasso 5

  • Ajuste as configurações de memória na tag heap.


...

As instâncias que forem configuradas para não iniciar automaticamente (auto-start="false"), devem ser iniciadas manualmente utilizando a ferramenta jboss-cli, que se encontra em [diretório_instalação]/appserver/bin, com o seguinte comandocomando abaixo, de acordo com o sistema operacional:No

  • no Linux:

    Bloco de código
    languagebash
    titleLinux
    ./jboss-cli.sh --controller="<ip-da-maquina>:9990" --connect --command="/host=master/server-config=fluig2:start"

...

  • no Windows:

    Bloco de código
    languagebash
    titleWindows
    jboss-cli.bat --controller="<ip-da-maquina>:9990" --connect --command="/host=master/server-config=fluig2:start"

Onde <ipOnde <ip-da-maquina> é o endereço IP/hostname configurado no arquivo host.xml (localizado em [diretório_instalação]/appserver/domain/configuration), na seção:

Bloco de código
<interface name="management">
    <inet-address value="192.168.2.3"/>
</interface>


Criando uma instância em outra máquina

...

Deck of Cards
historyfalse
idThirdInstance
Card
id1
labelPasso 1


  • Instale a aplicação pelo procedimento normal e siga as instruções até o procedimento antes de iniciar o servidor.


Card
id2
labelPasso 2

  • Abra em um editor de texto o arquivo arquivo [diretório_instalação]/appserver/domain/configuration/host.xml em um editor de texto.
  • Localize a tag <servers>. Dentro dela haverão existem tags chamadas <server>.
  • Altere o atributo name dessas tags. O valor desse atributo precisa ser diferente em cada instância.


Card
id3
labelPasso 3


  • Abra em um editor de texto o arquivo arquivo [diretório_instalação]/appserver/domain/configuration/domain.xml e em um editor de texto e altere as seguintes configurações:Localize
    • localize a propriedade de binding "java:global/wcm/globalDataDir" e altere-a informando o caminho da pasta compartilhada entre as instâncias;

      Bloco de código
      languagehtml/xml
      <simple name="java:global/wcm/globalDataDir" value="GLOBAL_DATA_DIR/wcmdir"/>
    Localize
    • localize o subsystem "urn:com.totvs.technology.wcm:1.0" e altere-o informando o caminho da pasta compartilhada entre as instâncias

  • ;
    • .

      Bloco de código
      languagehtml/xml
      <subsystem xmlns="urn:com.totvs.technology.wcm:1.0" dir="GLOBAL_DATA_DIR/apps" refresh="15"/>

Configurando o balanceador

...

O Fluig homologa o Nginx NGINX com o upstream para fazer o balanceamento de carga.

Deck of Cards
historyfalse
idModProxy
Card
defaulttrue
id1
labelPasso 1


  • Instale o servidor Nginx NGINX, versão 1.20.1 ou superior.


Card
id2
labelPasso 2



  • Cada “BalancerMember” indica um servidor e deve apontar para o IP e porta corretos.
Um cookie chamado “FLUIGCOOKIE” é criado para manter a afinidade da sessão. Sem o cookie, o procedimento não irá funcionar.
Card
id3
labelPasso 3


  • Habilite o balanceamento com o parâmetro upstream (geralmente é feito criando o arquivo

    /etc/nginx/nginx.conf ou /etc/nginx/conf.d)

    /etc/nginx/nginx.conf ou /etc/nginx/conf.d).

    Aviso
    titleAtenção!

    Cada “BalancerMember” indica um servidor e deve apontar para o IP e a porta corretos.
    Um cookie chamado “FLUIGCOOKIE” é criado para manter a afinidade da sessão. Sem o cookie, o procedimento não irá funcionar.

    Bloco de código
    languagexml
    titlenginx.conf
    upstream mycluster {
        server {Ip do servidor 1}:{PORTA};
        server {Ip do servidor 2}:{PORTA};
        server {Ip do servidor 3}:{PORTA};
        sticky name=FLUIGCOOKIE expires=1h path=/ domain=.exemplo.com;
    }
    
    server {
        listen 80;
        server_name fluig.exemplo.com;
        
        server_tokens off;
    
        add_header 'Access-Control-Allow-Origin' 'http://mycluster';
        add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS, DELETE';
        add_header 'Access-Control-Request-Method' 'GET, PUT, POST, OPTIONS, DELETE';
        add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With, accept-version';
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    
        location / {
            proxy_pass http://mycluster;
            add_header Set-Cookie "FLUIGCOOKIE=$request_id.$upstream_addr; Path=/";
    
            proxy_pass_request_headers on;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-Host $host:$server_port;
            proxy_set_header X-Real-IP $remote_addr;
    
            client_max_body_size       880m;
            client_body_buffer_size    256k;
    
            proxy_connect_timeout      800;
            proxy_send_timeout         800;
            proxy_read_timeout         800;
    
            proxy_buffer_size          8k;
            proxy_buffers              8 32k;
            proxy_busy_buffers_size    64k;
            
proxy_temp_file_write_size 64k; } }
Aviso
titleAtenção
proxy_temp_file_write_size 64k;
    }

}


Card
id4
labelPasso 4
titleLoad Balance RealTime
Avisonote
titleImportante!

O procedimento abaixo deve ser realizado para utilizar o serviço de Realtime em Load balance.


Passos para usar o Load Balance do Realtime

  • Realizadas

    Feitas as configurações acima,

    adicionar

    adicione o código abaixo

    ao

    no arquivo de configuração do servidor (Passo 3).

    Bloco de código
    languagexml
    themeEclipse
    titlenginx.conf
    upstream nodeCluster1 {
        sticky name=SERVERID expires=1h path=/ domain=exemplo.com  httponly;
    
        server {ip_servidor_realtime1}:8888;
        server {ip_servidor_realtime2}:8888;
    }
    
    server {
        listen 8888;
    
        add_header Set-Cookie "SERVERID=sticky.$upstream_cookie_SERVERID; Path=/";
    
        location / {
            proxy_pass http://nodeCluster1;
            proxy_cookie_path / "/; HTTPOnly; Secure";
        }
    }
    
    upstream nodes_polling {
        sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;
    
        server {ip_servidor_realtime1}:7777;
        server {ip_servidor_realtime2}:7777;
    }
    
    upstream nodes_ws {
        sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;
    
        server {ip_servidor_realtime1}:7777;
        server {ip_servidor_realtime2}:7777;
    }
    
    server {
        listen 7777;
    
        add_header Set-Cookie "SERVERID=sticky.$upstream_cookie_SERVERID; Path=/";
    
        location / {
            set $upstream "nodes_polling"; 
            
            if ($http_upgrade = "websocket") {
                set $upstream "nodes_ws"; 
            }
            proxy_pass http://$upstream;
    
        }
    }


Card
id5
labelPasso 5
titleLoad Balance Bloco completo


  • Após efetuar os passos anteriores, o arquivo "/etc/nginx/conf.d" estará desta forma:

    Bloco de código
    languagexml
    themeEclipse
    titlenginx.conf
collapsetrue
upstream mycluster {
    server {Ip do servidor 1}:{PORTA};
    server {Ip do servidor 2}:{PORTA};
    server {Ip do servidor 3}:{PORTA};
    sticky name=FLUIGCOOKIE expires=1h path=/ domain=.exemplo.com;
}

server {
    listen 80;
    server_name fluig.exemplo.com;
    
    server_tokens off;

    add_header 'Access-Control-Allow-Origin' 'http://mycluster';
    add_header 'Access-Control-Allow-Methods' 'GET, PUT, POST, OPTIONS, DELETE';
    add_header 'Access-Control-Request-Method' 'GET, PUT, POST, OPTIONS, DELETE';
    add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With, accept-version';
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    location / {
        proxy_pass http://mycluster;
        add_header Set-Cookie "FLUIGCOOKIE=$request_id.$upstream_addr; Path=/";

        proxy_pass_request_headers on;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;

        client_max_body_size       880m;
        client_body_buffer_size    256k;

        proxy_connect_timeout      800;
        proxy_send_timeout         800;
        proxy_read_timeout         800;

        proxy_buffer_size          8k;
        proxy_buffers              8 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

}

upstream nodeCluster1 {
    sticky name=SERVERID expires=1h path=/ domain=exemplo.com  httponly;

    server {ip_servidor_realtime1}:8888;
    server {ip_servidor_realtime2}:8888;
}

server {
    listen 8888;

    add_header Set-Cookie "SERVERID=sticky.$upstream_cookie_SERVERID; Path=/";

    location / {
        proxy_pass http://nodeCluster1;
        proxy_cookie_path / "/; HTTPOnly; Secure";
    }
}

upstream nodes_polling {
    sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;

    server {ip_servidor_realtime1}:7777;
    server {ip_servidor_realtime2}:7777;
}

upstream nodes_ws {
    sticky name=SERVERID expires=1h path=/ domain=exemplo.com httponly;

    server {ip_servidor_realtime1}:7777;
    server {ip_servidor_realtime2}:7777;
}

server {
    listen 7777;

    add_header Set-Cookie "SERVERID=sticky.$upstream_cookie_SERVERID; Path=/";

    location / {
        set $upstream "nodes_polling"; 
        
        if ($http_upgrade = "websocket") {
            set $upstream "nodes_ws"; 
        }
        proxy_pass http://$upstream;

    }
}


Ambiente

...

HTTPS

...

Quando o Fluig estiver configurado em httpsHTTPS, é necessário que as flags de segurança "Secure" e "HttpOnly" dos cookies estejam habilitadas na sessão. Para isso, siga a instrução abaixo:

...