Controle de Cache para páginas WEB

Cache-Control é um cabeçalho HTTP que consiste em um conjunto de configurações que permite com que você especifique como, quando e por quanto tempo um um cache acontecerá.

Quando você visita um website, seu browser copia partes dos componentes desse website para um diretório para que experiência seja mais rápida. Quando você revisita esse site muitas partes do site não são carregadas do servidor web, mas sim do cache que está na sua maquinas, você pode usar o Cache-Control para definir as regas de como esses conteúdo será carregado, como por quanto tempo o browser pode fazer cache, se ele vai fazer cache de algum componente ou algum tipo de arquivo específico.

É importante entender que cache é muito bom para a experiência do usuário final, fazê-lo ter que ir até seu servidor web para todas as requisições pode fazer a experiência com seu produto ser desagradável, mas é muito mais importante você entender o que realmente pode ficar na máquina do usuário e o que deve ser carregado dinamicamente desconsiderando o lado do usuário, afinal, dependendo do seu tipo de conteúdo, uma página mau configurada, um componente mau testado, ou um chat-bot onde precisa existir uma comunicação mais dinâmica pode ser impactado.

Cache-Control: no-cache

no-cache significa que o recurso não pode ser reutilizado sem primeiro ser checado se ele foi alterado ou atualizado em sua origem. Usualmente um cabeçalho ETag é usado para isso.

Cache-Control: no-store

no-store é similar ao no-cache onde o conteúdo não pode ser reutilizado nem cacheado. Entretanto, diferente da outra opção o no-store força que todo o conteúdo seja baixado novamente da fonte, desconsiderando a ETag.

Cache-Control: public

Uma resposta contendo public significa que está autorizado que o cache seja feito por qualquer parte envolvida, não apenas o cliente final, neste caso estamos falando de caches intermediários como proxys, gateways, CDN’s, etc.. Para essa situação é recomendado que seja adicionado o max-age afim de garantir que em algum momento o cache tando to usuário final quanto do intermediário sejam limpos.

Cache-Control: private

A opção private significa que apenas o browser do solicitante pode fazer cache do conteúdo, e os intermediários não devem fazer cache do conteúdo.

Cache-Control: max-age=<seconds>

Esta opção indica ao browser por quanto tempo ele deve considerar o conteúdo daquele cache como passível de utilização, após o termino desse tempo novas requisições devem recarregar todo o conteúdo.

Cache-Control: s-maxage=<seconds>

s-maxage é similar ao max-age. O “s” significa shared e é relevante apenas para os CDNs ou outro cache intermediário. Esta opção sobrescreve o max-age e expires.

Cache-Control: no-transform

Caches intermediários podem, as vezes, alterar o formato ou compressão das imagens para melhorar a performance. O no-transform diz aos intermediários para que não alterem o formato das imagens.

Exemplos de implementação:

Web Pages (HTML)

Para as páginas WEB (HTML) adicione as seguintes tags <meta> nas páginas que você quer que o controle de cache seja diferente do browser (lembrando que o código precisa estar na sessão  <head> da página):

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

.htaccess (Apache)

<IfModule mod_headers.c>
  Header set Cache-Control "no-cache, no-store, must-revalidate"
  Header set Pragma "no-cache"
  Header set Expires 0
</IfModule>

Java Servlet

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);

PHP

header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

ASP

Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate"
Response.addHeader "Pragma", "no-cache"
Response.addHeader "Expires", "0"

ASP.NET

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");

Ruby on Rails

response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
response.headers['Pragma'] = 'no-cache'
response.headers['Expires'] = '0'

Python on Flask

resp.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
resp.headers["Pragma"] = "no-cache"
resp.headers["Expires"] = "0"

Google Go

responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
responseWriter.Header().Set("Pragma", "no-cache")
responseWriter.Header().Set("Expires", "0")

Faça você mesmo – Registrando um Domínio

Para começar essa pequena maratona nada melhor que começar pelo básico.

