Instalar e configurar servidores Web
Apresentação
UC00627 (25h · 2,25 pts) do curso Técnico de Sistemas de Computação e Redes. Cobre a instalação e configuração de servidores web (Nginx, Apache), virtual hosts, conteúdo dinâmico, HTTPS com Let's Encrypt, segurança (hardening), performance e diagnóstico. Liga-se a UC00626 (Linux) e UC00633 (servidores).
Como a web é servida
Cliente ── HTTP/HTTPS ──► Servidor Web ──► Conteúdo
│
estático (HTML/CSS/JS) ou
dinâmico (PHP-FPM / WSGI / Node) ──► BD
- Conteúdo estático — ficheiros entregues diretamente (muito rápido).
- Conteúdo dinâmico — uma aplicação gera a resposta (PHP, Python, Node). O servidor web encaminha o pedido para a app (FastCGI, reverse proxy).
- O servidor web é frequentemente a "porta da frente": termina TLS, serve estáticos, faz cache, balanceia carga e encaminha o dinâmico para a app.
Servidores web
| Servidor | Pontos fortes |
|---|---|
| Nginx | Rápido, leve, excelente para estáticos e reverse proxy |
| Apache HTTP Server | Muito flexível, módulos, .htaccess |
| Caddy | HTTPS automático, configuração simples |
| Microsoft IIS | Integrado no Windows Server |
| LiteSpeed | Comercial, alto desempenho |
Stacks clássicas: LAMP (Linux, Apache, MySQL, PHP) e LEMP (Linux, Nginx, MySQL/MariaDB, PHP).
Instalação (Nginx, Ubuntu)
sudo apt update
sudo apt install nginx -y
sudo systemctl enable --now nginx
sudo ufw allow 'Nginx Full' # 80 + 443
curl -I http://localhost # deve devolver 200
Pastas-chave:
- Configuração: /etc/nginx/nginx.conf, /etc/nginx/sites-available/, /etc/nginx/sites-enabled/.
- Conteúdo por defeito: /var/www/html/.
- Logs: /var/log/nginx/access.log, error.log.
Ciclo de trabalho:
sudo nano /etc/nginx/sites-available/site.conf
sudo ln -s /etc/nginx/sites-available/site.conf /etc/nginx/sites-enabled/
sudo nginx -t # validar sintaxe (sempre antes de reload)
sudo systemctl reload nginx # aplicar sem cortar ligações
(Apache: apache2, /etc/apache2/sites-available/, a2ensite, apache2ctl configtest, systemctl reload apache2.)
Virtual hosts (server blocks)
Permitem alojar vários sites no mesmo servidor/IP, distinguidos pelo nome (server_name) ou pela porta.
server {
listen 80;
server_name exemplo.pt www.exemplo.pt;
root /var/www/exemplo;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/exemplo.access.log;
error_log /var/log/nginx/exemplo.error.log;
}
Apache (equivalente):
<VirtualHost *:80>
ServerName exemplo.pt
DocumentRoot /var/www/exemplo
ErrorLog ${APACHE_LOG_DIR}/exemplo.error.log
</VirtualHost>
Para vários sites, criar um server block por site e ativá-lo.
Conteúdo dinâmico
PHP (PHP-FPM)
sudo apt install php-fpm -y
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
O Nginx passa pedidos .php ao PHP-FPM (FastCGI Process Manager), que executa o código e devolve o HTML.
Reverse proxy para app (Python/Node)
A aplicação corre num servidor de aplicação (Gunicorn/uWSGI para Python, o runtime do Node) numa porta local; o Nginx faz de reverse proxy:
server {
listen 80;
server_name app.exemplo.pt;
location /static/ {
alias /var/www/app/static/;
}
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Vantagens: o Nginx trata de TLS, estáticos, cache, compressão e protege a app; a app foca-se na lógica.
HTTPS com TLS
Let's Encrypt + Certbot
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d exemplo.pt -d www.exemplo.pt
- Certificado gratuito, validade 90 dias, renovação automática (timer do systemd).
- O Certbot edita o server block: adiciona o bloco
443 ssle o redirect 80 → 443. - Testar a renovação:
sudo certbot renew --dry-run.
Pré-requisito: o domínio tem de apontar (DNS A/AAAA) para o servidor e a porta 80/443 estar acessível.
Boas práticas TLS
- TLS 1.2 e 1.3 apenas; desativar 1.0/1.1 e cifras fracas.
- HSTS (
Strict-Transport-Security) — o browser passa a exigir HTTPS. - Redirect total HTTP → HTTPS.
- OCSP stapling, cipher suites modernas.
- Avaliar em SSL Labs (alvo A/A+) e Mozilla SSL Config Generator para a configuração.
Segurança (hardening)
- Atualizações do servidor e módulos em dia.
- Firewall — abrir apenas 80/443 (e SSH para gestão).
- Esconder versão:
server_tokens off;(Nginx) /ServerTokens Prod(Apache). - Headers de segurança:
X-Frame-Options: SAMEORIGIN(anti-clickjacking).X-Content-Type-Options: nosniff.Content-Security-Policy(controla origens — mitiga XSS).Referrer-Policy,Permissions-Policy.- Permissões — conteúdo propriedade de utilizador adequado; processo corre como
www-data(menor privilégio); nada de 777. - Desativar listagem de diretórios (
autoindex off). - Limitar métodos e tamanho de upload (
client_max_body_size). - Rate limiting (
limit_req) e Fail2ban contra brute-force/abuso. - Logs revistos; WAF (ModSecurity / Cloudflare) em sites expostos.
- Separar privilégios: nunca correr o servidor como root.
Performance e disponibilidade
- Compressão — gzip/brotli para texto (HTML/CSS/JS).
- Cache —
expirespara estáticos;proxy_cachepara dinâmico cacheável. - HTTP/2 (e HTTP/3/QUIC) — multiplexing, menos latência.
- CDN para estáticos e proteção DDoS.
- Load balancing — bloco
upstreamcom vários backends + health checks. - Keepalive, tuning de workers/conexões.
- Monitorização — uptime, latência, taxa de 5xx, uso de CPU/memória.
- Backups — conteúdo (site/app) e configuração do servidor.
upstream app {
server 10.0.0.11:8000;
server 10.0.0.12:8000;
}
server {
location / { proxy_pass http://app; }
}
Diagnóstico
sudo nginx -t # erro de sintaxe + linha
systemctl status nginx
sudo tail -f /var/log/nginx/error.log
curl -I https://exemplo.pt # ver código e headers
ss -tulpn | grep -E ':80|:443' # portas à escuta
openssl s_client -connect exemplo.pt:443 -servername exemplo.pt
Interpretação rápida de códigos:
- 403 — permissões do filesystem ou regra de acesso.
- 404 — root/try_files/caminho errado.
- 502 Bad Gateway — backend (app/PHP-FPM) em baixo ou socket errado.
- 504 Gateway Timeout — backend lento/sem resposta.
- 413 — upload acima de client_max_body_size.
- TLS errors — certificado expirado/cadeia incompleta/nome não coincide.
Apêndices
A · Cheatsheet
# Nginx
sudo nginx -t && sudo systemctl reload nginx
/etc/nginx/sites-available + ln -s -> sites-enabled
server { listen 80; server_name X; root /var/www/X; }
location ~ \.php$ { fastcgi_pass unix:/run/php/phpX-fpm.sock; }
location / { proxy_pass http://127.0.0.1:8000; }
# HTTPS
sudo certbot --nginx -d dominio
sudo certbot renew --dry-run
# Diagnóstico
tail -f /var/log/nginx/error.log
curl -I https://dominio
B · Glossário
Virtual host / server block. Definição de um site no servidor web. FastCGI / PHP-FPM. Interface para executar PHP. Reverse proxy. Servidor que encaminha pedidos para uma app interna. Let's Encrypt / Certbot. CA gratuita / cliente de emissão de certificados. HSTS. HTTP Strict Transport Security. Upstream. Grupo de backends para balanceamento. WAF. Web Application Firewall.
C · Recursos
- Nginx docs · nginx.org/en/docs.
- DigitalOcean Community · tutoriais LEMP/LAMP excelentes.
- Mozilla SSL Config Generator · ssl-config.mozilla.org.
- SSL Labs · ssllabs.com/ssltest.
- Let's Encrypt · letsencrypt.org.