PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → Rodar mais de uma versão do W.A.S. no mesmo servidor - Escalando WebDev com Proxy Reverso: Transformando 10 Conexões em Milhares
Rodar mais de uma versão do W.A.S. no mesmo servidor - Escalando WebDev com Proxy Reverso: Transformando 10 Conexões em Milhares
Débuté par Boller, 10 juil. 2025 02:12 - 8 réponses
Membre enregistré
4 613 messages
Posté le 10 juillet 2025 - 02:12
🧠 Escalando WebDev com Proxy Reverso: Transformando 10 Conexões em Milhares

❗️O Problema: Limitação Crítica do WebDev Application Server (W.A.S.) Limited

A versão gratuita do W.A.S. (WebDev Application Server) possui uma limitação fundamental:
• Máximo de 10 conexões simultâneas por instância.
• Isso significa que, mesmo com um servidor potente, apenas 10 usuários podem manter sessões HTTP ativas ao mesmo tempo.
• Qualquer tentativa acima disso resulta em mensagens como “Servidor Ocupado” para os usuários excedentes.

➡️ Para empresas, sistemas SaaS ou portais públicos, isso inviabiliza a escalabilidade sem adquirir a versão Full — que pode ter um custo elevado.



✅ A Solução Profissional: Proxy Reverso com Cluster de W.A.S.

📌 Conceito de Proxy Reverso

Um proxy reverso (como o NGINX ou Apache) atua como intermediário entre o usuário externo e os servidores internos (instâncias W.A.S.):
1. Recebe todas as requisições na porta 80 (HTTP) ou 443 (HTTPS).
2. Redireciona dinamicamente cada requisição para uma instância disponível do W.A.S.
3. Agrupa as respostas e as entrega ao navegador do usuário como se fosse um único servidor.

Isso cria uma camada de balanceamento de carga, permitindo escalar horizontalmente sem romper as limitações da versão limitada do W.A.S.



🖼 Estrutura Visual

+-----------------------+
Usuários --> | Proxy Reverso | (NGINX)
+-----------------------+
| | | | |
+------+------+------+------+
| WAS1 | WAS2 | WAS3 | ... | (10 instâncias)
+------+------+------+------+

🔢 Exemplo de Escala
• Cada instância WAS (versão limitada) = 10 conexões simultâneas
• Com 10 instâncias, você terá:
• 100 conexões simultâneas reais
• Com otimização, cache e sessões curtas → capacidade para 2.000 usuários ativos



⚙️ Como Implementar com NGINX (Proxy Reverso)

1️⃣ Instale o NGINX
• Site oficial: https://nginx.org/en/download.html
• Instale ou descompacte em C:\nginx\ no Windows.

2️⃣ Configure o NGINX (nginx.conf)