Vamos registrar um domínio !

Já imagino que você tem alguma coisa em mente… mas antes, vamos para o básico.

Para que serve um domínio?

Um domínio serve para várias coisas, a principal é um endereço humanamente entendível que auxilia pessoas e outros serviços de computador a chegarem em algum lugar/serviço para ter a resposta de alguma coisa, simples assim,,,,

Em outras palavras, é pra ajudar e personalizar a forma com que vão chegar no seu site, ou para você mandar aquele email com um @ diferente dos gratuitos,,, ao invés de decorar um IP para conseguir acessar algum site ou serviço você usa a resolução de nome para ficar mais fácil,,,, Ex. como você chegou aqui? andando? decorando o IP do servidor desse site? você chegou porque digitou https://leka.com.br

Claro que tem uma explicação bem mais técnica do que isso, mas se você chegou até aqui provavelmente não quer saber.

Onde registro um domínio?

Legal, já entendi pra que serve e quero muito ter um domínio,,, mas como fazer?

Primeira coisa é saber se você quer um domínio com o final .br ou não, isso faz uma grande diferença.

Domínios com final .br são administrados pela Registro.br (registro.br), é a entidade governamental responsável pelo registrar (sistema de registros de nomes de domínios, IP, rotas de tráfego, etc.)

Cada país tem direito de registrar o final junto a ICANN e tem seus devidos processos legais que devem ser seguidos para registrar algum domínio com um final diferente como .ca (Canadá) .uk (Inglaterra)

Para domínios .com existem algumas entidades que a câmara de comércio americana homologou para fazer esse tipo de serviço, Ex. Godaddy, Domain.com, etc.,

No Brasil os preços são fixos não importando o domínio. (a título de curiosidade em 09/22 o valor é de R$40/ano)

Fora daqui, ai o valor varia muito dependendo do quanto nobre é o domínio, podendo variar de alguns dólares a milhares ou milhões de dólares)

Para ficar simples vamos usar a Registro.br, simples, nacional e da pra pagar no cartão de crédito.

Como registro um domínio?

Agora que já sabemos onde registra um domínio, vamos para a parte de como registrar um domínio.

O registro de um domínio pode ser feito por uma pessoa física ou jurídica, para a maioria dos domínios .br, salvo os .org.br, .ong.br, puro .br, .b.br,,, (tá tem uma lista dos que você ou não pode registrar) é um processo bem simples.

Para começar você precisa criar uma Entidade (basicamente registrar uma conta), essa conta vai gerenciar as informações de cobrança, serviço de DNS, ser o contato caso o pessoal da Registro.br tenha que falar com você.

Você vai poder delegar partes da administração do domínio para outras Entidades, por exemplo, cobrança uma pessoa específica pra pagar a conta, técnico outra pessoa responsável para administrar o DNS.

Atenção: Se pedir ajuda de alguém, peça para usar seus dados para criar a conta e registrar o domínio, pois no BR a troca de entidades mantenedoras de domínio é extremamente burrocrático !

Criando a conta:

Para criar a conta clique em “ACESSAR CONTA

Ele vai para uma tela de acesso a uma conta já existente, olha mais em baixo e tem um link para “CRIAR CONTA”

Vai aparecer um formulário para ser preenchido, obviamente preencha-o com cuidado e preste muita atenção ao email e a senha que você vai usar.

Após clicar em “CRIAR CONTA” você vai receber um email para ativar sua conta, veja que em nenhum momento escolheu um usuário apenas digitou a senha, a conta de usuário é gerada pelo sistema da Registro.br.

ATENÇÃO !!! NÃO ESQUEÇA ESSE USUÁRIO E SENHA !!! ele é importante para registrar seu domínio e pagar a anuidade !!!

Para mais informações assista esse vídeo: https://www.youtube.com/watch?v=gZRYDxWuYpk

Registrando um Domínio

Para registrar um domínio não é complicado.

