Code Monkey home page Code Monkey logo

web-server's Introduction

web-server

Arquivo de configuração

Server Name

server_name: Será o nome DNS dado para o ip.

  • pode receber um ou mais nomes que terão como destino esse server.
  • Se não por informando um server name padrão é atribuido.
server {
    server_name domain.com www.domain.com
}

Listen

listen: Listen recebe dois parametros, IP:PORT, um ip default assume se o IP não for especificado.

server {
    listen 192.168.1.100:8081
}

server {
    listen 8082; # Sem especificar IP.
}

Error page

error_page: define uma paǵina de erro padrão para o server ou para a location.

  • Pode receber um ou mais códigos de erros que fazer referência a um arquivo a ser retornado.
server {
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    location /home {
        error_page 404 /home/errors/home-404.html;
    }
}
  • Caso o acesso seja realizado em / o 404.html será retornado.
  • Caso o acesso seja realizado em /home o home-404.html será retornado.

Client Max Body Size

client_max_body_size: Define o tamanho maximo do body de request do client e recebe como paramento o valor e uma letra com a unidade de medida.

  • K para Kilo bytes.
  • M para Mega bytes.
  • G para Giga bytes.
server {
        location /app/crash-limit-m {
            client_max_body_size 2M;
        }

        location /app/crash-limit-g {
            client_max_body_size 1G;
            
        }

        location /app/crash-limit-k {
            client_max_body_size 2K;
        }
}

Allow Methods

allow_methods: descreve os metodos permitidos.

  • recebe uma lista com os metodos.
server {
    allow_methods GET;

    location /images {
        allow_methods GET POST DELETE;
    }
}

Redirect

rewrite: redireciona para outro location.

  • pode ser definido em server, nesse caso os paramentros são <caminho atual, caminho desejado>
  • pode ser definido em location, nesse caso o parametro é o caminho desejado.
server {

    rewrite /jogo /games;

    location /img {
        rewrite /images;
    }

    location /jogo {

    }

    location /games {

    }
}

Define a Root

root: define o diretorio que será o root da aplicação.

  • recebe como parametro o caminho partindo da raiz do sistema.
  • pode ser definido no server e em location.
server {
    root /app/

    location /images {
        /images
    }
}

Directory Listing

autoindex: Permite a exibição dos arquivos de um diretorio caso nenhum arquivo de index seja encontrato.

  • recebe como paramentro on ou off.
  • por padrão vem como off.
  • pode ser definido no server ou em location especificas.
server {
    autoindex on;

    location /home {
        autoindex off;
    }

    location / {

    }
}

Default file for response

index: Define uma lista de arquivos que podem ser devolvidos caso o caminho seja uma pasta.

  • recebe como paramentro uma lista de nomes.
server {
    index index.html index.htm default.html;
}

strerror:

gai_strerror:

socketpair:

htons, htonl, ntohs e ntohl

