Servidores e Clientes Web
Published: 2023-07-26 11:47:16

## Tópicos
&nbsp;1. [Introdução](#introdu%C3%A7%C3%A3o)
&nbsp;2. [Servidores Web](#servidores-web)
&nbsp;3. [Apache e Nginx](#apache-e-nginx)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1. [Servidores Web e PHP](#servidores-web-e-php)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.2. [Diretório Raiz, / e Index](#diret%C3%B3rio-raiz-raw-endraw-e-index)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. [Diretório Raiz](#diret%C3%B3rio-raiz)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. [/ (Barra)](#-raw-endraw-barra)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c. [Index](#index)
&nbsp;4. [O servidor embutido do PHP](#o-servidor-embutido-do-php)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.1. [Utilizando o servidor embutido](#utilizando-o-servidor-embutido)
&nbsp;5. [Clientes Web](#clientes-web)

## Introdução

No universo do desenvolvimento de aplicações web, os termos "servidor" e "cliente" ganham uma conotação específica e essencialmente relacionada ao mundo dos softwares. Diferente da imagem tradicional de salas repletas de racks de computadores, quando se fala em servidores no contexto web, estamos nos referindo a programas de computador cuja função primordial é receber, processar e responder a requisições feitas por clientes. Enquanto isso, os clientes, igualmente, são softwares projetados para conectar-se a esses servidores, enviando requisições e processando as respostas obtidas.

Nesse cenário, a arquitetura cliente-servidor surge como a base do funcionamento de aplicações web, permitindo a interação entre dispositivos conectados à internet. Enquanto os servidores, como o Apache e o Nginx, executando em computadores remotos (às vezes realmente em salas cheias de racks de computadores) atuam como os anfitriões que disponibilizam serviços e recursos, os clientes, representados por navegadores (*browsers*), Postman, Insomnia e outros atuam como os agentes requisitantes, permitindo que os usuários interajam com páginas, APIs e outros serviços disponíveis na web.

Neste artigo, exploraremos algumas características de servidores Web e de alguns dos principais servidores web, como o Apache e o Nginx, destacando suas características e usos mais comuns no desenvolvimento de aplicações web. Além disso, abordaremos o servidor embutido do PHP, que oferece uma maneira conveniente para os desenvolvedores testarem suas aplicações localmente antes da implantação em ambientes de produção.

Também analisaremos a importância dos clientes web e as diversas ferramentas disponíveis, como os navegadores populares que utilizamos diariamente para navegar pela web, bem como aplicações especializadas, como o Postman e o Insomnia, que oferecem recursos específicos para desenvolvimento e teste de APIs.

## Servidores Web

Um conceito essencial no funcionamento dos servidores é que, na sua essência, todo servidor é um software que "escuta" em uma porta específica, seja ela TCP ou UDP. Essa "escuta" é o que permite que os servidores recebam requisições provenientes de clientes, como navegadores web ou outras aplicações.  Quando um servidor é iniciado, ele escolhe uma porta específica em que deseja "escutar". As portas mais baixas (0 a 1023) são conhecidas como "well-known ports" e são geralmente reservadas para serviços amplamente utilizados, como HTTP (porta 80), HTTPS (porta 443), FTP (porta 21), entre outros.

Quando um cliente deseja se comunicar com o servidor, ele precisa conhecer o endereço IP e o número da porta em que o servidor está escutando. Com essas informações em mãos, o cliente pode estabelecer uma conexão com o servidor e através dela enviar uma requisições e aguardar pelas respostas. Os detalhes de como esta conexão acontece dizem respeito à API de socket do sistema operacional, mas não serão abordados neste artigo.

Essa ideia de "escutar" em uma porta e estabelecer conexões com base nas requisições recebidas é o que permite que os servidores web, como o Apache e o Nginx, atendam a múltiplos clientes simultaneamente. Cada nova requisição recebida resulta na criação de uma nova conexão, permitindo que o servidor processe várias requisições de diferentes clientes de forma concorrente.

## Apache e Nginx

O Apache HTTP Server e o Nginx são dois dos servidores web mais populares e amplamente utilizados na Internet. O Apache é conhecido por sua flexibilidade e extensibilidade, permitindo que os desenvolvedores personalizem e expandam suas funcionalidades através de módulos. Ele suporta várias plataformas, incluindo Linux, Windows, macOS e outras.

Por outro lado, o Nginx (pronuncia-se "engine-x") é um servidor web de alto desempenho e também atua como servidor proxy reverso e proxy HTTP. Ele ganhou destaque por sua capacidade de lidar com grandes cargas de tráfego de forma eficiente e escalável, sendo amplamente utilizado em configurações de alto volume.

Ambos os servidores têm como função principal "escutar" as requisições HTTP ou HTTPS (caso o protocolo TLS esteja habilitado) recebidas de clientes, como navegadores web, e repassá-las aos softwares que de fato realizarão o processamento da requisição. Esses softwares podem ser aplicações web escritas em diversas linguagens de programação, como PHP, Python, Ruby, Node.js, entre outras. Ao receber a resposta dessas aplicações, o servidor web a envia de volta ao cliente que fez a requisição, permitindo que o conteúdo dinâmico das páginas web seja exibido ao usuário.

Uma das características importantes do Apache e do Nginx é a capacidade de atuarem como proxies. Um proxy é um intermediário que recebe as requisições de clientes e as encaminha para outros servidores, na mesma máquina ou em máquinas remotas. Esse recurso é valioso para arquiteturas distribuídas, em que várias aplicações podem estar sendo executadas em diferentes servidores e o servidor web atua como um ponto de entrada único para os clientes.

Além disso, os servidores web também desempenham um papel importante na implementação de recursos de segurança, como autenticação de usuário, autorização de acesso e criptografia através do protocolo HTTPS. Eles permitem que os administradores de sistemas configurem regras de segurança e protejam as aplicações contra ameaças e ataques cibernéticos.

### Servidores Web e PHP

No caso específico de aplicações escritas em PHP, o Apache e o Nginx se comunicam com um intermediário conhecido como "PHP-FPM" (PHP FastCGI Process Manager). O PHP-FPM é um gerenciador de processos PHP que atua como um "caller" intermediário entre o servidor web e a aplicação PHP. Quando uma requisição é recebida pelo servidor web e destina-se a uma aplicação PHP, o PHP-FPM é acionado. Internamente, o PHP-FPM realiza o equivalente a uma chamada ao script PHP em questão como se fosse feita no terminal. Esse processo permite que o PHP-FPM execute a aplicação PHP e retorne o resultado ao servidor web, que por sua vez enviará a resposta ao cliente que fez a requisição.

Essa arquitetura com o PHP-FPM traz benefícios significativos para o desempenho e a escalabilidade das aplicações PHP. Como o PHP-FPM é capaz de gerenciar processos PHP separados do servidor web, ele permite um controle mais eficiente e otimizado dos recursos do servidor. Além disso, ele pode gerenciar múltiplos processos PHP simultaneamente, o que melhora o desempenho e a capacidade de resposta das aplicações em situações de alta demanda de tráfego.

### Diretório Raiz, `/` e Index

Quando um servidor web recebe uma requisição HTTP de um cliente para uma determinada URI, ele precisa determinar qual arquivo ou recurso corresponde a essa URI. Em muitos casos, a URI solicitada corresponde a um diretório no sistema de arquivos do servidor web.

#### Diretório Raiz

O diretório raiz, também conhecido como "*Document Root*" ou "*Root Directory*", é o ponto de partida para o servidor web ao atender uma requisição. Quando o servidor recebe uma URI, ele busca o arquivo correspondente a partir do diretório raiz.

Em servidores web como o Apache e o Nginx, o diretório raiz é configurado no arquivo de configuração do servidor, como o arquivo `httpd.conf` para o Apache. É nessa configuração que os administradores do servidor definem qual diretório no sistema de arquivos deve ser considerado como diretório raiz para atender as requisições HTTP.

Por exemplo, se o diretório raiz estiver configurado como `/var/www/html`, todas as requisições serão tratadas a partir desse diretório como ponto de partida. Se o cliente solicitar a URI `/pagina.html`, o servidor procurará o arquivo `pagina.html` dentro do diretório raiz (`/var/www/html/pagina.html`) para responder à requisição.

#### `/` (Barra)

A barra (`/`) é um caractere especial utilizado na URI para representar o diretório raiz. Quando um cliente solicita a URI `/`, ele está pedindo o recurso raiz do servidor web. Nesse caso, o servidor procura pelo arquivo específico que representa a página inicial padrão do diretório raiz. Esta é a URI padrão que é requisitada quando o usuário digita apenas o domínio, como `www.exemplo.com`. Nesse caso, o cliente fará uma requisição para o servidor deste domínio passando a URI `/` em seu pacote HTTP.

#### Index

O "index" é um nome de arquivo padrão utilizado pelos servidores web para identificar a página inicial de um diretório. Quando o servidor recebe uma requisição para uma URI que termina com `/`, ou seja, representa o diretório raiz, ele procura automaticamente por um arquivo chamado `index` dentro desse diretório.

A extensão do arquivo `index` pode variar dependendo da linguagem de programação ou tecnologia utilizada. As extensões mais comuns são `.html` e `.php`, mas também podem ser `.htm`, `.xhtml`, `.asp`, entre outras, dependendo da configuração do servidor e do tipo de aplicação web.

Por exemplo, com uma certa configuração do servidor, se um cliente solicitar a URI `/`, o servidor procurará pelos seguintes arquivos (nessa ordem) para responder à requisição:

1. `index.html`
2. `index.php`
3. Outros arquivos index definidos no servidor

Caso encontre um desses arquivos no diretório raiz, o servidor o utilizará como resposta à requisição, exibindo-o no navegador do cliente. Se nenhum desses arquivos estiver presente, o servidor retornará uma resposta com código 404 (*Not Found*).

Portanto, quando um desenvolvedor configura corretamente o servidor web e coloca um arquivo `index.[html|php|asp|...]` no diretório raiz, o cliente poderá acessar o site apenas digitando o domínio ou endereço IP do servidor, sem a necessidade de digitar o nome do arquivo na URI. Isso é especialmente comum em sites que utilizam tecnologias de desenvolvimento web como PHP, onde o arquivo `index.php` frequentemente funciona como a página inicial de um site ou aplicação web.

## O servidor embutido do PHP

O servidor embutido do PHP é uma ferramenta extremamente útil para o desenvolvimento e teste de aplicações em PHP. Ele oferece uma forma simples e rápida de iniciar um servidor web local diretamente a partir da linha de comando, sem a necessidade de configurar e executar um servidor web externo, como o Apache ou o Nginx.

Internamente, o servidor embutido do PHP inicia um servidor HTTP, que escuta na porta especificada pelo desenvolvedor. Ao receber uma requisição, ele executa diretamente o arquivo solicitado, caso seja um arquivo PHP. Nesse caso, o servidor embutido interpreta o código PHP contido no arquivo e retorna o resultado para o cliente que fez a requisição.

Essa abordagem simplificada torna o desenvolvimento mais ágil, pois não requer a configuração adicional do PHP-FPM nem a necessidade de ter outro servidor web em execução. É uma solução prática para desenvolvedores que desejam criar e testar aplicações PHP localmente de forma rápida e sem complicações.

Entretanto, é importante ressaltar que o servidor embutido do PHP não foi projetado para uso em ambientes de produção. Ele não oferece o mesmo nível de desempenho e escalabilidade que servidores web como o Apache ou o Nginx podem proporcionar. Sua finalidade é facilitar o desenvolvimento e o teste local, permitindo que os desenvolvedores executem suas aplicações rapidamente sem a necessidade de configurações complexas.

Uma característica interessante do servidor embutido é a utilização de um script de "roteamento" (também conhecido como Front Controller). Todas as requisições que chegam são enviadas para este único script, que é responsável por fazer o processamento e enviar a resposta para o cliente. Isso permite que a aplicação utilize URLs amigáveis, que são URLs mais legíveis e significativas para os usuários, sem a presença de extensões de arquivos ou parâmetros complexos.

Com a utilização do Front Controller, o servidor embutido pode direcionar cada requisição para a parte apropriada da aplicação, facilitando a organização e a estrutura do código. Essa abordagem também permite a implementação de rotas personalizadas e o uso de frameworks PHP populares, como o Laravel, o Symfony e o CodeIgniter.

Para utilizar o servidor embutido do PHP, tendo o PHP instalado e disponível no PATH do terminal de comando, é preciso navegar até um diretório, que será considerado o diretório raiz, e digitar o seguinte comando: 

### Utilizando o servidor embutido

```bash
php -S localhost:8000
```

Neste exemplo, estamos informando ao servidor embutido que ele deve escutar requisições vindas de `localhost` (ou seja, do próprio computador) na porta `8000`. A porta pode ser escolhida conforme o gosto do usuário, e também é possível trocar o `localhost` por `0.0.0.0`, fazendo com o que o servidor escute requisições vindas de qualquer cliente conectado na mesma rede que o computador (embora possivelmente seja necessário fazer configurações no firewall para permitir esse tipo de uso).

Sem o PHP instalado também é possível fazê-lo utilizando Docker. Falaremos mais sobre esta plataforma em outros artigos, mas a ideia é utilizar um container com uma imagem do PHP, fazê-lo iniciar o servidor embutido do PHP em um dado diretório e montar o diretório local neste diretório do container:

```bash
docker run --rm -v $(pwd):/app -w /app -p 8080:8080 php:8.2 php -S 0.0.0.0:8080
```

ou 

```bash
docker run --rm -v %cd%:/app -w /app -p 8080:8080 php:8.2 php -S 0.0.0.0:8080
```

usando o terminal nativo do Windows.

---

## Clientes Web

Clientes web desempenham um papel crucial no ecossistema da internet e são fundamentais para a comunicação entre os usuários e os servidores web que hospedam as aplicações. Embora os navegadores (browsers) sejam os clientes web mais conhecidos e amplamente utilizados, é importante destacar que a categoria de clientes web abrange uma ampla gama de aplicações que se conectam a servidores por meio do protocolo HTTP ou HTTPS.

Os navegadores modernos, como Google Chrome, Mozilla Firefox, Microsoft Edge e Safari, são verdadeiras plataformas de software sofisticadas, comportando-se quase como sistemas operacionais. Eles incorporam diversos módulos e funcionalidades que trabalham em conjunto. Esses módulos incluem acesso à rede para estabelecer conexões com servidores web, mecanismos de parsing para interpretar e processar os códigos HTML e CSS, renderização para exibir as páginas web, tratamento de eventos para lidar com ações do usuário, motor de JavaScript para executar código do lado do cliente e muito mais.

Os navegadores são capazes de enviar diferentes tipos de requisições HTTP aos servidores, como GET, POST, PUT, DELETE, entre outras utilizando apenas suas APIs nativas. Essas requisições podem conter cabeçalhos personalizados, cookies e outras informações relevantes para a comunicação com os servidores. Além disso, os navegadores têm a capacidade de lidar com diversos formatos de resposta enviados pelos servidores, como documentos HTML, XML, JSON e também arquivos binários, como imagens e vídeos.

No entanto, além dos navegadores, existem outras aplicações que também funcionam como clientes web. As aplicações mobile, por exemplo, são projetadas para dispositivos móveis, como smartphones e tablets, e têm a capacidade de criar suas próprias requisições HTTP com cabeçalhos personalizados e enviar dados binários para os servidores com os quais se conectam. Isso abre um leque gigantesco de possibilidades para desenvolver aplicativos móveis que interagem com serviços e recursos disponíveis na web.

Além disso, com o advento da Internet das Coisas (IoT), dispositivos inteligentes, como smartwatches, termostatos inteligentes, câmeras e outros gadgets conectados à internet, também podem atuar como clientes web, enviando e recebendo dados de servidores remotos para oferecer uma experiência conectada aos usuários.

Outras ferramentas essenciais no universo do desenvolvimento de aplicações web são o Postman, o Insomnia, o Thunder Client (extensão do VSCode) e outros similares. Esses clientes web são projetados especificamente para desenvolvedores, permitindo que eles criem e testem requisições HTTP de forma rápida e eficiente. Essas ferramentas possuem interfaces que permitem aos desenvolvedores configurar várias opções, como parâmetros, cabeçalhos personalizados, autenticação e muito mais. Com esses clientes, os desenvolvedores podem realizar testes de integração, testes de API e verificar as respostas dos servidores para garantir que suas aplicações estejam funcionando corretamente.

---

Com este artigo eu espero que fique mais claro que são servidores e clientes web, quais seus papeis e como utilizar o servidor embutido do PHP para começar a desenvolver Aplicações Web.