NGINX - O que é e como usar

Hoje irei falar um pouco sobre o NGINX. Para quem não sabe o nginx é um servidor web, amplamente usado por toda a web. Nesse post irei falar sobre os seguintes tópicos:

O que é o nginx

Como citei acima, o nginx (se pronuncia no inglês "engine x") é um servidor web que também pode ser usado como proxy reverso e balanceador de carga, proxy de e-mail e servidor de cache. O Nginx é conhecido por ser um servidor de alta performance, estável, de fácil configuração e baixo consumo de recursos. Escrito em C como vocês podem ver no github, é um servidor amplamente usado em toda a web e foi criado para solucionar o problema do C10k — o desafio de gerenciar dez mil conexões ao mesmo tempo.

Instalando o NGINX

Instalando no ubuntu


        sudo apt update
        sudo apt install nginx
        sudo service nginx start
    

Após a instalação é só acessar http://localhost e verá uma tela como essa:

Instalando com Docker

Para instalar o nginx usando o Docker rode no terminal docker run -v "`pwd`/nginx:/usr/share/nginx/html" -p "8080:80" -d nginx. Após o download e o terminal for liberado, acesse http://localhost:8080, você verá uma tela como essa:


O erro ocorreu pois mapeamos uma pasta vazia para o nginx, agora vamos adicionar um conteúdo. Digite no terminal echo "<h1>Hello George</h1>" > nginx/index.html e recarregue a página, você verá algo assim:

Como usar o NGINX

O nginx possui muitas utilidades, mas normalmente é usado como proxy reverso e load balancer, a partir de agora vou mostrar como configurar o nginx para servir de servidor web, proxy reverso e balanceador de carga. O exemplos de como configurá-lo como proxy e-mail e servidor de cache podem ser encontrados aqui e aqui

1 - NGINX como Servidor web

Com o nginx é possível servir arquivos estáticos como imagens, css, javascript e HTML, além de conteúdos dinâmicos usando com manipuladores FastCGI, uwsgi e SCGI.
Por padrão o nginx já serve qualquer arquivo estático, então para um teste simples você pode navegar até o dirtório /var/www/html ou /usr/share/nginx/html, a depender da distribuição linux, e altere o arquivo index.html com o seguinte conteúdo:


            <!doctype html>
            <html>
                <head>
                    <meta charset="utf-8">
                    <title>Hello, Nginx!</title>
                    <link rel="stylesheet" href="estilo.css">
                </head>
                <body>
                    <h1>Hello, Nginx!</h1>
                    <p>We have just configured our Nginx web server on Ubuntu Server!</p>
                </body>
            </html>
        
Crie o arquivo estilo.css com o seguinte conteúdo:

            p { background-color: cornflowerblue; }
            body { background-color: darkgray; }
        
Ao recarregar a página deverá ver algo como:
Como configurar um virtual host
Com o NGINX instalado, navegue até o diretório /var/www/ ou /usr/share/nginx, dentro do diretório, crie uma nova pasta chamada tutorial mkdir tutorial, crie também um arquivo index.html e cole o seguinte conteúdo:

            <!doctype html>
            <html>
                <head>
                    <meta charset="utf-8">
                    <title>Hello, Nginx!</title>
                </head>
                <body>
                    <h1>Hello, Nginx!</h1>
                    <p>We have just configured our Nginx web server on Ubuntu Server!</p>
                </body>
            </html>
        
Vamos agora configurar um virtual host. Para este tutorial iremos criar um site que fique disponível na porta 81. Navegue até o diretório /etc/nginx/sites-enabled/ ou /etc/nginx/conf.d/ e crie um arquivo chamado tutorial.conf com o seguinte conteúdo:

            server {
                listen 81;
                listen [::]:81;

                server_name example.localhost;

                root /usr/share/nginx/tutorial; # diretório onde ficará o conteúdo do site
                index index.html;

                location / {
                        try_files $uri $uri/ =404;
                }
            }
        
