Partilhar: WhatsApp
aulify · Sebenta
UC · Unidade de Competência · UC00627

Instalar e configurar servidores Web

Sebenta · Nginx/Apache, virtual hosts, HTTPS, segurança
25h · 2.25 pontos crédito Curso: T. Desenv. Software, T. Sist. Comp. Redes ↗ Referencial oficial SNQ
Índice

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

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

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

Segurança (hardening)

Performance e disponibilidade

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. - 404root/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