Usados para converter a ordem dos bytes. (pg 17 Beej's Guide to Network Programming)

htons: host to network short (uint32_t)

htonl: host to network long (uint16_t)

ntohs: network to host short (uint32_t)

ntohl: network to host long (uint16_t)

Básicamente usado para converter a ordem dos bytes de forma que a estrutura do seu processador possa compreender.

select, poll and epoll:

epoll_create:

epoll_ctl:

epoll_wait:

kqueue:

kevent:

Ordem de chamadas:

A seções a seguir definem uma ordem de chamdas para um conexão.

Pesquisar no DNS por nome de host - (www.example.com)

getaddrinfo: Traduz um nome de host (www.google.com) para um ip. Responde com uma struct addrinfo.

int getaddrinfo(const char *node, // Ex. "www.example.com" ou IP
    const char *service, // Ex. "http" ou número da porta
    const struct addrinfo *hints, // estrutura com informações esperadas do resultado.
    struct addrinfo **res // ponteiro para armazena o resultados da função.
);

freeaddrinfo: Limpa a estrutra de resposta.

Socket

  struct addrinfo {
    int             ai_flags; // AI_PASSIVE, AI_CANONNAME, etc.
    int             ai_family; // AF_INET, AF_INET6, AF_UNSPEC
    int             ai_socktype; // SOCK_STREAM, SOCK_DGRAM
    int             ai_protocol; // use 0 para "qualquer"
    size_t          ai_addrlen; // tamanho de ai_addr em bytes
    struct sockaddr *ai_addr; // struct sockaddr_in ou _in6
    char            *ai_canonname; // nome de host canônico e completo
    struct addrinfo *ai_next; // Príximo addrinfo da lista
};  

AF_INET: Força o uso de ipv4. AF_INET6: Força o uso de ipv6. AF_UNSPEC: Tanto ipv4 quanto ipv6. SOCK_STREAM: Implementa o protocolo TCP ( Transmission Control Protocol). SOCK_DGRAM: Implementa o protocolo UDP (User Datagram protocol).

struct sockaddr {
    unsigned short  sa_family; // familia de endereços. (ipv4 | ipv6)
    char            sa_data[14]; // 14 bytes de endereço do protocolo.
};

struct sockaddr_in {
    short int           sin_family; // Família de endereços, AF_INET
    unsigned short int  sin_port; // Número de Porta
    struct in_addr      sin_addr; // Endereço Internet
    unsigned char       sin_zero[8]; // Mesmo tamanho que struct sockaddr
};

socket: retorna um arquivo socket. Similar ao open e tem a mesma função de abrir um arquivo de I/O.

Exemplo de chamada:

struct protoent ent;
ent = getprotobyname("TCP");
int fd = socket(PF_INET, SOCK_STREAM, ent.p_proto)

Essa familia define a ai-family como PF_INET, o tipo do protocolo e TCP e passa o numero do protocolo TCP.

Bind - Relaciona uma porta ao socket.

bind: Tem a função de relacionar uma struct sockaddr com uma porta do sistema.

    struct addrinfo hints, *res;
    int sockfd;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_UNSPEC; // tanto faz ser IPv4 ou IPv6
    hints.ai_socktype = SOCK_STREAM; // use TCP
    hints.ai_flags = AI_CANONNAME; // retorna o nome do host. 

    getaddrinfo("192.168.0.200", "8080", &hints, &res);

    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    bind(sockfd, res->ai_addr, res->ai_addrlen);

Nesse caso teremos um vinculo do socket criando com a porta 8080 do ip 192.168.0.200.

Connect - Usado para realizar a conecxão com um socket.

connect: Estabelece uma vinculo de conecxao com o socket especificado.

Listen - Aguarda o envio de mesagens.

listen:

Accept

accept:

send:

recv:

chdir bind:

setsockopt:

getsockname:

Pegar informações do protocolo

getprotobyname: retonar uma struct protoent que ccontém informações do protocolo da chamada. (pg 31 Beej's Guide to Network Programming)

getprotobyname("TCP"); // traz informações do protocolo TCP.
getprotobyname("UDP"); // traz informações do protocolo UDP.

struct protoent {
    char    *p_name; // nome oficial do protocolo.
    char    **p_aliases; // lista com alias do protocolo.
    int     P_proto; // Numero do protocolo.
}

access:

fcntl:

stat:

opendir:

readdir:

closedir:

References

web-server's People

Contributors

rsleslie avatar threedp avatar

Watchers

 avatar

Forkers

rsleslie

web-server's Issues

FEAT: Parser página de erro

Parsear flag error_page que irá conter o numero do erro e o path da página destino.

Exemplo de arquivo:

server {
     error_page 404 /404.html
}
  • Esse arquivo define que quando houver um erro 404 (not found) para esse server o arquivo 404.html será enviado.
  • criar uma um map com código de erro como chave e path de destino com valor.

Determinar Output de Route

Desenvolver um metodo em Route que baseado no request tenha com sua resposta o status code e um FD.

  • O FD deve ser nulo caso não seja necessário carregar um arquivo do sistema.
  • O FD deve conter o FD do arquivo cadastrado no epoll caso seja necessário ler um arquivo do sistema.
  • Caso sejá um directory deve conter o FD do directory e uma flag que identifique como um directory.

FIX: Error page

Como é o funcionamento da definição de error page:

  • Quando definido no server: seta os destinos, página ou arquivo o mais comum é um .html com o nome do código, para todas as location. Se em alguma location não for definido o error_page por padrão ele irá pegar o error_page do server.
  • Quando definido no location: seta os destinos, página ou arquivo o mais comum é um .html com o nome do código, para esse location em especifico e substitui o que tinha sido definido pelo server no location em que foi definido.

No caso de uma definição assim:

server {
    error_page 404 /404.html

    location /static {
        error_page 404 /static/404.html
        error_page 500 504 50x.html
    }

    location /images {

    }
}
  • O error page do server é 404.html, então caso ocorra um acesso em uma página que não exista em qualquer location do server que não tenha reescrito o error page ele irá chamar /404.html.
  • No location /static se alguma página não for encontrada com o erro 404 ele irá entregar o arquivo em /static/404.html.
  • Os error pages 500 e 504 são duas chaves que contem o mesmo valor. no caso 50x.html

FEAT: Parser Host

Parsear flag server_name que irá conter uma lista de host para o server.

Exemplo de arquivo:

server {
    server_name www.webserver.com webserver.com
}
  • armazenar em um array.
  • será os nomes usados para acessar o server.

FIX: Parser Port (Listen)

Como funciona a definição do listen:

  • O listen será a porta (socket) responsável por receber os request.
  • Cada Server deve possuir um listen.

No caso de uma definição assim:

server {
    server_name mundo.com;
    listen 9000;
}
  • O server mundo.com está ouvindo na porta 9000.

FIX: Parser HTTP Methods

Como funciona o Http allow methods:

  • Se definido no server: Defino os metodos http permitidos para todos os locations do server.
  • Se definido no location: sobrescreve os valores default do server para a location especifica.

Se definido dessa forma:

server {
    server_name caramelo.com;
    listen 80;

    allow_methods GET;

    location /static/images {
        allow_methods GET POST;
    }

    location /static {

    }
}
  • O server caramelo.com somente o método GET é permitido como default
  • O location /static/images tem os métodos GET e POST.
  • O location /static tem as permissões padrão (default) no caso o método GET.

FEAT: Parser Port

Parser a flag listen que contem a porta onde o server estará ouvindo.

Exemplo de arquivo:

server {

     listen 80;
}
  • essa flag fica dentro de server.
  • armazenar em um unsigned short

FEAT: Create Class Server

Criar classe server que irá conter as informações do server.

  • server_name - Host #5
  • listen - Port #4
  • locations
  • limit_client_body_size
  • routes

FIX: Parser Server Name

Como funciona a definição de um server_name:

  • O server name é uma lista de URI que corresponder a um server do arquivo de configuração.
  • Ele pode ser definido ou não. Quando não é definido é um assunto que precisamos ir mais a fundo para definir.
  • Ele é definido somente no server.

No caso de uma definição assim:

server {
    server_name example.com www.example.com mysite.com
}
  • Se um request for enviado para example.com, www.example.com ou mysite.com esse server será responsável por responder.

FEAT: Parser client max body size

Parsear flag client_max_body_size que irá conter o tamanho máximo da mensagem.

exemplo de arquivo:

server {
     client_max_body_size 10M;
}
  • armazenar o tamanho em bytes;
  • K: Kilobytes (1024 bytes)
  • M: Megabytes (1048576 bytes)
  • G: Gigabytes (1073741824 bytes)

FIX: Parser limit client body size

Como é a configuração do limit_client_body_size:

  • Se definido no server: Será o default para todas as locations.
  • Se definido no location: sobrescreve o default para aquela location especifica.
  • Em seu valor temos um valor inteiro e uma letra que representa a unidade em bytes que deve ser multiplicada.
  • É a quantidade de dados que pode ser enviada no payload http.

Em caso de uma configuração assim:

server {
     server_name amigo.com;
     listen 8000;

     limit_client_body_size 8M;

     location / {
        limit_client_body_size 2M;
     }

     location /static/images {
        limit_client_body_size 1G;
     }

     location /static {
        limit_client_body_size 2K;
     }

     location /img {

     }
}
  • O default é de um payload de 8.388.608 bytes.
  • O location / é de um payload de 2.097.152 bytes.
  • O location /static/images é de um payload de 1.073.741.824 bytes.
  • O location /staic é de um payload de 2048 bytes.
  • O location /img recebe o payload default do server 8.388.608 bytes.

FEAT: Parser Diretório root

Parser a flag root do arquivo, responsável por definir um diretório raiz para uma location.

Exemplo do PDF: kapouet tem como root /tmp/www então quando chegar na url www.webserver.com/kapouet no sistema ela vai buscar por /tmp/www ao contrário de padrão que seria buscar de onde o executável foi chamado.

Como fica no arquivo:

server {
   location / {
       root   /app
   }

    location /kapouet {
        root /tmp/www
    }
}

No caso o cada uma dessas locations estará em diretórios diferentes do sistema. O root pode ser definido no server ou nas locations caso queira ao mais especifico.

Definir um map que contenha como chave o path da url e como valor o path no sistema.

Referência para o root

FEAT: Parser Allowed Methods

Criar parser da leitura do arquivo que irá transformar a linha allow_methods em uma Array de métodos permitidos para a rota.

O allowed Methods estará nessa posição do arquivo de configuração:

server {

    location <path> {
    
    allow_methods GET POST;

    }
}

Strings que pode ser passadas:

GET | POST | PUT | PATCH | DELETE | HEAD | OPTIONS | CONNECT | TRACE

o que identifica o allow_methdos é a string de mesmo nome, está dentro de uma location e terminar com ponto e vírgula na mesma linha.

FIX: Server Default

Definição do server default

  • A definição do server default para request ao server é baseada no primeiro item definido.

No caso de uma definição assim:

server {
    server_name secondsite.com
}

server {
     server_name firstsite.com;
}
  • O server secondsite.com será o server default.

Feat: Parser Class

Parser de informações para o Server:

  • server_name
  • host
  • port (listen)
  • define default the first server
  • error_pages
  • limit client body size
  • root
  • Http methods

Parser de informações para o Route:

  • Http Methods (allow_methods)
  • redirection (rewrite)
  • root
  • directory listing (autoindex)
  • arquivo padrão de resposta da requisição caso o caminho seja um directory (index)
  • CGI
  • upload files

Finalizar quando todas essas implementações forem atingidas.

FEAT: Parser HTTP redirection

Criar parser da flag rewrite que tem como objetivo redirecionar o trafego que está indo para um caminho para outro.

No arquivo de configuração irá ficar assim:

server {

   location /old_path {
       rewrite ^ /new_path;
   }

    location /new_path {

    }
}

O resultado do parser deve ser um Map com chave /old_path valor /new_path.

Nesse caso todo o trafego que chegue em /old_path será redirecionado para new_path Exemplo:

https://www.webserver/old_path será redirecionado para https://www.webserver/new_path
https://www.webserver/old_path/42 será redirecionado para https://www.webserver/new_path/42

o símbolo de ^ representa que todo o caminho que começar /old_path será rescrito. Como no exemplo da 42 acima.

Referência no Nginx

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.