Depois que você criou sua conta e entrou no sistema da Registro.br

Agora basicamente é saber se sua criatividade é boa e se você teve a sorte de ser a primeira pessoa a pensar o nome que quer.

Clique em “REGISTRE”

Vai aparecer aquela mesma tela inicia do site deles, onde agora você vai pesquisar pelo domínio que quer registrar.

Caso o domínio que você quiser já tenha dono vai aparecer assim:

Não adianta chorar,,, o primeiro que chega é o primeiro que se serve…

Se você achar um domínio que te interesse e que esteja disponível ele vai aparecer assim:

Você pode registrar quantos domínios quiser, tudo depende do limite do seu cartão de crédito.

Clicando em “REGISTRAR” ele vai para uma segunda onde você vai preencher novamente algumas informações, com o CPF ou CNPJ de quem vai ser o dono desse domínio. Na tela seguinte ele vai trazer algumas informações sobre o cadastro da pessoa que você forneceu o dado na tela anterior e bem lá em baixo tem a caixa de ler e aceitar os itens do contrato e clicar em “REGISTRAR”

Nesse momento o sistema vai fazer algumas checagens sobre o registro do domínio, espere um email com um link para clicar e executar o pagamento, a tela é bem simples e prática, não tem o que dar errado,,, teoricamente,,,, presta atenção pra não fazer merd* !!!

Acabou

Basicamente é isso, você criou uma conta na Registro.br e registrou seu primeiro domínio, parabéns !!!

No próximo post vamos hospedar seu domínio em um servidor de DNS para poder começar a usar ele de verdade, pois nesse momento ele não serve de nada…

Faça você mesmo – 101

Algumas vezes as pessoas me perguntam como eu fiz para registrar meu domínio, onde hospedo o site, como fiz para criar o blog, se é difícil de manter, quanto custa, etc., etc., etc.

Vou dar início a um conjunto de posts para te ajudar desde como registrar um domínio (para chamar de seu), a criação de uma infraestrutura dedicada para hospedar um site wordpress com o mínimo de manutenção necessária, emails e mais algumas coisas que eu achar que sejam legais para dar aquela incrementada.

Para que fique bem,,, mas bem,,, claro: Em algum certo momento haverão custos que SÃO DE SUA INTEIRA RESPOSABILIDADE, não existe filantropia para alguns serviços (se eu achar algum de graça que faça a mesma coisa coloco o link)

Essa página deve funcionar como um índice para esse conteúdo.

Faça você mesmo – Registrando um Domínio

SQL na Caixinha

Que o SQL pode rodar em container já não é novidade tem um tempinho.

A facilidade que isso nos trás para testar recursos, novidades, configurações, bugs, etc. ajudou demais.

Só o trabalho de subir um SO, configurar todo o SO, atualizações do SO, baixar a instalação do SQL, todo o processo de instalação, atualização, configuração já cansa só de lembrar.

Tá certo que com a vantagem na nuvem podemos subir qualquer configuração a qualquer momento, só dependendo do limite do cartão de crédito, mas com o Docker, da pra fazer basicamente a mesma coisa sem precisar de uma conta em alguma nuvem, sem ter que ficar instalando um monte de binário com um monte de biblioteca, não se preocupando se está no patch certo do SO, etc.

Basicamente com duas linhas de comando você consegue “rodar” qualquer SQL Server do 17 até o 22 em qualquer cumulative update que houve nesse meio tempo.

