<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Valdeir S.</title>
    <description>The latest articles on DEV Community by Valdeir S. (@valdeirpsr).</description>
    <link>https://dev.to/valdeirpsr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F554452%2F5fd1cb24-2e09-47db-8a09-24f67cbb0784.jpg</url>
      <title>DEV Community: Valdeir S.</title>
      <link>https://dev.to/valdeirpsr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/valdeirpsr"/>
    <language>en</language>
    <item>
      <title>CNPJ Alfanumérico: Implemente a validação do novo CNPJ em seu projeto</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Fri, 23 Jan 2026 13:18:30 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/cnpj-alfanumerico-implemente-a-validacao-do-novo-cnpj-em-seu-projeto-25hg</link>
      <guid>https://dev.to/valdeirpsr/cnpj-alfanumerico-implemente-a-validacao-do-novo-cnpj-em-seu-projeto-25hg</guid>
      <description>&lt;p&gt;Em razão do aumento contínuo do número de empresas e do iminente esgotamento dos CNPJs disponíveis, a Receita Federal do Brasil institui o CNPJ Alfanumérico. A iniciativa tem por objetivo facilitar a identificação de todas as empresas e aprimorar o ambiente de negócios, contribuindo para o desenvolvimento econômico e social do Brasil.&lt;/p&gt;

&lt;p&gt;O CNPJ Alfanumérico será atribuído, a partir de Julho de 2026, exclusivamente a novas inscrições.&lt;/p&gt;




&lt;h1&gt;
  
  
  Formato
&lt;/h1&gt;

&lt;p&gt;O novo formato de CNPJ seguirá com o padrão de 14 caracteres divididos da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhrc97x5nxwwwuyroumr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjhrc97x5nxwwwuyroumr.png" alt="Imagem digital horizontal em estilo de slide com fundo azul escuro, intitulada 'ESTRUTURA DO CNPJ'. Ao centro, o formato do cadastro é decomposto visualmente em três blocos conectados por chaves e setas explicativas. O primeiro bloco exibe 'XX.XXX.XXX', identificado como 'RAIZ' e descrito como valor alfanumérico. O segundo bloco exibe 'YYYY', identificado como 'ORDEM' e também descrito como valor alfanumérico. O terceiro e último bloco exibe 'ZZ', identificado como 'DÍGITO VERIFICADOR', descrito como valor numérico composto por inteiros positivos." width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Cálculo do Dígito Verificador (DV)
&lt;/h1&gt;

&lt;p&gt;Para o cálculo do DV, os valores decimais, contidos na Tabela Código ASCII (Veja abaixo os códigos), serão substituídos pelos valores decimais relativos às letras maiúsculas e atribuídos aos valores numéricos — para cada um deles, subtraído o valor 48 — e alfanuméricos do novo CNPJ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transformação da Raiz e da Ordem
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;CNPJ padrão &lt;code&gt;12.ABC.345/01de&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Substitui as letras minúsculas para maiúsculas: &lt;code&gt;12.ABC.345/01DE&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Substitui cada letra por seu código ASCII e subtrai por 48: &lt;code&gt;12.(65–48)(66–48)(67–48).345/01(68–48)(69–48)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Resultado após substituição e subtração: &lt;code&gt;12.171819.345/012021&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Cálculo do 1º Dígito Verificador
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Atribuição de Pesos
&lt;/h3&gt;

&lt;p&gt;Os valores obtidos após os passos anteriores serão multiplicados por pesos, atribuídos da direita para esquerda, do valor 2 até o valor 9. A partir do 8º caractere será reiniciada a atribuição dos pesos pelo valor 2.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;CNPJ após transformação: &lt;code&gt;1 2 . 17 18 19 . 3 4 5 / 0 1 20 21&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Atribuição dos pesos e cálculo do somatório:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(1*5)+(2*4)+(17*3)+(18*2)+(19*9)+(3*8)+(4*7)+(5*6)+(0*5)+(1*4)+(20*3)+(21*2)
∑ = 459
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cálculo do 1º dígito verificador
&lt;/h2&gt;

&lt;p&gt;Após encontrar o somatório do passo anterior, é necessário encontrar o resto da divisão do valor por 11. Posteriormente, deverá subtrair 11 pelo valor encontrado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X = 11 - MOD(459/11)
X = 11 - 8
X = 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Portanto, o 1º dígito verificador do CNPJ é igual a 3. Agora o CNPJ deverá estar no seguinte formato: “&lt;em&gt;12.ABC.345/01DE-&lt;strong&gt;3&lt;/strong&gt;&lt;/em&gt;"&lt;/p&gt;

&lt;h2&gt;
  
  
  Cálculo do 2º dígito verificador
&lt;/h2&gt;

&lt;p&gt;Para encontrar o 2º DV, basta repetir o processo acima:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96dknwpvrzm4mrugff4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96dknwpvrzm4mrugff4y.png" alt="A imagem) que explica, passo a passo, o cálculo aplicado a um CNPJ com caracteres alfanuméricos. Na parte superior, o CNPJ original é apresentado com 13 posições numeradas, contendo dígitos e letras. Em seguida, o infográfico mostra o “CNPJ Transformado”, onde as letras são convertidas em valores numéricos correspondentes (valores ASCII). Logo abaixo, aparece a linha de “Pesos”, indicando o peso associado a cada posição do CNPJ. Na sequência, cada valor transformado é multiplicado pelo respectivo peso, gerando resultados individuais. Na parte inferior, esses resultados são somados, e o somatório final é destacado visualmente, indicando o valor total igual a 424. O uso de linhas e símbolos reforçam a correspondência entre posições, valores transformados, pesos e resultados.&amp;lt;br&amp;gt;
" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após encontrar o somatório do passo anterior, é necessário encontrar o resto da divisão do valor por 11. Posteriormente, deverá subtrair 11 pelo valor encontrado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X = 11 - MOD(424/11)
X = 11 - 6
X = 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Portanto, o 2º dígito verificador do CNPJ é igual a 5. Agora o CNPJ deverá estar no seguinte formato: “&lt;em&gt;12.ABC.345/01DE-3*&lt;em&gt;5&lt;/em&gt;*&lt;/em&gt;”&lt;/p&gt;




&lt;h1&gt;
  
  
  Implementação em Códigos
&lt;/h1&gt;

&lt;h2&gt;
  
  
  JavaScript
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CNPJ&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;regexCNPJSemDV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;([&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;\d]){14}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;regexRemoveMascara&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;\d]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;tamanhoCNPJSemDV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pesosDV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;valorBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cnpj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;cnpjSemMascara&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cnpj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;regexRemoveMascara&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;regexCNPJSemDV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;tamanhoCNPJSemDV&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
          &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;asciiDigito&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charCodeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;valorBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="nx"&gt;somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;asciiDigito&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pesosDV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
          &lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;asciiDigito&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pesosDV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
      &lt;span class="p"&gt;}&lt;/span&gt; 
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dv1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
      &lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;dv1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;pesosDV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;tamanhoCNPJSemDV&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dv2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;dv1&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;dv2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;dv&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;CNPJ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;12.ABC.345/01de-35&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: True&lt;/span&gt;
&lt;span class="nx"&gt;CNPJ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;12.ABC.345/01DE-35&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: True&lt;/span&gt;
&lt;span class="nx"&gt;CNPJ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;12.ABC.345/01DE-00&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  TypeScript
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CNPJ&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;regexCNPJSemDV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;([&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;\d]){14}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;regexRemoveMascara&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[^&lt;/span&gt;&lt;span class="sr"&gt;A-Z&lt;/span&gt;&lt;span class="se"&gt;\d]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;tamanhoCNPJSemDV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;pesosDV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;valorBase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cnpj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;cnpjSemMascara&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cnpj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;regexRemoveMascara&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;regexCNPJSemDV&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
            &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
            &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tamanhoCNPJSemDV&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
                &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;asciiDigito&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charCodeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valorBase&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nx"&gt;somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;asciiDigito&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pesosDV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
                &lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;asciiDigito&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pesosDV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
            &lt;span class="p"&gt;}&lt;/span&gt; 
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dv1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
            &lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;dv1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pesosDV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tamanhoCNPJSemDV&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dv2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;dv1&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;dv2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;dv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;CNPJ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;12.ABC.345/01de-35&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: True&lt;/span&gt;
&lt;span class="nx"&gt;CNPJ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;12.ABC.345/01DE-35&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: True&lt;/span&gt;
&lt;span class="nx"&gt;CNPJ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;12.ABC.345/01DE-00&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Output: False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  PHP
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CNPJ&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;REGEX_CNPJ_SEM_DV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/^([A-Z\d]){14}$/'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;REGEX_REMOVE_MASCARA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'/[^A-Z\d]/'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;TAMANHO_CNPJ_SEM_DV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;PESOS_DV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;VALOR_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$cnpj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="nv"&gt;$cnpjSemMascara&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;strtoupper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;preg_replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;REGEX_REMOVE_MASCARA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$cnpj&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;preg_match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;REGEX_CNPJ_SEM_DV&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
            &lt;span class="nv"&gt;$somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
            &lt;span class="nv"&gt;$somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TAMANHO_CNPJ_SEM_DV&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
                &lt;span class="nv"&gt;$asciiDigito&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;VALOR_BASE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nv"&gt;$somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$asciiDigito&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PESOS_DV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
                &lt;span class="nv"&gt;$somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$asciiDigito&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PESOS_DV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
            &lt;span class="p"&gt;}&lt;/span&gt; 

            &lt;span class="nv"&gt;$dv1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$somatorioDV1&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
            &lt;span class="nv"&gt;$somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$dv1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PESOS_DV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TAMANHO_CNPJ_SEM_DV&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
            &lt;span class="nv"&gt;$dv2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$somatorioDV2&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
            &lt;span class="nv"&gt;$dv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$dv1&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$dv2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cnpjSemMascara&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;$dv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Testes&lt;/span&gt;
&lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;CNPJ&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'12.ABC.345/01de-35'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: True&lt;/span&gt;
&lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;CNPJ&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'12.ABC.345/01DE-35'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Output: True&lt;/span&gt;
&lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;CNPJ&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;valido&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'12.ABC.345/01DE-00'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// Fatal error: Uncaught AssertionError&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Tabela ASCII
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2s5ep80avweqs44djs52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2s5ep80avweqs44djs52.png" alt="A imagme mostra uma tabela intitulada “Códigos ASCII de A a Z”. A tabela está organizada em duas colunas principais para facilitar a leitura." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;É importante atualizar seu código para que a aplicação quebre a partir de julho/2026.&lt;/p&gt;

&lt;p&gt;Ficou com alguma dúvida ou tem uma sugestão? Deixe nos comentários, que darei uma olhada.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>braziliandevs</category>
      <category>cnpj</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Why can deleted files be recovered?</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Thu, 20 Mar 2025 00:44:09 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/why-can-deleted-files-be-recovered-3gln</link>
      <guid>https://dev.to/valdeirpsr/why-can-deleted-files-be-recovered-3gln</guid>
      <description>&lt;p&gt;Understand how deleted data on SSDs can be recovered and the role of the TRIM command, encryption, and forensic techniques used in digital investigations.&lt;/p&gt;

&lt;h1&gt;
  
  
  Components of an SSD
&lt;/h1&gt;

&lt;p&gt;Solid State Drives (SSDs) are made up of module(s):&lt;/p&gt;

&lt;p&gt;➡️ DRAM (Cache): speeds up read/write operations;&lt;br&gt;
➡️ Nand Memory: allows data storage;&lt;br&gt;
➡️ Controller: Manages all SSD operations&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtfd3lxxcfdtrtogb10n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtfd3lxxcfdtrtogb10n.png" alt="Image of an open SSD. The image shows where the DRAM, NAND memory and controller are located." width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is DRAM?
&lt;/h1&gt;

&lt;p&gt;DRAM is a type of volatile memory that temporarily stores data. It is made up of cells that store bits.&lt;/p&gt;

&lt;p&gt;This DRAM module is used as a cache to temporarily store data being read or written, improving the device’s access speed and efficiency.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Controller’s Role
&lt;/h1&gt;

&lt;p&gt;The SSD controller is a chip that manages data reading and writing to NAND flash memory cells. This component is vital for the device’s performance and durability, and it contains the Flash Translation Layer (FTL).&lt;/p&gt;

&lt;p&gt;The main functions of FTL are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translate commands received from the operating system to flash memory;&lt;/li&gt;
&lt;li&gt;Maintain a mapping between the logical address and the physical address of the data;&lt;/li&gt;
&lt;li&gt;Perform garbage collection on memory blocks; and&lt;/li&gt;
&lt;li&gt;Distribute SSD operations among memory blocks to reduce wear. This function is known as Wear Leveling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  How NAND Memory Works
&lt;/h1&gt;

&lt;p&gt;NAND Memory is a non-volatile memory technology that stores data in memory cells organized in a matrix structure. NAND memory is made up of numerous memory cells that are organized into pages and blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory Cells
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmwfgrxxd7zokx3yczp6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmwfgrxxd7zokx3yczp6.png" alt="Structure in NAND memory" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Storage cells are organized in layers, similar to a ream of A4 paper. Within each cell, there are several blocks responsible for effectively storing file data.&lt;/p&gt;

&lt;p&gt;These components have a limited lifespan. Each time information is created (or modified, or deleted), this lifespan decreases.&lt;/p&gt;

&lt;p&gt;To address this issue, the FTL (Flash Translation Layer) distributes operations evenly, preventing certain blocks from wearing out faster than others.&lt;/p&gt;

&lt;p&gt;The operating system does not have direct access to this part of the SSD; for this, the use of the Flash Translation Layer (FTL) is required, which facilitates integration between them.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why Can Data Be Recovered?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mzumxwxf4xlc455gn8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mzumxwxf4xlc455gn8z.png" alt="Sequence diagram showing how file deletion is done by the SSD controller" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a file is deleted, the operating system signals to the FTL (Flash Translation Layer) that the space used by the file can be reused for another. The FTL marks the spaces as free, but the bits of information remain in the cell until they are overwritten later.&lt;/p&gt;

&lt;p&gt;This strategy, in addition to preventing wear — as already explained — also improves performance. Erasing entire blocks is more efficient than erasing individual cells.&lt;/p&gt;

&lt;p&gt;Therefore, after you delete a file from your SSD, forensic experts can attempt to directly access the memory cells using specific devices to recover the deleted data. An SSD with many gigabytes or terabytes that is lightly used can retain deleted information for years.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to Ensure Permanent Deletion?
&lt;/h1&gt;

&lt;p&gt;When working with personal data (such as contracts, SSH keys, and database backups), you must take specific precautions with files — particularly if your company needs to comply with the General Data Protection Law.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❓ I used the Eraser, BitRaser, Shred apps, etc.
&lt;/h2&gt;

&lt;p&gt;Congratulations!! Some of these apps work on 90s-era HDDs. On SSDs, they still don’t permanently delete the file.&lt;/p&gt;

&lt;p&gt;Back in the early 1990s, computer scientist Peter Gutmann created an algorithm to overwrite empty spaces on HDDs. The goal was to rewrite the same file 35 times to prevent the original content from being recovered. However, this technique does not work on modern storage devices.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❓ How can I securely delete files containing my data, then?
&lt;/h2&gt;

&lt;p&gt;The National Security Agency (NSA) recommends that storage devices be shredded into pieces no larger than 2mm. This is an extreme measure, but there are other alternatives.&lt;/p&gt;

&lt;h1&gt;
  
  
  The TRIM Command
&lt;/h1&gt;

&lt;p&gt;The TRIM command is an instruction sent by the operating system to the SSD, indicating which data blocks are no longer in use and can be erased. Once TRIM is executed, recovering deleted files becomes much more difficult — though not impossible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdv9wbd01q7berq38s7b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdv9wbd01q7berq38s7b.png" alt="Image shows a grid to demonstrate how memory cells are marked as empty, filled, or unused." width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attention!&lt;/strong&gt; Not every SSD and not every operating system supports this instruction.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Software Encryption
&lt;/h1&gt;

&lt;p&gt;Full disk encryption aims to make data access more difficult, ensuring that the information stored on the device is accessible only to authorized users, such as those who have the password, a key file, or a hardware authentication device (like a Yubikey, for example).&lt;/p&gt;

&lt;p&gt;Windows, for instance, uses BitLocker to implement full disk encryption. However, this does not guarantee that the data is completely inviolable.&lt;/p&gt;

&lt;p&gt;The study &lt;a href="https://publications.eai.eu/index.php/ct/article/view/1407" rel="noopener noreferrer"&gt;“Is My Password Strong Enough?: A Study on User Perception in The Developing World”&lt;/a&gt; revealed that many users choose predictable and weak passwords, such as personal information and common patterns. Password reuse is also a significant issue, with 69% of participants admitting to this practice.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hardware Encryption
&lt;/h1&gt;

&lt;p&gt;This is a technique that uses dedicated components, such as encryption controllers and chips, to protect data stored on SSD devices. This approach offers advantages over software encryption, particularly when it comes to the difficulty of recovering data after deletion or destruction of the device. However, the cost of such devices may not be attractive to most people.&lt;/p&gt;

&lt;p&gt;On the market, there are some devices like the IronKey Vault Privacy 80 8TB External SSD, which can cost up to $900; and the ORICO 2TB mSATA SSD for internal use, which can cost $130.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwe3sfrb5i71jbowuzxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwe3sfrb5i71jbowuzxl.png" alt="IronKey Vault Privacy 80 8TB External SSD" width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It’s not a paid post, but it could be 🥲&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;In an increasingly digital world, the protection of sensitive data is a priority. Full disk encryption and the use of commands like TRIM on SSDs are effective tools to ensure that information remains secure against unauthorized access. However, it is important to remember that, even with these security measures, file deletion does not guarantee permanent removal.&lt;/p&gt;

&lt;p&gt;There are secure file deletion techniques that can help mitigate the risk of data recovery, but the only truly secure way to ensure that information cannot be recovered is through the physical destruction of the device, reducing it to particles no larger than 2 mm. This approach ensures that the data cannot be accessed in any way, providing an additional layer of security for critical information. Therefore, when considering data protection, it is essential to adopt a comprehensive approach that includes both encryption and secure device destruction when necessary.&lt;/p&gt;

</description>
      <category>security</category>
      <category>infosec</category>
      <category>cybersecurity</category>
      <category>securityengineering</category>
    </item>
    <item>
      <title>Por que os arquivos excluídos são recuperados?</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Thu, 21 Nov 2024 21:36:57 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/por-que-os-arquivos-sao-recuperados-de-ssds-mesmo-apos-a-exclusao-383m</link>
      <guid>https://dev.to/valdeirpsr/por-que-os-arquivos-sao-recuperados-de-ssds-mesmo-apos-a-exclusao-383m</guid>
      <description>&lt;p&gt;Entenda como dados apagados em SSDs podem ser recuperados, o papel do comando TRIM, criptografia e técnicas forenses usadas em investigações digitais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Componentes de um SSD
&lt;/h2&gt;

&lt;p&gt;Os Solid State Drive (SSD) são formados basicamente por módulo(s) de:&lt;/p&gt;

&lt;p&gt;➡️ DRAM (Cache): acelera as operações de leitura/escrita;&lt;br&gt;
➡️ Nand Memory: permite o armazenamento de dados;&lt;br&gt;
➡️ Controlator (Controller): Gerencia todas as operações do SSD&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcwmequvyazxpiuxgn9vo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcwmequvyazxpiuxgn9vo.png" alt="A imagem mostra o PCB (Printed Circuit Board), em pt-br placa de circuito impresso" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é a DRAM?
&lt;/h2&gt;

&lt;p&gt;A DRAM é um espécie de memória volátil que armazena os dados temporariamente. Ela é composta por células que guarda os bits.&lt;/p&gt;

&lt;p&gt;Esse módulo DRAM é utilizada como um cache para armazenar temporariamente dados que estão sendo lidos ou escritos. Isso melhora a velocidade de acesso e a eficiência do dispositivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  A função do Controlador
&lt;/h2&gt;

&lt;p&gt;O controlador de um SSD é um chip que gerencia a leitura e a gravação de dados nas células de memória flash NAND do SSD. Ele é fundamental para o desempenho e a durabilidade do dispositivo. Nele, está contido o Flash Translation Layer (FTL).&lt;/p&gt;

