Upstream#
Fornece contexto para descrever grupos de servidores que podem ser usados na diretiva proxy_pass. Descreve um grupo de servidores. Os servidores podem escutar em portas diferentes. Além disso, servidores escutando em TCP e sockets de domínio UNIX podem ser misturados. Exemplo: Por padrão, as conexões são distribuídas entre os servidores usando um método de balanceamento round-robin ponderado. No exemplo acima, cada 7 conexões serão distribuídas da seguinte forma: 5 conexões vão para backend1.example.com:1935 e uma conexão para cada um dos segundo e terceiro servidores. Se ocorrer um erro durante a comunicação com um servidor, a conexão será passada para o próximo servidor, e assim por diante até que todos os servidores funcionais sejam tentados. Se a comunicação com todos os servidores falhar, a conexão será fechada. Define o endereço e outros parâmetros de um servidor. O endereço pode ser especificado como um nome de domínio ou endereço IP com uma porta obrigatória, ou como um caminho de socket de domínio UNIX especificado após o prefixo Os seguintes parâmetros podem ser definidos: Define o peso do servidor; por padrão, 1. Limita o número máximo de conexões ativas simultâneas para o servidor proxy. O valor padrão é Aqui, uma tentativa malsucedida é um erro ou timeout ao estabelecer uma
conexão com o servidor. Nota Se uma diretiva Se um upstream contém apenas um servidor
após todas as suas diretivas O número padrão de tentativas. Desabilita a contabilização de tentativas. Por padrão, isso é definido como 10 segundos. Nota Se uma diretiva Se um upstream contém apenas um servidor
após todas as suas diretivas Marca o servidor como um servidor de backup. Ele receberá requisições quando os servidores primários estiverem indisponíveis. Marca o servidor como permanentemente indisponível. Marca o servidor como drenando; isso significa
que ele recebe apenas requisições das sessões
que foram vinculadas anteriormente com sticky.
Caso contrário, ele se comporta de forma similar a Aviso O parâmetro Os parâmetros Adicionado na versão 1.3.0. Habilita o monitoramento de mudanças na lista de endereços IP que
corresponde a um nome de domínio, atualizando-a sem recarregar a configuração.
O grupo deve residir em uma
zona de memória compartilhada;
além disso, um resolver deve ser definido. Habilita a resolução de registros DNS SRV e define o nome do serviço.
Para que este parâmetro funcione, o parâmetro resolve também deve ser especificado,
sem especificar a porta do servidor no nome do host. Se não houver pontos no nome do serviço,
o nome é formado de acordo com o padrão RFC:
o nome do serviço é prefixado com O Angie resolve os registros SRV
combinando o nome do serviço normalizado e o nome do host
e obtendo a lista de servidores para a combinação via DNS,
junto com suas prioridades e pesos. Registros SRV de prioridade máxima
(aqueles que compartilham o valor mínimo de prioridade)
resolvem em servidores primários,
e outros registros tornam-se servidores de backup.
Se O peso é similar ao parâmetro Este exemplo irá procurar o registro Adicionado na versão 1.2.0: Angie Adicionado na versão 1.1.0-P1: Angie PRO Define o ID do servidor no grupo. Se o parâmetro não for especificado,
o ID é definido como um hash MD5 hexadecimal
do endereço IP e porta ou caminho do socket de domínio UNIX. Adicionado na versão 1.4.0. Define o tempo para um servidor recuperar seu peso
ao retornar ao serviço
com os métodos de balanceamento de carga round-robin ou least_conn. Se o parâmetro estiver definido
e um servidor for novamente considerado saudável
após uma falha de acordo com max_fails e upstream_probe (PRO),
o servidor gradualmente recupera seu peso designado
durante o período de tempo especificado. Se o parâmetro não estiver definido,
em uma situação similar
o servidor imediatamente começa a trabalhar com seu peso designado. Nota Se apenas um Adicionado na versão 1.4.0: PRO Especifica o file onde a lista de servidores upstream é armazenada persistentemente.
Ao instalar a partir dos
nossos pacotes,
um diretório dedicado
O formato da lista de servidores aqui é similar ao Aviso Para usar a diretiva Define o nome e tamanho da zona de memória compartilhada que armazena a configuração e estado de execução do grupo, compartilhada entre processos worker. Múltiplos grupos podem usar a mesma zona. Neste caso, é suficiente especificar o tamanho apenas uma vez. Adicionado na versão 1.10.0: PRO A diretiva habilita a capacidade de iniciar a seleção de servidor não do grupo primário,
mas do grupo ativo, ou seja, aquele onde um servidor foi encontrado com sucesso anteriormente.
Se um servidor não puder ser encontrado no grupo ativo para a próxima requisição,
e a busca se mover para o grupo de backup,
este grupo de backup se torna ativo,
e requisições subsequentes são primeiro direcionadas para servidores neste grupo. Se o parâmetro Exemplo: Se o balanceador de carga alternar dos servidores primários para o grupo de backup,
todas as requisições subsequentes são tratadas por este grupo de backup por 2 minutos.
Após 2 minutos expirarem, o balanceador de carga re-verifica os servidores primários
e os torna ativos novamente se estiverem funcionando normalmente. Adicionado na versão 1.7.0: PRO Padrão — upstream Habilita um mecanismo de balanceamento de carga baseado em feedback para o Os seguintes parâmetros podem ser especificados: A variável da qual o valor de feedback é obtido.
Ela deve representar uma métrica de desempenho ou saúde;
assume-se que seja fornecida pelo servidor. O valor é avaliado com cada resposta do servidor
e considerado na média móvel
de acordo com as configurações Se o parâmetro estiver definido, o valor de feedback é interpretado inversamente:
valores menores indicam melhor desempenho. O fator pelo qual o valor de feedback é ponderado
ao calcular a média.
Valores válidos são inteiros de 0 a 99.
O padrão é A média é calculada usando a fórmula de suavização exponencial. Quanto maior o fator, menos os novos valores afetam a média;
se Especifica uma variável de condição
que controla como as conexões são contabilizadas no cálculo.
O valor médio é atualizado com o valor de feedback
apenas se a variável de condição
não for igual a Nota Por padrão, o tráfego de sondas
não é incluído no cálculo;
combinar a variável $upstream_probe
com Exemplo: Esta configuração categoriza servidores por níveis de feedback
baseados nos protocolos usados em sessões individuais,
e também adiciona uma condição em $upstream_probe
para contabilizar apenas sondas Especifica um método de balanceamento de carga para o grupo onde o mapeamento cliente-servidor é determinado usando um valor de chave hash. A chave pode conter texto, variáveis e suas combinações. Exemplo de uso: O método é compatível com a biblioteca Perl Cache::Memcached. Se o parâmetro Especifica um método de balanceamento de carga para o grupo onde uma conexão é passada para o servidor com o menor número de conexões ativas, levando em conta os pesos dos servidores. Se vários servidores forem adequados, eles são selecionados ciclicamente (round-robin) com seus pesos levados em conta. Padrão — upstream Especifica um método de balanceamento de carga para o grupo onde a probabilidade de passar
uma conexão para um servidor ativo é inversamente proporcional ao seu tempo médio
de resposta; quanto menor o tempo, mais conexões o servidor receberá. A diretiva considera o tempo médio para estabelecer uma conexão. A diretiva usa o tempo médio para receber o primeiro byte da resposta. A diretiva usa o tempo médio para receber a resposta completa. Adicionado na versão 1.7.0: PRO Serve a mesma função que response_time_factor (PRO)
e o substitui se o parâmetro for definido. Especifica uma variável de condição
que controla quais conexões são contabilizadas no cálculo.
O valor médio é atualizado
apenas se a variável de condição da conexão
não for igual a Nota Por padrão, sondas
não são incluídas no cálculo;
combinar a variável $upstream_probe
com Os valores atuais são apresentados como Especifica um método de balanceamento de carga para o grupo onde uma conexão é passada para um servidor selecionado aleatoriamente, levando em conta os pesos dos servidores. Se o parâmetro opcional Define o fator de suavização para o método de balanceamento de carga least_time (PRO),
usando o valor anterior ao calcular o tempo médio de resposta
de acordo com a fórmula de média móvel exponencialmente ponderada. Quanto maior o number especificado, menos os novos valores influenciam a média;
se Os resultados atuais do cálculo são apresentados como Nota Apenas respostas bem-sucedidas são consideradas no cálculo;
o que constitui uma resposta mal-sucedida
é determinado pelas diretivas proxy_next_upstream. Adicionado na versão 1.6.0: Angie Adicionado na versão 1.6.0: Angie PRO Padrão — upstream Configura sessões persistentes entre clientes e servidores upstream,
dependendo do modo especificado no primeiro parâmetro.
Para gradualmente tirar servidores com Aviso A diretiva Este modo usa identificadores de rota predefinidos que podem ser derivados dos metadados da conexão.
É menos flexível porque depende de identificadores conhecidos,
mas é útil quando tais valores já estão disponíveis. Quando uma conexão é estabelecida, o servidor backend pode atribuir um ID de rota
e retorná-lo usando um método que ambos os lados entendam.
Este ID de rota deve corresponder ao parâmetro sid
da diretiva server.
Se sticky_secret estiver configurado,
o ID é hasheado. Conexões futuras que incluam este ID serão roteadas de volta para o mesmo servidor,
assumindo que o Angie possa recuperar o ID de uma variável especificada. A diretiva recebe uma lista de variáveis para extrair o ID da rota.
O primeiro valor não vazio é comparado com o sid de cada servidor.
Se uma correspondência for encontrada, a conexão é roteada adequadamente.
Caso contrário, o método de balanceamento de carga padrão é usado. Exemplo usando Este modo atribui clientes a servidores backend dinamicamente
usando IDs de sessão derivados dos metadados da conexão.
As sessões são armazenadas em memória compartilhada e podem ser reutilizadas para conexões futuras. Use A primeira variável As sessões são armazenadas em uma zona de memória compartilhada especificada por Por padrão, a expiração da sessão é estendida a cada uso.
Use Conexões de entrada que incluam um ID de sessão correspondente
(via Use Exemplo usando Este modo permite que sessões sejam criadas e recuperadas dinamicamente
de um armazenamento de sessão externo usando Diferentemente do Fluxo de trabalho geral: Extrai o ID da sessão da primeira variável Envia uma sub-requisição HTTP síncrona para o armazenamento remoto
(definido por O ID da sessão (variável $sticky_sessid) O ID do servidor escolhido — do parâmetro Essas variáveis são expostas ao contexto HTTP como
O armazenamento remoto responde: 200/201/204: confirma o servidor selecionado Pode também retornar um ID de servidor alternativo via cabeçalho (tratado por Qualquer outro status ou ID ausente: fallback para o servidor original O ID do servidor da resposta é extraído usando Exemplo de configuração: Exemplo de resposta do armazenamento remoto: O Angie expõe: Como A diretiva Servidores marcados como Servidores que excedem Servidores com Se um servidor anteriormente indisponível se recuperar, Você pode ajustar ainda mais o comportamento sticky usando
sticky_secret e sticky_strict.
Se nenhum servidor correspondente for encontrado ou estiver indisponível: Com Com Cada Adicionado na versão 1.6.0: Angie Adicionado na versão 1.6.0: Angie PRO Adiciona a string como salt à função de hash MD5
para a diretiva sticky no modo O salt é anexado após o valor com hash;
para verificar independentemente o mecanismo de hash: Adicionado na versão 1.6.0: Angie Adicionado na versão 1.6.0: Angie PRO Quando habilitado, o Angie retornará um erro de conexão para o cliente
se o servidor de destino estiver indisponível,
em vez de fazer fallback para outro servidor disponível,
que é o comportamento padrão quando nenhum servidor correspondente é encontrado. O módulo Usado com Usado com armazena o endereço IP e porta, ou o caminho para o socket de domínio UNIX do servidor upstream. Se vários servidores foram contatados durante o proxy, seus endereços são separados por vírgulas, por exemplo: 192.168.1.1:1935, 192.168.1.2:1935, unix:/tmp/sock Se um servidor não pode ser selecionado, a variável mantém o nome do grupo de servidores. número de bytes recebidos de um servidor upstream. Valores de várias conexões são separados por vírgulas e dois pontos como endereços na variável $upstream_addr. número de bytes enviados para um servidor upstream. Valores de várias conexões são separados por vírgulas e dois pontos como endereços na variável $upstream_addr. tempo para conectar ao servidor upstream; o tempo é mantido em segundos com resolução de milissegundos. Tempos de várias conexões são separados por vírgulas e dois pontos como endereços na variável $upstream_addr. tempo para receber o primeiro byte de dados; o tempo é mantido em segundos com resolução de milissegundos. Tempos de várias conexões são separados por vírgulas como endereços na variável $upstream_addr. duração da sessão em segundos com resolução de milissegundos. Tempos de várias conexões são separados por vírgulas como endereços na variável $upstream_addr. Status das conexões sticky. Conexão roteada para upstream sem sticky habilitado. Conexão sem informações sticky. Conexão com informações sticky roteada para o backend desejado. Conexão com informações sticky roteada para o backend
selecionado pelo algoritmo de balanceamento de carga. Valores de múltiplas conexões são separados por vírgulas e dois pontos,
similar aos endereços na variável $upstream_addr.Exemplo de Configuração#
upstream backend {
hash $remote_addr consistent;
zone backend 1m;
server backend1.example.com:1935 weight=5;
server unix:/tmp/backend3;
server backend3.example.com service=_example._tcp resolve;
server backup1.example.com:1935 backup;
server backup2.example.com:1935 backup;
}
resolver 127.0.0.53 status_zone=resolver;
server {
listen 1936;
proxy_pass backend;
}
Diretivas#
upstream#
upstream backend {
server backend1.example.com:1935 weight=5;
server 127.0.0.1:1935 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend2;
server backend3.example.com:1935 resolve;
server backup1.example.com:1935 backup;
}
server#
unix:
. Um nome de domínio que resolve para vários endereços IP define múltiplos servidores de uma vez.weight=
númeromax_conns=
número0
, significando que não há limite. Se o grupo de servidores não residir na memória compartilhada, a limitação funciona por cada processo worker.max_fails=
número — define o número de tentativas malsucedidas
de comunicação com o servidor
que devem acontecer na duração definida por fail_timeout
para considerar o servidor indisponível;
ele é então tentado novamente após a mesma duração.server
em um grupo resolve em múltiplos servidores,
sua configuração max_fails
se aplica a cada servidor individualmente.server
serem resolvidas,
a configuração max_fails
não tem efeito e será ignorada.max_fails=1
max_fails=0
fail_timeout=
tempo — define o período de tempo durante o qual um número especificado de
tentativas malsucedidas de comunicação com o servidor (max_fails) deve acontecer para considerar o servidor indisponível.
O servidor então permanece indisponível pela mesma quantidade de tempo
antes de ser tentado novamente.server
em um grupo resolve em múltiplos servidores,
sua configuração fail_timeout
se aplica a cada servidor individualmente.server
serem resolvidas,
a configuração fail_timeout
não tem efeito e será ignorada.backup
down
drain
(PRO)down
.backup
não pode ser usado junto com os métodos de balanceamento de carga hash e random.down
e drain
são mutuamente exclusivos.resolve
service=
name_
,
então _tcp
é adicionado após um ponto.
Assim, o nome do serviço http
resultará em _http._tcp
.backup
for definido com server
,
registros SRV de prioridade máxima resolvem em servidores de backup,
e outros registros são ignorados.weight
da diretiva server
.
Se o peso for definido tanto pela diretiva quanto pelo registro SRV,
o peso definido pela diretiva é usado._http._tcp.backend.example.com
:server backend.example.com service=http resolve;
sid=
idslow_start=
timeserver
for especificado no upstream,
slow_start
não tem efeito e será ignorado.state (PRO)#
/var/lib/angie/state/
(/var/db/angie/state/
no FreeBSD)
é criado com as permissões apropriadas para armazenar tais arquivos,
então você só precisa adicionar o nome do arquivo na configuração:upstream backend {
zone backend 1m;
state /var/lib/angie/state/<NOME DO ARQUIVO>;
}
s_server
.
O conteúdo do arquivo muda sempre que servidores são modificados na
seção /config/stream/upstreams/
via API de configuração.
O arquivo é lido na inicialização do Angie ou no recarregamento da configuração.state
em um bloco upstream
,
não deve haver diretivas server
nele,
mas uma zona de memória compartilhada (zone) é necessária.zone#
backup_switch (PRO)#
permanent
for definido sem um valor de tempo,
o grupo permanece ativo após a seleção,
e a re-verificação automática de grupos com níveis de prioridade mais baixos não ocorre.
Se time for especificado,
o status ativo do grupo expira após o intervalo especificado,
e o balanceador de carga novamente verifica grupos com níveis de prioridade mais baixos,
retornando a eles se os servidores estiverem funcionando normalmente.upstream media_backend {
server primary1.example.com:1935;
server primary2.example.com:1935;
server reserve1.example.com:1935 backup;
server reserve2.example.com:1935 backup;
backup_switch permanent=2m;
}
feedback (PRO)#
feedback
variable [inverse
] [factor=
number] [account=
condition_variable];upstream
.
Ele ajusta dinamicamente as decisões de balanceamento de carga
multiplicando o peso de cada servidor proxy pela média do valor de feedback,
que muda ao longo do tempo baseado no valor da variable
e está sujeito a uma condição opcional.variable
inverse
e factor
.inverse
factor
90
.90
for especificado, 90% do valor anterior será considerado
e apenas 10% do novo valor.account
""
ou "0"
.account
permite incluí-las
ou até mesmo excluir todo o resto.upstream backend {
zone backend 1m;
feedback $feedback_value factor=80 account=$condition_value;
server backend1.example.com:1935 weight=1;
server backend2.example.com:1935 weight=2;
}
map $protocol $feedback_value {
"TCP" 100;
"UDP" 75;
default 10;
}
map $upstream_probe $condition_value {
"high_priority" "1";
"low_priority" "0";
default "1";
}
high_priority
ou sessões regulares de cliente.hash#
hash $remote_addr;
consistent
for especificado, o método de hash consistente ketama será usado em vez do método acima. O método garante que quando um servidor é adicionado ou removido do grupo, apenas um número mínimo de chaves será remapeado para outros servidores. Usar o método para servidores de cache fornece uma taxa de acerto de cache mais alta. O método é compatível com a biblioteca Perl Cache::Memcached::Fast com o parâmetro ketama_points definido como 160.least_conn#
least_time (PRO)#
least_time
connect
| first_byte
| last_byte
[factor=
number] [account=
condition_variable];connect
first_byte
last_byte
factor
account
""
ou "0"
.account
permite incluí-las
ou até mesmo excluir todo o resto.connect_time
, first_byte_time
,
e last_byte_time
no objeto health
do servidor
entre as métricas upstream na API.random#
two
for especificado, o Angie seleciona aleatoriamente dois servidores e então escolhe um servidor usando o método especificado. O método padrão é least_conn, que passa uma conexão para o servidor com o menor número de conexões ativas.response_time_factor (PRO)#
90
for especificado, 90% do valor anterior será considerado,
e apenas 10% do novo valor. Valores válidos variam de 0 a 99 inclusive.connect_time
(tempo
de estabelecimento de conexão), first_byte_time
(tempo para receber o primeiro
byte da resposta), e last_byte_time
(tempo para receber a resposta
completa) no objeto health
do servidor entre as métricas
upstream na API.sticky#
sticky route
$variable...;sticky learn
zone=
zone create=
$create_var1... lookup=
$lookup_var1... [connect] [norefresh
] [timeout=
time];sticky learn
lookup=
$lookup_var1... remote_action=
uri remote_result=
$remote_var [remote_uri=
uri];sticky
de rotação,
você pode usar a opção drain
(PRO) no bloco server.sticky
deve aparecer após todas as diretivas de método de balanceamento de carga,
caso contrário não funcionará.$route
, mapeado de $ssl_preread_server_name:stream {
map $ssl_preread_server_name $route {
a.example.com a;
b.example.com b;
default "";
}
upstream backend {
server 127.0.0.1:8081 sid=a;
server 127.0.0.1:8082 sid=b;
sticky route $route;
}
server {
listen 127.0.0.1:8080;
ssl_preread on;
proxy_pass backend;
}
}
create
para definir como novos IDs de sessão são gerados,
e lookup
para definir como eles são recuperados.
Múltiplas variáveis podem ser especificadas para cada um.create
não vazia define o ID da sessão,
por exemplo, o nome do servidor backend.zone
.
Se uma sessão não for acessada por timeout
(padrão: 1 hora),
ela é removida.norefresh
para desabilitar este comportamento.lookup
) são roteadas para o servidor correspondente.
Se nenhuma correspondência for encontrada ou o servidor estiver indisponível,
o método de balanceamento normal é usado.connect
para criar a sessão assim que a conexão upstream for estabelecida.
Sem isso, a criação da sessão é adiada até após o processamento ser concluído.
(Para UDP, as sessões são criadas imediatamente após a seleção do servidor.)$rdp_cookie
tanto para lookup quanto para create:stream {
upstream backend {
server 127.0.0.1:3390 sid=a;
server 127.0.0.1:3391 sid=b;
sticky learn lookup=$rdp_cookie create=$rdp_cookie zone=sessions:1m;
}
server {
listen 127.0.0.1:3389;
ssl_preread on;
proxy_pass backend;
}
}
remote_action
e remote_result
.learn
com zone
,
este modo não armazena sessões localmente em cache
e faz uma requisição ao armazenamento remoto para cada conexão.remote_action
deve referenciar um location
dentro do bloco client.
remote_uri
define a URI da requisição (padrão: /
)
e pode incluir variáveis.lookup
não vazia.
Se nenhuma for encontrada, o balanceamento normal é usado.remote_action
) incluindo:sid=
ou um nome de servidor hasheado (variável $sticky_sid)$stream_sticky_sessid
e $stream_sticky_sid
,
permitindo uso direto em cabeçalhos via proxy_set_header.remote_result
)remote_result
,
referenciando variáveis upstream_http_*
criadas pelo Angie
a partir dos cabeçalhos HTTP.http {
client {
location @sticky_client1 {
proxy_set_header X-Sticky-Sessid $stream_sticky_sessid;
proxy_set_header X-Sticky-Sid $stream_sticky_sid;
proxy_set_header X-Sticky-Last $msec;
proxy_pass http://127.0.0.1:8080;
proxy_cache remote;
proxy_cache_valid 200 1d;
proxy_cache_key $scheme$proxy_host$request_uri$stream_sticky_sessid;
}
}
}
stream {
upstream u {
server 127.0.0.1:8081 sid=backend-01;
server 127.0.0.1:8082 sid=backend-02;
sticky learn lookup=$remote_addr
remote_action=@sticky_client1
remote_result=$upstream_http_x_sticky_sid
remote_uri=/foo;
}
server {
listen 127.0.0.1:8080;
proxy_pass u;
}
}
HTTP/1.1 200 OK
...
X-Sticky-Sid: backend-01
X-Session-Info: active
$upstream_http_x_sticky_sid
= backend-01
$upstream_http_x_session_info
= active
$upstream_http_x_sticky_sid
é especificado em remote_result
,
ele é usado para selecionar o sid
correspondente.sticky
considera o estado do servidor upstream:down
ou temporariamente indisponíveis são ignorados.max_conns
são temporariamente ignorados.drain
(PRO) ainda podem ser selecionados se seu sid corresponder.sticky
retomará seu uso.sticky_strict
desabilitado: fallback para balanceamento padrão.sticky_strict on;
: a requisição é rejeitada.zone
usado em sticky
deve ser exclusivo de um único upstream
.
Zonas não podem ser compartilhadas entre múltiplos blocos upstream
.sticky_secret#
route
.
A string pode conter variáveis, por exemplo, $remote_addr
:upstream backend {
server 127.0.0.1:8081 sid=a;
server 127.0.0.1:8082 sid=b;
sticky route $route;
sticky_secret my_secret.$remote_addr;
}
$ echo -n "<VALUE><SALT>" | md5sum
sticky_strict#
Variáveis Integradas#
stream_upstream
suporta as seguintes variáveis integradas:$sticky_sessid
#remote_action
em sticky;
armazena o identificador de sessão inicial obtido de lookup
.$sticky_sid
#remote_action
em sticky;
armazena o identificador do servidor previamente associado com a sessão.sticky_sid
contém o valor do parâmetro sid=
da diretiva server
no bloco upstream, se especificado,
ou o hash MD5 do nome do servidor.$upstream_addr
#$upstream_bytes_received
#$upstream_bytes_sent
#$upstream_connect_time
#$upstream_first_byte_time
#$upstream_session_time
#$upstream_sticky_status
#""
NEW
HIT
MISS