Actualizar:

Actualizar:

Tengo una aplicación web Django que comparte los puertos externos 80 y 443 con otro servidor. localhostFunciona bien sin el proxy inverso, pero cuando está habilitado, me encuentro con todo tipo de errores.

¿Cómo hacer que el proxy inverso funcione correctamente?

proxy-inverso.conf:

      # SSL Certificate and other SSL configurations
      SSLProxyEngine on
      ProxyRequests on
      SSLProxyVerify require 
      SSLProxyCheckPeerCN on
      SSLProxyCheckPeerName on
      SSLProxyCheckPeerExpire on
      ProxyPreserveHost on
      RequestHeader set X-Forwarded-Proto https

      # Reverse Proxy Configuration
      ProxyPass "/" "https://192.168.1.83/"
      ProxyPassReverse "/" "https://192.168.1.83/"

      # Additional SSL configurations if needed

Redireccioné todo httpe httpsincluí el proxy anterior en mi archivo de configuración ssl-https. El sitio funciona normalmente.sinla inclusión (es decir, cuando Include .../reverse-proxy.confse comenta). Cuando se incluye el proxy inverso, obtengo:

[Thu Jan 18 07:09:39.835368 2024] [ssl:error] [pid 46505:tid 133251102926528] [remote 192.168.1.83:443] AH02039: Certificate Verification: Error (20): unable to get local issuer certificate
[Thu Jan 18 07:09:39.835470 2024] [ssl:error] [pid 46505:tid 133251102926528] [remote 192.168.1.83:443] AH02040: Certificate Verification: Certificate Chain too long (chain has 2 certificates, but maximum allowed are only 1)
[Thu Jan 18 07:09:39.835773 2024] [proxy:error] [pid 46505:tid 133251102926528] (20014)Internal error (specific information not available): [client 119.74.38.81:51224] AH01084: pass request body failed to 192.168.1.83:443 (192.168.1.83), referer: https://acupunctureclassique.duckdns.org/
[Thu Jan 18 07:09:39.835832 2024] [proxy:error] [pid 46505:tid 133251102926528] [client 119.74.38.81:51224] AH00898: Error during SSL Handshake with remote server returned by /login/, referer: https://acupunctureclassique.duckdns.org/
[Thu Jan 18 07:09:39.835861 2024] [proxy_http:error] [pid 46505:tid 133251102926528] [client 119.74.38.81:51224] AH01097: pass request body failed to 192.168.1.83:443 (192.168.1.83) from 119.74.38.81 (), referer: https://acupunctureclassique.duckdns.org/

En la parte delantera:

Proxy Error
The proxy server could not handle the request

Reason: Error during SSL Handshake with remote server

Apache/2.4.58 (Ubuntu) Server at acupunctureclassique.duckdns.org Port 443

Actualizar:

apachectl -S

VirtualHost configuration:
*:443                  acupunctureclassique.duckdns.org (/etc/apache2/sites-enabled/acu-le-ssl.conf:2)
*:80                   acupunctureclassique.duckdns.org (/etc/apache2/sites-enabled/acu.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default 
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33 not_used
Group: name="www-data" id=33 not_used

Respuesta1

El problema real aquí resultó ser, después de discusiones en el chat, que el usuario estaba usando nginx para enviar tráfico a la misma instancia de nginx, creando un bucle de redireccionamiento ordenado, que eventualmente condujo a un mensaje de error de encabezado demasiado grande.

> ProxyPass "/" "https://192.168.1.83/"

Envías tu tráfico a https://192.168.1.83. Usted afirma que se trata de un certificado emitido por Let's Encrypt, pero LE lo hará.nuncaemitirá un certificado para 192.168.1.83, ni ninguna CA pública emitirá dicho certificado. Recuerde que unválidoel certificado no es suficiente,tienepara que coincida con el nombre esperado, que en este caso es 192.168.1.83. Sus registros también son bastante explícitos sobre esto.

Tienes algunas alternativas:

  1. Usar HTTP
  2. Utilice un certificado autofirmado y haga que Apache confíe en él usandoSSLProxyCACertificatedirectiva.
  3. Utilice un nombre de dominio válido y adquiera un certificado válido para el nombre de dominio. El nombre de dominio puede resolverse 192.168.1.83o puede agregarse a /etc/hosts, pero Apachevoluntadcoincida con el nombre de host y el nombre común (o SAN) en el certificado.
  4. Desactivarverificación de nombre usandoSSLProxyCheckPeerName = off
  5. Deshabilitar la verificación usandoSSLProxyVerify = none, deshabilitando efectivamente la verificación. Esto es más o menos equivalente a usar http...

Respuesta2

Para invertir el proxy necesita crear un host virtual en /etc/apache2/sites-available. Aquí un ejemplo de dicha configuración de VirtualHost.

<VirtualHost *:80>
    ServerName yourdomain.com
    ServerAlias www.yourdomain.com

    DocumentRoot /path/to/your/django/static/files

    Alias /static/ /path/to/your/django/static/files/
    <Directory /path/to/your/django/static/files>
        Require all granted
    </Directory>

    ProxyPass / http://localhost:8000/
    ProxyPassReverse / http://localhost:8000/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<VirtualHost *:443>
    ServerName yourdomain.com
    ServerAlias www.yourdomain.com

    DocumentRoot /path/to/your/django/static/files

    Alias /static/ /path/to/your/django/static/files/
    <Directory /path/to/your/django/static/files>
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile /path/to/your/ssl/certificate.crt
    SSLCertificateKeyFile /path/to/your/ssl/private.key
    SSLCertificateChainFile /path/to/your/ssl/chainfile.pem

    ProxyPass / https://localhost:8000/
    ProxyPassReverse / https://localhost:8000/

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

La parte https es opcional, puedes omitirla si no necesitas https

información relacionada