&lt;p&gt;As principais funções do FTL são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Traduzir os comandos recebidos do sistema operacional para a memória flash;&lt;/li&gt;
&lt;li&gt;Manter um mapeamento entre o endereço lógico e o endereço físico dos dados;&lt;/li&gt;
&lt;li&gt;Realizar o &lt;em&gt;garbage collection&lt;/em&gt; nos blocos de memórias; e&lt;/li&gt;
&lt;li&gt;Distribuir as operações do SSD entre os blocos de memória para reduzir o desgaste. Essa função é conhecida como Wear Leveling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Funcionamento da Memória Nand
&lt;/h2&gt;

&lt;p&gt;A Nand Memory é uma tecnologia de memória não-volátil que armazena dados em células de memória organizadas em uma estrutura de matriz. A memória NAND é composta por diversas células de memórias que são organizadas em páginas e blocos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Células de Memória
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrtzxngvwtb4ql3kby9f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrtzxngvwtb4ql3kby9f.png" alt="A imagem mostra o desenho de uma célula de memória" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As células de armazenamento são organizadas em camadas, semelhantes a uma resma de papel A4. Dentro de cada célula, existem vários blocos que são responsáveis por armazenar efetivamente os dados dos arquivos.&lt;/p&gt;

&lt;p&gt;Esses componentes têm uma vida útil limitada. Cada vez que uma informação é criada (ou alterada, ou excluída), essa vida útil diminui.&lt;/p&gt;

&lt;p&gt;Para resolver esse problema, o FTL distribui as operações de maneira uniforme, evitando que certos blocos se desgastem mais rapidamente do que outros.&lt;/p&gt;

&lt;p&gt;O sistema operacional não possui acesso direto a essa parte do SSD; para isso, é necessário o uso do Flash Translation Layer (FTL), que facilita a integração entre eles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que dados podem ser recuperados?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwvn1fpq6t9wptpwyb42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwvn1fpq6t9wptpwyb42.png" alt="Diagrama que mostra o processo de exclusão de um arquivo" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao excluir um arquivo, o sistema operacional sinaliza para o FTL que o espaço utilizado pelo arquivo pode ser reutilizado por outro. O FTL marca os espaços como livres, mas os bits de informações permanecem na célula até serem sobrescritos posteriormente.&lt;/p&gt;

&lt;p&gt;Essa estratégia, além de evitar o desgaste — como já explicado — também melhora desempenho. Apagar blocos inteiros é mais eficiente que apagar células individualmente.&lt;/p&gt;

&lt;p&gt;Portanto, após você excluir um arquivo do seu SSD, os peritos forenses podem tentar acessar diretamente, usando determinados aparelhos, as células de memória para recuperar os dados excluídos. Um SSD de muitos gigabytes ou terabytes pouco usado pode reter por anos as informações que foram deletadas pelo usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como garantir a exclusão definitiva?
&lt;/h2&gt;

&lt;p&gt;Você que trabalha com dados pessoais (contratos, chaves de SSH, backup de banco de dados etc) tem que tomar algumas precauções com arquivos, principalmente se for uma empresa, que tem que seguir a Lei Geral de Proteção de Dados Pessoais (LGPD).&lt;/p&gt;

&lt;p&gt;🗨️ &lt;strong&gt;🗨️ “Eu usei o aplicativo Eraser, BitRaser, Shred etc.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Parabéns!! Parte desses apps funciona em HD dos anos 90. Em SSD continua não apagando o arquivo definitivamente.&lt;/p&gt;

&lt;p&gt;No inícío nos anos 1990, o cientista da computação Peter Gutmann criou um algoritmo para preenchimento de espaços vazio em HDD. O objetivo era reescrever o mesmo arquivo por 35 vezes para evitar que o conteúdo original fosse recuperado. No entanto, essa técnica não funciona em dispositivos de armazenamento recente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🗨️ Como apagar os arquivos com meus dados pessoais em segurança, então?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A National Security Agency (NSA) recomenda que os dispositivos de armazenamentos sejam triturados em pedaços de até 2mm. Essa é uma medida extrema, mas há outras alternativas.&lt;/p&gt;

&lt;h3&gt;
  
  
  O comando TRIM
&lt;/h3&gt;

&lt;p&gt;O comando TRIM é uma instrução que o sistema operacional envia para o SSD para informar quais blocos de dados não estão mais em uso e podem ser apagados. Após o comando TRIM ser executado em um SSD, a recuperação de um arquivo excluído se torna significativamente mais difícil, mas não impossível.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8lyahyw5fwgqcwxrtv2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff8lyahyw5fwgqcwxrtv2.png" alt="TRIM working on SSD(Belkasoft, 2014)" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atenção!&lt;/strong&gt; Nem todo SSD e nem todo sistema operacional possui suporte à essa instrução.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criptografia de Software
&lt;/h3&gt;

&lt;p&gt;A criptografia total do disco visa dificultar o acesso aos dados, assegurando que as informações armazenadas no dispositivo sejam acessíveis apenas por usuários autorizados, como aqueles que possuem a senha, uma &lt;em&gt;keyfile&lt;/em&gt; ou um hardware de autenticação (como o Yubikey, por exemplo).&lt;/p&gt;

&lt;p&gt;O Windows, por exemplo, utiliza o BitLocker para implementar a criptografia total do disco. No entanto, isso não garante que os dados sejam completamente invioláveis.&lt;/p&gt;

&lt;p&gt;O estudo &lt;a href="https://publications.eai.eu/index.php/ct/article/view/1407" rel="noopener noreferrer"&gt;"Is My Password Strong Enough?: A Study on User Perception in The Developing World"&lt;/a&gt; revelou que muitos usuários escolhem senhas previsíveis e fracas, como informações pessoais e padrões comuns. A reutilização de senhas também é um problema significativo, com 69% dos participantes admitindo essa prática.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criptografia de Hardware
&lt;/h2&gt;

&lt;p&gt;Esta é uma técnica de que utiliza componentes dedicados, como controladores e chips de criptografia, para proteger dados armazenados em dispositivos SSDs. Essa abordagem oferece vantagens em relação à criptografia de software, especialmente no que diz respeito à dificuldade de recuperação de dados após a exclusão ou a destruição do dispositivo. No entanto, o custo do dispositivo pode não ser atrativo para a maioria das pessoas.&lt;/p&gt;

&lt;p&gt;No mercado, há alguns dispositivos como o SSD Externo IronKey Vault Privacy 80 8TB, que pode chegar a custar R$ 18.000,00; e SSD KC600 mSATA 2TB para uso interno, que pode custar R$ 3.000,00&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frshpzrwqdiapz0quglzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frshpzrwqdiapz0quglzy.png" alt="Imagem do SSD Externo IronKey Vault Privacy 80 8TB" width="800" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Não é uma publi post, mas poderia ser 🥲&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Em um mundo cada vez mais digital, a proteção de dados sensíveis é uma prioridade. A criptografia total de discos e o uso de comandos como TRIM em SSDs são ferramentas eficazes para garantir que as informações permaneçam seguras contra acessos não autorizados. No entanto, é importante lembrar que, mesmo com essas medidas de segurança, a exclusão de arquivos não garante sua remoção permanente.&lt;/p&gt;

&lt;p&gt;Existem técnicas de remoção segura de arquivos que podem ajudar a mitigar o risco de recuperação de dados, mas a única forma realmente segura de garantir que as informações não possam ser recuperadas é através da destruição física do dispositivo, reduzindo-o a partículas de até 2 mm. Essa abordagem assegura que os dados não possam ser acessados de forma alguma, proporcionando uma camada adicional de segurança para informações críticas. Portanto, ao considerar a proteção de dados, é essencial adotar uma abordagem abrangente que inclua tanto a criptografia quanto a destruição segura de dispositivos quando necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Post Scriptum
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Este artigo tem caráter educativo, com foco em explicar como dados são gerenciados em SSDs e como você pode proteger sua privacidade.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>security</category>
      <category>braziliandevs</category>
      <category>forense</category>
    </item>
    <item>
      <title>Criando transições com API ViewTransition</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Tue, 08 Aug 2023 12:52:15 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/criando-transicoes-com-api-viewtransition-4afp</link>
      <guid>https://dev.to/valdeirpsr/criando-transicoes-com-api-viewtransition-4afp</guid>
      <description>&lt;p&gt;Nesta postagem falarei sobre uma API muito bacana e que pouca gente está comentando: a View Transitions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No texto há diversos links, clique neles para ter acesso à implementação no browser.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;O que é&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A API ViewTransition foi desenvolvida para tornar mais fácil e eficiente a criação de animações e de efeitos visuais.. Um dos benefícios de usá-la é que ela permite transições mais suaves entre páginas e estados de elementos.&lt;/p&gt;

&lt;p&gt;No Google Chrome 76, foi implementado o sistema &lt;em&gt;Paint Holding&lt;/em&gt;: sistema para corrigir &lt;em&gt;flashes&lt;/em&gt; brancos que acontecia quando o usuário mudava de página e o todo o conteúdo era renderizado (desenhado) na tela. No entanto, algumas mudanças ainda ocorriam de forma abrupta e repentina. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/RGaKOtodscA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Embora a utilização dessa API traga benefícios em termos de animação e transições, é fundamental considerar possíveis problemas de acessibilidade e usabilidade. A composição de dois estados distintos pode causar problemas com elementos &lt;strong&gt;aria-wai&lt;/strong&gt; em leitores de tela.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Criando transições com a nova API&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Para iniciar uma transição, basta executar as modificações do DOM dentro da função &lt;code&gt;document.startViewTransition&lt;/code&gt;. No momento que o DOM do HTML for alterado, o navegador criará, no topo da estrutura HTML, uma árvore de pseudoelementos, que será removida após a conclusão da transição.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startViewTransition&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;your code&amp;gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Árvore de pseudoelementos
&lt;/h2&gt;

&lt;p&gt;Uma vez que o documento captura os estados novo e velho da página ou do elemento a ser modificado, uma estrutura de &lt;a href="https://github.com/chromium/chromium/blob/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc#L1520-L1572"&gt;pseudoelementos&lt;/a&gt; como esta é criada:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;html
|_::view-transition
  ├─ ::view-transition-group(name)
  │  └─ ::view-transition-image-pair(name)
  │     ├─ ::view-transition-old(name)
  │     └─ ::view-transition-new(name)
  └─ …Other groups…

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;A função de cada uma deles:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pseudoelemento&lt;/th&gt;
&lt;th&gt;Descrição&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;::view-transition&lt;/td&gt;
&lt;td&gt;Empilha os grupos de cada elemento que sofrerá transição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;::view-transition-group&lt;/td&gt;
&lt;td&gt;Agrupa os estados dos elementos que sofrerão a transição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;::view-transition-image-pair&lt;/td&gt;
&lt;td&gt;Armazena uma imagem de cada estado: velho e novo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;::view-transition-old&lt;/td&gt;
&lt;td&gt;É o elemento que armazena o estado (uma espécie de screenshot) velho do elemento de transição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;::view-transition-new&lt;/td&gt;
&lt;td&gt;É o elemento que armazena o estado (uma espécie de screenshot) novo, que será atualizado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Por padrão, a transição terá o &lt;a href="https://github.com/chromium/chromium/blob/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/css/transition_animations.css"&gt;efeito de &lt;em&gt;fade&lt;/em&gt;&lt;/a&gt;: quando um elemento se esvaece e outro aparece no lugar.&lt;/p&gt;


&lt;h2&gt;
  
  
  Como as transições funcionam
&lt;/h2&gt;

