Infraestrutura: Servidores em Datacenter, OS - Debian Squeeze, Webserver - Apache 2.2.16
Situação:
O servidor live está sendo usado pelos nossos clientes todos os dias, o que torna impossível testar ajustes e melhorias.
Portanto, gostaríamos de duplicar o tráfego HTTP de entrada no servidor ativo para um ou vários servidores remotos em tempo real. O tráfego deve ser passado para o servidor Web local (neste caso, o Apache) E para o (s) servidor (es) remoto (s). Dessa forma, podemos ajustar configurações e usar código diferente / atualizado no (s) servidor (es) remoto (s) para comparação e comparação com o servidor ao vivo atual.
Atualmente, o servidor está ouvindo aprox. 60 portas adicionais além de 80 e 443, por causa da estrutura do cliente.
Pergunta:
Como essa duplicação para um ou vários servidores remotos pode ser implementada?
Já tentamos:
- duplicador de agnoster - isso exigiria uma sessão aberta por porta que não é aplicável. ( link )
- proxy kklis - só encaminha o tráfego para o servidor remoto, mas não o transmite para o servidor web lcoal. ( link )
- iptables - O DNAT somente encaminha o tráfego, mas não o encaminha para o servidor da Web local
- iptables - TEE apenas duplica para servidores na rede local - > os servidores não estão localizados na mesma rede devido à estrutura do datacenter
- alternativas sugeridas fornecidas para a pergunta "tráfego tcp duplicado com um proxy" em stackoverflow ( link ) não tiveram sucesso. Como mencionado, o TEE não funciona com servidores remotos fora da rede local. O teeproxy não está mais disponível ( link ) e não conseguimos encontrá-lo em outro lugar.
- Adicionamos um segundo endereço IP (que está na mesma rede) e atribuímo-lo a eth0: 0 (o endereço IP principal é atribuído a eth0). Não há sucesso em combinar este novo IP ou interface virtual eth0: 0 com a função TEE do iptables ou rotas.
- alternativas sugeridas fornecidas para a questão "tráfego tcp de entrada duplicado no squeeze debian" ( Duplicar o tráfego TCP de entrada no Debian Squeeze não teve sucesso. As sessões cat | nc (cat / tmp / prodpipe | nc 127.0.0.1 12345 e cat / tmp / testpipe | nc 127.0.0.1 23456) são interrompidas após cada solicitação / conexão por um cliente sem qualquer aviso ou log. O keepalive não mudou essa situação. Pacotes TCP não foram transportados para o sistema remoto.
- Tentativas adicionais com diferentes opções de socat (HowTo: link , < um href="https://stackoverflow.com/questions/9024227/duplicate-input-unix-stream-to-multiple-tcp-clients-using-socat"> link ) e ferramentas semelhantes foram mal sucedidas, porque a função TEE fornecida só grava em FS.
- É claro que pesquisar e pesquisar esse "problema" ou a configuração também não foi bem-sucedida.
Estamos ficando sem opções aqui.
Existe um método para desabilitar a aplicação de "servidor na rede local" da função TEE ao usar IPTABLES?
O nosso objetivo pode ser alcançado pelo uso diferente de IPTABLES ou Rotas?
Você conhece uma ferramenta diferente para esse propósito que foi testada e funciona para essas circunstâncias específicas?
Existe uma fonte diferente para o tee-proxy (que se encaixaria perfeitamente em nossos requisitos, AFAIK)?
Agradecemos antecipadamente por suas respostas.
----------
editar: 05.02.2014
aqui está o script python, que funciona da maneira que precisamos:
import socket
import SimpleHTTPServer
import SocketServer
import sys, thread, time
def main(config, errorlog):
sys.stderr = file(errorlog, 'a')
for settings in parse(config):
thread.start_new_thread(server, settings)
while True:
time.sleep(60)
def parse(configline):
settings = list()
for line in file(configline):
parts = line.split()
settings.append((int(parts[0]), int(parts[1]), parts[2], int(parts[3])))
return settings
def server(*settings):
try:
dock_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
dock_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
dock_socket.bind(('', settings[0]))
dock_socket.listen(5)
while True:
client_socket = dock_socket.accept()[0]
client_data = client_socket.recv(1024)
sys.stderr.write("[OK] Data received:\n %s \n" % client_data)
print "Forward data to local port: %s" % (settings[1])
local_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
local_socket.connect(('', settings[1]))
local_socket.sendall(client_data)
print "Get response from local socket"
client_response = local_socket.recv(1024)
local_socket.close()
print "Send response to client"
client_socket.sendall(client_response)
print "Close client socket"
client_socket.close()
print "Forward data to remote server: %s:%s" % (settings[2],settings[3])
remote_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
remote_socket.connect((settings[2], settings[3]))
remote_socket.sendall(client_data)
print "Close remote sockets"
remote_socket.close()
except:
print "[ERROR]: ",
print sys.exc_info()
raise
if __name__ == '__main__':
main('multiforwarder.config', 'error.log')
Os comentários para usar este script:
Este script encaminha um número de portas locais configuradas para outro servidor de soquete local e remoto.
Configuração:
Adicione as linhas port-forward.config do arquivo de configuração com o seguinte conteúdo:
Mensagens de erro são armazenadas no arquivo 'error.log'.
O script divide os parâmetros do arquivo de configuração:
Dividir cada linha de configuração com espaços
0: porta local para ouvir
1: porto local para encaminhar para o
2: endereço IP remoto do servidor de destino
3: porta remota do servidor de destino
e retornar configurações