Antes de adicionar ssl_certificate, nginx.conf
é muito simples:
server {
listen 80 default_server;
index index.php index.html index.htm;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_read_timeout 1200s;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Então segui aqui para configurar o letsencrypt com Nginx (substituindo [domain-name]
por completo), e agora nginx.conf
parece:
server {
listen 80 default_server;
server_name [domain-name] www.[domain-name];
server_tokens off;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://[domain-name]$request_uri;
}
}
server {
listen 443 default_server ssl http2;
listen [::]:443 ssl http2;
server_name [domain-name];
ssl_certificate /etc/nginx/ssl/live/[domain-name]/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/[domain-name]/privkey.pem;
location / {
proxy_pass http://[domain-name];
}
index index.php index.html index.htm;
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass php:9000;
include fastcgi_params;
fastcgi_read_timeout 1200s;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Veja as mudanças aqui – https://www.diffchecker.com/bAfVjewE/ ,
o que considero muito simples, direto e razoável.
No entanto, meu site php está completamente quebrado - meu navegador Chrome diz que entra em redirecionamento infinito ( "redirecionou você muitas vezes" ), consulte as Notas 2.
Qual pode ser a causa e correção?
Notas,
- A adição de ssl_certificate é adequada, mas o redirecionamento infinito existe mesmo quando testei com um site vazio.
- Quando ocorre um redirecionamento interminável, os logs do nginx continuaram imprimindo nada além de
...[08/Aug/2024:15:xx:yy +0000] "GET / HTTP/1.1" 301 162 "-" "Mozilla/5.0 (X11; Linux x86_64)...
, mesmo tendo visto que o protocolo no meu navegador mudou dehttp
parahttps
.
Se eu visitá-lo com curl
, estou recebendo:
$ curl -i https://my.site.name:443/
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 08 Aug 2024 15:42:45 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://my.site.name/
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>
e o log do servidor é:
[08/Aug/2024:15:42:45 +0000] "GET / HTTP/1.1" 301 162 "-" "curl/8.5.0" "my.ip"
[08/Aug/2024:15:42:45 +0000] "GET / HTTP/1.1" 301 162 "-" "curl/8.5.0" "-"
E o log de erros está vazio, pois é assim que meu log ngix está configurado:
cd /var/log/nginx/
root@5b6a9033cb31:/var/log/nginx# ls -l
total 0
lrwxrwxrwx 1 root root 11 Jul 23 07:14 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jul 23 07:14 error.log -> /dev/stderr
O problema é que o primeiro bloco do servidor escuta na porta 80 (HTTP) e redireciona todo o tráfego para HTTPS (https://[nome-do-domínio]$request_uri).
O segundo bloco de servidor escuta na porta 443 (HTTPS) e faz proxy do tráfego de volta para o mesmo domínio (proxy_pass http://[nome-do-domínio];).
Isso cria um loop de redirecionamento.
Solicitações do usuário http://my.site.name
O servidor redireciona para https://my.site.name
O servidor HTTPS faz proxy da solicitação de volta para http://my.site.name
O servidor HTTP redireciona para https://my.site.name
E o ciclo continua....
Para corrigir isso , você deve certificar-se de que o servidor HTTPS não esteja fazendo proxy de volta para o servidor HTTP. Em vez disso, deve servir o conteúdo diretamente.
Assim:
Então, try_files $uri $uri/ /index.php?$query_string; no bloco HTTPS garante que as solicitações sejam atendidas corretamente sem a necessidade de proxy de volta para HTTP.
O bloco location ~ .php$ { ... } é definido para manipular arquivos PHP diretamente no servidor HTTPS.
O retorno 301 https://$host$request_uri; no bloco HTTP garante que todas as solicitações HTTP sejam redirecionadas para HTTPS.
Corrija o código, execute
nginx -s reload
e deve funcionar.############### EDITADO ################
Você não precisa remover o proxy reverso Nginx para corrigir o problema. Você ainda pode se beneficiar do proxy reverso garantindo que o proxy ocorra dentro do mesmo protocolo (ou seja, HTTPS).
Uma abordagem é ajustar a diretiva proxy_pass no bloco do servidor HTTPS para usar https:// em vez de http://. Isso garante que, uma vez redirecionado o tráfego para HTTPS, ele permaneça dentro do contexto HTTPS, evitando o loop:
Dessa forma, você ainda pode aproveitar os benefícios do proxy reverso do Nginx enquanto resolve o problema do loop de redirecionamento. Se precisar de mais ajuda com esta configuração, sinta-se à vontade para entrar em contato!