OpenResty na prática

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