Esse projeto é sobre escrever seu próprio servidor HTTP. Uma versão bem mais simplificada de um NGINX ou Apache.
Nele é possível configurar seu(s) servidor(es) com porta, server_name, rotas e muito mais.
Por Rafaela Bustamante e Raphael dos Santos Esteves, cadetes na 42 São Paulo.
This is when you finally understand why a URL starts with HTTP
Para fazer um servidor web, primeiro precisamos aprender sobre sockets (ou soquetes). Depois sobre I/O Multiplexing com select(), poll() ou epoll(). E, por fim, seguir o protocolo HTTP para transferência de informação entre nosso servidor e o cliente. Esse protocolo nada mais é do que uma padronização para o envio de informações pela web. Os requisitos mínimos para seu funcionamento, é informar o protocolo (HTTP/1.1, é o que vamos usar) e o status da resposta (200 OK, 404 Not Found, etc...). Outras informações que podemos enviar são: o tipo de conteúdo da resposta (se é texto ou imagem), a data, o tamanho da resposta, o corpo da resposta (a página html de um site, por exemplo), entre outras mais. Podemos checar todos os requsitos lendo o próprio Hypertext Transfer Protocol -- HTTP/1.1.
GET: ao bater em uma rota do nosso servidor, que são configuradas no arquivo .conf, o cliente usa o método GET para receber de volta o conteúdo da página ou arquivo
que está acessando.
POST: ao usar o método POST em uma rota que aceita esse método, o cliente consegue mandar informações para o nosso servidor processar. Pode ser uma imagem/texto pra ser
armazenada no servidor, ou um texto para ser mandado para um programa que vai ser executado, entre outros usos diversos.
DELETE: ao usar o método DELETE em uma das rotas que aceita esse método, o cliente consegue informar qual conteúdo quer retirar do servidor, informando o nome do
arquivo.
- SERVER NAME: nome do seu servidor, o que vem logo após o "http://SERVER_NAME", pode ser qualquer coisa, desde que conste no arquivo hosts da sua máquina local;
- PORT: porta que seu servidor vai escutar -> "http://SERVERNAME:PORT". Fique lembrado que portas abaixo de 1024 precisa de permissão sudo para rodar;
- ERROR PAGES: páginas de erro personalizadas para o servidor, caso não queira usar as páginas default;
- ROOT: diretório correspondente à rota buscada pelo cliente. Onde será buscado o recurso requisitado;
- INDEXES: arquivo que vai responder caso a rota aponte para um diretório do servidor. Normalmente combinamos Root+Indexes para responder o cliente;
- REDIRECT: rota que se o cliente acessar, irá redirecioná-lo para outro endereço;
- AUTOINDEX: ao habilitar a listagem de diretório o cliente consegue navegar pelas pastas daquela rota como se fossem páginas html;
- ALLOWED METHODS: métodos permitidos naquela rota. Por padrão são permitidos todos os implementados;
- UPLOAD DIR: onde serão salvos os arquivos que o cliente quiser armazenar no servidor. Importante lembrar que o diretório deve existir no camihho especificado pelo Root para conseguir salvar o arquivo de fato. Caso não exista o servidor devolverá 404;
- MAX BODY SIZE: o tamanha máximo do arquivo que pode ser armazenado no servidor. Por padrão é 1MB;
- CGI: habilita sites diâmicos, em que o conteúdo da página quando o cliente acessar pode mudar de acordo com o programa que estiver rodando por trás dela.
# Exemplo de arquivo de configuração para servidor HTTP
# Configurações para o primeiro servidor
server {
port 8080 # Porta do servidor
server_names localhost # Nome do servidor (opcional)
error_page 404 404.html # Página de erro personalizada (opcional)
# Configurações para rotas
location / {
root /var/www/html # Diretório raiz da rota
indexes index.html index2.html # Páginas de índice padrão da rota
}
location /about {
root /var/www/html
indexes about.html
}
# Configuração para rota que redireciona
location /redirect {
root /var/www/html
redirect /about # Redireciona para a rota /about
}
# Configuração para rota que aceita uploads de arquivos
location /upload {
root /var/www/html
indexes upload.html
allowed_methods GET POST # informa quais métodos são permitidos nessa rota (opcional)
upload_dir /var/www/uploads # Diretório onde os arquivos enviados serão salvos (opcional)
max_body_size 300000 # Tamanho permitido do arquivo em bytes (opcional)
}
# Configuração para rota que executa um CGI
location /delete {
root /var/www/html/delete
indexes delete.html
allowed_methods GET DELETE
}
# Configuração para rota que executa um CGI
location /cgi {
root /var/www/cgi
indexes game.py # arquivo do programa a ser executado
}
location /autoindex {
root /var/www/html/autoindex
autoindex true # habilita listagem de diretórios
}
}
Na pasta raiz do projeto rode o Makefile: make
Depois de compilado, suba o servidor com as configurações padrão: ./webserv
Ou com o arquivo de configuração de sua escolha: ./webserv [caminho_para_seu_arquivo.conf]
Em caso de mais dúvidas, use o comando ./webserv --help
Usage: ./webserv [<Configuration File>.conf]
or: ./webserv
A HTTP server in C++ 98
-h, --help display this help page and exit.
By default, \"./examples/webserv.conf\" will load if no
configuration file is provided.
More about this project can be found on
https://github.com/rafaelabdm/Webserv/