OpenResty na prática
    Olá,
OpenResty é uma plataforma completa para trabalhar como uma primeira camada na sua infraestrutura de aplicações fazendo um papel de Proxy ou Load Balancer. O projeto é um fork do NGINX e evoluido com o uso do LuaJIT para enriquecer a plataforma de entregar uma solução completa. Caso venha a se interessar no projeto e tenha interesse em recursos mais avançados existe uma empresa por trás do projeto que vende soluções pagas da ferramenta com mais funcionalidades.
Hello World
Como o foco aqui é ir na prática vamos começar pelo exemplo mais trivial da programação que é o “Hello World”.
Arquivos
docker-compose.yml
version: '3.2'
services:
  openresty:
    build: .
    ports:
      - 8080:8080
Dockerfile
FROM openresty/openresty:1.19.3.2-1-alpine
LABEL maintener="joão maia <joao@joaovrmaia.com>"
LABEL project="openresty-na-pratica"
COPY src/nginx/nginx.conf /usr/local/openresty/nginx/conf/nginx.conf
COPY src/nginx/server.conf /usr/local/openresty/nginx/conf/server.conf
COPY src/lua /opt/app
EXPOSE 8080
nginx.conf
worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
	include server.conf;
}
server.conf
server {
	listen 8080;
	location / {
		default_type text/html;
		content_by_lua_block {
			ngx.say("<p>hello, world</p>")
		}
	}
}
Aqui é a única parte que tem algo de diferente para quem já usa nginx pois tem esse bloco que conseguimos invocar um bloco de código em Lua.
Executando
$ docker-compose up -d
$ curl -i localhost:8080
HTTP/1.1 200 OK
Server: openresty/1.19.3.2
Date: Fri, 02 Jul 2021 22:40:58 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
<p>hello, world</p>
Refatorando
Escrever seu código Lua dentro de um arquivo do NGINX não é muito produtivo e gera problemas para criar testes então vamos refatorar o projeto para isolar o código em Lua em um arquivo:
nginx.conf
worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    lua_package_path '/opt/app/?.lua;;';
	include server.conf;
}
Adiciona-se uma entrada para dizer onde estão os arquivos Lua.
server.conf
server {
	listen 8080;
	location / {
		default_type text/html;
		content_by_lua_block {
			require('app').hello_world()
		}
	}
}
Importa o módulo e executa sua função exportada.
app.lua
_M = {}
function _M.hello_world() 
    ngx.say("<p>hello, world</p>")
end
return _M
Contador de requisições
Vamos agora fazer algo mais além de apenas imprimir algo fixo e vamos retorar a quantidade de requisições recebidas pelo seu servidor. Para isso vamos mudar apenas nosso arquivo Lua do projeto anterior:
app.lua
_M = {}
counter = 0
function _M.hello_world() 
    counter = counter + 1;
    ngx.say(counter);
end
return _M
Executando
$ for i in `seq 1 10`; do curl localhost:8080; done
1
2
3
4
5
6
7
8
9
10
Interessante, não?
Conclusão
Como podemos ver é bem fácil e simples de começar a usar Lua no NGINX com o OpenResty mas ai está longe de ter tudo que o OpenResty pode nos oferecer. Por isso, recomendo fortemente que olhe no site deles para ver se tem algo mais que te interesse e no Github deles, pois tem projetos interessantes para turbinar seu Proxy ou Load Balancer como limitador de requests.
Vou no futuro voltar com mais textos sobre o assunto pois tive uma experiência bem interessante lidando com um projeto real usando essa tecnologia em produção e tendo a oportunidade na prática de aprender Lua que só conhecia de nome.
Referências
- Sife oficial do OpenResty: https://openresty.org/en/
 - “What is a Reverse Proxy vs. Load Balancer?”: https://www.nginx.com/resources/glossary/reverse-proxy-vs-load-balancer/
 - Site oficial do NGINX: https://nginx.org/en/
 - LuaJIT: https://luajit.org/
 - Empresa do OpenResty: https://openresty.com/en/
 
            
            
            
Comments ()