Feito isso, apenas reinicie o nginx sudo service nginx restart e ao acessar http://localhost:81/ verá a página que criamos.
Alguns pontos importantes:
root diretório raiz onde ficaram os arquivos HTML.
index é usado para especificar o arquivo disponível ao visitar o diretório raiz do site.
server_name pode ser o que você quiser, geralmente é usado para especificar qual domínio o nginx vai interpretar as requisições.

2 - NGINX como Proxy reverso

O nginx também pode ser usado como um proxy reverso para suas aplicações, ele pode ser usado como um orquestrador de requisições onde receberia todas as requisições e as entregaria para seus "donos". Pense que você poderia ter uma ou mais aplicações sendo executadas em portas ou domínios diferentes, você poderia configurar o ngnix para que ao receber uma requisição no domínio app1.meudominio.com ele a redirecionasse para 192.168.1.10:9000 e ao receber uma requisição no domínio app2.dominio.com ele a redirecionasse para 189.55.44.30:8001. Vamos mostrar num exemplo.
Para este tutorial iremos ter duas aplicações em PHP cada uma rodando em portas diferentes, uma na porta 8001 e a outra na porta 8002. Navegue até o diretório /etc/nginx/sites-enabled/ ou /etc/nginx/conf.d/ e crie um arquivo chamado reverseproxy.conf, nele coloque o seguinte o conteúdo:


            server {
                listen 80;
                listen [::]:80;

                server_name app1.localhost;

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

            server {
                listen 80;
                listen [::]:80;

                server_name app2.localhost;

                location / {
                    proxy_pass  http://localhost:8002;
                }
            }
        
Feito isso, apenas reinicie o nginx sudo service nginx restart.
Perceba as mudanças:
1 - Em server_name adicionamos os domínios que o nginx deve reconhecer.
2 - Em proxy_pass indicamos qual a url o nginx deve redirecionar as requisções.

Em resumo, o que fizemos foi dizer ao nginx o seguinte: "Tudo que chegar na porta 80 pelo caminho /, usando o domínio em server_name, faça proxy para url x".
Para testarmos se tudo funciona bem é só acessar http://app1.localhost/ e http://app2.localhost/, então veremos hello APP1 e hello APP2 respectivamente.

3 - NGINX como Balanceador de carga

O balanceamento de carga é uma técnica para distribuir a carga de trabalho uniformemente entre dois ou mais computadores - Obrigado Wikipedia. É possível configurar de forma muito fácil um load balancer no nginx. Primeiro navegue até o diretório /etc/nginx/sites-enabled/ ou /etc/nginx/conf.d/, cria um arquivo chamado loadbalancer.conf e coloque o seguinte conteúdo:


            upstream backend  {
                server localhost:8001;
                server localhost:8002;
            }

            server {
                listen 80;
                listen [::]:80;

                server_name app3.localhost;

                location / {
                    proxy_pass  http://backend;
                }
            }
        
Agora acesse http://app3.localhost/ e fique dando recarregando na página, perceba que o conteúdo da tela alterna entre a APP1 e APP2.
Para configurar o load balancer no NGINX precisamos ajustar algumas coisas:
1 - Usar o módulo de upstream para adicionar nossos backends. Você pode ter quantos backends quiser e usar o formato que quiser, você pode usar um domínio público, um domínio interno ou um IP
2 - Em proxy_pass veja que colocamos o alias backend.
Com essa configuração estamos dizendo ao NGINX: "Teho um pool de servidores chamado backend e toda requisição que chegar na porta 80 pelo domínio app3.localhost redirecione para o pool backend".

Com isso chegamos ao fim, criei um repositório no github (https://github.com/gwmoura/nginx-reverse-proxy) com os códigos e as aplicações que citei acima, pode servir de estudo. Eu utilizei Docker e Docker Compose para montar o ambiente de desenvolvimento, se ainda não conhece o Docker recomendo dar passada aqui e se não conhece o Docker Compose recomendo dar uma lida nesse post.

Espero ter ajudado e qualquer dúvida é só entrar em contato.

anúncio