Para começar, instale o Docker Desktop (https://www.docker.com/get-started/);

Após alguns restarts e atualizações você deve ter ele pronto no seu PC.

Agora, no Terminal, PowerShell, CMD digite o comando abaixo:

docker pull mcr.microsoft.com/mssql/server

Espere ele carregar algumas configurações

Em seguida vem a mágica com esse segundo comando:

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=yourStrong(!)Password" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2022-latest

E pronto, basicamente só isso e você vai ter um SQL Server Developer Edition 2022 rodando no seu PC

Claro que tem seus detalhes, nessa configuração simples tudo o que acontece no docker fica dentro do docker, se você apagar o container todas as bases que você criou, registros, etc. serão apagadas, o backup também conta.

Por padrão ele não integra com autenticação windows.

Se você procurar nos serviços ele não aparece listado.

Basicamente para conectar é seu hostname e a porta 1433 com usuário SA e a senha digitada ali em cima.

Caso precise da lista de todas as releases que você pode subir com o Docker a lista encontra-se aqui (https://hub.docker.com/_/microsoft-mssql-server).

AWS – Redshift – Carregar dados S3

A algum tempo atrás fiz um trabalho que teoricamente parecia simples, extrair dados de um banco transacional e mandar para um Redshift para análilse.

Claro que após bater cabeça alguns minutos entendi que imporar dados diretamente para o Redshift iria ser no mínimo conturbado e instável.

Fazendo uma análise das opções vi que a AWS disponibilizou um método muito parecido com o do SQL Server para importar arquivos diretamente para dentro do banco mas claro ao invés de fazer isso através de um servidor, é possível fazer isso através do S3.

A forma mais simples é basicamente:

copy tabela_destino
from 'S3://bucket/arquivo'
iam_role 'arn:aws:iam::01234567890:role/MinhaRegraDoRedshift'

Se o arquivo for muito grande e foi dividido ele tem que terminar com um numeral incremental 1 2 3 4 …

Se o arquivo for compactado, o comando de COPY tem que ser incrementado com GZIP.

Para mais informações tem esse link da AWS abaixo:

https://docs.aws.amazon.com/pt_br/redshift/latest/dg/t_loading-tables-from-s3.html

para monitorar essa importação você pode usar o

https://docs.aws.amazon.com/redshift/latest/dg/r_STV_LOAD_STATE.html

AWS – Redshift – Lock e Block

Por incrível que pareça o Redshift sofre com problemas de Lock e Block da mesma forma que um banco transacional qualquer.

Como qualquer post sobre nuvem, até o momento dessa publicação, o Redshift não tem uma interface que monitora Lock e Block, ela monitora conexões ativas, querys em execução mas não lock e block.

A query para monitorar o Redshift é a seguinte:

select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
from svv_transactions a 
left join (select pid,relation,granted from pg_locks group by 1,2,3) b 
on a.relation=b.relation and a.granted='f' and b.granted='t' 
left join (select * from stv_tbl_perm where slice=0) c 
on a.relation=c.id 
left join pg_class d on a.relation=d.oid
where  a.relation is not null;

e para dar um kill no processo

select pg_terminate_backend(PID);

o resultado deve vir como “1”

No link abaixo tem mais informações:

https://aws.amazon.com/pt/premiumsupport/knowledge-center/prevent-locks-blocking-queries-redshift/

RFC 8482

Com as opções de serviço de nuvem “bombando” freneticamente para quase tudo que temos em TI, e outros serviços, fica fácil de escolher um serviço qualquer e simplesmente clicar em START e começar a usar.

Como bons profissionais, sabemos que por trás desse “START” roda uma imensidão de coisas para fazer esse simples deploy começar a funcionar, mas um recurso que é extremamente utilizado, ainda mais hoje, acaba ficando de lado porque é tão simples que alguns esquecem, o serviço de resolução de nomes, também conhecido como DNS.

Provavelmente 99% do que você usa tanto na internet quanto “em casa” é resolvido por nome, esse blog por exemplo, você chegou aqui pelo endereço de nome, não da pra acessá-lo por IP, seu serviço de email, um site qualquer, aquele endereço no listener do SQL, etc.

Mesmo sendo uma requisição simples em UDP na porta 53, essa requisição gera um trafego de internet, para cada vez que alguém consulta algum endereço, toda uma mágica tem que acontecer, basicamente é assim:

  • A requisição da aplicação é encaminhada para para o SO
  • Essa solicitação passa para o mini-driver de rede e procura no cache para saber se tem alguma coisa em cache para adiantar o serviço, caso não tenha ele…
  • pega a lista dos endereços de DNS cadastrados na interface
  • requisita ao DNS cadastrado a resolução de nome para o endereço solicitado
  • se os servidores cadastrados tiverem em cache o endereço ele devolve a ao requisitante caso não,,,
  • Vão para os ROOT´s cadastrados para iniciar a consulta pública,
  • tudo começa no “.” depois o sufixo que pode ser “com”, “net”, “br”, “ca”, etc…
  • Depois localiza o nome intermediário do domínio, que é o nome em si, e resolve o DNS master e slave
  • conecta no DNS master e slave e resolve o SOA
  • pergunta sobre o RR do endereço em questão e aí a resposta pode variar para um A, MX, AAA, TXT, CNAME, etc.
  • volta com o resultado para o servidor de DNS lá cadastrado na interface, faz o cache pelo TTL, e devolve a resolução do nome para a interface solicitante com o TTL do registro

Basicamente, porque é um pouco mais complexo que isso, esse é o processo feito para cada vez que é requisitada uma resolução de nome, tudo isso em UDP e o mais rápido possível.

E o que a RFC 8482 tem a ver com isso?

Por padrão, quando é feita uma consulta de DNS esse método é direto, um RR para um domínio e apenas isso, mas existe um método de consulta que é o ANY que significa basicamente um traga todas as informações disponíveis do domínio requisitado.

Essas “todas as informações” são compostas de:

  • Nomes do servidores DNS
  • serial
  • refresh da zona
  • retry
  • expiração
  • TTL da zona
  • email do responsável
  • nome do servidor de resposta primário
  • MX
  • text
  • e o IP de resposta para o root

Certo, mas qual o problema?

O volume trafegado é maior, o tempo de conexão com o DNS é maior e o volume de requisições pode afetar o desempenho na experiência, para dar time out de requisição de DNS o serviço pode demorar até 2 segundos para resolver o endereço, imagina isso para uma aplicação onde do total do tempo gasto 2 segundos foram apenas para resolver nome, onde ela vai ter que tentar novamente por houve time-out.

Existe um método de ataque que é o de amplificação de DNS, onde uma onda de requisição ANY sobrecarrega o serviço causando um DDoS e sem DNS sem aplicação.

Na ponta do lápis estamos falando em uma requisição direta requisitar alguma coisa em torno de 44 bytes, enquanto uma requisição ANY (pode variar) mas para uma média dica em 890 bytes.

Não parece muita coisa certo? agora imagina isso para um servidor de DNS respondendo para não apenas suas requisições mas para todos os domínios cadastrados nele, mais replicar para um secundário, mais atualizações vindas de aplicações.

Como evitar requisições ANY?

Basicamente, adicione um RR no DNS do tipo HINFO com alguma informação.

Ex. HINFO RFC8482

quem faz isso?

WikiPedia, CloudFront

AWS – EC2 com SQL

Caso você contrate uma AMI com SQL e precise da mídia de instalação do SQL para qualquer atividade, na unidade C:\ existe um diretório chamado “SQLServerSetup” com os binários para a instalação do SQL Server.

Isso ajuda caso precise trocar o Collation da instância, adicionar feature, reinstalar usando uma instância, adicionar uma instância, etc..

A instalação padrão vem na instância default, collation SQL_Latin1_General_CP1_CI_AS, tempdb nas configurações NNF, sem IFI, basicamente uma instalação NNF.

Aí vem outra pergunta, por que pegar uma imagem da AWS com SQL? por que não usar um RDS?

Bom, a resposta disso é mais com você do que comigo, porque tudo vai depender da necessidade.

AMI – EC2 com SQL Instalado

  • As imagens da AWS com SQL instalado vem em diversos sabores, você escolhe o tamanho da máquina e o tipo de licenciamento STD ou ENT, eles tem developer mas se optar por esse developer você vai pagar um custo pela licença de uma aplicação que pode ser baixada gratuitamente, e ai o preço desse licenciamento do STD ou ENT vai depender do tamanho da máquina que você escolher, a vantagem fica justamente na questão de licenciamento, quem recolhe e paga para a Microsoft é a AWS, você é apenas uma empresa que está usando uma imagem já pré-instalada, então sem stress quando a licenciamento;
  • Toda a administração do ambiente e com você, eles só deixam o SQL instalado e o resto é o trabalho de casa, desde restaurar o banco até todas as rotinas de manutenção.

RDS

  • Basicamente o SQL como serviço
  • você não loga na máquina, não tem nenhum acesso a estrutura onde o SQL está instalado
  • você não é SA nem faz parte da role de Sysadmin
  • você é owner dos seus bancos
  • todas as rotinas de manutenção do SO e algumas do SQL são geridas pela AWS.
  • é uma administração meio a meio

Vou tratar da comparação entre uma AMI e um RDS em outro post.

Ocupação de disco fantasma

Quem nunca foi acionado ou recebeu um alerta de falta de espaço em disco e não fazia ideia de onde estava a ocupação do disco?

Existem várias formas de ocupar espaço no disco e dar dor de cabeça para o administrador Windows, nesse post vou comentar da que, no meu ponto de vista, é a mais chata o diretório do “System Volume Information”.

Quem é esse tal de “System Volume Information”?

  • Esse diretório contém informações sobre a indexação do disco
  • Informação de Quota NTFS
  • Dados do sistema de ponto de restauração e backup usando Windows Server Backup
  • Dados para backup usando algumas ferramentas de backup
  • Se você usa “Shadow copy” cada nova versão de VSS snapshot salva dados nesse diretório
  • etc.

Você não deveria se preocupar com os dados desse diretório, onde a ferramenta que está gerando os dados e versionamentos de arquivos nesse diretório deveriam limpar os dados e tocar a vida, mas como trabalhamos com TI e não necessariamente as ferramentas fazem o que deveriam fazer, vamos fazer o trabalho de identificar e limpar essa estrutura.

De uma forma visual, para saber se você está com problemas com esse diretório, recomento usar uma ferramenta como o “TreeFile Size”, “WizTree”, “DiskUsage”, etc.

Pelo “Windows Explorer” originalmente esse diretório não é exibido, você precisa alterar as configurações de exibição para mostrar arquivo e diretórios ocultos do sistema.

Quando tentar acessar vai receber erro de acesso negado mesmo você sendo o administrador do sistema.

Agora que você já sabe quem é esse diretório, já sabe que ele existe, já viu onde ele está, para calcular o espaço ocupado por ele você vai abrir o prompt de comando em modo administrador e vai digitar:

vssadmin list shadowstorage

Se tiver alguma coisa configurada com o ” System Volume Information” ele deve apresentar um resultado parecido com:

Legal, agora temos informações de quanto o espaço máximo pode ser alocado para os recursos e o quanto está realmente alocado.

Se o valor estiver com configuração “UNBOUNDED” quer dizer que o céu é o limite, ou o espaço total do disco, o que acabar primeiro…

Para exemplificar, vamos colocar o limite para a letra C: em 2GB

vssadmin resize shadowstorage /on=c: /for=c: /maxsize=2GB

Ele vai escrever que redimensionou o espaço para o serviço de shadow copy.

Você pode trocar o /maxsize=XGB para porcentagem também, ai fica /maxsize=10%

Se você cria backups de “system state” o windows também cria essa estrutura na letra C:, para apagar eles você pode rodar:

wbadmin delete systemstatebackup -keepversions:0

Isso deve ser o suficiente para limpar esses diretórios das suas unidades, agora entender por que eles estão sendo alimentados para evitar que isso ocorra novamente? corre atrás do pessoal de backup…