&lt;p&gt;As etapas de uma transição realizada sem erro ou interrupções são as seguintes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A função &lt;a href="https://github.com/chromium/chromium/blob/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition/view_transition_supplement.cc#L85-L104"&gt;&lt;code&gt;document.startViewTransition(callback)&lt;/code&gt;&lt;/a&gt; é invocada e retorna a interface &lt;a href="https://github.com/chromium/chromium/blob/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition/view_transition.idl"&gt;&lt;code&gt;ViewTransition&lt;/code&gt;&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;O estado atual da página é capturado;&lt;/li&gt;
&lt;li&gt;A renderização é pausada;&lt;/li&gt;
&lt;li&gt;O &lt;em&gt;callback&lt;/em&gt; do passo 1 é executado. Ele é o responsável por realizar as alterações;&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;promise&lt;/em&gt; &lt;a href="https://github.com/chromium/chromium/blob/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition/view_transition.cc#L382-L386"&gt;&lt;code&gt;ViewTransition.updateCallbackbone&lt;/code&gt;&lt;/a&gt; é cumprida. Ela pode ser utilizada para você saber quando a alteração no DOM será atualiada;&lt;/li&gt;
&lt;li&gt;O novo estado da página, após a mudanças no passo 4, é capturado;&lt;/li&gt;
&lt;li&gt;Os pseudoelementos são criados na raiz da página (dentro do &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;O estado do passo 2 é aplicado no pseudoelemento;&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;promise&lt;/em&gt; &lt;a href="https://github.com/chromium/chromium/blob/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition/view_transition.cc#L376-L380"&gt;&lt;code&gt;ViewTransition.ready&lt;/code&gt;&lt;/a&gt; é cumprida. Ela poderá ser usada para identificar quando a transição estará pronta para iniciar (mais abaixo terá um exemplo com ela)&lt;/li&gt;
&lt;li&gt;Ocorre a transição entre os pseudoelementos;&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;promise&lt;/em&gt; &lt;a href="https://github.com/chromium/chromium/blob/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition/view_transition.cc#L370-L374"&gt;&lt;code&gt;ViewTransition.finished&lt;/code&gt;&lt;/a&gt; é cumprida.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Criando uma transição simples&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Vamos começar com uns exemplos bem simples para facilitar o entendimento, né? 👍&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;changePage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Altera o conteúdo sem o uso das transições caso o navegador&lt;/span&gt;
    &lt;span class="c1"&gt;// não suporte a operação&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startViewTransition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;changeContentPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startViewTransition&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;changeContentPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com isso, teremos o seguinte resultado:&lt;/p&gt;


&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/viewtransition---very-simple-transition?previewSize=100&amp;amp;path=index.html" alt="viewtransition---very-simple-transition on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;Olha só, é super fácil! E dá para melhorar ainda mais. Bora colocar uma animação usando CSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;::view-transition-old&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;root&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;90ms&lt;/span&gt; &lt;span class="n"&gt;cubic-bezier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt; &lt;span class="n"&gt;fade-out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="m"&gt;300ms&lt;/span&gt; &lt;span class="n"&gt;cubic-bezier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt; &lt;span class="n"&gt;slide-to-left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;::view-transition-new&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;root&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;210ms&lt;/span&gt; &lt;span class="n"&gt;cubic-bezier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="m"&gt;90ms&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt; &lt;span class="n"&gt;fade-in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="m"&gt;300ms&lt;/span&gt; &lt;span class="n"&gt;cubic-bezier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt; &lt;span class="n"&gt;slide-from-right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fade-in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fade-out&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;slide-from-right&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;slide-to-left&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;translateX&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;-30px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Eis o novo resultado:&lt;/p&gt;


&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/viewtransition---simple?previewSize=100&amp;amp;path=index.html" alt="viewtransition---simple on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;Não é tudo. Você tem liberdade para escolher quais elementos sofrerão a transição. 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  Criando transição com múltiplos elementos
&lt;/h2&gt;

&lt;p&gt;A criação entre dois elementos segue o mesmo padrão que os exemplos anteriores. No entanto, para fazer esta transição, você precisa nomear os elementos com CSS, usando a propriedade: &lt;code&gt;view-transition-name&lt;/code&gt;. Assim, o navegador criará um novo grupo de pseudoelementos que mover-se-ão de uma posição para outra. Quer saber mais? Olha esse exemplo que legal.&lt;/p&gt;


&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/viewtransition---multiple-elements?previewSize=100&amp;amp;path=index.html" alt="viewtransition---multiple-elements on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Verifique que nomeamos os três elementos que sofreram a transição&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#header-menu&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;view-transition-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;header-menu&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;#first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;view-transition-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;el-first&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;#second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;view-transition-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;el-second&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;E também alteramos o modo de transição dos elementos &lt;code&gt;#first&lt;/code&gt; e &lt;code&gt;#second&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;::view-transition-old&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;el-first&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scale-old&lt;/span&gt; &lt;span class="m"&gt;3s&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nd"&gt;::view-transition-new&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;el-first&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scale-new&lt;/span&gt; &lt;span class="m"&gt;3s&lt;/span&gt; &lt;span class="nb"&gt;both&lt;/span&gt; &lt;span class="n"&gt;ease-in-out&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* --------------------------------------------------- */&lt;/span&gt;

&lt;span class="nd"&gt;::view-transition-old&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;el-second&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;back-in-up&lt;/span&gt; &lt;span class="m"&gt;3s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nd"&gt;::view-transition-new&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;el-second&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;back-in-down&lt;/span&gt; &lt;span class="m"&gt;3s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Bem legal, né? Às vezes, precisamos lidar com animações mais complexas, então é legal se preocupar com o &lt;em&gt;debug.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Debugando transições&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Nem todos gostam de fazer testes, mas é necessário😁&lt;/p&gt;

&lt;p&gt;Nesta seção, aprenderemos como debugar as animações CSS em seu site.&lt;/p&gt;

&lt;p&gt;Para isso, basta abrir o &lt;em&gt;DevTools&lt;/em&gt; (F12) e escolher a aba "&lt;em&gt;Animations&lt;/em&gt;" para ter acesso a animações do seu site. Clicando no botão "&lt;em&gt;pause&lt;/em&gt;", você consegue parar a transição, verificar as propriedades, tentar umas novas modificações.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TigPu7sXwXI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Bem simples. Você também poderá verificar performance e emular outros dispositivos, redução de animação etc.&lt;/p&gt;


&lt;h2&gt;
  
  
  Criando uma transição entre páginas (SPA - Single Page Application)
&lt;/h2&gt;

&lt;p&gt;Você pode mudar de página ou documento com a mesma facilidade. Mas atenção: esse método é exclusivo para SPA (pelo menos, por enquanto).&lt;/p&gt;

&lt;p&gt;Segue um exemplo maroto (funcionará apenas com os nomes &lt;em&gt;Renata&lt;/em&gt; e &lt;em&gt;Pâmela&lt;/em&gt;).&lt;/p&gt;


&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/viewtransition---full?previewSize=100&amp;amp;path=index.html" alt="viewtransition---full on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;Esse ficou legal, mas vamos aos comentários de alguns trechos do código e descobrir mais?&lt;/p&gt;

&lt;p&gt;Neste evento, toda a navegação do site será interceptada para capturamos a URL atual e a de destino. Será importante para nomearmos os elementos da página inicial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;navigation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;navigate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;toUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;origin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fromUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;intercept&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;onLinkNavigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Esse trecho é opcional. Você pode trocá-lo por uma função qualquer e utilizar o evento &lt;code&gt;onclick&lt;/code&gt; nos elementos do tipo &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a"&gt;Anchor&lt;/a&gt; para invocá-la.&lt;/p&gt;

&lt;p&gt;Nesta etapa, o conteúdo da página de destino será capturado com a função &lt;code&gt;getPage&lt;/code&gt; (que utiliza a API &lt;code&gt;fetch&lt;/code&gt; para realizar a requisição)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;onLinkNavigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;getPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ainda no &lt;code&gt;onLinkNavigate&lt;/code&gt;, temos o código abaixo para capturar o *&lt;strong&gt;&lt;em&gt;card&lt;/em&gt;&lt;/strong&gt;* da dançarina escolhida e nomear os elementos &lt;em&gt;html&lt;/em&gt; corretamente. A nomeação durante a execução é necessária, pois &lt;a href="https://github.com/chromium/chromium/blob/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc#L564-L580"&gt;não é possível ter dois ou mais elementos&lt;/a&gt; com o mesmo &lt;code&gt;view-transition-name&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * @param {{ personImage: HTMLImageElement, personName: HTMLDivElement }} elementsTarget
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;defineViewTransitionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;personImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;person-image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;personName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;person-name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;onLinkNavigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dancers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;elementsTarget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getTargetElements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;defineViewTransitionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após os elementos serem identificados e nomeados, iniciamos a substituição de todo o conteúdo &lt;code&gt;body&lt;/code&gt; antigo pela nova página.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;onLinkNavigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;...&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startViewTransition&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="cm"&gt;/**
             * Se a requisição for de /dancers/* para /index.html
             * então nomearemos o card da dançarina
             */&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fromUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dancers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;elementsTarget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;getTargetElements&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fromUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;defineViewTransitionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;finished&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;personImage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;person-image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;elementsTarget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;personName&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;person-name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Após a conclusão da transição, removeremos as classes que definem a propriedade &lt;code&gt;view-transition-name&lt;/code&gt; para evitar duplicidade.&lt;/p&gt;

&lt;p&gt;Simples, né? 💁&lt;/p&gt;

&lt;p&gt;Mas podemos fazer muito mais.&lt;/p&gt;


&lt;h2&gt;
  
  
  Criando transições com o javascript 😯
&lt;/h2&gt;

&lt;p&gt;Já acabou, Jéssica?? Nops!!!&lt;/p&gt;

&lt;p&gt;Neste último exemplo, veremos como fazer uma animação usando Javascript.&lt;/p&gt;


&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/viewtransition---animation-with-javascript?previewSize=100&amp;amp;path=index.html" alt="viewtransition---animation-with-javascript on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;Como vimos anteriormente, a &lt;em&gt;promise&lt;/em&gt; &lt;code&gt;transition.ready&lt;/code&gt; será cumprida quando a transição estiver pronta para começar. Nela, adicionamos a animação personalizada. É importante executar a transição nesta &lt;em&gt;promise&lt;/em&gt;, pois é o momento que o browser capturou os dois estados necessários (o novo e o velho) e fez a composição.&lt;/p&gt;

&lt;p&gt;No exemplo acima, usamos a API nativa &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/animate"&gt;Element.animate&lt;/a&gt;, porque ela dá o suporte necessário para pseudoelementos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rotate(0) scale(1)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rotate(360deg) scale(0)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;easing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cubic-bezier(0.68,-0.55,0.27,1.55)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pseudoElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;::view-transition-old(image)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;documentElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;clipPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`circle(0 at 100px 100px)`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`circle(200px at 100px 100px)`&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;easing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ease-in&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pseudoElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;::view-transition-new(image)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Trabalhando com frameworks 💁
&lt;/h2&gt;

&lt;p&gt;Caso você trabalhe com algum framework front-end, é possível também utilizar o &lt;code&gt;startViewTransition&lt;/code&gt;. Abaixo segue alguns exemplos com alguns deles.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;Vue JS&lt;/dt&gt;
  &lt;dd&gt;A chave aqui é `nextTick`, que cumpre a promise uma vez que o DOM foi atualizado. &lt;a href="https://bit.ly/44Wpgwr"&gt;Conferir um exemplo&lt;/a&gt;.&lt;/dd&gt;

  &lt;dt&gt;Svelte&lt;/dt&gt;
  &lt;dd&gt;Muito semelhante ao Vue, mas o método para aguardar a próxima mudança é `tick`. &lt;a href="https://svelte.dev/repl/84cffc3241514c1581bf951bdf818def?version=3.55.1"&gt;Conferir um exemplo&lt;/a&gt;.&lt;/dd&gt;

 &lt;dt&gt;Lit&lt;/dt&gt;
 &lt;dd&gt;A chave aqui é a promessa `this.updateComplete`, que cumpre a promise uma vez que o DOM foi atualizado. &lt;a href="https://shorturl.at/kCPU7"&gt;Conferir um exemplo&lt;/a&gt;.&lt;/dd&gt;

 &lt;dt&gt;Angular&lt;/dt&gt;
 &lt;dd&gt;Utilize `applicationRef.tick`. &lt;a href="https://stackblitz.com/edit/angular-bp4pvy?file=src%2Fmain.ts"&gt;Conferir um exemplo&lt;/a&gt;.&lt;/dd&gt;

 &lt;dt&gt;React&lt;/dt&gt;
 &lt;dd&gt;Utilize `flushSync`, porém tome cuidado com várias promises retornadas. &lt;a href="https://codesandbox.io/s/nervous-mclaren-j8v8y0?file=/src/App.tsx"&gt;Conferir um exemplo&lt;/a&gt;.&lt;/dd&gt;
&lt;/dl&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Aplicando interfaces no Typescript 😎&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Como é um recurso recente (hoje 2023-08-03), a maioria dos editores não reconhecem a API. Então, caso você utilize o Typescript, basta adicionar o código abaixo em seu &lt;code&gt;global.d.ts&lt;/code&gt; (ou informe o arquivo de tipo em &lt;code&gt;compilerOptions.typeRoots&lt;/code&gt; no &lt;em&gt;tsconfig.json&lt;/em&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ViewTransition&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/**
   * A promise that fulfills when the promise returned by updateCallback fulfills,
     * or rejects when it rejects.
   */&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;updateCallbackDone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="cm"&gt;/**
   * A promise that fulfills once the pseudo-elements for the transition are created,
   * and the animation is about to start.
   * It rejects if the transition cannot begin. This can be due to misconfiguration,
   * such as duplicate 'view-transition-name’s, or if updateCallbackDone returns a
     * rejected promise.
   * The point that ready fulfills is the ideal opportunity to animate the view
     * transition pseudo-elements with the Web Animation API.
   */&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="cm"&gt;/**
   * A promise that fulfills once the end state is fully visible and interactive to
     * the user.
   * It only rejects if updateCallback returns a rejected promise, as this indicates
     * the end state wasn’t created.
   * Otherwise, if a transition fails to begin, or is skipped (by skipTransition()),
   * the end state is still reached, so finished fulfills.
   */&lt;/span&gt;
  &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;finished&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

  &lt;span class="cm"&gt;/**
   * Immediately finish the transition, or prevent it starting.
   * This never prevents updateCallback being called, as the DOM change
   * is independent of the transition
   * If this is called before ready resolves, ready will reject.
   * If finished hasn’t resolved, it will fulfill or reject along with
   * updateCallbackDone.
   */&lt;/span&gt;
  &lt;span class="nx"&gt;skipTransition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UpdateCallback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="nb"&gt;global&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Document&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;startViewTransition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updateCallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UpdateCallback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ViewTransition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Compatibilidade
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kpz2xPZb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://caniuse.bitsofco.de/image/view-transitions.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kpz2xPZb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://caniuse.bitsofco.de/image/view-transitions.png" alt="" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;CHROMIUM. Blink: renderer/core/view_transition. GitHub, c2021. Disponível em: &amp;lt;&lt;a href="https://github.com/chromium/chromium/tree/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition"&gt;https://github.com/chromium/chromium/tree/4817833c534a72d50606e5f97d1e003f5885494d/third_party/blink/renderer/core/view_transition&lt;/a&gt;&amp;gt;. Acesso em: 05 ago. 2023.&lt;/p&gt;

&lt;p&gt;W3C. CSS View Transitions Module Level 1. W3C, 2012. Disponível em: &amp;lt;&lt;a href="https://www.w3.org/TR/css-view-transitions-1/"&gt;https://www.w3.org/TR/css-view-transitions-1/&lt;/a&gt;&amp;gt;. Acesso em: 05 ago. 2023.&lt;/p&gt;

&lt;p&gt;WICG. View Transitions Explainer. GitHub, 2021. Disponível em: &amp;lt;&lt;a href="https://github.com/WICG/view-transitions/blob/main/explainer.md"&gt;https://github.com/WICG/view-transitions/blob/main/explainer.md&lt;/a&gt;&amp;gt;. Acesso em: 05 ago. 2023.&lt;/p&gt;

&lt;p&gt;CAN I USE. View Transitions. Can I Use, [s.d.]. Disponível em: &amp;lt;&lt;a href="https://caniuse.com/view-transitions"&gt;https://caniuse.com/view-transitions&lt;/a&gt;&amp;gt;. Acesso em: 05 ago. 2023.&lt;/p&gt;




&lt;h2&gt;
  
  
  FIM!! 🎆
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TPos3mp8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pgux7lz0yqbmovdfkohg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TPos3mp8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pgux7lz0yqbmovdfkohg.gif" alt="Homem soltando fogos de artifício porque que você chegou ao fim" width="364" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Curtiu?? Não curtiu?? Tem alguma dúvida sobre o assunto?&lt;/p&gt;

&lt;p&gt;Deixe um comentário para eu saber mais.&lt;/p&gt;

&lt;p&gt;Espero que isso tenha sido útil para você. 😊&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>css</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Série Nginx 6#: Controlando acesso</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Fri, 01 Oct 2021 16:59:08 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/serie-nginx-6-controlando-acesso-47bd</link>
      <guid>https://dev.to/valdeirpsr/serie-nginx-6-controlando-acesso-47bd</guid>
      <description>&lt;p&gt;Opa!! Vamos avançar em nossa série. Hoje aprenderemos como controlar o acesso com filtro de IP e autenticação interna.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bloqueando acessos
&lt;/h2&gt;

&lt;p&gt;Você pode bloquear um IP (ou faixa de IP) utilizando a diretiva &lt;code&gt;deny&lt;/code&gt;. Além do IP, é possível também utilizar o CIDR para bloquear requisições.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: deny address | CIDR | unix: | all;
# Default: —
# Context: http, server, location, limit_except
#
# Bloqueia um IP específico
&lt;/span&gt;&lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="m"&gt;127&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;;

&lt;span class="c"&gt;# Bloqueia faixa 142.250.218.0 - 142.250.218.255
&lt;/span&gt;&lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="m"&gt;142&lt;/span&gt;.&lt;span class="m"&gt;250&lt;/span&gt;.&lt;span class="m"&gt;218&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;/&lt;span class="m"&gt;24&lt;/span&gt;;

&lt;span class="c"&gt;# Bloqueia uma faixa de IP do tipo IPV6
&lt;/span&gt;&lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="m"&gt;2001&lt;/span&gt;:&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;::/&lt;span class="m"&gt;32&lt;/span&gt;;

&lt;span class="c"&gt;# Bloqueia todos os acessos
&lt;/span&gt;&lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Bloqueando acesso a arquivos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Com o &lt;code&gt;deny&lt;/code&gt;, também é possível bloquear acesso aos arquivos ou a um diretório. Basta utilizar a diretiva dentro do contexto &lt;code&gt;location&lt;/code&gt;, por exemplo.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; ~ \.(&lt;span class="n"&gt;log&lt;/span&gt;|&lt;span class="n"&gt;zip&lt;/span&gt;|&lt;span class="n"&gt;tar&lt;/span&gt;|&lt;span class="n"&gt;gz&lt;/span&gt;|&lt;span class="n"&gt;htaccess&lt;/span&gt;|&lt;span class="n"&gt;bkp&lt;/span&gt;|&lt;span class="n"&gt;old&lt;/span&gt;|&lt;span class="n"&gt;txt&lt;/span&gt;)$ {
    &lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Permitindo acesso a determinados IPs
&lt;/h2&gt;

&lt;p&gt;Além de bloquear, você pode apenas permitir determinados IPs ou faixa de ips. Isso é útil para limitar o acesso a determinada rede.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: allow address | CIDR | unix: | all;
# Default: —
# Context: http, server, location, limit_except
#
# Bloqueia acesso local
&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt; &lt;span class="m"&gt;127&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;;

&lt;span class="c"&gt;# Permite acesso da faixa de IP 162.158.214.0 - 162.158.214.255
&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt; &lt;span class="m"&gt;162&lt;/span&gt;.&lt;span class="m"&gt;158&lt;/span&gt;.&lt;span class="m"&gt;214&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;/&lt;span class="m"&gt;24&lt;/span&gt;;

&lt;span class="c"&gt;# Permite acesso a uma faixa IPV6
&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt; &lt;span class="m"&gt;2001&lt;/span&gt;:&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;::/&lt;span class="m"&gt;32&lt;/span&gt;;

&lt;span class="c"&gt;# Bloqueia todos os acessos
&lt;/span&gt;&lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Não faz sentido usar apenas &lt;code&gt;allow&lt;/code&gt;, visto que — por padrão — todos os acessos são permitidos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Resolvendo problema com CDN&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quando você utiliza um serviço como CloudFlare (ou similar), eles recebem a requisição e a repassam para seu servidor. Isso faz com que o IP recebido pelo Nginx não seja o real, o do cliente; mas sim o IP do servidor da CloudFlare. Como resolver isso?&lt;/p&gt;

&lt;p&gt;Para resolver, você precisa configurar duas diretivas: &lt;code&gt;set_real_ip_from&lt;/code&gt; e &lt;code&gt;real_ip_header&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na primeira, você definirá os endereços de IP confiável (&lt;em&gt;True-Client-IP&lt;/em&gt;) que sabem o IP do cliente, ou seja, você configurará com os IPs da CloudFlare.&lt;/p&gt;

&lt;p&gt;Na segunda, você informará o &lt;em&gt;header&lt;/em&gt; que contém o endereço real do cliente. Normalmente é &lt;em&gt;CF-Connecting-IP&lt;/em&gt; ou &lt;em&gt;X-Forwarded-For&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Como esses dados são mutáveis, deixarei o &lt;em&gt;link&lt;/em&gt; com as configurações atuais.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://support.cloudflare.com/hc/en-us/articles/200170786-Restoring-original-visitor-IPs#R8FGMtY5b3k5cez"&gt;CloudFlare&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://ip-ranges.amazonaws.com/ip-ranges.json"&gt;CloudFront&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.fastly.com/signalsciences/faq/real-client-ip-addresses/#nginx---http_realip_module"&gt;Fastly&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.sucuri.net/website-firewall/troubleshooting/same-ip-for-all-users/#nginx"&gt;Sucuri&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Auth Request
&lt;/h2&gt;

&lt;p&gt;O sistema de subautorização do Nginx funciona através do módulo &lt;code&gt;ngx_http_auth_request_module&lt;/code&gt;. Ele permite que o desenvolvedor crie um sistema de autorização baseado em sub-requisições (requisições internas).&lt;/p&gt;

&lt;p&gt;Essas requisições devem retornar o &lt;em&gt;status code&lt;/em&gt; 200 (2xx), 401 ou 403. A depender do código de &lt;em&gt;status&lt;/em&gt; retornado, o Nginx liberará (ou não) a solicitação. Caso a autorização seja negada, o Nginx retornará o erro para o usuário.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verificar suporte&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de começar, verifique se o Nginx foi compilado com o suporte ao módulo.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nginx &lt;span class="nt"&gt;-V&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;--color&lt;/span&gt; http_auth_request_module
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Se não tiver configurado, compile o Nginx com a &lt;em&gt;flag&lt;/em&gt; &lt;code&gt;--with-http_auth_request_module&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: É importante que você saiba compilar o código fonte do Nginx. Caso não tenha esse conhecimento, acesse a postagem &lt;a href="https://dev.to/valdeirpsr/serie-nginx-2-compilando-o-nginx-3f9o"&gt;Série Nginx #2: Compilando o Nginx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Configurando rota&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para configurar a autorização, utilizaremos a diretiva &lt;code&gt;auth_request&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iremos configurar a autorização para uma rota, mas você pode configurar para um servidor virtual (no contexto &lt;code&gt;server&lt;/code&gt;) ou todos os sites (no contexto &lt;code&gt;http&lt;/code&gt;), beleza? 👍&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="c"&gt;# Outras configurações
&lt;/span&gt;
    &lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;upload&lt;/span&gt; {
        &lt;span class="c"&gt;# Syntax: auth_request uri | off;
&lt;/span&gt;        &lt;span class="c"&gt;# Default: auth_request off;
&lt;/span&gt;        &lt;span class="c"&gt;# Context: http, server, location
&lt;/span&gt;        &lt;span class="c"&gt;#
&lt;/span&gt;        &lt;span class="n"&gt;auth_request&lt;/span&gt; /&lt;span class="n"&gt;auth_upload&lt;/span&gt;;

        &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;upload&lt;/span&gt;-&lt;span class="n"&gt;server&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Perfeito! Agora vamos configurar a localização de autorização.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; = /&lt;span class="n"&gt;auth_upload&lt;/span&gt; {
    &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;auth&lt;/span&gt;-&lt;span class="n"&gt;server&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com isso já conseguimos realizar a validação. Lembrando que o &lt;em&gt;status code&lt;/em&gt; do &lt;em&gt;proxy&lt;/em&gt; &lt;code&gt;http://auth-server&lt;/code&gt; &lt;strong&gt;deve&lt;/strong&gt; retornar 2xx, 401 ou 403.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bloqueando acesso direto&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Em alguns sistemas, você pode querer bloquear o acesso direto à URL ou ao servidor de autenticação ou autorização. O Nginx oferece esse suporte com a diretiva &lt;code&gt;internal&lt;/code&gt;, ou seja, o Nginx impedirá que o usuário acesse a URL &lt;code&gt;/auth_upload&lt;/code&gt; e apenas ele fará o acesso.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; = /&lt;span class="n"&gt;auth_upload&lt;/span&gt; {
    &lt;span class="n"&gt;internal&lt;/span&gt;;

    &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;auth&lt;/span&gt;-&lt;span class="n"&gt;server&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No nosso exemplo, utilizarei os dados enviados na requisição POST para realizar a verificação da autorização, por isso é necessário configurar as diretivas &lt;code&gt;proxy_pass_request_body&lt;/code&gt; e &lt;code&gt;proxy_method&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Caso seu sistema de autorização não faça uso dos dados enviados no corpo da requisição, ignore-a.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; = /&lt;span class="n"&gt;auth_upload&lt;/span&gt; {
    &lt;span class="n"&gt;internal&lt;/span&gt;;

    &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;auth&lt;/span&gt;-&lt;span class="n"&gt;server&lt;/span&gt;;
    &lt;span class="n"&gt;proxy_pass_request_body&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;;
    &lt;span class="n"&gt;proxy_method&lt;/span&gt; &lt;span class="n"&gt;POST&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pronto! Com isso, o nosso sistema deverá funcionar corretamente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código para verificação da autorização&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O código foi feito em Node e o servidor iniciado com Docker. Não explicarei o funcionamento porque a ideia é focar apenas no servidor web.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Utilizei o &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAuthentication.html"&gt;padrão adotado pelo S3&lt;/a&gt;, da AWS, para realizar a autorização ou negação. Ele basicamente verificará o método da requisição, &lt;em&gt;content type&lt;/em&gt;, &lt;em&gt;hash&lt;/em&gt; do arquivo e a data de envio e depois comparará com o &lt;em&gt;hash&lt;/em&gt; enviado no &lt;em&gt;header Authorization&lt;/em&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Realizando Upload&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"2HmVrZRYii8ZWrfIAFHLmlCYtqqv5nSASLCzZMHUg6M5vRlarfjumNDz9ZR5NHoY"&lt;/span&gt;

&lt;span class="nv"&gt;date_req&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-en&lt;/span&gt; &lt;span class="s2"&gt;"POST&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;md5sum &lt;/span&gt;anitta.mp4 | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;video/mp4&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="nv"&gt;$date_req&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | openssl sha1 &lt;span class="nt"&gt;-hmac&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;user-key&amp;gt;"&lt;/span&gt; &lt;span class="nt"&gt;-hex&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

http &lt;span class="nt"&gt;--form&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  php.valdeirpsr.dev/upload &lt;span class="se"&gt;\&lt;/span&gt;
  Authorization:&lt;span class="s2"&gt;"AWS &lt;/span&gt;&lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$hash&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  Date:&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$date_req&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  file@anitta.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Como é feito o upload&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O arquivo é enviado para a URL &lt;code&gt;/upload&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;O Nginx recebe a requisição;&lt;/li&gt;
&lt;li&gt;O Nginx realiza uma subrequisição para autorização em &lt;code&gt;/auth_upload&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;O servidor &lt;code&gt;http://auth-server&lt;/code&gt; realiza a validação e retorna o &lt;em&gt;status code&lt;/em&gt; &lt;em&gt;200&lt;/em&gt; ou &lt;em&gt;401&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;O Nginx recebe a resposta da subrequisição e verifica o código retornado;&lt;/li&gt;
&lt;li&gt;Se o código for 401 ou 403, o Nginx retorna um erro para o cliente; caso retorne 2xx, prossegue com a requisição de upload.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;É isso aew, meu povo! Finalizamos mais uma etapa da série de Nginx. Caso tenham dúvidas e/ou sugestões, basta deixarem o comentário. Beleza?&lt;/p&gt;

&lt;p&gt;Até a próxima!&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>security</category>
      <category>webdev</category>
      <category>webserver</category>
    </item>
    <item>
      <title>Série Nginx #5: Trabalhando com Geolocalização por IP</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Thu, 23 Sep 2021 20:00:51 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/serie-nginx-5-trabalhando-com-geolocalizacao-por-ip-314a</link>
      <guid>https://dev.to/valdeirpsr/serie-nginx-5-trabalhando-com-geolocalizacao-por-ip-314a</guid>
      <description>&lt;p&gt;Opa!!! Vamos aprender a configurar nosso primeiro módulo externo. 🤓🤓&lt;/p&gt;

&lt;p&gt;Aprenderemos como realizar bloqueio e balancear requisições conforme a região do usuário.&lt;/p&gt;

&lt;p&gt;Para realizar o bloqueio por cidade ou país, utilizaremos o módulo &lt;a href="https://github.com/leev/ngx_http_geoip2_module"&gt;&lt;code&gt;GeoIP&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Caso você não saiba instalar um módulo, acesse o capítulo &lt;a href="https://dev.to/valdeirpsr/serie-nginx-4-instalando-modulos-de-terceiros-hjh"&gt;Série Nginx #4: Instalando módulos de terceiros&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Após instalar o módulo, carregue-o no arquivo de configuração do Nginx.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"load_module modules-available/ngx_http_geoip2_module.so;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/nginx/modules-enabled/geoip2.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  GeoIP2 Databases
&lt;/h2&gt;

&lt;p&gt;Agora é necessário baixar os arquivos &lt;code&gt;.mmdb&lt;/code&gt;. Eles possuem as configurações e regras necessárias para o módulo. Para isso, acesse o site &lt;a href="https://dev.maxmind.com/geoip/geolite2-free-geolocation-data"&gt;https://dev.maxmind.com/geoip/geolite2-free-geolocation-data&lt;/a&gt; e realize o download. Após baixá-los, extraia em uma pasta como &lt;code&gt;/etc/nginx/GeoIP2&lt;/code&gt;, por exemplo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configurando o módulo
&lt;/h2&gt;

&lt;p&gt;Para configurar é simples. Iremos carregar o arquivo baixado e criar nossas variáveis que terão os valores de código de país, cidade e/ou continente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http {
    ...

    # Cria variáveis relacionadas ao país de acesso
    #
    geoip2 GeoIP2/GeoLite2-Country.mmdb {
        $geoip2_data_continent_code   default="NU" continent code;
        $geoip2_data_country_iso_code country iso_code;
        $geoip2_metadata_country_build metadata build_epoch;
    }

    # Cria variáveis relacionadas à cidade de acesso
    #
    geoip2 GeoIP2/GeoLite2-City.mmdb {
        $geoip2_data_city_name   city names en;
        $geoip2_data_postal_code postal code;
        $geoip2_data_latitude    location latitude;
        $geoip2_data_longitude   location longitude;
        $geoip2_data_state_name  subdivisions 0 names en;
        $geoip2_data_state_code  subdivisions 0 iso_code;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ainda no bloco &lt;code&gt;http&lt;/code&gt;, criaremos uma variável com a diretiva &lt;code&gt;map&lt;/code&gt; para definir quais países terão permissão ou não de acesso.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http {
    ...

    # Permite apenas países lusófonos
    #
    map $geoip2_data_country_code $country_blocked {
        default 1;

        AO 0;
        BR 0;
        CV 0;
        GW 0;
        MZ 0;
        PT 0;
        ST 0;
        TL 0;
        GQ 0;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Permite todos os países que possua o valor "0" tenham permissão de acesso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No contexto &lt;code&gt;server&lt;/code&gt;, definiremos nossa condição.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
    server_name valdeir.dev;

    if ($country_blocked) {
        return 403;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reincie o Nginx e faça o teste.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nginx -s reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Load Balancer
&lt;/h2&gt;

&lt;p&gt;Além de bloqueios, podemos usar o módulo de &lt;em&gt;GeoIP2&lt;/em&gt; para criar um &lt;em&gt;load balancer&lt;/em&gt; por país ou continente, por exemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upstream all {
    server default1.valdeir.dev:8080;
    server default2.valdeir.dev:8080;
}

upstream eu {
    server eu1.example.com:8080;
    server eu2.example.com:8080;
}

upstream as {
    server as1.example.com:8080;
    server as2.example.com:8080;
}

http {
    geoip2 GeoIP2/GeoLite2-Country.mmdb {
        $geoip2_data_continent_code continent code;
    }

    map $geoip2_data_continent_code $nearest_server {
        default all;

        EU      eu;
        AS      as;
    }

    server {
        listen 80;
        proxy_pass http://$nearest_server;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Parabéns! Concluímos mais uma etapa. Caso tenha dúvidas ou sugestões, só deixar nos comentários.&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>devops</category>
      <category>sysadmin</category>
      <category>geoip</category>
    </item>
    <item>
      <title>Série Nginx #4: Instalando módulos de terceiros</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Thu, 16 Sep 2021 15:17:44 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/serie-nginx-4-instalando-modulos-de-terceiros-hjh</link>
      <guid>https://dev.to/valdeirpsr/serie-nginx-4-instalando-modulos-de-terceiros-hjh</guid>
      <description>&lt;p&gt;Uhuu!! Chegamos em mais uma parte. 👊👊&lt;/p&gt;

&lt;p&gt;Bem, os módulos no Nginx servem como uma extensão do servidor web. Eles podem ser instalados durante a compilação ou dinamicamente.&lt;/p&gt;

&lt;p&gt;Os módulos trazem uma facilidade maior ao implementar e utilizar o Nginx. Podemos usar desde identificação do Estado até executar código PHP no próprio Nginx. A lista é graaaande.&lt;/p&gt;

&lt;p&gt;Nesta postagem, aprenderemos a instalar módulos de terceiros. Este passo é importante para postagens futuras. Nelas utilizaremos vários módulos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: É importante que você saiba compilar o código fonte do Nginx. Caso não tenha esse conhecimento, acesse a postagem &lt;a href="https://dev.to/valdeirpsr/serie-nginx-2-compilando-o-nginx-3f9o"&gt;Série Nginx #2: Compilando o Nginx&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos lá! 🏃&lt;/p&gt;




&lt;h2&gt;
  
  
  Verificando módulos instalados
&lt;/h2&gt;

&lt;p&gt;Antes de instalar, nada mais justo que verificar se o módulo já está instalado, correto?&lt;/p&gt;

&lt;p&gt;Para confirmar, basta executar o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verifica se o módulo foi instalado durante a compilação&lt;/span&gt;
nginx &lt;span class="nt"&gt;-V&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;--color&lt;/span&gt; geoip2

&lt;span class="c"&gt;# Lista módulos dinâmicos&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lah&lt;/span&gt; /etc/nginx/modules-available
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;A pasta &lt;code&gt;/etc/nginx/modules-available&lt;/code&gt; pode variar de acordo com sua configuração de compilação, método de instalação e/ou sistema operacional. Caso você não saiba qual é a pasta de módulos, execute &lt;code&gt;nginx -V&lt;/code&gt; e verifique o valor da opção &lt;code&gt;--module-path&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se aparecer algum resultado, o módulo &lt;em&gt;geoip2&lt;/em&gt; está instalado. Caso contrário, vamos instalá-lo.🤲&lt;/p&gt;


&lt;h2&gt;
  
  
  Instalando módulos
&lt;/h2&gt;

&lt;p&gt;Para começar, instalaremos o módulo &lt;a href="https://github.com/leev/ngx_http_geoip2_module"&gt;GeoIP2&lt;/a&gt; como exemplo.&lt;/p&gt;

&lt;p&gt;Vamos começar clonando o projeto no diretório &lt;code&gt;/tmp/geoip2&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; git clone &lt;span class="nt"&gt;--depth&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
    https://github.com/leev/ngx_http_geoip2_module.git &lt;span class="se"&gt;\&lt;/span&gt;
    /tmp/geoip2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Prontinho!! Agora precisamos instalar a biblioteca &lt;a href="https://github.com/maxmind/libmaxminddb"&gt;libmaxminddb&lt;/a&gt; como pede a documentação do módulo.&lt;/p&gt;

&lt;p&gt;Há duas formas de instalação: 1) &lt;a href="https://github.com/maxmind/libmaxminddb#from-a-named-release-tarball"&gt;Compilando&lt;/a&gt;; ou 2) Instalando via gerenciador de pacotes. Vamos escolher esta para facilitar as coisas. 😅&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Debian/Ubuntu&lt;/span&gt;
apt update&lt;span class="p"&gt;;&lt;/span&gt;
apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; libmaxminddb-dev

&lt;span class="c"&gt;# Alpine&lt;/span&gt;
apk update&lt;span class="p"&gt;;&lt;/span&gt;
apk add &lt;span class="nt"&gt;--upgrade&lt;/span&gt; libmaxminddb-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ótimo! Instalamos a biblioteca e já baixamos o módulo em &lt;code&gt;/tmp/geoip2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vamos para o próximo passo. Don't stop! ⏩&lt;/p&gt;


&lt;h2&gt;
  
  
  Compilando o módulo
&lt;/h2&gt;

&lt;p&gt;Agora vamos navegar até a pasta do código fonte do Nginx.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se você não viu essa parte, recomendo voltar à postagem &lt;a href="https://dev.to/valdeirpsr/serie-nginx-2-compilando-o-nginx-3f9o"&gt;Série Nginx #2: Compilando o Nginx&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/nginx-1.21.2 &lt;span class="c"&gt;# No meu caso&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Hora de configurar 🕒. Utilizaremos a &lt;em&gt;flag&lt;/em&gt; &lt;code&gt;--add-dynamic-module=&amp;lt;path&amp;gt;&lt;/code&gt; para informar a pasta onde baixamos o código fonte do módulo.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Configura os diretórios e&lt;/span&gt;
&lt;span class="c"&gt;# quais módulos o Nginx deverá instalar&lt;/span&gt;
./configure &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-compat&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--add-module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/geoip2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Caso você precise utilizar com proxies, utilize a &lt;em&gt;flag&lt;/em&gt; &lt;code&gt;--with-stream&lt;/code&gt;. O funcionamento depende de módulo para módulo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Feito isso, vamos compilar o módulo.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make modules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ótimo! Vamos enviar o módulo compilado para a pasta de módulos e carregá-lo nas configurações do Nginx.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Carrega os módulos a pasta&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;objs/ngx_http_geoip2_module.so /etc/nginx/modules-available
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Pronto! Tudo Instalado... 🎉💃&lt;br&gt;
Mas... Verifique se o módulo realmente foi instalado. 😜&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8BRXR_k1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6u4fstlkf782mliwlvxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8BRXR_k1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6u4fstlkf782mliwlvxg.png" alt="Resultado do comando  raw `nginx -V 2&amp;gt;&amp;amp;1 | grep --color geoip2` endraw  mostra que o módulo foi instalado com sucesso."&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Habilitando o módulo
&lt;/h2&gt;

&lt;p&gt;Para habilitar um módulo, precisamos utilizar a diretiva &lt;code&gt;load_module &amp;lt;path&amp;gt;&lt;/code&gt; no contexto &lt;em&gt;main&lt;/em&gt; (principal).&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"load_module modules-available/ngx_http_geoip2_module.so;"&lt;/span&gt; | \
    &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;tee&lt;/span&gt; -&lt;span class="n"&gt;a&lt;/span&gt; /&lt;span class="n"&gt;etc&lt;/span&gt;/&lt;span class="n"&gt;nginx&lt;/span&gt;/&lt;span class="n"&gt;modules&lt;/span&gt;-&lt;span class="n"&gt;enabled&lt;/span&gt;/&lt;span class="n"&gt;geoip2&lt;/span&gt;.&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;O diretório do arquivo pode variar de acordo com sua configuração de compilação, método de instalação e/ou sistema operacional.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reinicie o Nginx.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nginx &lt;span class="nt"&gt;-s&lt;/span&gt; reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testando o módulo
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Não abordarei como configurar o módulo, que ficará para a próxima postagem, que será sobre segurança com Nginx.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;É isso aí!!! Finalizamos mais uma parte. Nas próximas postagens, aprenderemos a configurar o GeoIP e a utilizar outros módulos.&lt;/p&gt;

&lt;p&gt;Até breve! 🙌&lt;/p&gt;

</description>
      <category>nginx</category>
      <category>braziliandevs</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Série Nginx #3: Conhecendo as diretivas</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Wed, 08 Sep 2021 14:39:00 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/serie-nginx-3-conhecendo-as-diretivas-1gf</link>
      <guid>https://dev.to/valdeirpsr/serie-nginx-3-conhecendo-as-diretivas-1gf</guid>
      <description>&lt;h2&gt;
  
  
  Diretivas do Nginx
&lt;/h2&gt;

&lt;p&gt;Olá, galerinha, pronto para mais uma postagem? 🥳&lt;/p&gt;

&lt;p&gt;Vamos conhecer e aprender como utilizar algumas das diretivas mais importantes do Nginx.&lt;/p&gt;

&lt;p&gt;De acordo com a documentação oficial, o nginx consiste em módulos controlados por diretivas especificadas nos arquivos de configuração. Elas são divididas em &lt;em&gt;diretivas simples&lt;/em&gt; e &lt;em&gt;diretivas em bloco&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Uma diretiva simples consiste no nome e nos parâmetros separados por espaços e com um ponto e vírgula (&lt;code&gt;;&lt;/code&gt;) no final.&lt;/p&gt;

&lt;p&gt;Uma diretiva de bloco permite que o desenvolvedor utilize outras diretivas dentro de chaves (&lt;code&gt;{&lt;/code&gt; e &lt;code&gt;}&lt;/code&gt;). Quando isso ocorre, essa diretiva de bloco é chamada de contexto (exemplos: &lt;code&gt;events&lt;/code&gt;, &lt;code&gt;http&lt;/code&gt;, &lt;code&gt;server&lt;/code&gt; e &lt;code&gt;location&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Vamos conhecer as diretivas.&lt;/p&gt;




&lt;h3&gt;
  
  
  add_header (&lt;a href="https://github.com/nginx/nginx/blob/67d160bf25e02ba6679bb6c3b9cbdfeb29b759de/src/http/modules/ngx_http_headers_filter_module.c#L543-L560"&gt;fonte&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;Como o nome deixa claro, essa diretiva serve para definir &lt;em&gt;headers&lt;/em&gt; direto do Nginx. Isso é útil para definir os cabeçalhos de CORS, por exemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: add_header name value [always];
# Default: —
# Context: http, server, location, if in location
#
&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;upload&lt;/span&gt; {
    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="s2"&gt;"Access-Control-Allow-Origin"&lt;/span&gt; &lt;span class="s2"&gt;"https://*.valdeir.dev"&lt;/span&gt;;
    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="s2"&gt;"Access-Control-Allow-Methods"&lt;/span&gt; &lt;span class="s2"&gt;"GET, OPTIONS"&lt;/span&gt;;
    &lt;span class="n"&gt;add_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;-&lt;span class="n"&gt;Dev&lt;/span&gt; &lt;span class="s2"&gt;"Valdeir Psr"&lt;/span&gt; &lt;span class="n"&gt;always&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O cabeçalho da requisição acima será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;http http://php.valdeirpsr.com.br/upload/foto.jpg
HTTP/1.1 200 OK
Content-Length: 1333425
Content-Type: image/jpeg
Date: Fri, 27 Aug 2021 15:28:23 GMT
access-control-allow-methods: GET, OPTIONS
access-control-allow-origin: https://&lt;span class="k"&gt;*&lt;/span&gt;.valdeir.dev
x-dev: Valdeir Psr

+-----------------------------------------+
| NOTE: binary data not shown &lt;span class="k"&gt;in &lt;/span&gt;terminal |
+-----------------------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  alias (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/ngx_http_core_module.c#L1875-L1945"&gt;fonte&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;Com a diretiva &lt;code&gt;alias&lt;/code&gt;, podemos substituir a localização da pasta definida na diretiva &lt;code&gt;root&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;www&lt;/span&gt;/&lt;span class="n"&gt;html&lt;/span&gt;;

&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;css&lt;/span&gt; {
    &lt;span class="c"&gt;# Syntax: alias path;
&lt;/span&gt;    &lt;span class="c"&gt;# Default: —
&lt;/span&gt;    &lt;span class="c"&gt;# Context: location
&lt;/span&gt;    &lt;span class="c"&gt;#
&lt;/span&gt;    &lt;span class="n"&gt;alias&lt;/span&gt; /&lt;span class="n"&gt;dev&lt;/span&gt;/&lt;span class="n"&gt;vda2&lt;/span&gt;/&lt;span class="n"&gt;css&lt;/span&gt;/;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso significa que a requisição &lt;code&gt;https://valdeir.psr/css/global.css&lt;/code&gt; carregará os arquivos da pasta &lt;code&gt;/dev/vda2/css&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP&lt;/th&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://valdeir.psr/css/global.css"&gt;https://valdeir.psr/css/global.css&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;/dev/vda2/css/global.css&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://valdeir.psr/images/logo.svg"&gt;https://valdeir.psr/images/logo.svg&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;/var/www/html/images/logo.svg&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  client_max_body_size (&lt;a href="https://github.com/nginx/nginx/blob/67d160bf25e02ba6679bb6c3b9cbdfeb29b759de/src/http/ngx_http_request_body.c#L1114-L1127"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;Você pode usar essa diretiva para configurar o tamanho máximo do corpo da requisição. Útil para limitar o tamanho de arquivos em formulários de &lt;em&gt;upload&lt;/em&gt;. Caso o valor definido seja &lt;code&gt;0&lt;/code&gt;, desabilita a verificação do tamanho dos dados enviados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: client_max_body_size size;
# Default: client_max_body_size 1m;
# Context: http, server, location
#
&lt;/span&gt;&lt;span class="n"&gt;client_max_body_size&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;G&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  error_page (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/ngx_http_core_module.c#L4674-L4789"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;A diretiva permite a customização de uma página de erro. Quando a página retornar o erro 404, por exemplo, então o Nginx irá retornar para o usuário o arquivo &lt;code&gt;/not_found.html&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: error_page code ... [=[response]] uri;
# Default: —
# Context: http, server, location
#
&lt;/span&gt;&lt;span class="n"&gt;error_page&lt;/span&gt; &lt;span class="m"&gt;404&lt;/span&gt;             /&lt;span class="n"&gt;not_found&lt;/span&gt;.&lt;span class="n"&gt;html&lt;/span&gt;
&lt;span class="n"&gt;error_page&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt; &lt;span class="m"&gt;502&lt;/span&gt; &lt;span class="m"&gt;503&lt;/span&gt; &lt;span class="m"&gt;504&lt;/span&gt; /&lt;span class="m"&gt;50&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;.&lt;span class="n"&gt;html&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também é possível redirecionar o usuário para outra página ou domínio com um novo &lt;em&gt;status code&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server_name valdeir.dev;

error_page 401 =200 https://auth.$server_name;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Observação&lt;/strong&gt;: O parâmetro &lt;code&gt;code&lt;/code&gt; não pode ser igual a &lt;em&gt;499&lt;/em&gt;, menor que &lt;em&gt;300&lt;/em&gt; ou maior que &lt;em&gt;599&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  listen (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/ngx_http_core_module.c#L3868-L4211"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;Essa diretiva permite definir qual o endereço e/ou porta o Nginx deverá "ouvir" as requisições. Por padrão, o servidor usará as portas 80 e 8000.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax address: listen address[:port] [default_server] [ssl] [http2];
#
# Syntax port: listen port [default_server] [ssl] [http2];
#
# Syntax PID: listen unix:path [default_server] [ssl] [http2];
#
# Default: listen *:80 | *:8000;
# Context: server
#
&lt;/span&gt;&lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;;
&lt;span class="n"&gt;listen&lt;/span&gt; [::]:&lt;span class="m"&gt;80&lt;/span&gt;;
&lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;;
&lt;span class="n"&gt;listen&lt;/span&gt; [::]:&lt;span class="m"&gt;443&lt;/span&gt; &lt;span class="n"&gt;ssl&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Parâmetros adicionais&lt;/strong&gt;&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;b&gt;default_server&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Informa se o servidor virtual é o padrão. Caso o parâmetro não seja informado, o primeiro servidor localizado será definido como padrão. Você pode utilizar esse parâmetro apenas em um servidor virtual.&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;ssl&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Esse parâmetro informa se o servidor deve receber conexões criptografadas. Lembrando que, ao utilizar esse parâmetro, é importante configurar as diretivas &lt;code&gt;ssl_certificate&lt;/code&gt; e &lt;code&gt;ssl_certificate_key&lt;/code&gt; com as chaves para que o Nginx consiga descritografar as informações e repassá-las à aplicação.&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;http2&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Indica que o Nginx deve aceitar conexões com o protocolo &lt;a href="https://datatracker.ietf.org/doc/html/rfc7540"&gt;HTTP/2&lt;/a&gt;. Lembrando que o SSL é obrigatório para o uso desse protocolo.&lt;/dd&gt;
&lt;/dl&gt;




&lt;h2&gt;
  
  
  location (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/ngx_http_core_module.c#L2950-L3140"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;A diretiva mais utilizada. Ela serve para aplicar configurações de acordo com a URI da requisição, que pode ser identificada com o uso de expressões regulares ou correspondência exata.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
#         location @name { ... }
# Default: —
# Context: server, location
#
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Utilizando os modificadores&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O uso do modificador &lt;code&gt;=&lt;/code&gt; indica que as configurações deverão ser aplicadas &lt;strong&gt;apenas&lt;/strong&gt; quando a &lt;em&gt;URI&lt;/em&gt; for exatamente igual ao valor informado no parâmetro &lt;code&gt;URI&lt;/code&gt;. No exemplo abaixo, as configurações serão aplicadas na URI &lt;code&gt;/upload&lt;/code&gt;, porém &lt;strong&gt;não&lt;/strong&gt; serão aplicadas na URI &lt;code&gt;/upload/avatar.svg&lt;/code&gt;, por exemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; = /&lt;span class="n"&gt;upload&lt;/span&gt; {
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O uso do modificador &lt;code&gt;~&lt;/code&gt; indica que as configurações deverão ser aplicadas quando a URI for correspondente à expressão regular definida na diretiva. No exemplo abaixo, as configurações serão aplicadas nas URI &lt;code&gt;/upload/avatar.jpeg&lt;/code&gt;, &lt;code&gt;/upload/avatar.jpg&lt;/code&gt;, &lt;code&gt;/upload/avatar.gif&lt;/code&gt; e &lt;code&gt;/upload/avatar.webp&lt;/code&gt;, porém &lt;strong&gt;não&lt;/strong&gt; serão aplicadas nas URI &lt;code&gt;/upload/avatar.mp4&lt;/code&gt;, &lt;code&gt;/upload/avatar.jpg.avif&lt;/code&gt; ou &lt;code&gt;/UPLOAD/avatar.jpg&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; ~ /&lt;span class="n"&gt;upload&lt;/span&gt;/.*\.(&lt;span class="n"&gt;jpe&lt;/span&gt;?&lt;span class="n"&gt;g&lt;/span&gt;|&lt;span class="n"&gt;gif&lt;/span&gt;|&lt;span class="n"&gt;webp&lt;/span&gt;)$ {
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O modificador &lt;code&gt;~*&lt;/code&gt; funciona da mesma forma que &lt;code&gt;~&lt;/code&gt;. A diferença é que essa é &lt;em&gt;case-insensitive&lt;/em&gt; e esta, não; ou seja, utilizando o modificador &lt;code&gt;~*&lt;/code&gt;, a URI &lt;code&gt;/upload/avatar.jpg&lt;/code&gt; e &lt;code&gt;/UPLOAD/avatar.jpg&lt;/code&gt; serão processadas igualmente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; ~* /&lt;span class="n"&gt;upload&lt;/span&gt;/.*\.(&lt;span class="n"&gt;jpe&lt;/span&gt;?&lt;span class="n"&gt;g&lt;/span&gt;|&lt;span class="n"&gt;gif&lt;/span&gt;|&lt;span class="n"&gt;webp&lt;/span&gt;)$ {
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O modificador &lt;code&gt;^~&lt;/code&gt; determina que o NGINX deverá parar de pesquisar correspondências mais específicas e utilizar essa diretiva.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; ^~ /&lt;span class="n"&gt;upload&lt;/span&gt;/.*\.(&lt;span class="n"&gt;jpe&lt;/span&gt;?&lt;span class="n"&gt;g&lt;/span&gt;|&lt;span class="n"&gt;gif&lt;/span&gt;|&lt;span class="n"&gt;webp&lt;/span&gt;)$ {
    &lt;span class="c"&gt;# Para aqui e não continua
&lt;/span&gt;}

&lt;span class="n"&gt;location&lt;/span&gt; ~* \.(&lt;span class="n"&gt;jpe&lt;/span&gt;?&lt;span class="n"&gt;g&lt;/span&gt;|&lt;span class="n"&gt;gif&lt;/span&gt;|&lt;span class="n"&gt;webp&lt;/span&gt;)$ {
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso nenhum modificador seja utilizado, o Nginx comparará o início da URI com parte da URL. No exemplo abaixo, as configurações da diretiva &lt;code&gt;location&lt;/code&gt; serão aplicadas em &lt;code&gt;/upload&lt;/code&gt;, &lt;code&gt;/upload/avatar.jpg&lt;/code&gt; e &lt;code&gt;/uploadsssss/avatar.jpg&lt;/code&gt;, por exemplo. Esse modo diferencia maiúscula de minúscula.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;upload&lt;/span&gt; {
    ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Capturando grupos de RegEx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na diretiva &lt;code&gt;location&lt;/code&gt;, você pode capturar os grupos definidos em sua RegEx. Isso é útil para tornar as configurações dinâmicas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;www&lt;/span&gt;/&lt;span class="n"&gt;html&lt;/span&gt;;

&lt;span class="n"&gt;location&lt;/span&gt; ~* /&lt;span class="n"&gt;profile&lt;/span&gt;/([^/]+).&lt;span class="n"&gt;jpg&lt;/span&gt; {
    &lt;span class="n"&gt;alias&lt;/span&gt; /&lt;span class="n"&gt;dev&lt;/span&gt;/&lt;span class="n"&gt;vda2&lt;/span&gt;/&lt;span class="n"&gt;users&lt;/span&gt;/$&lt;span class="m"&gt;1&lt;/span&gt;/&lt;span class="n"&gt;avatar&lt;/span&gt;.&lt;span class="n"&gt;jpg&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, informamos que requisições com a URI &lt;code&gt;/profile/qualquer-coisa.jpg&lt;/code&gt; será apontada para o arquivo &lt;code&gt;/dev/vda2/users/qualquer-coisa/avatar.jpg&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Nomeando &lt;code&gt;location&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nomear a diretiva &lt;code&gt;location&lt;/code&gt; é importante para reutilizá-la em outras partes do código ou quebrar as regras em pedaços para facilitar a manutenção e/ou leitura dos arquivos de configuração. A sintaxe é semelhante as que já foram mostradas. A diferença está no parâmetro &lt;code&gt;@&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; / {
    &lt;span class="n"&gt;try_files&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt;/ @&lt;span class="n"&gt;opencart&lt;/span&gt;;
}

&lt;span class="n"&gt;location&lt;/span&gt; ~ ^/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;$ {
    &lt;span class="n"&gt;try_files&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; @&lt;span class="n"&gt;opencart&lt;/span&gt;;
}

&lt;span class="n"&gt;location&lt;/span&gt; @&lt;span class="n"&gt;opencart&lt;/span&gt; {
    &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;$ /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="n"&gt;route&lt;/span&gt;=&lt;span class="n"&gt;extension&lt;/span&gt;/&lt;span class="n"&gt;feed&lt;/span&gt;/&lt;span class="n"&gt;google_sitemap&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;;

    &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/(.+)$ /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;route_&lt;/span&gt;=$&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  map (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/modules/ngx_http_map_module.c#L381"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;A diretiva &lt;code&gt;map&lt;/code&gt; permite criar variáveis de acordo com um mapeamento feito através de valores &lt;em&gt;key:value&lt;/em&gt; definidos nela. É útil para tornar as configurações dinâmicas.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo, utilizamos a variável &lt;code&gt;$http_user_agent&lt;/code&gt;, que é nativa do Nginx, para capturar o &lt;em&gt;User Agent&lt;/em&gt; do usuário e comparar com as chaves. Se a variável do Nginx for igual à chave, então define um valor na variável a ser criada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: map $variable_nginx $variable_name { ... }
# Default: —
# Context: http
#
&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; $&lt;span class="n"&gt;http_user_agent&lt;/span&gt; $&lt;span class="n"&gt;ua_blocked&lt;/span&gt; {
    &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;; &lt;span class="c"&gt;# Parâmetro
&lt;/span&gt;
    ~&lt;span class="n"&gt;Jorgee&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;; &lt;span class="c"&gt;# Block "Jorgee", "One Jorgee Two"
&lt;/span&gt;    ~&lt;span class="n"&gt;ZmEu&lt;/span&gt;   &lt;span class="m"&gt;1&lt;/span&gt;;
    ~*&lt;span class="n"&gt;Spam&lt;/span&gt;  &lt;span class="m"&gt;1&lt;/span&gt;; &lt;span class="c"&gt;# Block "SPAM", "One spam Two"
&lt;/span&gt;    ~*&lt;span class="n"&gt;Scan&lt;/span&gt;  &lt;span class="m"&gt;1&lt;/span&gt;;
    &lt;span class="n"&gt;Scanner&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;; &lt;span class="c"&gt;# Block "Scanner", but not "PSR-Scanner"
&lt;/span&gt;    &lt;span class="n"&gt;Wget&lt;/span&gt;    &lt;span class="m"&gt;1&lt;/span&gt;;
    &lt;span class="n"&gt;curl&lt;/span&gt;    &lt;span class="m"&gt;1&lt;/span&gt;;
}

&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="n"&gt;if&lt;/span&gt; ($&lt;span class="n"&gt;ua_blocked&lt;/span&gt;) {
        &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="m"&gt;403&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, se a variável &lt;code&gt;$http_user_agent&lt;/code&gt; for igual à &lt;code&gt;Jorgee&lt;/code&gt;, &lt;code&gt;ZmEu&lt;/code&gt;, &lt;code&gt;Spam&lt;/code&gt; etc., define o valor 1 à variável &lt;code&gt;$ua_blocked&lt;/code&gt;. Caso valor nenhum coincida, utiliza o valor do parâmetro &lt;code&gt;default&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ao usar &lt;code&gt;~&lt;/code&gt; ou &lt;code&gt;~*&lt;/code&gt;, você indica que o Nginx deve tratar a chave como expressão regular &lt;em&gt;case-sensitive&lt;/em&gt; e &lt;em&gt;case-insensitive&lt;/em&gt;, respectivamente. Não usá-las, indica que a correspondência deve ser exata.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parâmetros do &lt;code&gt;map&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;
&lt;b&gt;default&lt;/b&gt; &amp;lt;valor&amp;gt;&lt;/dt&gt;
  &lt;dd&gt;Define um valor padrão que retornará quando as regras não corresponderem às chaves definidas.&lt;/dd&gt;

  &lt;dt&gt;
&lt;b&gt;include&lt;/b&gt; &amp;lt;arquivo&amp;gt;&lt;/dt&gt;
  &lt;dd&gt;Inclui um arquivo com valores. Pode haver várias inclusões.&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;volatile&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Indica que a variável não pode ser armazenada em cache.&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;hostnames&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Indica que os valores de origem podem ser nomes de host com um prefixo ou máscara de sufixo.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;strong&gt;Funcionamento do &lt;code&gt;map&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se houver mais de uma correspondência, o Nginx seguirá a ordem abaixo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Valor &lt;em&gt;string&lt;/em&gt; sem máscara;&lt;/li&gt;
&lt;li&gt;Valor da &lt;em&gt;string&lt;/em&gt; mais longa com uma máscara de prefixo, por exemplo: &lt;em&gt;*.example.com&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Valor da &lt;em&gt;string&lt;/em&gt; mais longa com uma máscara de sufixo, por exemplo, &lt;em&gt;mail.*&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Primeiro valor encontrado com a expressão regular;&lt;/li&gt;
&lt;li&gt;Valor do parâmetro &lt;code&gt;default&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  return (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/modules/ngx_http_rewrite_module.c#L442-L509"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;Ao utilizar essa diretiva, o &lt;em&gt;Nginx&lt;/em&gt; irá parar o processamento e retornará um valor definido ou um redirecionamento de página.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo, ao utilizar o código de &lt;em&gt;status&lt;/em&gt; &lt;em&gt;301&lt;/em&gt; ou &lt;em&gt;302&lt;/em&gt; ou apenas uma URL, o Nginx informará ao navegador que o cliente deve ser redirecionado para a URL informada.&lt;/p&gt;

&lt;p&gt;Ao utilizar o código de &lt;em&gt;status&lt;/em&gt; &lt;em&gt;444&lt;/em&gt;, o Nginx fechará a conexão e não retornará uma resposta.&lt;/p&gt;

&lt;p&gt;Em qualquer outro código de &lt;em&gt;status&lt;/em&gt;, o Nginx retornará o texto como o corpo da resposta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: return code [text];
#         return [301|302] URL;
# Default: —
# Context: server, location, if
#
&lt;/span&gt;
&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;retorna&lt;/span&gt; {
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="s2"&gt;"Corpo da Mensagem"&lt;/span&gt;;
}

&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;movido&lt;/span&gt;-&lt;span class="n"&gt;permanente&lt;/span&gt; {
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="m"&gt;301&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;another&lt;/span&gt;-&lt;span class="n"&gt;url&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;;
}

&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;movido&lt;/span&gt;-&lt;span class="n"&gt;temporario&lt;/span&gt; {
    &lt;span class="n"&gt;return&lt;/span&gt; $&lt;span class="n"&gt;scheme&lt;/span&gt;://&lt;span class="n"&gt;auth&lt;/span&gt;.$&lt;span class="n"&gt;server_name&lt;/span&gt;; &lt;span class="c"&gt;# Equivale a https://auth.valdeir.dev
&lt;/span&gt;}

&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;fechado&lt;/span&gt; {
    &lt;span class="n"&gt;return&lt;/span&gt; &lt;span class="m"&gt;444&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  rewrite (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/modules/ngx_http_rewrite_module.c#L298-L438"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;A diretiva permite reescrever a URI internamente ou redirecionar o usuário para outra página utilizando o &lt;em&gt;status code&lt;/em&gt; 301 ou 302. Caso haja mais de uma diretiva &lt;code&gt;rewrite&lt;/code&gt;, a URI poderá ser substituída/processada até a última diretiva ou conforme o uso das &lt;em&gt;flags&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: rewrite regex replacement [flag];
# Default: —
# Context: server, location, if
#
&lt;/span&gt;&lt;span class="n"&gt;rewrite&lt;/span&gt; ^/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;$ /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="n"&gt;route&lt;/span&gt;=&lt;span class="n"&gt;extension&lt;/span&gt;/&lt;span class="n"&gt;feed&lt;/span&gt;/&lt;span class="n"&gt;google_sitemap&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Flag (opcional)&lt;/strong&gt;&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;b&gt;last&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Para o processamento atual e busca um bloco &lt;code&gt;location&lt;/code&gt; que corresponda à nova URI.&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;break&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Para o processamento atual e retorna a resposta para o usuário.&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;redirect&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Informa ao navegador que o usuário deverá ser redirecionado se o parâmetro &lt;code&gt;replacement&lt;/code&gt; iniciar com https://, http:// ou a variável &lt;code&gt;$scheme&lt;/code&gt;. O redirecionamento deverá ser feito com o status code 302&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;permanent&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Informa ao navegador que o usuário deverá ser redirecionado se o parâmetro &lt;code&gt;replacement&lt;/code&gt; iniciar com https://, http:// ou a variável &lt;code&gt;$scheme&lt;/code&gt;. O redirecionamento deverá ser feito com o status code 301
&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;strong&gt;Quando usar &lt;code&gt;last&lt;/code&gt; ou &lt;code&gt;break&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como explicado, o &lt;code&gt;last&lt;/code&gt; buscará um novo bloco &lt;code&gt;location&lt;/code&gt; para tratar a URI substituída. Caso utilize essa &lt;em&gt;flag&lt;/em&gt; dentro do contexto &lt;code&gt;location&lt;/code&gt;, o Nginx poderá entrar em um &lt;em&gt;loop infinito&lt;/em&gt; e gerar o erro 500. Portanto, quando possível, opte por &lt;code&gt;break&lt;/code&gt; quando estiver no contexto do &lt;code&gt;location&lt;/code&gt;; e, &lt;code&gt;last&lt;/code&gt;, &lt;code&gt;server&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/&lt;span class="n"&gt;upload&lt;/span&gt;/(.*)$ /&lt;span class="n"&gt;upload&lt;/span&gt;/&lt;span class="n"&gt;foto&lt;/span&gt;/$&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;;
}

&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;static&lt;/span&gt;/(.*) {
    &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/&lt;span class="n"&gt;static&lt;/span&gt;/(.*)$ /&lt;span class="n"&gt;static&lt;/span&gt;/&lt;span class="n"&gt;foto&lt;/span&gt;/$&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="n"&gt;break&lt;/span&gt;; &lt;span class="c"&gt;# O `break` evita o erro 500
&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção!&lt;/strong&gt; O grupo capturado na RegExp pode ser substituído ao usar &lt;code&gt;map&lt;/code&gt;. Para resolver, você pode usar um nome para o grupo ou criar uma variável antes de usar a diretiva &lt;code&gt;rewrite&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Permite que o Nginx retorne uma imagem otimizada de acordo com o navegador
# Para saber mais, acesse o link &amp;lt;link-do-próximo-artigo&amp;gt;
#
&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; $&lt;span class="n"&gt;file_ext&lt;/span&gt; {
    ...
}

&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;upload&lt;/span&gt; {
    &lt;span class="n"&gt;set&lt;/span&gt; $&lt;span class="n"&gt;file_extension&lt;/span&gt; $&lt;span class="n"&gt;file_ext&lt;/span&gt;;

    &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/&lt;span class="n"&gt;upload&lt;/span&gt;/(.*)\..+$ &lt;span class="s2"&gt;"/static/$1$file_extension"&lt;/span&gt; &lt;span class="n"&gt;break&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  root (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/ngx_http_core_module.c#L4316-L4414"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;Define o diretório para as requisições. No exemplo abaixo, ao acessar a URI &lt;code&gt;/css&lt;/code&gt;, o Nginx carregará o arquivo da pasta &lt;code&gt;/dev/vda2/css/&lt;/code&gt; em vez do diretório &lt;code&gt;/var/www/html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Caso a diretiva &lt;code&gt;root&lt;/code&gt; não seja definida no escopo &lt;code&gt;location&lt;/code&gt;, o Nginx buscará na diretiva &lt;code&gt;server&lt;/code&gt; e caso não encontre, buscará na diretiva &lt;code&gt;http&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="c"&gt;# Syntax: root path;
&lt;/span&gt;    &lt;span class="c"&gt;# Default: root html;
&lt;/span&gt;    &lt;span class="c"&gt;# Context: http, server, location, if in location
&lt;/span&gt;    &lt;span class="c"&gt;#
&lt;/span&gt;    &lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;www&lt;/span&gt;/&lt;span class="n"&gt;html&lt;/span&gt;;

    &lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;css&lt;/span&gt; {
        &lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;dev&lt;/span&gt;/&lt;span class="n"&gt;vda2&lt;/span&gt;/&lt;span class="n"&gt;css&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Quando usar &lt;code&gt;alias&lt;/code&gt; e &lt;code&gt;root&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;root&lt;/code&gt; adiciona a URI ao construir o caminho do arquivo, enquanto o &lt;code&gt;alias&lt;/code&gt; modifica a URI. Além disso, o &lt;code&gt;alias&lt;/code&gt; &lt;strong&gt;não&lt;/strong&gt; pode estar dentro do contexto &lt;code&gt;location&lt;/code&gt; nomeado e não pode usar a variável &lt;code&gt;$realpath_root&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Na requisição `/foto/luisa.jpg`, o Nginx carregará o arquivo
# /var/www/html/static/foto/luisa.jpg
#
&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;foto&lt;/span&gt; {
    &lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;www&lt;/span&gt;/&lt;span class="n"&gt;html&lt;/span&gt;/&lt;span class="n"&gt;static&lt;/span&gt;;
}

&lt;span class="c"&gt;# Na requisição `/imagem/sonza.jpg`, o Nginx carregará o arquivo
# /var/www/html/static/sonza.jpg
#
&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;imagem&lt;/span&gt; {
    &lt;span class="n"&gt;alias&lt;/span&gt; /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;www&lt;/span&gt;/&lt;span class="n"&gt;html&lt;/span&gt;/&lt;span class="n"&gt;static&lt;/span&gt;/;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  server (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/ngx_http_core_module.c#L2806-L2946"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;Essa diretiva em bloco serve para criar um servidor virtual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Syntax: server { ... }
# Default: —
# Context: http
#
&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;valdeir&lt;/span&gt;.&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;.&lt;span class="n"&gt;valdeir&lt;/span&gt;.&lt;span class="n"&gt;dev&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  server_name (&lt;a href="https://github.com/nginx/nginx/blob/41a241b3ef74dbbe3d82ab2ebbe682919e4a0b90/src/http/ngx_http_core_module.c#L4215-L4312"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;Define o nome/URL do servidor virtual criado. É possível definir mais de um nome quando separados por espaços. A diretiva, assim como &lt;code&gt;rewrite&lt;/code&gt; e &lt;code&gt;location&lt;/code&gt;, permite o uso de expressões regulares.&lt;/p&gt;

&lt;p&gt;Criaremos abaixo um servidor virtual que receberá as requisições das URLS: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;valdeir.dev&lt;/li&gt;
&lt;li&gt;cdn.valdeir.dev&lt;/li&gt;
&lt;li&gt;assets.valdeir.dev&lt;/li&gt;
&lt;li&gt;qualquer-coisa.valdeir.cdn
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="c"&gt;# Syntax:  server_name name ...;
&lt;/span&gt;    &lt;span class="c"&gt;# Default: server_name "";
&lt;/span&gt;    &lt;span class="c"&gt;# Context: server
&lt;/span&gt;    &lt;span class="c"&gt;#
&lt;/span&gt;    &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;valdeir&lt;/span&gt;.&lt;span class="n"&gt;dev&lt;/span&gt; ~(&lt;span class="n"&gt;cdn&lt;/span&gt;|&lt;span class="n"&gt;assets&lt;/span&gt;)\.&lt;span class="n"&gt;valdeir&lt;/span&gt;\.&lt;span class="n"&gt;dev&lt;/span&gt;$ *.&lt;span class="n"&gt;valdeir&lt;/span&gt;.&lt;span class="n"&gt;cdn&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção!&lt;/strong&gt; Para utilizar RegExp, é necessário que o Nginx tenha sido compilado com suporte à biblioteca &lt;code&gt;PCRE&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Através da diretiva &lt;code&gt;server_name&lt;/code&gt;, você pode criar variáveis de acordo com os grupos capturados na sua expressão regular.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="n"&gt;server_name&lt;/span&gt; ~^(&lt;span class="n"&gt;www&lt;/span&gt;\.)?(?&amp;lt;&lt;span class="n"&gt;domain&lt;/span&gt;&amp;gt;.+)$;

    &lt;span class="n"&gt;location&lt;/span&gt; / {
        &lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;sites&lt;/span&gt;/$&lt;span class="n"&gt;domain&lt;/span&gt;;
    }
}

&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="err"&gt;_&lt;/span&gt;;

    &lt;span class="n"&gt;location&lt;/span&gt; / {
        &lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;sites&lt;/span&gt;/&lt;span class="n"&gt;default&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ordem na busca pelos servidor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quando há mais de um nome de servidor, o Nginx seguirá a seguinte ordem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Procurar pelo nome exato (valdeir.dev);&lt;/li&gt;
&lt;li&gt;Procurar pelo nome mais longo com o &lt;em&gt;wildcard&lt;/em&gt; (&lt;code&gt;*&lt;/code&gt;) como prefixo (*.valdeir.dev);&lt;/li&gt;
&lt;li&gt;Procurar pelo nome mais longo com o &lt;em&gt;wildcard&lt;/em&gt; (&lt;code&gt;*&lt;/code&gt;) como sufixo (valdeir.*);&lt;/li&gt;
&lt;li&gt;Procurar pela primeira ocorrência usando expressão regular.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação! Você, obviamente, deve cadastrar corretamente os dados de CDN que redirecione o site para seu servidor.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  try_files (&lt;a href="https://github.com/nginx/nginx/blob/a64190933e06758d50eea926e6a55974645096fd/src/http/modules/ngx_http_try_files_module.c"&gt;fonte&lt;/a&gt;)
&lt;/h2&gt;

&lt;p&gt;Essa diretiva verificará se um arquivo existe seguindo a ordem pré-definida pelo administrador. O processamento é feito semelhante ao das diretivas &lt;code&gt;alias&lt;/code&gt; e &lt;code&gt;root&lt;/code&gt;. Ela permite também que o cliente possa acessar uma pasta quando o valor terminar com uma barra (&lt;code&gt;/&lt;/code&gt;). Isso é útil quando o desenvolvedor utiliza a diretiva &lt;code&gt;autoindex&lt;/code&gt;. Se arquivo nenhum for encontrado, o o usuário será redirecionado para outra página, URL ou bloco &lt;code&gt;location&lt;/code&gt; nomeado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt; /&lt;span class="n"&gt;var&lt;/span&gt;/&lt;span class="n"&gt;www&lt;/span&gt;/&lt;span class="n"&gt;html&lt;/span&gt;;

&lt;span class="n"&gt;autoindex&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;;

&lt;span class="n"&gt;location&lt;/span&gt; /&lt;span class="n"&gt;upload&lt;/span&gt; {
    &lt;span class="c"&gt;# Syntax: try_files file ... uri;
&lt;/span&gt;    &lt;span class="c"&gt;#         try_files file ... =code;
&lt;/span&gt;    &lt;span class="c"&gt;# Default: —
&lt;/span&gt;    &lt;span class="c"&gt;# Context: server, location
&lt;/span&gt;    &lt;span class="c"&gt;#
&lt;/span&gt;    &lt;span class="n"&gt;try_files&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt;/ /&lt;span class="n"&gt;empty&lt;/span&gt;.&lt;span class="n"&gt;gif&lt;/span&gt; =&lt;span class="m"&gt;444&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, ao acessar a requisição &lt;code&gt;/upload/avatar.webp&lt;/code&gt;, o Nginx seguirá a seguinte ordem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verifica se o arquivo &lt;code&gt;/var/www/html/upload/avatar.webp&lt;/code&gt; existe; se não existir,&lt;/li&gt;
&lt;li&gt;Verifica se a pasta &lt;code&gt;/var/www/html/upload/avatar.webp/&lt;/code&gt; existe;  se não existir,&lt;/li&gt;
&lt;li&gt;Verifica se o arquivo &lt;code&gt;/var/www/html/empty.gif&lt;/code&gt; existe;  se não existir,&lt;/li&gt;
&lt;li&gt;Fecha a conexão sem uma resposta (usando o &lt;code&gt;=444&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;É possível também utilizar bloco &lt;code&gt;location&lt;/code&gt; nomeado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;location&lt;/span&gt; / {
  &lt;span class="n"&gt;try_files&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt;/ @&lt;span class="n"&gt;opencart&lt;/span&gt;;
}

&lt;span class="n"&gt;location&lt;/span&gt; @&lt;span class="n"&gt;opencart&lt;/span&gt; {
  &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;$ /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="n"&gt;route&lt;/span&gt;=&lt;span class="n"&gt;extension&lt;/span&gt;/&lt;span class="n"&gt;feed&lt;/span&gt;/&lt;span class="n"&gt;google_sitemap&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;;
  &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/&lt;span class="n"&gt;googlebase&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;$ /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="n"&gt;route&lt;/span&gt;=&lt;span class="n"&gt;extension&lt;/span&gt;/&lt;span class="n"&gt;feed&lt;/span&gt;/&lt;span class="n"&gt;google_base&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;;
  &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/&lt;span class="n"&gt;system&lt;/span&gt;/&lt;span class="n"&gt;storage&lt;/span&gt;/(.*) /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="n"&gt;route&lt;/span&gt;=&lt;span class="n"&gt;error&lt;/span&gt;/&lt;span class="n"&gt;not_found&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;;

  &lt;span class="n"&gt;rewrite&lt;/span&gt; ^/(.+)$ /&lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;php&lt;/span&gt;?&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;route_&lt;/span&gt;=$&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;;
}

&lt;span class="n"&gt;location&lt;/span&gt; ~* (\.&lt;span class="n"&gt;twig&lt;/span&gt;|\.&lt;span class="n"&gt;tpl&lt;/span&gt;|\.&lt;span class="n"&gt;ini&lt;/span&gt;|\.&lt;span class="n"&gt;log&lt;/span&gt;|(?&amp;lt;!&lt;span class="n"&gt;robots&lt;/span&gt;)\.&lt;span class="n"&gt;txt&lt;/span&gt;)$ {
  &lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Essas foram as diretivas mais utilizadas no Nginx. Nas próximas postagens, aprenderemos como aumentar a segurança e a performance do nosso site. Beleza? 👍&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>nginx</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Série Nginx #2: Compilando o Nginx</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Thu, 02 Sep 2021 19:21:15 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/serie-nginx-2-compilando-o-nginx-3f9o</link>
      <guid>https://dev.to/valdeirpsr/serie-nginx-2-compilando-o-nginx-3f9o</guid>
      <description>&lt;p&gt;Opa!! Chegamos em mais uma parte da série sobre Nginx.&lt;/p&gt;

&lt;p&gt;Neste capítulo, aprenderemos como compilar o código fonte do Nginx no Ubuntu.&lt;/p&gt;

&lt;p&gt;Quais as vantagens? 😎&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flexibilidade;&lt;/li&gt;
&lt;li&gt;Utilização de módulos de terceiros;&lt;/li&gt;
&lt;li&gt;Aplicar as correções de segurança mais recentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E as desvantagens? 😢&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;É mais complexo;&lt;/li&gt;
&lt;li&gt;Demanda mais tempo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do que preciso para compilar o código?? 👷&lt;/p&gt;

&lt;p&gt;Precisamos instalar algumas ferramentas para "buildar" e adicionar suporte a determinadas funcionalidades do Nginx. São elas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update&lt;span class="p"&gt;;&lt;/span&gt;
apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl &lt;span class="se"&gt;\&lt;/span&gt;
    vim &lt;span class="se"&gt;\ &lt;/span&gt;             &lt;span class="c"&gt;# Será nosso editor &amp;lt;3&lt;/span&gt;
    build-essential &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c"&gt;# Serve para "buildar"&lt;/span&gt;
    gcc &lt;span class="se"&gt;\ &lt;/span&gt;             &lt;span class="c"&gt;# " para compilar o código escrito em C&lt;/span&gt;
    systemd &lt;span class="se"&gt;\ &lt;/span&gt;         &lt;span class="c"&gt;# " para gerenciar o serviço do servidor&lt;/span&gt;
    libgd-dev &lt;span class="se"&gt;\ &lt;/span&gt;       &lt;span class="c"&gt;# " para o uso do módulo de otimização de imagem (será mostrado em outro capítulo)&lt;/span&gt;
    libpcre3-dev &lt;span class="se"&gt;\ &lt;/span&gt;    &lt;span class="c"&gt;# " para funções do Core e da diretiva Rewrite, Location (RegExp em geral)&lt;/span&gt;
    libssl-dev &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c"&gt;# " para utilizar SSL&lt;/span&gt;
    libmaxminddb-dev &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="c"&gt;# " para usar um módulo de terceiro para GeoIP2&lt;/span&gt;
    zlib1g-dev         &lt;span class="c"&gt;# " para otimização com GZIP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ferramentas instaladas, vamos baixar nosso Nginx. Neste capítulo, utilizaremos a versão 1.21.&lt;/p&gt;

&lt;p&gt;Baixá-la é simples, basta executar o comando abaixo em seu terminal.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Baixa e extrai&lt;/span&gt;
curl &lt;span class="nt"&gt;-sSLo-&lt;/span&gt; http://nginx.org/download/nginx-1.21.2.tar.gz | &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzvf&lt;/span&gt; -

&lt;span class="c"&gt;# Acessa a pasta criada&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;nginx-1.21.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ótimo! Baixamos! Agora é hora de usar as ferramentas baixadas para compilar o Nginx. 🎉🎉&lt;/p&gt;

&lt;p&gt;Irei deixar o código completo e depois explicarei cada uma das &lt;em&gt;flags&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Configura os diretórios e&lt;/span&gt;
&lt;span class="c"&gt;# quais módulos o Nginx deverá instalar&lt;/span&gt;
./configure &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/nginx &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--sbin-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/sbin/nginx &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--conf-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/nginx/nginx.conf &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--http-log-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/log/nginx/access.log &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--error-log-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/log/nginx/error.log &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--pid-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/run/nginx.pid &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--modules-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/nginx/modules-available &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--http-client-body-temp-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/nginx/client_body_temp &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--http-proxy-temp-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/nginx/proxy_temp &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--http-fastcgi-temp-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/nginx/fastcgi_temp &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--http-uwsgi-temp-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/nginx/uwsgi_temp &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--http-scgi-temp-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/nginx/scgi_temp &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-debug&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-compat&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-pcre-jit&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-pcre&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;www-data &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;www-data &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-threads&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_ssl_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_stub_status_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_realip_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_auth_request_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_v2_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_dav_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_slice_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_addition_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_gunzip_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_gzip_static_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_image_filter_module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dynamic &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-http_sub_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dynamic &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--with-stream_ssl_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--without-mail_pop3_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--without-mail_imap_module&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--without-mail_smtp_module&lt;/span&gt;

&lt;span class="c"&gt;# Compila o Nginx já configurado&lt;/span&gt;
make

&lt;span class="c"&gt;# Instala o Nginx no sistema&lt;/span&gt;
make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Apareceu algum erro? Não? 🎉🎉&lt;br&gt;
Ótimo! Finalizamos a instalação do servidor. Para testar, basta iniciar o serviço do Nginx e abrir o navegador &lt;a href="http://localhost"&gt;http://localhost&lt;/a&gt; 🖥&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/sbin/nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Nos próximos capítulos, ao indicar um módulo irei informar qual &lt;em&gt;flag&lt;/em&gt; deverá ser utilizada para instalá-lo com o Nginx. Ela deverá ser utilizada no momento da compilação.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Explicação das Flags 🚩
&lt;/h2&gt;

&lt;p&gt;Não é obrigatório saber todas, mas é importante saber o que você está instalando e para que cada &lt;em&gt;flag&lt;/em&gt; serve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurações de Caminhos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;script&lt;/em&gt; &lt;code&gt;configure&lt;/code&gt; permite definir caminhos para arquivos binários e de configuração NGINX e para bibliotecas dependentes como PCRE ou SSL, a fim de vinculá-los ao binário NGINX.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;code&gt;--prefix=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o diretório principal das configurações do Nginx. Padrão: &lt;em&gt;/usr/local/nginx&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;-sbin-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o nome e o caminho do arquivo executável. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/sbin/nginx&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--conf-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o arquivo principal de configuração do Nginx. É possível carregar o Nginx com um arquivo de configuração diferente, basta usar a flag &lt;code&gt;-c &amp;lt;file&amp;gt;&lt;/code&gt;. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/nginx.conf&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--http-log-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o arquivo principal do log de acesso geral. É possível configurar um arquivo diferente para cada servidor virtual usando a diretiva &lt;a href="https://nginx.org/r/access_log"&gt;access_log&lt;/a&gt;. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/logs/access.log&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--error-log-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o arquivo principal do log de erro geral. É possível configurar um arquivo diferente para cada servidor virtual usando a diretiva &lt;a href="https://nginx.org/r/access_log"&gt;error_log&lt;/a&gt;. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/logs/error.log&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--pid-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o nome do arquivo que conterá o PID (ID do processo mestre). Você pode alterar o local no arquivo &lt;code&gt;nginx.conf&lt;/code&gt;. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/logs/nginx.pid&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--modules-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o diretório onde os módulos dinâmicos serão instalados. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/modules/&lt;/em&gt;
&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;strong&gt;Configurações de diretórios de dados temporários&lt;/strong&gt;&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;code&gt;--http-client-body-temp-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o diretório em que será armazenados temporariamente o corpo das requisições. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/client_body_temp&lt;/em&gt;
&lt;/dd&gt;
  
  &lt;dt&gt;&lt;code&gt;--http-proxy-temp-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o diretório em que serão armazenados temporariamente os dados recebidos ao utilizar proxy reverso. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/proxy_temp&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--http-fastcgi-temp-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o diretório em que serão armazenados temporariamente os dados recebidos ao utilizar por servidores FastCGI. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/fastcgi_temp&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--http-uwsgi-temp-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o diretório em que serão armazenados temporariamente os dados recebidos ao utilizar por servidores UWSGI. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/uwsgi_temp&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--http-scgi-temp-path=&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o diretório em que serão armazenados temporariamente os dados recebidos ao utilizar por servidores SCGI. Padrão: &lt;em&gt;&amp;lt;prefix&amp;gt;/scgi_temp&lt;/em&gt;
&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;strong&gt;Configurações gerais do Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;code&gt;--with-debug&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita os logs de debug.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-compat&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita a compatibilidade com módulos dinâmicos.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-pcre-jit&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita a biblioteca PCRE com suporte a “just-in-time compilation”. Requer a biblioteca PCRE instalada.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-pcre&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Força o uso da biblioteca PCRE. Requer a biblioteca PCRE instalada.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--user=&lt;em&gt;user-name&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o usuário sem privilégios cujas credentiais serão usadas nos processos de trabalho (Services Worker). Padrão: &lt;em&gt;nobody&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--group=&lt;em&gt;group-name&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Define o nome do grupo sem privilégios cujas credentiais serão usadas nos processos de trabalho (Services Worker). Padrão: O mesmo que &lt;em&gt;--user&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-threads&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita a thread pools. Elas são usadas para leitura e envio de arquivos sem bloquear os processos de trabalho.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;strong&gt;Ativando módulos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O NGINX consiste em um conjunto de módulos específicos de função, que são compilados com o &lt;em&gt;script&lt;/em&gt; &lt;code&gt;configure&lt;/code&gt; junto com outras opções de construção.&lt;/p&gt;

&lt;p&gt;Se você quiser ativar um módulo que não é "buildado" por padrão, utilize o prefixo &lt;code&gt;--with-&amp;lt;nome_do_modulo&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;code&gt;--with-http_ssl_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita suporte ao protocolo HTTPS para um servidor virtual. Requer a biblioteca &lt;a href="https://www.openssl.org/"&gt;openssl&lt;/a&gt;
&lt;/dd&gt;
  
  &lt;dt&gt;&lt;code&gt;--with-http_stub_status_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_stub_status_module&lt;/em&gt;. Ele é usado por plataformas de métrica ou gerenciamento de *logs*.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_realip_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_realip_module&lt;/em&gt;. Ele é usado para alterar o endereço do cliente. Com o Cloudflare, por exemplo, permite identificar o IP real do usuário.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_auth_request_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_auth_request_module&lt;/em&gt;. Ele é utilizado para implementação de subrequisições para autenticação.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_v2_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita suporte ao protocolo HTTP/2.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_dav_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_dav_module&lt;/em&gt;. Ele é utilizado para gerenciamento de arquivos com o protocolo WebDAV.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_slice_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_slice_module&lt;/em&gt;. Ele é usado para dividir uma requisição. Isso permite retornar partes de um arquivo de acordo com o cabeçalho Range, por exemplo.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_addition_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_addition_module&lt;/em&gt;. Ele é usado para modificar uma resposta adicionando um conteúdo antes ou depois dela.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_gunzip_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_gunzip_module&lt;/em&gt;. Ele é utilizado para compactação com &lt;em&gt;gzip&lt;/em&gt;
&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_gzip_static_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_gzip_static_module&lt;/em&gt;. Ele é utilizado para transferência de arquivos compactados com &lt;em&gt;gzip&lt;/em&gt;.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_image_filter_module=&lt;em&gt;dynamic&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_image_filter_module&lt;/em&gt;. Ele serve para modificar/alterar arquivos de imagens (JPEG, GIF, PNG, WEBP).&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-http_sub_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_http_sub_module&lt;/em&gt;. Ele permite substituir trechos da resposta.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-stream=&lt;em&gt;dynamic&lt;/em&gt;&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o módulo &lt;em&gt;ngx_stream_core_module&lt;/em&gt; para proxy TCP/UDP e balanço de carga genérico.&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--with-stream_ssl_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Habilita o suporte ao procotolo SSL/TLS para módulo &lt;em&gt;ngx_stream_core_module&lt;/em&gt;.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;strong&gt;Desativando módulos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alguns módulos como Rewrite e HTTP são "buildados" por padrão. Para desativá-los, basta usar o prefixo &lt;code&gt;--without-&amp;lt;nome-do-modulo&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;code&gt;--without-mail_pop3_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Desabilita o protocolo &lt;em&gt;POP3&lt;/em&gt; para o proxy de email&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--without-mail_imap_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Desabilita o protocolo &lt;em&gt;IMAP&lt;/em&gt; para o proxy de email&lt;/dd&gt;

  &lt;dt&gt;&lt;code&gt;--without-mail_smtp_module&lt;/code&gt;&lt;/dt&gt;
  &lt;dd&gt;Desabilita o protocolo &lt;em&gt;SMTP&lt;/em&gt; para o proxy de email&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Ufa!! Terminamos. 🥱🥱&lt;br&gt;
Para saber outras &lt;em&gt;flags&lt;/em&gt;, basta acessar o link &lt;a href="http://nginx.org/en/docs/configure.html"&gt;http://nginx.org/en/docs/configure.html&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Organizando nossa estrutura 📝
&lt;/h2&gt;

&lt;p&gt;Se você abrir o arquivo &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt;, verá que o Nginx já deixou uma configuração pronta. Eu não curto muito essa estrutura e essa configuração, então mudá-la-ei, mas este passo é totalmente opcional e fica de acordo com o gosto de cada dev.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Cria as pastas necessárias&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/nginx/&lt;span class="o"&gt;{&lt;/span&gt;modules-enabled,config_default,sites-available,sites-enabled,log_formats,snippets&lt;span class="o"&gt;}&lt;/span&gt; /var/www/html

&lt;span class="c"&gt;# Move os arquivos de exemplo&lt;/span&gt;
&lt;span class="nb"&gt;mv&lt;/span&gt; /etc/nginx/&lt;span class="k"&gt;*&lt;/span&gt;.default /etc/nginx/config_default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora vamos reescrever o arquivo de configuração &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt; com o conteúdo abaixo:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Falta pouco! Como removemos o código padrão, nosso servidor parou de funcionar. Precisamos criar um novo servidor virtual, beleza? 👍&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vim /etc/nginx/sites-available/valdeir.dev.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;em&gt;vim&lt;/em&gt;, digite a configuração abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;server&lt;/span&gt; {
    &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="err"&gt;_&lt;/span&gt;;

    &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;.&lt;span class="n"&gt;htm&lt;/span&gt;;
    &lt;span class="n"&gt;autoindex&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;;

    &lt;span class="n"&gt;location&lt;/span&gt; / {
        &lt;span class="n"&gt;try_files&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt; $&lt;span class="n"&gt;uri&lt;/span&gt;/ =&lt;span class="m"&gt;404&lt;/span&gt;;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ótimo! Agora é necessário criar um link simbólico no diretório &lt;em&gt;sites-enabled&lt;/em&gt; para ativar o site. Ainda no vim, aperte ESC duas vezes e digite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;:w &amp;lt;enter&amp;gt;
:! &lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; %:p /etc/nginx/sites-enabled &amp;lt;enter&amp;gt;
:q
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após cada modificação nos arquivos de configuração, é necessário recarregar o &lt;em&gt;Nginx&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/sbin/nginx &lt;span class="nt"&gt;-s&lt;/span&gt; reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Criando serviço no Ubuntu
&lt;/h2&gt;

&lt;p&gt;Este passo também é opcional. Ele permitirá gerenciar o Nginx através do &lt;code&gt;systemd&lt;/code&gt; (auto iniciar, parar, recarregar etc).&lt;/p&gt;

&lt;p&gt;É simples! Basta criar o arquivo &lt;code&gt;/lib/systemd/system/nginx.service&lt;/code&gt; com o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;O valor de &lt;code&gt;PIDFile&lt;/code&gt; deverá ser igual ao da &lt;em&gt;flag&lt;/em&gt; &lt;code&gt;--pid-path&lt;/code&gt;, que usamos durante a compilação.&lt;/p&gt;

&lt;p&gt;O valor de &lt;code&gt;ExecStartPre&lt;/code&gt;, &lt;code&gt;ExecStart&lt;/code&gt; e &lt;code&gt;ExecReload&lt;/code&gt; deverá ser igual ao da &lt;em&gt;flag&lt;/em&gt; &lt;code&gt;--sbin-path&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Chegamos ao final de mais um capítulo. Nos próximos, aprenderemos o que e como funcionam as princiais diretivas do Nginx; aprenderemos também como melhorar e segurança e performance de nossos sites.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>nginx</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Bem-vindo(a) ao @Container Queries CSS</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Thu, 26 Aug 2021 16:57:21 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/bem-vindo-a-ao-container-queries-css-d9b</link>
      <guid>https://dev.to/valdeirpsr/bem-vindo-a-ao-container-queries-css-d9b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Image cover by &lt;a href="https://hermes.digitalinnovation.one"&gt;https://hermes.digitalinnovation.one&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  O que é
&lt;/h2&gt;

&lt;p&gt;Recentemente, o Google Chrome adicionou o recurso CSS &lt;em&gt;@container query&lt;/em&gt;. A novidade é semelhante as &lt;em&gt;@media queries&lt;/em&gt;, que são usadas para auxiliar a construção de sites responsivos.&lt;/p&gt;

&lt;p&gt;O recurso foi proposto por &lt;a href="https://github.com/mirisuzanne"&gt;Miriam Suzanne&lt;/a&gt;, contribuidora do projeto SASS e especialista convidada no projeto W3C, com base em uma proposta do &lt;a href="https://github.com/dbaron"&gt;David Baron&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Para que serve
&lt;/h2&gt;

&lt;p&gt;A novidade permitirá que os desenvolvedores apliquem estilizações em um elemento de acordo com o tamanho do elemento pai e não apenas do &lt;em&gt;viewport&lt;/em&gt; como ocorre com &lt;em&gt;@media query&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A vantagem da novidade é escrever elementos modulares com base em suas dimensões sem a necessidade de JavaScript. Junto com o recurso, o CSS receberá duas novas propriedades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Novas propriedades CSS&lt;/strong&gt;&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;b&gt;container-name&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;É ser usada para identificar o container. Assim, será possível isolar as regras de cada elemento.&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;container-type&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;É usada para definir o tipo de container. Atualmente, há três valores possíveis.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;strong&gt;Valores da propriedade &lt;code&gt;container-type&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;&lt;b&gt;block-size&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Estabelece um container para uma consulta dimensional no eixo vertical do próprio container (altura).&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;inline-size&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Estabelece um container para uma consulta dimensional no eixo horizontal do próprio container (largura).&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;size&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;Estabelece um container para uma consulta dimensional nos eixos vertical e horizontal do próprio container.&lt;/dd&gt;
&lt;/dl&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção!&lt;/strong&gt; A depender do valor da propriedade &lt;code&gt;writing-mode&lt;/code&gt;, a opção &lt;code&gt;inline-size&lt;/code&gt; poderá utilizar o eixo vertical; e a opção &lt;code&gt;block-size&lt;/code&gt;, o eixo horizontal para consulta dimensional.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Como usar
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Alguns trechos de CSS, JavaScript e HTML foram suprimidos, pois o foco é apenas na novidade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para adicionar suporte aos &lt;em&gt;containers&lt;/em&gt;, é preciso criar um elemento pai que deverá receber a propriedade &lt;code&gt;container-type&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.music&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;container-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;musics&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;container-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inline-size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="n"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;50%&lt;/span&gt; &lt;span class="n"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A propriedade &lt;code&gt;container-name&lt;/code&gt; é importante para tornar o elemento o mais modular possível. Com ele, é possível informar regras específicas para cada elemento, no entanto, o uso da propriedade é opcional.&lt;/p&gt;

&lt;p&gt;Após declarar um &lt;em&gt;@container&lt;/em&gt;, crie as regras para definir as customizações dele. Criá-las é simples, a sintaxe é semelhante à das &lt;em&gt;media rules&lt;/em&gt; e aceita múltiplas condições e regras.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;container-name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;feature-name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;feature-value&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;feature-name&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;feature-value&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* Code Here */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Segue exemplo:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/**
 * Se a largura máxima do container 
 * (div.music) for menor que 570px...
 */&lt;/span&gt;
&lt;span class="k"&gt;@container&lt;/span&gt; &lt;span class="n"&gt;musics&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;570px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="py"&gt;contain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;grid-template-areas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"media media"&lt;/span&gt;
      &lt;span class="s1"&gt;"heading heading"&lt;/span&gt;
      &lt;span class="s1"&gt;"content content"&lt;/span&gt;
      &lt;span class="s1"&gt;"footer footer"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card-media&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card-media&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card-heading&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card-content&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card-footer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card-content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="m"&gt;1s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card-content.active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No HTML, foi adicionada a seguinte estrutura:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!--
- Elemento PAI, que deverá
- receber a propriedade `container-type`
--&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"music"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!--
  - Estrutura do card da música
  --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"carta_1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"wave"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!--
    - Capa do álbum
    --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-media"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://source.unsplash.com/random/185x185"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!--
    - Nome da música do artista
    --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-heading"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Carta Nº 1&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;SID Mc&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!--
    - Letra da música
    --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Eu vi escorrer na pia a alegria avermelhada ♫&lt;span class="nt"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;
      Eu vi escorrer na pia a agonia acumulada ♪
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"card-footer"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;ORDER NOW&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Demonstração
&lt;/h2&gt;


&lt;div class="glitch-embed-wrap"&gt;
  &lt;iframe src="https://glitch.com/embed/#!/embed/poised-reflective-fabrosaurus?previewSize=100&amp;amp;path=index.html" alt="poised-reflective-fabrosaurus on glitch"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  Demonstração em vídeo
&lt;/h2&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/_WB6ZRiuhhk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparação com &lt;em&gt;@media query&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;A consulta de dispositivo (ou &lt;em&gt;media query&lt;/em&gt;) surgiu para facilitar a criação de sites responsivos. Com ele, é possível configurar diversas regras de estilização de acordo com o tamanho do &lt;em&gt;viewport&lt;/em&gt; (área visível da tela). É legal e funciona corretamente.&lt;/p&gt;

&lt;p&gt;No entanto, ainda há limitações. As estilizações com &lt;em&gt;@media query&lt;/em&gt; são aplicadas somente quando o usuário altera o tamanho da janela (maximizando, redimensionando ou alterando a orientação), por exemplo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1buiXysg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/unmnp286htccakjofw08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1buiXysg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/unmnp286htccakjofw08.png" alt="Media Query"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O sistema de &lt;em&gt;@container&lt;/em&gt; foi proposto para remover essa limitação. Ele permite que as estilizações sejam feitas de acordo com o tamanho do elemento pai independente das dimensões da &lt;em&gt;viewport&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yTlDBjtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/usmp31easx4sl2yrvown.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yTlDBjtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/usmp31easx4sl2yrvown.png" alt="Container Query"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Compatibilidade
&lt;/h2&gt;

&lt;p&gt;Até o momento (24 ago 2021), o recurso está disponível apenas para o Chrome 92 ou superior.&lt;/p&gt;

&lt;p&gt;Para habilitar e testá-lo, basta acessar a página &lt;code&gt;chrome://flags&lt;/code&gt;, pesquisar por &lt;em&gt;Container Queries&lt;/em&gt;, habilitar o recurso e reiniciar o navegador.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FJmbwSiv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmpunww1amb9cq0zumfb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FJmbwSiv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmpunww1amb9cq0zumfb.png" alt="Habilitando Container Query"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Polyfill
&lt;/h2&gt;

&lt;p&gt;Como alternativa, pode utilizar a API &lt;code&gt;ResizeObserver&lt;/code&gt; ou o projeto &lt;a href="https://github.com/jsxtools/cqfill/"&gt;cqfill&lt;/a&gt; com o PostCSS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demonstração com CQFill&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/jonneal/embed/WNRPBQg?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;É isso! Conforme o Google for liberando novidades, irei postar e atualizar aqui. Qualquer dúvida, só falar.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>css</category>
      <category>frontend</category>
      <category>design</category>
    </item>
    <item>
      <title>Série Nginx #1: Instalando e Configurando</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Thu, 26 Aug 2021 14:38:28 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/serie-nginx-1-instalando-e-configurando-3o99</link>
      <guid>https://dev.to/valdeirpsr/serie-nginx-1-instalando-e-configurando-3o99</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Nginx
&lt;/h2&gt;

&lt;p&gt;Ele é um servidor web de código aberto, de alto desempenho e que conta com suporte a proxy reverso, sistema de cache e &lt;em&gt;load balancer&lt;/em&gt;. Ele foi criado por &lt;em&gt;Igor Sysoev&lt;/em&gt; por volta de 2004 para resolver o problema conhecido como &lt;a href="http://www.kegel.com/c10k.html" rel="noopener noreferrer"&gt;C10K&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  O problema
&lt;/h2&gt;

&lt;p&gt;Parte dos servidores web utiliza o modelo de uma conexão por &lt;em&gt;thread&lt;/em&gt; ou processo. Ao fazer dessa forma, quando a ação &lt;em&gt;Y&lt;/em&gt; é gerada, ela esperará até uma ação &lt;em&gt;X&lt;/em&gt;, criada antes, ser finalizada. Durante todo o tempo, essa ação &lt;em&gt;Y&lt;/em&gt; ficará bloqueada, esperando ser liberada.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como o Nginx o resolveu
&lt;/h2&gt;

&lt;p&gt;O &lt;em&gt;Nginx&lt;/em&gt; funciona como uma &lt;em&gt;simultaneous exhibition&lt;/em&gt;. Ele utiliza, normalmente, um processo mestre para cada núcleo do processador. Esse processo é responsável por ouvir os eventos e atender a todas as requisições de forma simultânea.&lt;/p&gt;

&lt;p&gt;Diferente de outros servidores web, o Nginx não espera a ação ser realizada para prosseguir com as outras ações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2FU4A96Vl8OW7xS1COfU%2Fgiphy.gif%3Fcid%3Decf05e47kpufw5zrvruwhq0or62dqz15mlsiuhae5ww6p51u%26rid%3Dgiphy.gif%26ct%3Dg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2FU4A96Vl8OW7xS1COfU%2Fgiphy.gif%3Fcid%3Decf05e47kpufw5zrvruwhq0or62dqz15mlsiuhae5ww6p51u%26rid%3Dgiphy.gif%26ct%3Dg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;simultaneous exhibition (grandmaster)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Isso acontece porque o NGINX utiliza estratégias de I/O (Input/Output) não-bloqueantes disponibilizadas pelo sistema, que podem variar de acordo com o sistema operacional. Algumas delas são: &lt;a href="https://github.com/nginx/nginx/blob/master/src/event/modules/ngx_devpoll_module.c" rel="noopener noreferrer"&gt;/dev/poll&lt;/a&gt;, &lt;a href="https://github.com/nginx/nginx/blob/master/src/event/modules/ngx_epoll_module.c" rel="noopener noreferrer"&gt;epoll&lt;/a&gt;, &lt;a href="https://github.com/nginx/nginx/blob/master/src/event/modules/ngx_kqueue_module.c" rel="noopener noreferrer"&gt;kqueue para FreeBSD&lt;/a&gt; ou &lt;a href="https://github.com/nginx/nginx/blob/master/src/event/modules/ngx_win32_poll_module.c" rel="noopener noreferrer"&gt;poll para Windows&lt;/a&gt; e outras.&lt;/p&gt;


&lt;h2&gt;
  
  
  Como o Nginx funciona
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Arquitetura do Processo do Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5esnx52v43m843jyn4qj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5esnx52v43m843jyn4qj.jpg" alt="Page Master Process"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O &lt;em&gt;processo mestre&lt;/em&gt; executa as operações privilegiadas como configuração de leitura e vinculação de portas e então cria um pequeno número de processos filhos (os próximos três tipos).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O processo do &lt;em&gt;cache loader&lt;/em&gt; é executado na inicialização para carregar o cache baseado em disco na memória e, em seguida, é encerrado. Ele é planejado de forma moderada, portanto, suas demandas de recursos são baixas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O processo do &lt;em&gt;gerenciador de cache&lt;/em&gt; é executado periodicamente e remove entradas dos caches de disco para mantê-las dentro dos tamanhos configurados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Os &lt;em&gt;services workers&lt;/em&gt; fazem todo o trabalho. Eles lidam com conexões de rede, lêem e gravam conteúdo em disco e se comunicam com serviços upstream/proxy e interfaces CGI (PHP, Node, Python, Go etc).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Processo de Trabalho&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrtktdl7is93p5uzkxql.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrtktdl7is93p5uzkxql.jpg" alt="Detalhes do Processo de Trabalho do NGINX"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Realiza as estratégias I/O não bloqueante para a comunicação com os serviços &lt;em&gt;upstream/proxy&lt;/em&gt; e interfaces &lt;em&gt;CGI&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integra o servidor web com as aplicações, utilizando as interfaces FastCGI, WSGI, SCGI; o &lt;em&gt;gateway memcached&lt;/em&gt;, os &lt;em&gt;streams&lt;/em&gt;, as sub-requisições e o protocolo TCP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lê os conteúdos estáticos (imagens, css, js etc); lê, cria e atualiza os &lt;em&gt;caches&lt;/em&gt; dos arquivos ou as respostas da aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Grava os &lt;em&gt;logs&lt;/em&gt; de acesso e erro de acordo com a configuração do Nginx.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Vale lembrar que — nativamente — a escrita de arquivo funciona de forma síncrona. O arquivo é criado e bloqueado para novos acessos até ser liberado pelo sistema. A partir do &lt;em&gt;NGINX 1.9.13&lt;/em&gt;, tornou-se possível configurar a escrita de arquivos temporários de forma assíncrona com o &lt;a href="https://man7.org/linux/man-pages/man3/aio_write.3.html" rel="noopener noreferrer"&gt;aio_write&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Ciclo de vida de uma requisição no NGINX&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlgpga6ama3vt2uejlu2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlgpga6ama3vt2uejlu2.jpg" alt="Ciclo de vida de uma requisição no NGINX"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Recebe a requisição e descriptografa as informações caso ela esteja utilizando HTTPS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identifica a configuração das diretivas em bloco &lt;code&gt;server&lt;/code&gt; (Servidor Virtual) e &lt;code&gt;location&lt;/code&gt;, que é carregada conforme URI da requisição.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aplica limites (&lt;em&gt;Rate Limit&lt;/em&gt;) para requisição (opcional).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Executa autenticação interna e/ou externa como &lt;a href="https://datatracker.ietf.org/doc/html/rfc7617" rel="noopener noreferrer"&gt;&lt;em&gt;HTTP Basic Authentication&lt;/em&gt;&lt;/a&gt;. A autenticação pode ser feita com módulos nativos ou de de terceiros (opcional).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Acessa a aplicação através de interfaces de comunicação ou serviços &lt;em&gt;upstreams&lt;/em&gt; para obter a resposta que será retornada para o cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Realiza verificações da saúde da aplicação (se ela está ativa), controle de requisições simultâneas, &lt;em&gt;load balancer&lt;/em&gt;, resposta de cache etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recebe a resposta da aplicação, filtra-a utilizando compressores como &lt;em&gt;gzip&lt;/em&gt;, &lt;em&gt;brotli&lt;/em&gt; ou optimiza-a com filtros (por exemplo, em imagens) etc. É possível usar módulos nativos ou de terceiros para realizar o filtro (opcional).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Registra o log de acesso e o de sessão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Retorna a resposta filtrada para o cliente.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Vamos mostrar como instalar nos sistemas operacionais mais conhecidos. Posteriormente, veremos como compilar o código fonte. Este passo é importante para configuração dos módulos de terceiro (será estudado em outra parte da série).&lt;/p&gt;
&lt;h3&gt;
  
  
  Linux
&lt;/h3&gt;

&lt;p&gt;No exemplo, o processo de instalação será mostrado com os sitemas &lt;em&gt;Ubuntu&lt;/em&gt;, &lt;em&gt;Alpine&lt;/em&gt; e &lt;em&gt;CentOs&lt;/em&gt;. Posteriormente, como compilar o código no &lt;em&gt;Ubuntu&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Ubuntu
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Adiciona suporte à instalação da versão mais recente&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb https://nginx.org/packages/ubuntu/ &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; nginx"&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/apt/sources.list
&lt;span class="c"&gt;# Adiciona chave de assinatura&lt;/span&gt;
curl &lt;span class="nt"&gt;-sSLo-&lt;/span&gt; https://nginx.org/keys/nginx_signing.key | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add
&lt;span class="c"&gt;# Instala o Nginx&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Alpine
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apk add nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  CentOS
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;epel-release
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Mac
&lt;/h3&gt;

&lt;p&gt;1. É necessário utilizar o &lt;a href="https://brew.sh/index_pt-br" rel="noopener noreferrer"&gt;Homebrew&lt;/a&gt;, que permitirá a instalação de pacotes que o Mac não fornece. Para instalá-lo, utilize o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/bin/bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;2. Instale o Nginx:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Windows
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Acesse a página &lt;a href="http://nginx.org/en/download.html" rel="noopener noreferrer"&gt;http://nginx.org/en/download.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Escolha a versão que você deseja baixar (recomendo a &lt;em&gt;stable&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Após baixá-la, extraia o arquivo &lt;em&gt;zip&lt;/em&gt; e mova a pasta extraída para *C:*&lt;/li&gt;
&lt;li&gt;Inicie o executável &lt;em&gt;nginx.exe&lt;/em&gt; para iniciar o serviço do servidor web.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Dica: para encerrar o Nginx, abra o &lt;em&gt;prompt de comando&lt;/em&gt; e execute o comando &lt;code&gt;tasklist /fi "imagename eq nginx.exe"&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Estrutura de arquivos
&lt;/h2&gt;

&lt;p&gt;Após baixar e instalar o &lt;em&gt;Nginx&lt;/em&gt;, é criada uma pasta com todos os arquivos de configuração.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O local de instalação e a estrutura de arquivos podem variar conforme o método de instalação e o sistema operacional. Para esta postagem, utilizei o Nginx instalado via &lt;em&gt;apt&lt;/em&gt; no Ubuntu 20.04.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ao acessar o local de instalação (&lt;code&gt;/etc/nginx&lt;/code&gt;), veremos uma estrutura parecida com esta:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tree /etc/nginx

/etc/nginx
├── conf.d
├── fastcgi.conf
├── fastcgi_params
├── mime.types
├── modules-available
├── modules-enabled
├── nginx.conf
├── proxy_params
├── sites-available
│   ├── default
├── sites-enabled
│   ├── default -&amp;gt; /etc/nginx/sites-available/default
├── snippets
│   ├── fastcgi-php.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Vamos descobrir para que serve cada um dos arquivos/pastas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Arquivo/Pasta&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Descrição&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;conf.d/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pasta com as configurações extras do Nginx. Nela, é possível criar um arquivo de configuração que será incluído automaticamente nas configurações gerais.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;fastcgi.conf, fastcgi_params&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configurações do &lt;a href="https://www.ibm.com/docs/pt-br/ibm-http-server/9.0.5?topic=applications-learn-about-fastcgi" rel="noopener noreferrer"&gt;fastcgi&lt;/a&gt;. Com eles, é possível incluir, excluir ou remover parâmetros usado pela interface entre o servidor da web e os aplicativos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;mime.types&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Funciona como um &lt;em&gt;map&lt;/em&gt; para identificar o &lt;em&gt;mimetype&lt;/em&gt; dos arquivos conforme a extensão dele.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;modules-available/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configuração dos módulos disponíveis. (Veremos sobre os módulos mais adiante)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;modules-enabled/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Através de um &lt;em&gt;symlink&lt;/em&gt;, indica quais módulos o &lt;em&gt;Nginx&lt;/em&gt; deverá carregar e executar.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;nginx.conf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configuração geral do &lt;em&gt;Nginx&lt;/em&gt;. Nele, contém configuração básica de formatação de &lt;em&gt;log&lt;/em&gt;, &lt;em&gt;SSL&lt;/em&gt;, &lt;em&gt;upload&lt;/em&gt;, &lt;em&gt;gzip&lt;/em&gt;, &lt;em&gt;pid&lt;/em&gt; (Process Identifier, no Unix), número de conexões simultâneas por processo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;proxy_params&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configurações usada com o recurso de &lt;em&gt;proxy&lt;/em&gt; reverso. (Veremos um pouco ao configurar o &lt;em&gt;ExpressJs&lt;/em&gt; com o &lt;em&gt;NodeJs&lt;/em&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sites-available/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nesta pasta, ficam as configurações dos servidores virtuais.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;sites-enabled/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nesta pasta, ficam os servidores virtuais ativos. Caso o arquivo de configuração esteja em &lt;em&gt;sites-available&lt;/em&gt;, mas não esteja em &lt;em&gt;sites-enabled&lt;/em&gt;, o Nginx não irá carregá-lo.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;snippets/&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configurações extras.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sabendo disso, vamos continuar.&lt;/p&gt;


&lt;h2&gt;
  
  
  Configurando
&lt;/h2&gt;

&lt;p&gt;Nesta etapa, configuraremos o Nginx para servir o &lt;em&gt;WordPress&lt;/em&gt; e com o NodeJS (ExpressJS). Portanto, presume-se que você os conheças e os tenha instalados em seu sistema.&lt;/p&gt;

&lt;p&gt;Removeremos os arquivos de configuração padrão. Ele não será necessário.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo rm&lt;/span&gt; /etc/nginx/sites-available/default
&lt;span class="nb"&gt;sudo rm&lt;/span&gt; /etc/nginx/sites-enabled/default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  PHP 8.x (WordPress)
&lt;/h3&gt;

&lt;p&gt;Vamos criar um arquivo de configuração específico para esse site; dessa forma, deixaremos os arquivos mais organizados.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Cria o arquivo de configuração&lt;/span&gt;
&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nginx/sites-available/php.valdeir.dev.conf

&lt;span class="c"&gt;# Habilita o servidor virtual&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/php.valdeir.dev.conf /etc/nginx/sites-enabled/php.valdeir.dev.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora, vamos escrever nossas regras. No arquivo &lt;code&gt;/etc/nginx/sites-available/node.valdeir.dev&lt;/code&gt;, utilize o código abaixo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A explicação está no arquivo para facilitar o entendimento&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Reinicie o Nginx para ele carregar as novas configurações.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nginx -s reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  NodeJS
&lt;/h3&gt;

&lt;p&gt;Para começar, vamos criar um arquivo de configuração e um link simbólico para ele.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Cria o arquivo de configuração&lt;/span&gt;
&lt;span class="nb"&gt;sudo touch&lt;/span&gt; /etc/nginx/sites-available/node.conf

&lt;span class="c"&gt;# Habilita o servidor virtual&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/node.conf /etc/nginx/sites-enabled/node.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora, escreveremos nossas regras. No arquivo &lt;code&gt;/etc/nginx/sites-available/node&lt;/code&gt;, utilize o código abaixo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A explicação está no arquivo para facilitar o entendimento&lt;/p&gt;
&lt;/blockquote&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Para criação do servidor, utilizaremos a API &lt;em&gt;Http&lt;/em&gt; do &lt;em&gt;NodeJS&lt;/em&gt;, que retornará um "Olá, mundo".&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Reinicie o Nginx para ele carregar as novas configurações.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nginx -s reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, basta iniciar o servidor com o node &lt;code&gt;node server.js&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Finalizado
&lt;/h2&gt;

&lt;p&gt;É isso, finalizamos a primeira parte. Aprendemos o que é o Nginx, como ele funciona e como configurar uma aplicação com ele.&lt;/p&gt;

&lt;p&gt;Nas próximas partes, falaremos sobre os módulos e como usá-los para obter mais segurança e melhor performance no site. Ademais, falaremos sobre métricas e análise de &lt;em&gt;logs&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>nginx</category>
      <category>wordpress</category>
      <category>node</category>
    </item>
    <item>
      <title>Para que serve o comando `git send-email`?</title>
      <dc:creator>Valdeir S.</dc:creator>
      <pubDate>Wed, 14 Apr 2021 02:51:10 +0000</pubDate>
      <link>https://dev.to/valdeirpsr/para-que-serve-o-comando-git-send-email-1nbk</link>
      <guid>https://dev.to/valdeirpsr/para-que-serve-o-comando-git-send-email-1nbk</guid>
      <description>&lt;p&gt;O GIT nasceu em um momento que era muito comum programadores e entusiastas se reunirem em comunidades e fóruns para debater e programar. Apesar de existir softwares de versionamentos como o &lt;a href="https://www.bitkeeper.org/"&gt;Bitkeeper&lt;/a&gt;(na época pago), não existia (até onde sei) um sistema integrado ao &lt;em&gt;Git&lt;/em&gt; (lançando em 2005) como o &lt;a href="https://github.com/valdeirpsr"&gt;Github&lt;/a&gt;, GitLab e Bitbucket, por exemplo.&lt;/p&gt;

&lt;p&gt;Em vez disso, alguns programadores utilizavam as trocas de e-mails para enviar correções e novos códigos, através do protocolo SMTP/IMAP, para outros desenvolvedores ou fóruns. Com isso, eles podiam compartilhar seus códigos e ajudar a comunidade.&lt;/p&gt;

&lt;p&gt;A vantagem, na época, era a velocidade de transmissão de dados e o custo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Como o comando funciona?
&lt;/h1&gt;

&lt;p&gt;Basicamente, ele envia uma coleção de correções feitas por você para o destinatário, que vai poder mesclar as alterações utilizando o comando &lt;code&gt;git-am&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O comando permite o uso de dois formatos para envio das correções:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Formato &lt;em&gt;mbox&lt;/em&gt; (veremos adiante)&lt;/li&gt;
&lt;li&gt;Formato criado por Greg Kroah-hartman (Use por sua conta em risco. Palavras do autor 😁)&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  É possível enviar anexos com o comando?
&lt;/h1&gt;

&lt;p&gt;Não. Ele envia apenas texto. Caso queira enviar seu repositório por e-mail, basta usar o comando &lt;code&gt;git archive&lt;/code&gt; (para comprimir os arquivos com &lt;em&gt;zip&lt;/em&gt;, &lt;em&gt;gzip&lt;/em&gt;, &lt;em&gt;bzip2&lt;/em&gt; ou &lt;em&gt;xz&lt;/em&gt;) ou &lt;code&gt;git bundle&lt;/code&gt; (para criar um arquivo compactado com todas as alterações).&lt;/p&gt;

&lt;h1&gt;
  
  
  Como enviar correções via e-mail?
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Requisitos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Um repositório. Irei usar o &lt;a href="https://github.com/valdeirpsr/dotfiles"&gt;https://github.com/valdeirpsr/dotfiles&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Servidor de e-mail. Irei utilizar o &lt;a href="https://mailtrap.io/"&gt;Mailtrap&lt;/a&gt; para simulação de envio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conhecimento básico de GIT&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Preparando envio
&lt;/h3&gt;

&lt;p&gt;Antes de fazer o envio, precisamos preparar as correções utilizando o comando &lt;code&gt;git-format-patch&lt;/code&gt; como no exemplo abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# No comando abaixo, você pode informar um &amp;lt;commit hash&amp;gt; ou &amp;lt;revision range&amp;gt;&lt;/span&gt;
git format-patch 0ac05bd5a72f8d4e6f2d7313689153851a4809e5

&lt;span class="c"&gt;# O comando cria um arquivo por &amp;lt;commit&amp;gt;, que será nomeado com "&amp;lt;id&amp;gt;-&amp;lt;assunto do commit&amp;gt;.patch"&lt;/span&gt;
&lt;span class="c"&gt;# 0001-Update-.bash_aliases.patch&lt;/span&gt;
&lt;span class="c"&gt;# 0002-Create-.functions.patch&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Observação:&lt;/strong&gt; Para incluir um arquivo, use o comando &lt;code&gt;git format-patch --root -- &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Conteúdo dos arquivos *.patch
&lt;/h3&gt;

&lt;p&gt;Ao abrir ou imprimir o conteúdo do arquivo na tela, podemos ver que ele possui os cabeçalhos de e-mail (&lt;em&gt;FROM&lt;/em&gt;, &lt;em&gt;SUBJECT&lt;/em&gt;, &lt;em&gt;DATE&lt;/em&gt;) e o corpo da mensagem informando onde ocorreram as alterações.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;OBS.:&lt;/em&gt; Os comentários iniciados com &lt;em&gt;#&lt;/em&gt; não existem no arquivo original e foram adicionados por motivos didáticos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Na linha abaixo temos o &amp;lt;commit-hash&amp;gt;&lt;/span&gt;
From 28f8dabbc894ec75a1d8bee86f9de18ad1e7ccd1 Mon Sep 17 00:00:00 2001

&lt;span class="c"&gt;# Informações autor&lt;/span&gt;
From: Valdeir S. &amp;lt;contact@valdeir.dev&amp;gt;

&lt;span class="c"&gt;# Data de criação do &amp;lt;commit&amp;gt;&lt;/span&gt;
Date: Sat, 20 Mar 2021 16:17:48 &lt;span class="nt"&gt;-0300&lt;/span&gt;

&lt;span class="c"&gt;# Assunto do &amp;lt;commit&amp;gt; (a primeira linha dele)&lt;/span&gt;
Subject: &lt;span class="o"&gt;[&lt;/span&gt;PATCH 1/3] Update .bash_aliases

&lt;span class="c"&gt;# Estatísticas das alterações, que&lt;/span&gt;
&lt;span class="c"&gt;# Apresenta a quantidade de arquivos alterados, criados e deletados&lt;/span&gt;
&lt;span class="c"&gt;# E a quantidade de caracteres removidos e adicionados&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;
 .bash_aliases | 3 &lt;span class="nt"&gt;---&lt;/span&gt;
 1 file changed, 3 deletions&lt;span class="o"&gt;(&lt;/span&gt;-&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;# Abaixo são destacadas as diferenças entre o snapshot anterior do arquivo com o atual&lt;/span&gt;
diff &lt;span class="nt"&gt;--git&lt;/span&gt; a/.bash_aliases b/.bash_aliases

&lt;span class="c"&gt;# Index da árvore de trabalho.&lt;/span&gt;
&lt;span class="c"&gt;# Compare `git show 450e3a9` com `git show 1cdcd5e`&lt;/span&gt;
index 450e3a9..1cdcd5e 100644
&lt;span class="nt"&gt;---&lt;/span&gt; a/.bash_aliases
+++ b/.bash_aliases

&lt;span class="c"&gt;# A linha iniciada com "-" significa que a linha foi removida&lt;/span&gt;
&lt;span class="c"&gt;# A linha iniciada com "+" significa que a linha foi adicionada&lt;/span&gt;
&lt;span class="c"&gt;# A linha iniciada SEM "-" e SEM "+" significa que não sofreu alterações&lt;/span&gt;
@@ &lt;span class="nt"&gt;-27&lt;/span&gt;,9 +27,6 @@ &lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;myip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dig +short myip.opendns.com @resolver1.opendns.com"&lt;/span&gt;
 &lt;span class="c"&gt;# Outros&lt;/span&gt;
 &lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;diff&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"git diff --no-index"&lt;/span&gt;

-# Comandos
&lt;span class="nt"&gt;-command&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; calc &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;function &lt;/span&gt;calc&lt;span class="o"&gt;(){&lt;/span&gt; &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s2"&gt;"BEGIN{ print &lt;/span&gt;&lt;span class="nv"&gt;$*&lt;/span&gt;&lt;span class="s2"&gt; }"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
-
 &lt;span class="c"&gt;# Finaliza todos os containers do Docker&lt;/span&gt;
 &lt;span class="k"&gt;function &lt;/span&gt;dockerStopAll&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;for &lt;/span&gt;c &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;docker ps | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; +2 | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="nt"&gt;--&lt;/span&gt;
2.31.1.windows.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enviando alterações
&lt;/h3&gt;

&lt;p&gt;Para enviar as coleções de correções por e-mail, você pode usar um serviço/servidor de SMTP.&lt;br&gt;
No comando abaixo, são definidas as configurações para o envio; no entanto, elas podem ser armazenadas no arquivo de configuração &lt;code&gt;~/.gitconfig&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git send-email &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--smtp-encryption&lt;/span&gt; tls &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--smtp-server&lt;/span&gt; smtp.mailtrap.io &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--smtp-server-port&lt;/span&gt; 587 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--smtp-user&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--smtp-pass&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="k"&gt;*&lt;/span&gt;.patch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Saída do comando
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Lista de arquivos
0001-Update-.bash_aliases.patch
0002-Create-.functions.patch
0003-refactor-remove-o-arquivo-de-configura-o-do-navegado.patch
(mbox) Adding cc: Valdeir S. &amp;lt;contact@valdeir.dev&amp;gt; from line 'From: Valdeir S. &amp;lt;contact@valdeir.dev&amp;gt;'

# Cabeçalho e corpo do e-mail
From: example@valdeir.dev
To: exemplo@valdeir.dev
Cc: Valdeir S. &amp;lt;contact@valdeir.dev&amp;gt;
Subject: [PATCH 1/3] Update-.bash_aliases.patch
Date: Mon, 12 Apr 2021 23:29:20 -0300
Message-Id: &amp;lt;20210413022926.1198-1-example@valdeir.dev&amp;gt;
X-Mailer: git-send-email 2.31.1.windows.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

    The Cc list above has been expanded by additional
    addresses found in the patch commit message. By default
    send-email prompts before sending whenever this occurs.
    This behavior is controlled by the sendemail.confirm
    configuration setting.

    For additional information, run 'git send-email --help'.
    To retain the current behavior, but squelch this message,
    run 'git config --global sendemail.confirm auto'.

Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll):
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;Caso queira enviar as alterações, pressione y ou a; e, ENTER&lt;/p&gt;

&lt;h1&gt;
  
  
  Para que serve o comando &lt;code&gt;format-patch&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Ele é o responsável por preparar os arquivos para cada &lt;em&gt;commit&lt;/em&gt;, já com os cabeçalhos necessários e o a saída do comando &lt;code&gt;git diff &amp;lt;commit B&amp;gt;..&amp;lt;commit A&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é &lt;em&gt;MBOX&lt;/em&gt;?
&lt;/h1&gt;

&lt;p&gt;De acordo com a documentação do &lt;a href="https://www.freebsd.org/cgi/man.cgi?query=mbox"&gt;FreeBSD&lt;/a&gt;, o MBOX é "um arquivo de texto que contém um número arbitrário de mensagens de e-mail. Cada mensagem consiste em um carimbo do correio, seguido por uma mensagem de e-mail formatado de acordo com RFC822 e RFC2822. As linhas são separadas por caracteres de alimentação de linha (ASCII 10)."&lt;/p&gt;

&lt;h1&gt;
  
  
  Alguém, em sã consciência, usa isso?
&lt;/h1&gt;

&lt;p&gt;Esta é a única forma de contribuir com alguns projetos como o kernel do Linux ou o próprio GIT.&lt;/p&gt;

&lt;p&gt;Caso alguém tenha interesse em contribuir com o Kernel ou apenas queira saber como o fazer, basta acessar a página &lt;a href="https://www.kernel.org/doc/html/latest/process/submitting-patches.html"&gt;enviando correções: o guia essencial para colocar seu código no kernel&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Exemplo de configuração no arquivo &lt;code&gt;~/.gitconfig&lt;/code&gt;
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[sendemail]
    smtpEncryption = tls
    smtpServer = smtp.gmail.com
    smtpUser = you@email.com
    smtpServerPort = 587
    smtpPass = Your-pass (Não é recomendável)
    confirm = auto
    replyTo = reply@email.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Alternativa
&lt;/h1&gt;

&lt;p&gt;Desde a versão &lt;a href="https://github.com/git/git/commit/f2561fda364ad984ef1441a80c90b0ee04f1a7c4"&gt;v1.3.0-rc1&lt;/a&gt;, o GIT disponibiliza a ferramenta &lt;code&gt;git-imap-send&lt;/code&gt;. As diferenças são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;imap-send&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Envia as alterações para seu programa/provedor de e-mail e salva como rascunho &lt;em&gt;(é possível configurar outra pasta)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Envia alterações recebidas pela entrada (STDIN) e geradas pelo &lt;code&gt;format-patch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Comando: &lt;code&gt;git format-patch --stdout --attach origin &amp;lt;hash&amp;gt; | git imap-send&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;send-email&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Envia as alterações para o destinatário&lt;/li&gt;
&lt;li&gt;Envia alterações dos arquivos gerados pelo &lt;code&gt;format-patch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Comando: &lt;code&gt;git format-patch -o patches/ &amp;lt;hash&amp;gt; &amp;amp;&amp;amp; git send-email patches/*&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Referências
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://public-inbox.org/git/"&gt;https://public-inbox.org/git/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/torvalds/linux/pull/805"&gt;https://github.com/torvalds/linux/pull/805&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/pt-br/v2/Distributed-Git-Contributing-to-a-Project"&gt;https://git-scm.com/book/pt-br/v2/Distributed-Git-Contributing-to-a-Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/book/pt-br/v2/Come%C3%A7ando-Uma-Breve-Hist%C3%B3ria-do-Git"&gt;https://git-scm.com/book/pt-br/v2/Come%C3%A7ando-Uma-Breve-Hist%C3%B3ria-do-Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gregkh/kroah.com/blob/master/linux/send_lots_of_email.pl"&gt;https://github.com/gregkh/kroah.com/blob/master/linux/send_lots_of_email.pl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/docs/git-format-patch/"&gt;https://git-scm.com/docs/git-format-patch/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cisco.com/c/pt_br/support/docs/security/email-security-appliance/117912-qa-cdc-00.html"&gt;https://www.cisco.com/c/pt_br/support/docs/security/email-security-appliance/117912-qa-cdc-00.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Mbox"&gt;https://en.wikipedia.org/wiki/Mbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