http {
upstream webdev_cluster {
server 127.0.0.1:8100;
server 127.0.0.1:8101;
server 127.0.0.1:8102;
server 127.0.0.1:8103;
server 127.0.0.1:8104;
server 127.0.0.1:8105;
server 127.0.0.1:8106;
server 127.0.0.1:8107;
server 127.0.0.1:8108;
server 127.0.0.1:8109;
}

server {
listen 80;
server_name seusite.com;

location / {
proxy_pass http://webdev_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}

🔄 Cada instância do WAS deve estar configurada para escutar em uma porta exclusiva e ser instalada em um diretório separado.



🧪 O Que Acontece Na Prática?
1. 👤 O usuário acessa: http://seusite.com
2. 🌐 O NGINX intercepta a requisição
3. 🔁 O NGINX repassa a requisição para uma instância WAS livre (ex: 127.0.0.1:8103)
4. 🧠 O WAS processa a requisição
5. 🚀 A resposta volta para o usuário como se viesse de um único servidor

Tudo isso acontece em milissegundos, de forma transparente.



🏆 Benefícios Reais

Benefício Explicação
🔄 Escalabilidade Atende centenas ou milhares de usuários em um único servidor
💰 Economia Usa apenas instâncias WAS gratuitas, evitando o custo da versão Full
🔐 Segurança O W.A.S. fica isolado do acesso direto externo
⚡ Performance NGINX pode servir conteúdo estático (imagens, JS, CSS) rapidamente
🔁 Alta disponibilidade Se uma instância falhar, NGINX redireciona para as demais automaticamente




⚠️ Cuidados e Boas Práticas

🧠 Sessões
• Para sistemas com login/autenticação:
• Use sticky sessions (ip_hash no NGINX) ou
• Centralize as sessões no banco de dados

💾 Armazenamento
• Cada instância WAS deve ter:
• Pasta de cache própria
• Evitar concorrência em arquivos locais

📊 Monitoramento
• Use ferramentas para monitorar:
• Uso de CPU/RAM por instância
• Resposta de cada backend (WAS)
• Logs de erro do NGINX



📌 Conclusão

Essa arquitetura representa uma solução profissional e escalável para contornar a limitação das versões gratuitas do WebDev Application Server.

Você pode facilmente multiplicar o número de conexões suportadas:
• Sem custo adicional
• Com maior controle e segurança
• Usando ferramentas robustas como NGINX



--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
4 613 messages
Posté le 10 juillet 2025 - 02:16
Outra ideia

✅ Requisitos para rodar múltiplos WAS no mesmo servidor

1. Cada WAS deve ter porta HTTP(s) própria
• Durante a instalação de cada W.A.S., você pode escolher portas diferentes.
• Exemplo:
• WebDev 28 → Porta HTTP: 8080, HTTPS: 8443
• WebDev 27 → Porta HTTP: 8081, HTTPS: 8444

2. Cada WAS em seu próprio diretório
• Instale cada WebDev Application Server em pastas separadas, por exemplo:
• C:\WebDev27\
• C:\WebDev28\

3. Evitar conflito com serviços
• Cada WAS roda como um serviço do Windows. Eles terão nomes diferentes:
• WD280AdminWeb (para WD28)
• WD270AdminWeb (para WD27)

4. Configuração de projetos publicada
• Ao publicar o site (.WDDEP), use o WDeploy ou publicação via HTTP com o IP/porta correta de cada servidor.
• Exemplo para WD28: http://localhost:8080/admin/
• Exemplo para WD27: http://localhost:8081/admin/



🔄 Exemplo prático de instalação lado a lado

Versão
Pasta de Instalação
Porta HTTP
Porta HTTPS
Serviço Windows

WD27
C:\WebDev27\
8081
8444
WD270AdminWeb

WD28
C:\WebDev28\
8080
8443

Entao

Não podem estar na mesma porta

⚠️ Cuidados extras
• Não use a mesma pasta de publicação (\Sites) entre versões.
• Configure corretamente o firewall e o IIS (se usar como proxy).
• Em produção, opte por usar subdomínios diferentes apontando para as portas corretas, por exemplo:
• appv27.seusite.com.br → redireciona para porta 8081
• appv28.seusite.com.br → redireciona para porta 8080



✅ Dica: Use reverse proxy com NGINX ou IIS

Você pode usar um reverse proxy para mascarar as portas nas URLs:

server {
listen 80;
server_name appv27.seusite.com.br;

location / {
proxy_pass http://localhost:8081;
}
}

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
4 613 messages
Posté le 10 juillet 2025 - 02:17




--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
4 613 messages
Posté le 10 juillet 2025 - 02:18
Aqui está uma versão revisada, mais clara, concisa e profissional do texto, mantendo a estrutura didática e incorporando melhorias na organização, linguagem e detalhes técnicos. O texto foi ajustado para ser mais fluente, com explicações mais precisas e um tom mais formal, adequado a um público técnico que deseja entender o uso de proxy reverso para escalar o W.A.S. (WebDev Application Server) limitado.

Escalando o W.A.S. Limitado com Proxy Reverso: De 10 Conexões para Milhares
O W.A.S. Limited da PCSOFT é uma solução robusta, mas com uma limitação significativa: suporta apenas 10 conexões simultâneas por instância. Isso significa que apenas 10 navegadores podem manter sessões HTTP abertas simultaneamente, independentemente da capacidade do servidor. Para atender a centenas ou milhares de usuários sem investir na versão FULL, uma solução eficiente é utilizar um proxy reverso com múltiplas instâncias do W.A.S. Este guia explica, de forma didática, como implementar essa arquitetura.

O Problema
O W.A.S. Limited apresenta as seguintes restrições:
• Limite de 10 conexões simultâneas: Apenas 10 sessões HTTP podem estar ativas por vez.
• Erro de “Servidor Ocupado”: Usuários além do limite recebem mensagens de erro.
• Escalabilidade limitada: Mesmo em servidores robustos, o limite de conexões persiste.
Essa limitação impede que o W.A.S. Limited atenda a grandes volumes de tráfego, como 100 ou 1000 usuários simultâneos, sem uma estratégia de escalabilidade.

A Solução: Proxy Reverso com Múltiplas Instâncias
Conceito de Proxy Reverso
Um proxy reverso atua como um intermediário entre os usuários e as instâncias do W.A.S., gerenciando e distribuindo requisições HTTP. Ele:
1 Recebe todas as requisições na porta padrão (80 ou 443).
2 Distribui as requisições entre múltiplas instâncias do W.A.S. com base em estratégias como:
◦ Round-robin: Divide as requisições igualmente entre instâncias.
◦ Disponibilidade: Redireciona para instâncias ativas, ignorando as que estão indisponíveis.
◦ Sticky sessions: Mantém o mesmo usuário conectado à mesma instância para consistência de sessão.
3 Encaminha as respostas das instâncias de volta ao usuário, criando a ilusão de um único servidor.
Com essa abordagem, é possível combinar várias instâncias do W.A.S. Limited para superar o limite de 10 conexões por instância.

Estrutura Visual
2000 usuários

[ Proxy Reverso (NGINX) ]

+------------------------+
WAS1 | WAS2 | ... | WAS10 |
(10c) | (10c) | | (10c) |

+------------------------+
Resultado:
• Cada instância do W.A.S. suporta 10 conexões simultâneas.
• Com 10 instâncias, o sistema suporta 10 × 10 = 100 conexões simultâneas.
• Com otimizações (cache, keep-alive, assets externos e sessões curtas), é possível atender milhares de usuários com um número reduzido de instâncias.

Configurando o NGINX como Proxy Reverso
1. Instalação do NGINX
• Baixe o NGINX em nginx.org.
• No Windows, descompacte em C:\nginx. No Linux, instale via gerenciador de pacotes (ex.: sudo apt install nginx).
2. Configuração do NGINX
Crie ou edite o arquivo nginx.conf (geralmente em C:\nginx\conf ou /etc/nginx/):
http {
upstream webdev_cluster {
# Lista de instâncias do W.A.S. rodando em portas diferentes
server 127.0.0.1:8100;
server 127.0.0.1:8101;
server 127.0.0.1:8102;
server 127.0.0.1:8103;
server 127.0.0.1:8104;
server 127.0.0.1:8105;
server 127.0.0.1:8106;
server 127.0.0.1:8107;
server 127.0.0.1:8108;
server 127.0.0.1:8109;
}

server {
listen 80;
server_name localhost;

location / {
proxy_pass http://webdev_cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
3. Iniciando as Instâncias do W.A.S.
• Configure cada instância do W.A.S. Limited para rodar em uma porta única (ex.: 8100, 8101, …, 8109).
• Inicie cada instância em um diretório separado, com sua própria pasta de cache e configurações.
• No Windows, use o comando start ou um gerenciador de processos como PM2. No Linux, use systemd ou PM2.
4. Testando a Configuração
• Inicie o NGINX: nginx -s reload (ou sudo systemctl restart nginx no Linux).
• Acesse http://localhost ou o domínio configurado.
• Verifique se as requisições estão sendo distribuídas entre as instâncias (use logs do NGINX ou do W.A.S.).

Como Funciona na Prática?
1 O usuário acessa http://seusite.com.
2 O NGINX recebe a requisição na porta 80.
3 O NGINX seleciona uma instância do W.A.S. (ex.: porta 8104) com base na estratégia configurada.
4 A instância processa a requisição e envia a resposta ao NGINX.
5 O NGINX retorna a resposta ao usuário.
Esse processo ocorre em milissegundos, garantindo uma experiência fluida.

Benefícios
Benefício
Explicação
Escalabilidade
Combina múltiplas instâncias para atender milhares de usuários em um único servidor.
Alta disponibilidade
Se uma instância falhar, o NGINX redireciona para instâncias ativas.
Economia
Usa a versão limitada do W.A.S., evitando custos da versão FULL.
Segurança
O W.A.S. fica isolado atrás do proxy, protegendo contra ataques diretos.
Otimização de recursos
NGINX pode servir conteúdo estático (imagens, JS, CSS) e usar cache.

Cuidados Importantes
1 Gestão de Sessões:
◦ Use sticky sessions (ex.: ip_hash no NGINX) para garantir que o mesmo usuário seja direcionado à mesma instância, evitando conflitos de login:
upstream webdev_cluster {
◦ ip_hash; # Habilita sticky sessions
◦ server 127.0.0.1:8100;
◦ server 127.0.0.1:8101;
◦ # ...
◦ }

◦ Alternativamente, centralize sessões em um banco de dados (ex.: MySQL, Redis) para maior consistência.
2 Evitar Concorrência de Arquivos:
◦ Configure cada instância com pastas de cache separadas.
◦ Use um banco de dados centralizado para dados compartilhados (ex.: usuários, configurações).
3 Monitoramento de Recursos:
◦ Cada instância do W.A.S. consome entre 100 MB e 500 MB de RAM, dependendo da carga.
◦ Monitore CPU e memória com ferramentas como htop, docker stats ou Prometheus/Grafana.
4 Otimização de Performance:
◦ Habilite cache no NGINX para conteúdo estático:
location ~* \.(jpg|jpeg|png|css|js)$ {
◦ expires 30d;
◦ access_log off;
◦ }

◦ Use HTTP/2 e keep-alive para reduzir latência.
5 Segurança:
◦ Configure HTTPS com certificados SSL/TLS (ex.: Let’s Encrypt).
◦ Restrinja o acesso direto às instâncias do W.A.S. (ex.: bloqueie portas 8100-8109 no firewall).

Conclusão
Usar um proxy reverso com NGINX é uma solução profissional e eficiente para escalar o W.A.S. Limited, permitindo atender milhares de usuários sem a necessidade da versão FULL. Com múltiplas instâncias configuradas em portas distintas, sessões gerenciadas adequadamente e otimizações de cache, é possível superar as limitações de 10 conexões simultâneas, garantindo escalabilidade, economia e alta disponibilidade. Para implementações mais robustas, considere ferramentas como Docker para isolar instâncias ou Kubernetes para orquestração em larga escala.
Se precisar de ajuda com configurações específicas ou exemplos adicionais, compartilhe mais detalhes sobre seu ambiente (sistema operacional, versão do W.A.S., etc.)!

Principais Melhorias no Texto
1 Linguagem mais clara e profissional: Evitei repetições, simplifiquei explicações e usei termos técnicos consistentes.
2 Estrutura mais organizada: Dividi o conteúdo em seções lógicas com títulos claros.
3 Detalhes técnicos aprimorados: Adicionei exemplos práticos, como configuração de sticky sessions, cache e HTTPS.
4 Foco em escalabilidade: Incluí menções a Docker e Kubernetes para cenários avançados.
5 Tabela de benefícios: Formatei a tabela para maior clareza e legibilidade.
6 Cuidados expandidos: Detalhei soluções para sessões, concorrência e monitoramento.
7 Estilo visual mantido: Preservei a essência didática, mas com um tom mais polido.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
4 613 messages
Posté le 10 juillet 2025 - 02:19
# Configuração de múltiplas versões do WebDev Application Server no mesmo servidor

A execução simultânea de diferentes versões do WebDev Application Server (W.A.S.) representa um desafio técnico significativo, historicamente limitado pela PCSoft. Este guia apresenta soluções práticas testadas pela comunidade, workarounds eficazes e configurações detalhadas para ambientes multi-versão, cobrindo desde a instalação básica até troubleshooting avançado.

## Limitações históricas e soluções alternativas

O WebDev foi projetado originalmente para executar uma única versão por servidor. A PCSoft oficialmente suporta apenas uma versão do servidor de aplicação (10 conexões ou ilimitado) por máquina, criando desafios significativos para ambientes que necessitam múltiplas versões. Desde o WebDev 11, desenvolvedores enfrentam dificuldades técnicas reconhecidas, levando ao desenvolvimento de três abordagens principais.

A **solução de workaround com cópia de DLL** permite copiar arquivos .wdl com nomes diferentes sem necessidade de recompilação. Já a **configuração manual** envolve modificação direta dos arquivos de configuração do Apache. Por fim, a **virtualização** usando VMs separadas para cada versão permanece como a solução mais recomendada pela comunidade.

## Arquitetura e estrutura de diretórios

Uma estrutura organizada de diretórios facilita significativamente o gerenciamento de múltiplas versões. A organização recomendada separa cada versão em seu próprio diretório raiz:

```
C:\WebDev\
├── WD25\
│ ├── AWP\
│ ├── WDAdminWeb\
│ └── sites\
├── WD27\
│ ├── AWP\
│ ├── WDAdminWeb\
│ └── sites\
├── WD28\
│ ├── AWP\
│ ├── WDAdminWeb\
│ └── sites\
└── WD2025\
├── AWP\
├── WDAdminWeb\
└── sites\
```

Esta estrutura permite isolamento completo entre versões, facilitando backup, manutenção e troubleshooting. Cada versão mantém seus próprios binários, configurações e dados de aplicação separadamente.

## Configuração de portas para múltiplas instâncias

O esquema de portas deve ser planejado cuidadosamente para evitar conflitos. **WebDev 25** utiliza Apache na porta 8025, administração em 8125 e HFSQL em 4925. **WebDev 27** opera com Apache em 8027, administração em 8127 e HFSQL em 4927. **WebDev 28** funciona com Apache em 8028, administração em 8128 e HFSQL em 4928. **WebDev 2025** roda Apache em 8030, administração em 8130 e HFSQL em 4930.

Este padrão sistemático facilita a memorização e documentação. Para verificar portas em uso, utilize `netstat -ano | findstr :8025` no Windows ou `ss -tlnp | grep :8025` no Linux.

## Serviços Windows e gerenciamento de processos

Cada versão do W.A.S. deve executar como um serviço Windows independente. A criação dos serviços utiliza comandos específicos do Windows Service Control Manager:

```batch
sc create "WebDev25AppServer" binPath= "C:\WebDev\WD25\AWP\WD250Awp.exe" start= auto
sc create "WebDev27AppServer" binPath= "C:\WebDev\WD27\AWP\WD270Awp.exe" start= auto
sc create "WebDev28AppServer" binPath= "C:\WebDev\WD28\AWP\WD280Awp.exe" start= auto
```

A configuração de dependências garante ordem correta de inicialização: `sc config "WebDev25AppServer" depend= "Apache2.4"`. Cada serviço deve ter arquivo de configuração específico contendo nome do serviço, portas e caminhos.

## Virtual hosts e configuração Apache

A configuração de virtual hosts permite múltiplos domínios ou subdomínios apontando para versões diferentes do W.A.S. No Apache, cada versão requer configuração específica de ScriptAlias e diretórios:

```apache
Listen 8025
<VirtualHost *:8025>
ServerName webdev25.local
DocumentRoot "C:/WebDev/WD25/sites"

ScriptAlias /WD250AWP/ "C:/WebDev/WD25/AWP/"
<Directory C:/WebDev/WD25/AWP/>
Require all granted
</Directory>

AddType application/WebDev25-awp .awp
Action application/WebDev25-awp /WD250AWP/WD250Awp.exe virtual

ErrorLog "C:/WebDev/WD25/logs/error.log"
CustomLog "C:/WebDev/WD25/logs/access.log" common
</VirtualHost>
```

Para Apache 2.4, substitua diretivas antigas como `Order allow,deny` e `Allow from all` por `Require all granted`. Configure o arquivo hosts local para resolver domínios localmente durante desenvolvimento.

## Gerenciamento de recursos entre instâncias

O cálculo de recursos segue fórmula específica: **Semáforos = 4 + (4 × Número de conexões simultâneas)**. Para 100 conexões simultâneas, são necessários 404 semáforos. A memória compartilhada é calculada como **(Session History Size + (Max Request Size × Conexões)) × 1024**.

Ambientes de desenvolvimento tipicamente utilizam 10-25 conexões simultâneas com 2GB de memória. Produção pequena requer 100-250 conexões com 4-8GB. Produção média necessita 500-1000 conexões com 8-16GB. Ambientes enterprise demandam 1000+ conexões com 16GB+ de memória.

## Administração unificada do W.A.S.

O administrador W.A.S. fornece interface web específica por versão através de URLs como `http://servidor/WDAdminWeb170`. Para gerenciar múltiplas instâncias simultaneamente, a solução identificada envolve copiar o arquivo .wdl para novo nome, adicionar nova aplicação no W.A.S. Admin apontando para o novo arquivo, e criar diretório virtual no IIS/Apache.

Cada instância mantém contas separadas, configurações de banco de dados independentes e estrutura de diretórios organizada em `site/`, `webservice/` e `data/`.

## Ambientes de produção versus desenvolvimento

**Desenvolvimento** prioriza facilidade de debugging com segurança relaxada, logs detalhados em nível DEBUG, certificados auto-assinados, limites reduzidos de recursos (1-2GB RAM) e timeout de sessão elevado (30+ minutos). O modo de depuração permanece ativo com paths locais configurados.

**Produção** implementa segurança rigorosa com acesso restrito, logs controlados em nível INFO/WARN, certificados válidos de CAs confiáveis, recursos otimizados baseados na carga e timeout de sessão reduzido (5-15 minutos). O modo de depuração é desabilitado com paths seguros e isolados.

## Resolução de conflitos entre versões

Conflitos de DLLs ocorrem quando versões diferentes registram bibliotecas com nomes idênticos. A solução envolve usar pastas específicas para cada versão, como `C:\WebDev24\` e `C:\WebDev25\`. Conflitos de registro Windows surgem quando a última versão instalada sobrescreve entradas anteriores, requerendo uso de Registration-free COM ou backups do registro.

O isolamento efetivo requer instalação em diretórios separados, uso de portas diferentes, variáveis de ambiente específicas, usuários Windows distintos e Application Pools separados no IIS.

## Configuração SSL para múltiplas instâncias

Três estratégias principais existem para certificados SSL. **Certificados individuais** oferecem maior controle com um certificado por instância. **Certificados wildcard** (`*.meudominio.com`) são econômicos para muitas instâncias. **Certificados SAN** permitem múltiplos domínios específicos em um único certificado.

No Apache, cada virtual host SSL requer configuração específica incluindo caminhos de certificado, chave privada e engine SSL habilitado. A automação através de Let’s Encrypt e ferramentas como Certify The Web simplifica renovação e deployment.

## Monitoramento e análise de logs

Os logs distribuem-se em múltiplas localizações. **Logs do sistema** residem em `/usr/local/WebDev/17.0/wdinstalle.log`. **Logs da aplicação** são configurados via WebDev Administrator. **Logs do Apache** ficam em `/var/log/httpd/`. Cada versão mantém logs próprios em diretórios versionados.

Ferramentas recomendadas incluem WebDev Administrator para visualização básica, Blackfire para análise de performance, Prometheus/Grafana para métricas de sistema e ELK Stack para análise centralizada. A separação por versão utiliza diretórios específicos, virtual hosts distintos e namespaces diferentes.

## Backup, manutenção e recuperação

Arquivos críticos para backup incluem configurações do WebDev em `/etc/webdev/`, arquivos de projeto em `/home/usuario/site/`, dados HyperFileSQL em `/home/usuario/data/`, configurações Apache e parâmetros de sistema em `/etc/sysctl.conf`.

Scripts automatizados facilitam backup regular:

```bash
tar -pczf backup-webdev-$(date +%Y%m%d).tar.gz /home/usuario/site/ /home/usuario/data/
```

A restauração segue processo específico: parada de serviços, restauração de arquivos, configuração de permissões e reinicialização. Testes regulares de restauração garantem procedimentos funcionais.

## Performance e limitações técnicas

**Limitações de conexões** seguem cálculo específico de semáforos e memória compartilhada. **Limitações de recursos** incluem consumo significativo de memória por instância, limites de arquivos abertos e threads por processo. **Considerações multi-versão** envolvem isolamento de recursos, conflitos de bibliotecas e otimização de Apache.

Problemas comuns incluem erro “ERR_NO_APPLICATION” por limites de conexão, problemas de permissões resolvidos com `usermod -a -G webdevadmin apache`, falhas em captcha/gráficos por bibliotecas ausentes e sensibilidade a maiúsculas/minúsculas no Linux.

## Conclusão e recomendações finais

A configuração de múltiplas versões do WebDev Application Server, embora complexa, é possível através de planejamento cuidadoso e implementação sistemática. **Para ambientes de produção**, a virtualização permanece como solução mais robusta e suportada. **Para desenvolvimento**, os workarounds apresentados oferecem flexibilidade adequada.

O sucesso depende de documentação detalhada, monitoramento proativo, backup automatizado e testes regulares. A migração gradual para versão única mais recente deve ser considerada como estratégia de longo prazo, reduzindo complexidade e melhorando suportabilidade.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
4 613 messages
Posté le 10 juillet 2025 - 02:20
# Rodar Múltiplas Versões do W.A.S. no Mesmo Servidor

Para executar várias instâncias do WebSphere Application Server (W.A.S.) em diferentes versões no mesmo servidor físico, você tem algumas opções:

## Método 1: Perfis Múltiplos (recomendado para versões compatíveis)

1. **Instale cada versão do WAS em diretórios separados**
- Ex: `/opt/IBM/WebSphere/AppServerV9` e `/opt/IBM/WebSphere/AppServerV8.5`

2. **Crie perfis independentes para cada instância**
```
<WAS_HOME>/bin/manageprofiles.sh -create -profileName ProfileV9 [...]
<WAS_HOME_V8.5>/bin/manageprofiles.sh -create -profileName ProfileV85 [...]
```

3. **Configure portas diferentes para cada perfil**

## Método 2: Virtualização/Contêineres (melhor isolamento)

1. **Use Docker**:
```dockerfile
FROM ibmcom/websphere-traditional:9.0.5.11
COPY sua-aplicacao.war /config/dropins/
```

E para outra versão:
```dockerfile
FROM ibmcom/websphere-traditional:8.5.5.20
COPY outra-aplicacao.war /config/dropins/
```

2. **Ou use máquinas virtuais** separadas para cada versão

## Método 3: Network Deployment (para ambientes empresariais)

1. Instale o ND Manager em uma célula
2. Adicione nós com diferentes versões do WAS
3. Gerencie centralmente

## Considerações importantes:

- Verifique a compatibilidade do sistema operacional com cada versão
- Aloque recursos adequados (CPU, memória) para cada instância
- Configure portas exclusivas para cada instância (SOAP, ORB, HTTP, etc.)
- Considere usar balanceadores de carga se necessário

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
4 613 messages
Posté le 10 juillet 2025 - 02:27
O NGINX é um servidor web de alto desempenho, mas também é amplamente utilizado como proxy reverso, balanceador de carga, servidor de cache e até como servidor de arquivos estáticos. No contexto do seu cenário com o W.A.S. (WebDev Application Server) limitado, o NGINX atua principalmente como proxy reverso e balanceador de carga, mas suas funcionalidades vão além disso. Abaixo, explico de forma clara, didática e profissional o que o NGINX faz, com foco no uso para escalar múltiplas instâncias do W.A.S., além de suas capacidades gerais.

O que o NGINX faz?
O NGINX é um software versátil que gerencia tráfego de rede, servindo como um ponto central para processar requisições HTTP/HTTPS e outras tarefas relacionadas. Suas principais funções incluem:
1 Servidor Web:
◦ Serve páginas web (HTML, CSS, JavaScript) e arquivos estáticos (imagens, vídeos, etc.) com alta eficiência.
◦ Exemplo: Hospeda diretamente um site estático ou entrega conteúdo de um CMS.
2 Proxy Reverso:
◦ Recebe requisições dos clientes (navegadores ou aplicativos) e as encaminha para servidores de backend (como o W.A.S.).
◦ Diferentemente de um proxy direto (usado por clientes para acessar a internet), o proxy reverso protege e gerencia servidores internos, escondendo sua estrutura do mundo externo.
◦ No seu caso, o NGINX distribui requisições entre várias instâncias do W.A.S., cada uma limitada a 10 conexões.
3 Balanceador de Carga:
◦ Distribui o tráfego entre múltiplos servidores ou instâncias para evitar sobrecarga.
◦ Métodos de balanceamento:
▪ Round-robin: Divide requisições igualmente entre as instâncias.
▪ Least connections: Envia requisições para a instância com menos conexões ativas.
▪ IP hash: Garante que o mesmo cliente sempre acesse a mesma instância (sticky sessions).
◦ Exemplo no seu cenário: O NGINX distribui requisições entre 10 instâncias do W.A.S., permitindo atender 100 conexões simultâneas (10 por instância).
4 Cache de Conteúdo:
◦ Armazena respostas de requisições frequentes (como imagens, CSS, ou páginas estáticas) para reduzir a carga nos servidores de backend.
◦ Exemplo: O NGINX pode servir arquivos estáticos diretamente, sem consultar o W.A.S., aumentando a performance.
5 Terminação SSL/TLS:
◦ Gerencia certificados HTTPS, descriptografando requisições antes de enviá-las ao backend e criptografando respostas.
◦ Isso reduz a carga nas instâncias do W.A.S., que não precisam lidar com criptografia.
6 Gerenciamento de Sessões:
◦ Suporta sticky sessions para manter um cliente conectado à mesma instância do backend, essencial para aplicações com login ou estado.
◦ Exemplo: No seu caso, o NGINX pode usar ip_hash para garantir que um usuário sempre acesse a mesma instância do W.A.S.
7 Outras Funções:
◦ Compressão: Reduz o tamanho de respostas (ex.: gzip).
◦ Reescrita de URLs: Modifica URLs para roteamento ou redirecionamentos.
◦ Controle de acesso: Limita acesso com base em IP, autenticação, ou regras específicas.
◦ Servidor de streaming: Suporta streaming de mídia ou WebSocket.

Como o NGINX funciona no seu contexto (W.A.S. Limitado)?
No cenário descrito, onde o W.A.S. Limited suporta apenas 10 conexões simultâneas por instância, o NGINX desempenha um papel crítico para escalar a aplicação e atender milhares de usuários. Aqui está como ele funciona:
Estrutura Operacional
1 Recebe requisições:
◦ Usuários acessam http://seusite.com ou https://seusite.com (portas 80 ou 443).
◦ O NGINX escuta essas portas e intercepta todas as requisições.
2 Distribui requisições:
◦ O NGINX usa a configuração do bloco upstream (como no exemplo do nginx.conf) para encaminhar requisições a uma das instâncias do W.A.S. (ex.: rodando nas portas 8100, 8101, …, 8109).
◦ Exemplo de configuração:
upstream webdev_cluster {
◦ server 127.0.0.1:8100;
◦ server 127.0.0.1:8101;
◦ # ... outras instâncias
◦ }
◦ server {
◦ listen 80;
◦ location / {
◦ proxy_pass http://webdev_cluster;
◦ proxy_set_header Host $host;
◦ proxy_set_header X-Real-IP $remote_addr;
◦ }
◦ }

3 Gerencia respostas:
◦ A instância do W.A.S. processa a requisição e envia a resposta ao NGINX.
◦ O NGINX retorna a resposta ao usuário, mantendo a ilusão de um único servidor.
4 Escalabilidade:
◦ Com 10 instâncias do W.A.S., cada uma com 10 conexões, o NGINX permite até 100 conexões simultâneas.
◦ Com otimizações (como cache, keep-alive e sessões curtas), milhares de usuários podem ser atendidos, já que nem todas as conexões são mantidas ativas o tempo todo.

Exemplo Prático no Seu Cenário
Suponha que você tenha 10 instâncias do W.A.S. configuradas em portas de 8100 a 8109:
• O NGINX recebe 200 requisições de usuários.
• Ele distribui as requisições entre as instâncias, garantindo que nenhuma ultrapasse o limite de 10 conexões.
• Se uma instância falhar, o NGINX redireciona automaticamente para outras instâncias ativas (se configurado com max_fails e fail_timeout).
• Para usuários autenticados, o NGINX usa ip_hash para manter a consistência da sessão:
upstream webdev_cluster {
• ip_hash; # Sticky sessions
• server 127.0.0.1:8100;
• server 127.0.0.1:8101;
• # ...
• }


Benefícios do NGINX no Contexto do W.A.S.
1 Escalabilidade:
◦ Permite combinar várias instâncias limitadas para atender um grande número de usuários sem a versão FULL.
2 Alta Disponibilidade:
◦ O NGINX detecta instâncias inativas e redireciona o tráfego automaticamente.
3 Otimização de Performance:
◦ Cacheia conteúdo estático (ex.: imagens, CSS, JS), reduzindo a carga no W.A.S.
◦ Usa conexões keep-alive para minimizar latência.
4 Segurança:
◦ Esconde as instâncias do W.A.S. da internet, reduzindo a exposição a ataques.
◦ Suporta HTTPS para proteger dados em trânsito.
5 Flexibilidade:
◦ Permite configurações avançadas, como reescrita de URLs, compressão e controle de acesso.

Cuidados ao Usar NGINX com W.A.S.
1 Gestão de Sessões:
◦ Use sticky sessions (ip_hash) ou um banco de dados centralizado (ex.: Redis, MySQL) para evitar conflitos de sessão entre instâncias.
◦ Exemplo com Redis: Configure o W.A.S. para armazenar sessões em um servidor Redis compartilhado.
2 Conflitos de Arquivos:
◦ Cada instância do W.A.S. deve ter sua própria pasta de cache e arquivos temporários.
◦ Use um banco de dados centralizado para dados dinâmicos compartilhados.
3 Monitoramento:
◦ Monitore o uso de CPU e memória de cada instância (100-500 MB por instância, dependendo da carga).
◦ Use ferramentas como Prometheus ou Grafana para acompanhar o desempenho do NGINX e do W.A.S.
4 Otimização de Cache:
◦ Configure o NGINX para cachear conteúdo estático:
location ~* \.(jpg|jpeg|png|css|js)$ {
◦ expires 30d;
◦ access_log off;
◦ }

5 Segurança:
◦ Habilite HTTPS com certificados SSL/TLS (ex.: Let’s Encrypt).
◦ Bloqueie o acesso direto às portas do W.A.S. (ex.: 8100-8109) via firewall.

Conclusão
O NGINX é uma ferramenta poderosa que, no contexto do W.A.S. Limited, permite escalar de 10 conexões para milhares ao atuar como proxy reverso e balanceador de carga. Ele distribui requisições entre múltiplas instâncias, otimiza performance com cache e melhora a segurança com HTTPS e isolamento. Com uma configuração adequada, como a descrita, é possível atender grandes volumes de tráfego sem depender da versão FULL do W.A.S., economizando recursos e mantendo alta disponibilidade.
Se precisar de mais detalhes, como configurar o NGINX em um sistema operacional específico, integrar com Redis para sessões, ou usar Docker para isolar instâncias, é só informar!

Essa explicação mantém o foco no papel do NGINX no seu cenário, com linguagem clara e exemplos práticos, enquanto aborda suas capacidades gerais de forma concisa.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
4 613 messages
Posté le 10 juillet 2025 - 02:37
# Configuração Técnica Completa para WebDev Application Server com Múltiplas Instâncias

## Visão geral da arquitetura WebDev

Esta documentação técnica abrange a configuração completa de múltiplas instâncias do WebDev Application Server (W.A.S.), incluindo configuração nginx, scripts de automação Windows e procedimentos de implantação em produção. As informações foram compiladas a partir de documentação oficial PCSoft, experiências da comunidade e melhores práticas de produção.

## Parte 1: Configuração nginx para WebDev W.A.S.

### 1. Configuração completa nginx.conf para proxy reverso com múltiplos W.A.S.

```nginx
# /etc/nginx/nginx.conf - Configuração principal
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
use epoll;
multi_accept on;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

# Headers de segurança
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;

# Otimizações de performance
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;

# Compressão gzip
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;

# Configuração de proxy reverso WebDev
server {
listen 80;
server_name webdev.example.com;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2;
server_name webdev.example.com;

# Configuração SSL
ssl_certificate /etc/ssl/certs/webdev.pem;
ssl_certificate_key /etc/ssl/private/webdev.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

# Configurações específicas WebDev
client_max_body_size 100M;

# Recursos AWP WebDev
location /WD210AWP/res/ {
proxy_pass http://webdev_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
expires 1d;
add_header Cache-Control "public, immutable";
}

# Aplicações AWP WebDev
location /WD210AWP/ {
proxy_pass http://webdev_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Timeouts específicos WebDev
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;

# Configurações de buffer
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
}

# Interface administrativa WebDev
location /WDADMINWEB210_WEB/ {
proxy_pass http://webdev_backend;
allow 192.168.1.0/24;
deny all;
}

# Manipulação de arquivos .awp
location ~ \.awp$ {
proxy_pass http://webdev_backend;
proxy_set_header Content-Type application/WebDev21-awp;
}
}
}
```

### 2. Load balancing entre diferentes instâncias WebDev

```nginx
# Configuração upstream para load balancing
upstream webdev_backend {
# Métodos de balanceamento disponíveis:
# Round-robin (padrão)
# ip_hash; # Persistência de sessão
# least_conn; # Menos conexões

least_conn; # Recomendado para WebDev

# Instâncias WebDev Application Server
server 127.0.0.1:8080 weight=3 max_fails=2 fail_timeout=30s;
server 127.0.0.1:8081 weight=2 max_fails=2 fail_timeout=30s;
server 127.0.0.1:8082 weight=1 max_fails=2 fail_timeout=30s;

# Servidor de backup
server 127.0.0.1:8083 backup;
}

# Configuração alternativa com persistência de sessão
upstream webdev_backend_sticky {
ip_hash; # Persistência baseada em IP cliente

server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
```

### 3. Configuração upstream para diferentes versões WebDev

```nginx
# Suporte para múltiplas versões WebDev
upstream webdev_21_backend {
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:8081 weight=2;
}

upstream webdev_27_backend {
server 127.0.0.1:8082 weight=3;
server 127.0.0.1:8083 weight=3;
}

server {
listen 443 ssl;
server_name webdev21.example.com;

location / {
proxy_pass http://webdev_21_backend;
# Headers padrão...
}
}

server {
listen 443 ssl;
server_name webdev27.example.com;

location / {
proxy_pass http://webdev_27_backend;
# Headers padrão...
}
}
```

### 4. Configuração SSL/TLS para múltiplas instâncias

```nginx
# Otimização SSL para múltiplas instâncias WebDev
http {
# Configurações SSL globais
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;

# Protocolos e cifras SSL
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;

# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;

# Múltiplos domínios com certificados diferentes
server {
listen 443 ssl;
server_name app1.webdev.com;

ssl_certificate /etc/ssl/certs/app1.pem;
ssl_certificate_key /etc/ssl/private/app1.key;

location / {
proxy_pass http://webdev_app1_backend;
}
}

# Certificado wildcard
server {
listen 443 ssl;
server_name *.webdev.example.com;

ssl_certificate /etc/ssl/certs/wildcard.webdev.pem;
ssl_certificate_key /etc/ssl/private/wildcard.webdev.key;

location / {
proxy_pass http://webdev_backend;
}
}
}
```

### 5. Virtual hosts para diferentes aplicações WebDev

```nginx
# Virtual hosts específicos por aplicação
server {
listen 443 ssl;
server_name crm.example.com;

# SSL config...

location / {
proxy_pass http://webdev_crm_backend;
proxy_set_header X-WebDev-App "CRM";
}

# Logging customizado
access_log /var/log/nginx/crm.access.log webdev_format;
error_log /var/log/nginx/crm.error.log;
}

server {
listen 443 ssl;
server_name erp.example.com;

location / {
proxy_pass http://webdev_erp_backend;
proxy_set_header X-WebDev-App "ERP";
}

access_log /var/log/nginx/erp.access.log webdev_format;
}

# Backend definitions
upstream webdev_crm_backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}

upstream webdev_erp_backend {
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
```

### 6. Timeout e buffer sizes específicos para WebDev

```nginx
server {
listen 443 ssl;
server_name webdev.example.com;

# Configurações específicas WebDev
client_max_body_size 100M; # Upload de arquivos grandes
client_body_timeout 60s; # Timeout de upload
client_header_timeout 60s; # Timeout de header
client_body_buffer_size 1M; # Buffer de upload

location / {
proxy_pass http://webdev_backend;

# Timeouts de conexão
proxy_connect_timeout 30s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;

# Configurações de buffer para WebDev
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 8 8k;
proxy_busy_buffers_size 16k;
proxy_max_temp_file_size 1024m;

# Headers específicos WebDev
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;

# Manipulação de cookies de sessão WebDev
proxy_cookie_path / "/; HttpOnly; Secure";
}

# Tratamento especial para uploads WebDev
location /upload {
proxy_pass http://webdev_backend;

# Timeouts estendidos para uploads grandes
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;

# Buffer grande para uploads
client_max_body_size 500M;
proxy_request_buffering off;
}
}
```

### 7. Configuração de logs específicos por instância

```nginx
# Formato de log customizado para WebDev
http {
log_format webdev_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time" '
'sid="$upstream_http_x_session_id" '
'app="$upstream_http_x_webdev_app"';

# Logs por aplicação
server {
listen 443 ssl;
server_name webdev.example.com;

# Log principal
access_log /var/log/nginx/webdev.access.log webdev_format;
error_log /var/log/nginx/webdev.error.log warn;

# Logs específicos AWP
location /WD210AWP/ {
access_log /var/log/nginx/webdev.awp.log webdev_format;
proxy_pass http://webdev_backend;
}

# Logs da interface administrativa
location /WDADMINWEB210_WEB/ {
access_log /var/log/nginx/webdev.admin.log webdev_format;
proxy_pass http://webdev_backend;
}
}
}
```

### 8. Health checks para WebDev Application Server

```nginx
# Configuração de health check básica (nginx open source)
upstream webdev_backend {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8082 max_fails=3 fail_timeout=30s;
}

# Script de health check customizado
location /health {
access_log off;

# Verifica se WebDev está respondendo
proxy_pass http://webdev_backend/WD210AWP/;
proxy_connect_timeout 5s;
proxy_read_timeout 5s;

# Resposta customizada
if ($upstream_status = 200) {
return 200 "WebDev Health OK\n";
}
return 503 "WebDev Health Failed\n";
}
```

## Parte 2: Scripts BAT para Gerenciamento de Múltiplas Instâncias

### 9. Script principal de inicialização múltipla

```batch
@echo off
:: ==================================================
:: WebDev W.A.S. Multi-Instance Manager
:: Versão: 1.0 - Produção
:: ==================================================

setlocal EnableDelayedExpansion

:: Variáveis de Configuração
set "SCRIPT_NAME=WebDev WAS Multi-Instance Manager"
set "LOG_DIR=%~dp0logs"
set "CONFIG_FILE=%~dp0was_config.txt"
set "BASE_PORT=8080"
set "MAX_INSTANCES=5"
set "WAS_SERVICE_PREFIX=WebDev_WAS_"
set "WAS_INSTALL_PATH=C:\Program Files\PC SOFT\WebDev Application Server"

:: Criar diretório de logs
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

:: Gerar arquivo de log com timestamp
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "LOG_FILE=%LOG_DIR%\was_startup_%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%.log"

:: Verificar privilégios administrativos
net session >nul 2>&1
if %errorlevel% NEQ 0 (
echo ERRO: Este script requer privilégios de administrador.
pause
exit /b 1
)

call :LogMessage "INFO" "Iniciando %SCRIPT_NAME%"
call :LogMessage "INFO" "Configuração: Porta Base=%BASE_PORT%, Max Instâncias=%MAX_INSTANCES%"

:: Carregar configuração
call :LoadConfiguration

:: Verificar disponibilidade de portas e iniciar serviços
call :StartAllInstances

:: Monitorar serviços
call :MonitorServices

call :LogMessage "INFO" "Inicialização múltipla concluída"
pause
exit /b 0

:LogMessage
set "level=%~1"
set "message=%~2"
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "timestamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2% %dt:~8,2%:%dt:~10,2%:%dt:~12,2%"
echo [%timestamp%] [%level%] %message%
echo [%timestamp%] [%level%] %message% >> "%LOG_FILE%"
goto :eof

:LoadConfiguration
if exist "%CONFIG_FILE%" (
for /f "tokens=1,2 delims==" %%a in (%CONFIG_FILE%) do (
if "%%a"=="BASE_PORT" set "BASE_PORT=%%b"
if "%%a"=="MAX_INSTANCES" set "MAX_INSTANCES=%%b"
)
) else (
call :CreateDefaultConfig
)
goto :eof

:CreateDefaultConfig
(
echo BASE_PORT=%BASE_PORT%
echo MAX_INSTANCES=%MAX_INSTANCES%
echo WAS_INSTALL_PATH=%WAS_INSTALL_PATH%
) > "%CONFIG_FILE%"
goto :eof

:StartAllInstances
set "current_port=%BASE_PORT%"

for /L %%i in (1,1,%MAX_INSTANCES%) do (
call :FindNextAvailablePort !current_port!
if !found_port! NEQ 0 (
set "service_name=%WAS_SERVICE_PREFIX%%%i"
call :StartSingleInstance "!service_name!" !found_port!
set /a current_port=!found_port!+1
)
)
goto :eof

:FindNextAvailablePort
set "check_port=%~1"
set "found_port=0"

:FindPortLoop
netstat -an | findstr /r /c:":%check_port% " >nul 2>&1 [![how to check if port 8086 is listening, using a windows batch file - Stack Overflow](claude-citation:/icon.png?validation=65FC7FB1-C60A-4A6C-9F5B-A96A14FA6D3D&citation=eyJlbmRJbmRleCI6MTM0NDAsIm1ldGFkYXRhIjp7Imljb25VcmwiOiJodHRwczpcL1wvd3d3Lmdvb2dsZS5jb21cL3MyXC9mYXZpY29ucz9zej02NCZkb21haW49c3RhY2tvdmVyZmxvdy5jb20iLCJwcmV2aWV3VGl0bGUiOiJob3cgdG8gY2hlY2sgaWYgcG9ydCA4MDg2IGlzIGxpc3RlbmluZywgdXNpbmcgYSB3aW5kb3dzIGJhdGNoIGZpbGUgLSBTdGFjayBPdmVyZmxvdyIsInNvdXJjZSI6IlN0YWNrIE92ZXJmbG93IiwidHlwZSI6ImdlbmVyaWNfbWV0YWRhdGEifSwic291cmNlcyI6W3siaWNvblVybCI6Imh0dHBzOlwvXC93d3cuZ29vZ2xlLmNvbVwvczJcL2Zhdmljb25zP3N6PTY0JmRvbWFpbj1zdGFja292ZXJmbG93LmNvbSIsInNvdXJjZSI6IlN0YWNrIE92ZXJmbG93IiwidGl0bGUiOiJob3cgdG8gY2hlY2sgaWYgcG9ydCA4MDg2IGlzIGxpc3RlbmluZywgdXNpbmcgYSB3aW5kb3dzIGJhdGNoIGZpbGUgLSBTdGFjayBPdmVyZmxvdyIsInVybCI6Imh0dHBzOlwvXC9zdGFja292ZXJmbG93LmNvbVwvcXVlc3Rpb25zXC80NzAxMDk4OVwvaG93LXRvLWNoZWNrLWlmLXBvcnQtODA4Ni1pcy1saXN0ZW5pbmctdXNpbmctYS13aW5kb3dzLWJhdGNoLWZpbGUifV0sInN0YXJ0SW5kZXgiOjEzMzg2LCJ0aXRsZSI6IlN0YWNrIE92ZXJmbG93IiwidXJsIjoiaHR0cHM6XC9cL3N0YWNrb3ZlcmZsb3cuY29tXC9xdWVzdGlvbnNcLzQ3MDEwOTg5XC9ob3ctdG8tY2hlY2staWYtcG9ydC04MDg2LWlzLWxpc3RlbmluZy11c2luZy1hLXdpbmRvd3MtYmF0Y2gtZmlsZSIsInV1aWQiOiJkMjczYjQ1OC0xM2QyLTRjMjgtODY4MS1kMWE4M2VmOTczYTQifQ%3D%3D "how to check if port 8086 is listening, using a windows batch file - Stack Overflow")](https://stackoverflow.com/questions/47010989/how-to-check-if-port-8086-is-listening-using-a-windows-batch-file)
if %errorlevel% NEQ 0 (
set "found_port=%check_port%"
call :LogMessage "INFO" "Porta %check_port% disponível"
goto :eof
)
set /a check_port+=1
if %check_port% GTR 65535 (
call :LogMessage "ERROR" "Nenhuma porta disponível encontrada"
set "found_port=0"
goto :eof
)
goto :FindPortLoop

:StartSingleInstance
set "service_name=%~1"
set "port=%~2"

call :LogMessage "INFO" "Iniciando serviço %service_name% na porta %port%"

sc query "%service_name%" >nul 2>&1
if %errorlevel% NEQ 0 (
call :LogMessage "WARN" "Serviço %service_name% não encontrado"
goto :eof
)

sc start "%service_name%" >nul 2>&1
if %errorlevel% EQU 0 (
call :LogMessage "INFO" "Serviço %service_name% iniciado com sucesso"
) else (
call :LogMessage "ERROR" "Falha ao iniciar serviço %service_name%"
)
goto :eof

:MonitorServices
for /L %%i in (1,1,%MAX_INSTANCES%) do (
set "service_name=%WAS_SERVICE_PREFIX%%%i"
sc query "!service_name!" >nul 2>&1
if %errorlevel% EQU 0 (
for /f "tokens=4" %%s in ('sc query "!service_name!" ^| findstr "STATE"') do (
call :LogMessage "INFO" "Status do serviço !service_name!: %%s"
)
)
)
goto :eof
```

### 10-11. Verificação e configuração automática de portas

```batch
@echo off
:: ==================================================
:: Verificador de Portas para WebDev W.A.S.
:: Com configuração automática sequencial
:: ==================================================

setlocal EnableDelayedExpansion

set "START_PORT=8080"
set "END_PORT=8090"
set "REQUIRED_PORTS=5"

echo Verificando disponibilidade de portas de %START_PORT% a %END_PORT%
echo.

set "available_count=0"
set "available_ports="

for /L %%p in (%START_PORT%,1,%END_PORT%) do (
echo Verificando porta %%p...

:: Verificar se a porta está em uso
netstat -an | findstr /r /c:":%%p " >nul 2>&1 [![how to check if port 8086 is listening, using a windows batch file - Stack Overflow](claude-citation:/icon.png?validation=65FC7FB1-C60A-4A6C-9F5B-A96A14FA6D3D&citation=eyJlbmRJbmRleCI6MTUzMDIsIm1ldGFkYXRhIjp7Imljb25VcmwiOiJodHRwczpcL1wvd3d3Lmdvb2dsZS5jb21cL3MyXC9mYXZpY29ucz9zej02NCZkb21haW49c3RhY2tvdmVyZmxvdy5jb20iLCJwcmV2aWV3VGl0bGUiOiJob3cgdG8gY2hlY2sgaWYgcG9ydCA4MDg2IGlzIGxpc3RlbmluZywgdXNpbmcgYSB3aW5kb3dzIGJhdGNoIGZpbGUgLSBTdGFjayBPdmVyZmxvdyIsInNvdXJjZSI6IlN0YWNrIE92ZXJmbG93IiwidHlwZSI6ImdlbmVyaWNfbWV0YWRhdGEifSwic291cmNlcyI6W3siaWNvblVybCI6Imh0dHBzOlwvXC93d3cuZ29vZ2xlLmNvbVwvczJcL2Zhdmljb25zP3N6PTY0JmRvbWFpbj1zdGFja292ZXJmbG93LmNvbSIsInNvdXJjZSI6IlN0YWNrIE92ZXJmbG93IiwidGl0bGUiOiJob3cgdG8gY2hlY2sgaWYgcG9ydCA4MDg2IGlzIGxpc3RlbmluZywgdXNpbmcgYSB3aW5kb3dzIGJhdGNoIGZpbGUgLSBTdGFjayBPdmVyZmxvdyIsInVybCI6Imh0dHBzOlwvXC9zdGFja292ZXJmbG93LmNvbVwvcXVlc3Rpb25zXC80NzAxMDk4OVwvaG93LXRvLWNoZWNrLWlmLXBvcnQtODA4Ni1pcy1saXN0ZW5pbmctdXNpbmctYS13aW5kb3dzLWJhdGNoLWZpbGUifV0sInN0YXJ0SW5kZXgiOjE1MjU3LCJ0aXRsZSI6IlN0YWNrIE92ZXJmbG93IiwidXJsIjoiaHR0cHM6XC9cL3N0YWNrb3ZlcmZsb3cuY29tXC9xdWVzdGlvbnNcLzQ3MDEwOTg5XC9ob3ctdG8tY2hlY2staWYtcG9ydC04MDg2LWlzLWxpc3RlbmluZy11c2luZy1hLXdpbmRvd3MtYmF0Y2gtZmlsZSIsInV1aWQiOiJiZmVlZjc4My02MDNmLTQzOGMtOGNmMi03MWU4ZWRlNjVmMjIifQ%3D%3D "how to check if port 8086 is listening, using a windows batch file - Stack Overflow")](https://stackoverflow.com/questions/47010989/how-to-check-if-port-8086-is-listening-using-a-windows-batch-file)
if !errorlevel! NEQ 0 (
echo Porta %%p está DISPONÍVEL
set /a available_count+=1
set "available_ports=!available_ports! %%p"

:: Atribuir porta automaticamente à próxima instância
if !available_count! LEQ %REQUIRED_PORTS% (
echo Atribuindo porta %%p para WebDev_WAS_!available_count!
echo WebDev_WAS_!available_count!=%%p >> port_assignments.txt
)
) else (
echo Porta %%p está EM USO

:: Identificar processo usando a porta
for /f "tokens=5" %%i in ('netstat -ano ^| findstr ":%%p "') do (
set "pid=%%i"
for /f "tokens=1" %%n in ('tasklist /fi "pid eq !pid!" /fo csv /nh') do (
echo Usado por: %%n (PID: !pid!)
)
) [![Finding port information with netstat | ANS Documentation](claude-citation:/icon.png?validation=65FC7FB1-C60A-4A6C-9F5B-A96A14FA6D3D&citation=eyJlbmRJbmRleCI6MTYxMDcsIm1ldGFkYXRhIjp7Imljb25VcmwiOiJodHRwczpcL1wvd3d3Lmdvb2dsZS5jb21cL3MyXC9mYXZpY29ucz9zej02NCZkb21haW49YW5zLmNvLnVrIiwicHJldmlld1RpdGxlIjoiRmluZGluZyBwb3J0IGluZm9ybWF0aW9uIHdpdGggbmV0c3RhdCB8IEFOUyBEb2N1bWVudGF0aW9uIiwic291cmNlIjoiQU5TIiwidHlwZSI6ImdlbmVyaWNfbWV0YWRhdGEifSwic291cmNlcyI6W3siaWNvblVybCI6Imh0dHBzOlwvXC93d3cuZ29vZ2xlLmNvbVwvczJcL2Zhdmljb25zP3N6PTY0JmRvbWFpbj1hbnMuY28udWsiLCJzb3VyY2UiOiJBTlMiLCJ0aXRsZSI6IkZpbmRpbmcgcG9ydCBpbmZvcm1hdGlvbiB3aXRoIG5ldHN0YXQgfCBBTlMgRG9jdW1lbnRhdGlvbiIsInVybCI6Imh0dHBzOlwvXC93d3cuYW5zLmNvLnVrXC9kb2NzXC9vcGVyYXRpbmdzeXN0ZW1zXC93aW5kb3dzXC93aW5kb3dzYWRtaW5pc3RyYXRpb25cL25ldHN0YXRcLyJ9XSwic3RhcnRJbmRleCI6MTU4NTMsInRpdGxlIjoiQU5TIiwidXJsIjoiaHR0cHM6XC9cL3d3dy5hbnMuY28udWtcL2RvY3NcL29wZXJhdGluZ3N5c3RlbXNcL3dpbmRvd3NcL3dpbmRvd3NhZG1pbmlzdHJhdGlvblwvbmV0c3RhdFwvIiwidXVpZCI6ImYxYzgwMWE3LTg2M2ItNGZlYi1iOWU1LTAxYWYyOTllYjNhMyJ9 "Finding port information with netstat | ANS Documentation")](https://www.ans.co.uk/docs/operatingsystems/windows/windowsadministration/netstat/)
)
)

echo.
echo Resumo:
echo Portas disponíveis: %available_count%
echo Lista de portas:%available_ports%

if %available_count% GEQ %REQUIRED_PORTS% (
echo SUCESSO: Portas suficientes disponíveis para instâncias WebDev W.A.S.
echo Configuração de portas salva em port_assignments.txt
exit /b 0
) else (
echo AVISO: Portas insuficientes disponíveis
exit /b 1
)
```

### 12-13. Inicialização ordenada com monitoramento

```batch
@echo off
:: ==================================================
:: Gerenciador de Dependências WebDev W.A.S.
:: Com monitoramento de status em tempo real
:: ==================================================

setlocal EnableDelayedExpansion

:: Definir ordem de dependências
set "DEPENDENCY_SERVICES=Apache2.4 MySQL80 WebDev_WAS_1 WebDev_WAS_2 WebDev_WAS_3"

echo Iniciando serviços em ordem de dependência...
echo.

for %%s in (%DEPENDENCY_SERVICES%) do (
call :StartServiceWithMonitoring "%%s"
)

echo.
echo Todos os serviços iniciados. Iniciando monitoramento...
call :ContinuousMonitoring

exit /b 0

:StartServiceWithMonitoring
set "service_name=%~1"
echo [%time%] Processando serviço: %service_name%

:: Verificar se o serviço existe
sc query "%service_name%" >nul 2>&1
if %errorlevel% NEQ 0 (
echo [!] Serviço %service_name% não encontrado
goto :eof
)

:: Verificar status atual
for /f "tokens=4" %%s in ('sc query "%service_name%" ^| findstr "STATE"') do (
set "current_state=%%s"
)

if "%current_state%"=="RUNNING" (
echo [OK] Serviço %service_name% já está em execução
goto :eof
)

:: Iniciar o serviço
echo [..] Iniciando %service_name%...
sc start "%service_name%" >nul 2>&1
if %errorlevel% EQU 0 (
:: Aguardar serviço iniciar completamente
set "retry_count=0"
:WaitLoop
timeout /t 2 /nobreak >nul
sc query "%service_name%" | findstr "STATE" | findstr "RUNNING" >nul 2>&1
if %errorlevel% NEQ 0 (
set /a retry_count+=1
if !retry_count! LEQ 10 (
echo [..] Aguardando %service_name% iniciar (tentativa !retry_count!/10)...
goto :WaitLoop
) else (
echo [!!] Timeout ao aguardar %service_name%
goto :eof
)
)
echo [OK] Serviço %service_name% iniciado com sucesso
) else (
echo [!!] ERRO: Falha ao iniciar %service_name%
)
goto :eof

:ContinuousMonitoring
cls
echo ================================================================
echo Monitor de Serviços WebDev W.A.S. - %date% %time%
echo ================================================================
echo.

for %%s in (%DEPENDENCY_SERVICES%) do (
call :CheckServiceStatus "%%s"
)

echo.
echo Pressione Ctrl+C para sair ou aguarde 30 segundos...
timeout /t 30 /nobreak >nul
goto :ContinuousMonitoring

:CheckServiceStatus
set "service_name=%~1"
sc query "%service_name%" >nul 2>&1
if %errorlevel% NEQ 0 (
echo [!!] %service_name%: NÃO INSTALADO
goto :eof
)

for /f "tokens=4" %%s in ('sc query "%service_name%" ^| findstr "STATE"') do (
set "service_status=%%s"
)

if "%service_status%"=="RUNNING" (
for /f "tokens=5" %%p in ('sc queryex "%service_name%" ^| findstr "PID"') do (
echo [OK] %service_name%: EXECUTANDO (PID: %%p)
)
) else (
echo [!!] %service_name%: %service_status%
)
goto :eof
```

### 14-15. Scripts de shutdown/restart com logging

```batch
@echo off
:: ==================================================
:: Gerenciador de Shutdown/Restart WebDev W.A.S.
:: Com logging completo de inicialização
:: ==================================================

setlocal EnableDelayedExpansion

:: Configuração
set "SERVICES=WebDev_WAS_5 WebDev_WAS_4 WebDev_WAS_3 WebDev_WAS_2 WebDev_WAS_1"
set "LOG_DIR=%~dp0logs"
set "ACTION=%~1"

:: Criar diretório de logs
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

:: Gerar nome do arquivo de log
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "LOG_FILE=%LOG_DIR%\webdev_was_%ACTION%_%dt:~0,8%_%dt:~8,6%.log"

:: Verificar ação solicitada
if "%ACTION%"=="" set "ACTION=restart"

echo WebDev W.A.S. %ACTION% Manager
echo ==============================
call :WriteLog "Iniciando processo de %ACTION%" [![Batch Script - Logging - Batch Script Tutorial - W3schools](claude-citation:/icon.png?validation=65FC7FB1-C60A-4A6C-9F5B-A96A14FA6D3D&citation=eyJlbmRJbmRleCI6MjAyOTUsIm1ldGFkYXRhIjp7Imljb25VcmwiOiJodHRwczpcL1wvd3d3Lmdvb2dsZS5jb21cL3MyXC9mYXZpY29ucz9zej02NCZkb21haW49dzNzY2hvb2xzLnRlY2giLCJwcmV2aWV3VGl0bGUiOiJCYXRjaCBTY3JpcHQgLSBMb2dnaW5nIC0gQmF0Y2ggU2NyaXB0IFR1dG9yaWFsIC0gVzNzY2hvb2xzIiwic291cmNlIjoiVzNzY2hvb2xzIiwidHlwZSI6ImdlbmVyaWNfbWV0YWRhdGEifSwic291cmNlcyI6W3siaWNvblVybCI6Imh0dHBzOlwvXC93d3cuZ29vZ2xlLmNvbVwvczJcL2Zhdmljb25zP3N6PTY0JmRvbWFpbj13M3NjaG9vbHMudGVjaCIsInNvdXJjZSI6Ilczc2Nob29scyIsInRpdGxlIjoiQmF0Y2ggU2NyaXB0IC0gTG9nZ2luZyAtIEJhdGNoIFNjcmlwdCBUdXRvcmlhbCAtIFczc2Nob29scyIsInVybCI6Imh0dHBzOlwvXC93M3NjaG9vbHMudGVjaFwvdHV0b3JpYWxcL2JhdGNoLXNjcmlwdFwvYmF0Y2hfc2NyaXB0X2xvZ2dpbmcifV0sInN0YXJ0SW5kZXgiOjIwMjQ4LCJ0aXRsZSI6Ilczc2Nob29scyIsInVybCI6Imh0dHBzOlwvXC93M3NjaG9vbHMudGVjaFwvdHV0b3JpYWxcL2JhdGNoLXNjcmlwdFwvYmF0Y2hfc2NyaXB0X2xvZ2dpbmciLCJ1dWlkIjoiMWNhNTIxOGMtZjI1Yi00ZjRlLTlkZTItNGI2MjU4YmJiNmI3In0%3D "Batch Script - Logging - Batch Script Tutorial - W3schools")](https://w3schools.tech/tutorial/batch-script/batch_script_logging)

if /i "%ACTION%"=="shutdown" (
call :ShutdownAll
) else if /i "%ACTION%"=="restart" (
call :RestartAll
) else (
echo Uso: %~nx0 [shutdown^|restart]
exit /b 1
)

echo.
echo Processo concluído. Verifique o log em:
echo %LOG_FILE%
pause
exit /b 0

:WriteLog
echo [%date% %time%] %~1
echo [%date% %time%] %~1 >> "%LOG_FILE%" [![Batch Script - Logging - Batch Script Tutorial - W3schools](claude-citation:/icon.png?validation=65FC7FB1-C60A-4A6C-9F5B-A96A14FA6D3D&citation=eyJlbmRJbmRleCI6MjA2MzMsIm1ldGFkYXRhIjp7Imljb25VcmwiOiJodHRwczpcL1wvd3d3Lmdvb2dsZS5jb21cL3MyXC9mYXZpY29ucz9zej02NCZkb21haW49dzNzY2hvb2xzLnRlY2giLCJwcmV2aWV3VGl0bGUiOiJCYXRjaCBTY3JpcHQgLSBMb2dnaW5nIC0gQmF0Y2ggU2NyaXB0IFR1dG9yaWFsIC0gVzNzY2hvb2xzIiwic291cmNlIjoiVzNzY2hvb2xzIiwidHlwZSI6ImdlbmVyaWNfbWV0YWRhdGEifSwic291cmNlcyI6W3siaWNvblVybCI6Imh0dHBzOlwvXC93d3cuZ29vZ2xlLmNvbVwvczJcL2Zhdmljb25zP3N6PTY0JmRvbWFpbj13M3NjaG9vbHMudGVjaCIsInNvdXJjZSI6Ilczc2Nob29scyIsInRpdGxlIjoiQmF0Y2ggU2NyaXB0IC0gTG9nZ2luZyAtIEJhdGNoIFNjcmlwdCBUdXRvcmlhbCAtIFczc2Nob29scyIsInVybCI6Imh0dHBzOlwvXC93M3NjaG9vbHMudGVjaFwvdHV0b3JpYWxcL2JhdGNoLXNjcmlwdFwvYmF0Y2hfc2NyaXB0X2xvZ2dpbmcifV0sInN0YXJ0SW5kZXgiOjIwNTY4LCJ0aXRsZSI6Ilczc2Nob29scyIsInVybCI6Imh0dHBzOlwvXC93M3NjaG9vbHMudGVjaFwvdHV0b3JpYWxcL2JhdGNoLXNjcmlwdFwvYmF0Y2hfc2NyaXB0X2xvZ2dpbmciLCJ1dWlkIjoiMWU1N2U1YzEtM2VhNy00YmIyLThhOTUtNDg4N2JmMjg4YTY5In0%3D "Batch Script - Logging - Batch Script Tutorial - W3schools")](https://w3schools.tech/tutorial/batch-script/batch_script_logging)
goto :eof

:ShutdownAll
call :WriteLog "Iniciando shutdown de todos os serviços WebDev"

for %%s in (%SERVICES%) do (
call :StopService "%%s"
)

call :WriteLog "Shutdown concluído"
goto :eof

:RestartAll
call :WriteLog "Iniciando restart de todos os serviços WebDev"

:: Primeiro parar todos os serviços
call :WriteLog "Fase 1: Parando serviços"
for %%s in (%SERVICES%) do (
call :StopService "%%s"
)

:: Aguardar para garantir liberação de recursos
call :WriteLog "Aguardando 10 segundos para liberação de recursos..."
timeout /t 10 /nobreak >nul

:: Reiniciar serviços em ordem reversa
call :WriteLog "Fase 2: Iniciando serviços"
for %%s in (WebDev_WAS_1 WebDev_WAS_2 WebDev_WAS_3 WebDev_WAS_4 WebDev_WAS_5) do (
call :StartService "%%s"
)

call :WriteLog "Restart concluído"
goto :eof

:StopService
set "service_name=%~1"
call :WriteLog "Parando serviço %service_name%..."

sc query "%service_name%" >nul 2>&1
if %errorlevel% NEQ 0 (
call :WriteLog " Serviço %service_name% não encontrado"
goto :eof
)

sc stop "%service_name%" >nul 2>&1
if %errorlevel% EQU 0 (
:: Aguardar serviço parar completamente
:StopWaitLoop
timeout /t 2 /nobreak >nul
sc query "%service_name%" | findstr "STATE" | findstr "STOPPED" >nul 2>&1
if %errorlevel% NEQ 0 goto :StopWaitLoop

call :WriteLog " Serviço %service_name% parado com sucesso"
) else (
call :WriteLog " ERRO: Falha ao parar %service_name%"
)
goto :eof

:StartService
set "service_name=%~1"
call :WriteLog "Iniciando serviço %service_name%..."

sc start "%service_name%" >nul 2>&1
if %errorlevel% EQU 0 (
:: Aguardar serviço iniciar
:StartWaitLoop
timeout /t 2 /nobreak >nul
sc query "%service_name%" | findstr "STATE" | findstr "RUNNING" >nul 2>&1
if %errorlevel% NEQ 0 goto :StartWaitLoop

call :WriteLog " Serviço %service_name% iniciado com sucesso"
) else (
call :WriteLog " ERRO: Falha ao iniciar %service_name%"
)
goto :eof
```

## Parte 3: Manual de Implantação em Produção

### 16-17. Procedimentos e checklist de implantação

**Checklist Pré-Implantação:**

- [ ] Windows Server 2019/2022 instalado e atualizado
- [ ] Apache 2.4 ou IIS 10+ configurado
- [ ] HyperFileSQL ou SQL Server instalado
- [ ] Licenças WebDev Application Server disponíveis
- [ ] Certificados SSL obtidos e prontos
- [ ] DNS configurado para domínios de produção
- [ ] Backup da infraestrutura atual realizado
- [ ] Plano de rollback documentado

**Procedimento de Implantação Passo a Passo:**

1. **Instalação WebDev Application Server**

```cmd
:: Executar instalador como administrador
WebDev27_Setup.exe /silent /components="server,admin,hfsql"
```
1. **Configuração Apache para WebDev**

```apache
# Adicionar ao httpd.conf
ScriptAlias /WD270AWP/ "C:/WebDev27/AWP/"
<Directory C:/WebDev27/AWP/>
Require all granted
</Directory>

AddType application/WebDev27-awp .awp
Action application/WebDev27-awp /WD270AWP/WD270Awp.exe virtual
```
1. **Configuração de Segurança Inicial**
- Acessar `http://servidor/WDAdminWeb270`
- Alterar senha padrão (admin/admin)
- Configurar políticas de senha
- Definir IPs permitidos para administração

### 18-19. Configuração Windows Server e Firewall

**Configuração Windows Server para WebDev:**

```powershell
# Script PowerShell para configuração inicial
# Executar como administrador

# Instalar recursos IIS necessários
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole, IIS-WebServer, IIS-CommonHttpFeatures, IIS-HttpErrors, IIS-HttpRedirect, IIS-ApplicationDevelopment, IIS-NetFxExtensibility45, IIS-HealthAndDiagnostics, IIS-HttpLogging, IIS-Security, IIS-RequestFiltering, IIS-Performance, IIS-WebServerManagementTools, IIS-ManagementConsole

# Configurar regras de firewall
New-NetFirewallRule -DisplayName "WebDev HTTP" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
New-NetFirewallRule -DisplayName "WebDev HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow
New-NetFirewallRule -DisplayName "HyperFileSQL" -Direction Inbound -Protocol TCP -LocalPort 4900-4999 -Action Allow
New-NetFirewallRule -DisplayName "WebDev Admin" -Direction Inbound -Protocol TCP -LocalPort 8080-8090 -Action Allow -RemoteAddress 192.168.1.0/24

# Configurar serviços WebDev
Set-Service -Name "WebDev_WAS_1" -StartupType Automatic
Set-Service -Name "WebDev_WAS_2" -StartupType Automatic
Set-Service -Name "WebDev_WAS_3" -StartupType Automatic

# Otimizações de performance
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "TcpTimedWaitDelay" -Value 30
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "MaxUserPort" -Value 65534
```

### 20-21. Backup, restore e monitoramento

**Script de Backup Automatizado:**

```batch
@echo off
:: ==================================================
:: Script de Backup WebDev W.A.S.
:: Execução diária via Task Scheduler
:: ==================================================

setlocal

set "BACKUP_DIR=D:\Backups\WebDev"
set "WEBDEV_DIR=C:\WebDev27"
set "DATE_STAMP=%date:~10,4%%date:~4,2%%date:~7,2%"

:: Criar diretório de backup
mkdir "%BACKUP_DIR%\%DATE_STAMP%" 2>nul

:: Backup de aplicações
echo Fazendo backup das aplicações...
xcopy "%WEBDEV_DIR%\Applications" "%BACKUP_DIR%\%DATE_STAMP%\Applications" /E /I /Q

:: Backup de configurações
echo Fazendo backup das configurações...
xcopy "%WEBDEV_DIR%\Config" "%BACKUP_DIR%\%DATE_STAMP%\Config" /E /I /Q

:: Backup do banco de dados
echo Fazendo backup do banco de dados...
"%WEBDEV_DIR%\HFSQL\manta.exe" /backup /server:localhost:4900 /database:* /dest:"%BACKUP_DIR%\%DATE_STAMP%\Database"

:: Limpar backups antigos (manter últimos 30 dias)
forfiles /P "%BACKUP_DIR%" /D -30 /C "cmd /c if @isdir==TRUE rmdir /S /Q @path"

echo Backup concluído: %DATE_STAMP%
```

**Monitoramento com PowerShell:**

```powershell
# Monitor de Performance WebDev W.A.S.
param(
[int]$CheckInterval = 300, # 5 minutos
[string]$LogPath = "C:\Logs\WebDev_Monitor"
)

while ($true) {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

# Verificar status dos serviços
$services = @("WebDev_WAS_1", "WebDev_WAS_2", "WebDev_WAS_3")
foreach ($service in $services) {
$svc = Get-Service -Name $service -ErrorAction SilentlyContinue
if ($svc) {
$status = $svc.Status
$logEntry = "$timestamp - $service : $status"

if ($status -ne "Running") {
# Tentar reiniciar serviço
Start-Service -Name $service -ErrorAction SilentlyContinue
$logEntry += " - Tentativa de restart"
}

Add-Content -Path "$LogPath\service_monitor.log" -Value $logEntry
}
}

# Monitorar uso de recursos
$cpu = Get-Counter '\Processor(_Total)\% Processor Time' | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue
$mem = Get-Counter '\Memory\Available MBytes' | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue

$perfLog = "$timestamp - CPU: $([math]::Round($cpu,2))% - Memória Disponível: ${mem}MB"
Add-Content -Path "$LogPath\performance.log" -Value $perfLog

# Verificar espaço em disco
$drives = Get-PSDrive -PSProvider FileSystem
foreach ($drive in $drives) {
if ($drive.Free -lt 1GB) {
$alertLog = "$timestamp - ALERTA: Disco $($drive.Name): tem menos de 1GB livre"
Add-Content -Path "$LogPath\alerts.log" -Value $alertLog
}
}

Start-Sleep -Seconds $CheckInterval
}
```

### 22-23. Performance tuning e melhores práticas

**Otimização para Múltiplas Instâncias:**

1. **Configuração de Pool de Conexões**

```ini
; WebDev connection pool settings
[Database]
MaxConnections=100
MinConnections=10
ConnectionTimeout=30
IdleTimeout=300
```
1. **Otimização de Memória por Instância**

```batch
:: Configurar limites de memória
sc config WebDev_WAS_1 obj= ".\WebDevUser1" password= "SecurePass1"
wmic process where name="WebDev_WAS_1.exe" CALL setpriority "above normal"
```
1. **Balanceamento de Carga Eficiente**
- Use `least_conn` no nginx para melhor distribuição
- Configure afinidade de sessão quando necessário
- Monitore distribuição de carga regularmente

**Melhores Práticas da Comunidade:**

1. **Preferir Linux para Performance**
- Comunidade relata melhor desempenho no Linux
- Windows Server 2012 apresentou problemas de performance
- Ubuntu Server é a escolha mais comum
1. **Gerenciamento de Permissões**
- Usuários devem ser membros do grupo `webdevadmin`
- Diretórios FTP devem ter permissões específicas
- Evitar execução com privilégios administrativos
1. **Monitoramento Proativo**
- Implementar alertas para uso de CPU > 80%
- Monitorar logs de erro em tempo real
- Realizar testes de carga regularmente
1. **Segurança em Produção**
- Sempre usar HTTPS em produção
- Implementar rate limiting
- Manter WebDev e dependências atualizados
- Realizar auditorias de segurança trimestrais

## Recursos Adicionais

**Documentação Oficial:**

- PCSoft Documentation: https://doc.pcsoft.fr/
- Fórum Oficial: https://forum.pcsoft.fr/

**Repositórios GitHub:**

- WebDev Docker: https://github.com/PCSOFT-WINDEV/WEBDEV
- HFSQL Docker: https://github.com/PCSOFT-WINDEV/HFSQL

**Ferramentas de Monitoramento Recomendadas:**

- Zabbix ou Nagios para monitoramento de infraestrutura
- ELK Stack para análise de logs
- Grafana para dashboards de performance

Esta documentação técnica fornece uma base sólida para implementação e manutenção de múltiplas instâncias WebDev Application Server em ambiente de produção, com foco em confiabilidade, segurança e performance.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
4 613 messages
Posté le 12 juillet 2025 - 17:20
Com certeza. Rodar múltiplas versões do Servidor de Aplicação WebDev (W.A.S.) da PC SOFT no mesmo servidor é uma necessidade comum, seja para testes, migração de projetos ou para suportar aplicações desenvolvidas em versões diferentes do WebDev.

A arquitetura do W.A.S. foi projetada para permitir isso, mas exige atenção a alguns pontos-chave, principalmente o isolamento das instalações e o gerenciamento de portas.

Aqui está um guia detalhado de como fazer isso corretamente.

Conceitos Fundamentais
1. Instalação em Diretórios Separados: Cada versão do W.A.S. deve ser instalada em seu próprio diretório. Isso é crucial para evitar que os arquivos de uma versão sobrescrevam ou entrem em conflito com os de outra.
◦ Exemplo:
◦ Versão 28: `C:\PC SOFT\WEBDEV 28\W.A.S\`
◦ Versão 2024: `C:\PC SOFT\WEBDEV 2024\W.A.S\`
2. Serviços do Windows Independentes: Cada instalação do W.A.S. registrará seu próprio serviço no Windows. Eles terão nomes distintos, permitindo que você inicie, pare e gerencie cada versão de forma independente.
◦ Exemplo de nomes de serviço:
◦ `AwpService_WEBDEV_28`
◦ `AwpService_WEBDEV_2024`
3. Gerenciamento de Portas: Este é o ponto mais crítico. Dois serviços não podem “escutar” na mesma porta de rede ao mesmo tempo. O W.A.S. usa principalmente duas portas:
◦ Porta de Administração (padrão 7001): Usada pelo Administrador do W.A.S. para configurar os sites.
◦ Porta HTTP (padrão 80): Usada para servir as páginas dos sites aos usuários.

Você precisará configurar portas diferentes para cada instância do W.A.S.

Passos para a Instalação e Configuração
Vamos supor que você já tem o W.A.S. da versão 28 instalado e quer adicionar o W.A.S. da versão 2024.

Passo 1: Instalar a Nova Versão do W.A.S.
1. Execute o instalador do WebDev 2024.
2. Durante a instalação, quando for solicitado o diretório de destino, certifique-se de escolher um novo diretório. Não instale na mesma pasta da versão 28.
◦ Diretório sugerido: `C:\PC SOFT\WEBDEV 2024\`
3. Prossiga com a instalação do “Servidor de Aplicação WebDev (W.A.S.)”. O instalador é inteligente o suficiente para detectar uma versão existente e configurar o novo serviço com um nome diferente.

Passo 2: Configurar as Portas da Nova Instalação
Após a instalação, a nova instância do W.A.S. (v2024) provavelmente não iniciará, pois tentará usar as portas padrão (80 e 7001) que já estão ocupadas pela instância da v28. Você precisa alterar isso.

1. Abra o Administrador do Servidor de Aplicação WebDev correspondente à nova versão (2024). Você o encontrará no menu Iniciar, dentro da pasta do PC SOFT 2024.
2. Como o serviço não pode iniciar, o administrador pode mostrar um erro de conexão. Ignore-o e vá diretamente para a configuração.
3. Vá para a aba “Configuração Avançada” (Advanced configuration).
4. Localize os campos para as portas:
◦ Porta de escuta para o servidor de administração: Altere o valor padrão `7001` para um novo valor, por exemplo, `7002`.
◦ Porta de escuta para os sites (HTTP): Altere o valor padrão `80` para um novo valor, por exemplo, `81` ou `8081`.
5. Salve as alterações.

Passo 3: Iniciar o Serviço e Verificar
1. Abra os Serviços do Windows (`services.msc`).
2. Localize o serviço para a nova versão (ex: `AwpService_WEBDEV_2024`).
3. Inicie o serviço. Agora ele deve iniciar sem conflitos.
4. Abra novamente o Administrador do W.A.S. da v2024. Ele agora deve se conectar com sucesso (usando a nova porta de administração que você definiu, `7002`).

Resumo da Configuração Final

Como Acessar os Sites
Com essa configuração, os sites hospedados em cada servidor serão acessados por portas diferentes:

• Site na versão 28: `http://seuservidor.com/NOME_DO_SITE` (a porta 80 é implícita)
• Site na versão 2024: `http://seuservidor.com:81/NOME_DO_SITE` (é obrigatório especificar a porta `81`)

Usando um Proxy Reverso (Configuração Avançada)
Se você não quiser que seus usuários precisem digitar a porta (`:81`), a solução profissional é usar um Proxy Reverso, como o IIS (com o módulo ARR), Nginx ou Apache.

A ideia é:

1. O Proxy Reverso escuta na porta padrão 80.
2. Ele recebe todas as requisições.
3. Com base no nome do domínio ou no caminho da URL, ele decide para qual W.A.S. interno deve encaminhar a requisição (para a porta 80 ou para a porta 81).

Exemplo com IIS:

• Requisição para `site_v28.meudominio.com` -> Encaminha para `localhost:80`
• Requisição para `site_v2024.meudominio.com` -> Encaminha para `localhost:81`

Essa abordagem é mais transparente para o usuário final e é a prática recomendada para ambientes de produção.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/