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 instalar o nginx
- Como usar o nginx como service web
- Como usar o nginx como proxy reverso
- Como usar o nginx como balanceador de carga
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 IP2 - 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.