# Servidores Web

## Introdução aos Servidores Web

*Até o momento atual vimos como o protocolo HTTP(S) atua como o protocolo de comunicação da Web, permitindo que os navegadores possam solicitar diferentes tipos de conteúdos pela Internet. A partir de agora, iremos nos focar em entender um pouco da arquitetura que permite que a web ofereça tantos serviços e sites tal como conhecemos nos dias atuais.*

![Servidores Web](https://i.imgur.com/m9D1tgU.jpg)

## 1. O que é um Servidor Web?

Podemos definir um Servidor Web simples como um computador com uma série de mecanismos capazes de:

1. **Receber** requisições HTTP dos clientes,
2. **Processar** as requisições uma a uma,
3. **Retornar** uma resposta HTTP aos clientes.

Apesar de poucas etapas, o processamento muitas vezes pode ser algo simples, como o conteúdo de uma imagem, ou algo complexo como uma busca em um conjunto de bases de dados com milhares de registros.

Qualquer computador com acesso à uma rede pode agir como um Servidor Web e o objetivo dos próximos tópicos será de dar um breve vislumbre de quais são esses mecanismos e como eles atuam para que o servidor entregue o conteúdo esperado para cada requisição.

### 2. Servidor HTTP e Tipos de Conteúdos

O mecanismo responsável por estabelecer as conexões e processar as mensagens HTTP recebidas é chamado de **Servidor HTTP**, e a sua função é mapear, por meio das informações recebidas pelos cabeçalhos, qual tipo de conteúdo o cliente deseja receber do servidor.

![Estrutura Servidor HTTP](https://i.imgur.com/HHyYUgW.png)

Fonte: developer.mozilla.org

Podemos dividir os tipos de conteúdos em duas categorias principais:

* **Conteúdos Estáticos:** são arquivos que não necessitam de nenhum tipo de processamento do servidor, bastando que o processo apenas leia e retorne uma cópia do mesmo para o cliente (Ex: arquivos de imagens, CSS, JS, HTML, PDF, ZIP).
* **Conteúdos Dinâmicos:** são conteúdos que demandam algum tipo de processamento para retornar o conteúdo. Uma pesquisa, por exemplo, necessita que haja uma busca em um banco de dados e que a resposta seja construída de acordo com a requisição.

Geralmente no segundo caso, o servidor HTTP irá invocar a execução de algum código escrito em alguma linguagem de programação (Ex: PHP, Python, Javascript) seja na mesma máquina ou em um Servidor de Aplicação externo e este será responsável por realizar toda a carga de trabalho necessária. Nas aulas futuras iremos abordar com mais detalhes como esses outros mecanismos funcionam.

Vamos ver então dois exemplos de servidores web amplamente utilizados atualmente: o Apache HTTP Server e o Nginx. Mas antes, caso queira se aprofundar nos tópicos visto até o momento recomendamos os seguintes links:

1. Uma visão geral do HTTP. (<https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Overview>)
2. O que é um Servidor Web? (<https://developer.mozilla.org/pt-BR/docs/Learn/Common_questions/o_que_e_um_web_server>)
3. Servidor Web: Hardware ou Programa? (<https://tudosobrehospedagemdesites.com.br/servidor-web/#servidor-web-programa>)
4. What Is an Application Server vs. a Web Server? (<https://www.nginx.com/resources/glossary/application-server-vs-web-server/>)

### 3. Apache HTTP Server

![](https://s3.amazonaws.com/stillat/img/ch1_request_lifecycle.png) Fonte: <https://stillat.com/>

O projeto Apache é um servidor web criado em 1995 e é, desde então, um dos servidores mais utilizados para a hospedagem de websites (<https://news.netcraft.com/archives/category/web-server-survey/>). O core da sua aplicação é bastante enxuto e focado principalmente na tarefa de buscar e transmitir os dados requisitados via HTTP. No entanto, graças a uma grande comunidade de desenvolvedores e a sua arquitetura que permite a integração de módulos externos, ele se tornou uma ferramenta poderosa e muita utilizada ainda hoje.

Uma das vantagens do Apache é a sua alta integração com com outros projetos Open Source como o PHP e o MySQL. O uso dessas tecnologias em conjunto é muito comum e **recomendada como porta de entrada para aqueles que querem saber mais sobre desenvolvimento web**. Há diversos projetos que permitem a instalação dos três de maneira rápida, permitindo a criação de um servidor web local em conjunto com um banco de dados (ex: XAMP, WAMP, LAMP).

Para saber mais sobre, veja os seguintes links:

1. An Introduction to Apache (<https://code.tutsplus.com/tutorials/an-introduction-to-apache--net-25786>)
2. How Does PHP Work With The Web Server And Browser? (<https://stillat.com/blog/2014/04/02/how-does-php-work-with-the-web-server-and-browser>)
3. Apache tutorial (<https://www.guru99.com/apache.html>)

### 4. NGINX Web Server

![](https://www.aosabook.org/images/nginx/architecture.png) Fonte: <https://www.aosabook.org>

O NGINX se trata de um sistema Open Source que atua como Web Server, foi lançado em 2004 com o objetivo de ser um servidor com alta escalabilidade e eficiência e é atualmente o servidor mais utilizado para servir conteúdos web.

Assim como o Apache, o NGINX também possui alta integração com muitos outros projetos Open Source, além de possui muitos outros serviços além do de HTTP Server como Proxy Reverso, Load Balancer e Web application Firewall. Caso queira se aprofundar mais em como ele funciona, veja os links a seguir

1. What is NGINX? (<https://www.nginx.com/resources/glossary/nginx/>)
2. Inside NGINX (<https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/>)
3. NGINX (<https://www.aosabook.org/en/nginx.html>)
4. Beginner's Guide (<http://nginx.org/en/docs/beginners_guide.html#control>)

### 5. Arquitetura da Web na vida real

![](https://media.prod.mdn.mozit.cloud/attachments/2016/08/09/13677/d031b77dee83f372ffa4e0389d68108b/Fetching_a_page.png)

Fonte: developer.mozilla.org

Até o momento, tratamos o Servidor Web como uma instância simples que é executada em uma única máquina. No entanto, isso nem sempre é verdade. Grandes websites precisam lidar com problemas de disponibilidade e performance em alta escala e isso, muitas vezes, demanda uma arquitetura muito maior do que um simples servidor HTTP.

Caso você queira se aprofundar mais no tema, recomendamos a video aula do link a seguir. Nela, você poderá entender um pouco melhor sobre a arquitetura e funcionamento de serviços que precisam lidar com uma grande quantidade de requisições, assim como citar outros intermediários que podem estar inseridos entre o cliente e o servidor final.

1. Lecture 9 - Scalability - Harvard Web Development (<https://youtu.be/-W9F__D3oY4>)
2. Reverse Proxy vs Load Balancer (<https://www.nginx.com/resources/glossary/reverse-proxy-vs-load-balancer/>)
3. Web Application Firewall (<https://pt.wikipedia.org/wiki/Web_Application_Firewall>)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gitbook.ganeshicmc.com/web/semana-2/08_servidores_web.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
