Laravel Sail (docker), proxy inverso nginx - Html renders localhost:8002 en lugar de sitio.xyz

Comencé a probar el nuevo ambiente de lana de vela Laravel con un proxy inverso nginx para que pueda acceder a mi sitio web desde un verdadero tld mientras me desarrolla en mi máquina local.

Mi configuración es: OS - Ubuntu Desktop 20 con nginx y docker instalado.

Nginx sitio habilitado en la máquina anfitriona:

server {

        server_name mysite.xyz;

        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate /etc/ssl/certs/mysite.xyz.crt;
        ssl_certificate_key /etc/ssl/private/mysite.xyz.key;
        ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

        location / {
                proxy_pass http://localhost:8002;
        }

}

También tengo 127.0.0.1 mysite.xyz en mi máquina anfitrión /etc/hosts archivo

Y mi garfio-compose:

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.0
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.0/app
        ports:
            - '8002:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            - redis
        image: 'mysql:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
    sailredis:
        driver: local

El sitio está cargando bien cuando accedo a mi sitio. xyz de mi máquina de acogida.

El problema que estoy teniendo es que en la página de registro que veo desde mi máquina de acogida accediendo a la página de registro (https://mysite.xyz/register) la acción forma es: http://localhost:8002/register

La pieza de código que genera la url anterior es

Este es un problema porque no accedo al sitio desde localhost: XXXX pero en lugar de misite.xyz que pasa por el proxy inverso nginx y termina señalando a http://localhost:8002/register #

Lo que comprobé:

En mi archivo Laravel .env, el APP_URL es misite.xyz si me meto en el recipiente de la vela y empiezo lata artesanal y luego corro route('register') salidas https://mysite.xyz/ tan claramente, la aplicación laravel dentro del contenedor parece estar comportándose correctamente.

Lo curioso es que cuando hace la respuesta html, hace la ruta del registro como http://localhost:8002/register

Traté de buscar todo el proyecto para localhost:8002 y puedo encontrarlo en /storage/framework/sessions/asdofhsdfasf8as7dgf8as7ogdf8asgd 7 ese trozo de texto dice: {s:3:"url";s:27:"http://localhost:8002/login";}

Así que parece que la sesión piensa que es localhost:8002 pero Tinker piensa que es mi sitio.xyz

También soy un noob de taquilla para que sepa lo que me estoy perdiendo. Estoy perdido :)

Pregunta hecha hace 3 años, 4 meses, 28 días - Por byteninja8245


3 Respuestas:

  • El "problema" se encuentra dentro de su configuración nginx, no su código:

    proxy_pass http://localhost:8002;
    

    Laravel utiliza APP_URL en CLI (consola) o cuando usas config('app.url') o env('APP_URL') en tu código. Para todas las demás operaciones (como la construcción de URL a través del ayudante de ruta) Laravel abre la URL de la solicitud:

    Generación URL, Laravel 8.x Docs

    El ayudante url puede ser utilizado para generar URL arbitrarias para su aplicación. La URL generada utilizará automáticamente el esquema (HTTP o HTTPS) y el host de la solicitud actual siendo manejado por la aplicación.

    Lo que necesitas hacer es pasar la URL y el puerto correctos en tu configuración nginx, añadiendo:

    proxy_pass http://localhost:8002;
    proxy_set_header Host $host;
    

    Para obtener información adicional sobre el tema, es posible que desee echar un vistazo a este artículo: Configuración de un Proxy Inverso Nginx

    Respondida el Dec 17, 2020 a las 23:09 - por syntaxsensei8acf

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando parece ser causado por la configuración del proxy inverso en Nginx y la forma en que Laravel está generando la URL base para tu aplicación. Aquí tienes algunas sugerencias para resolver este problema:

    • Configuración del Proxy Inverso en Nginx:
    - Asegúrate de que el servidor Nginx esté configurado correctamente para redirigir las solicitudes a tu aplicación Laravel en el contenedor Docker. Parece que esto ya está funcionando porque puedes acceder a tu sitio usando `mysite.xyz`.
    • Revisa la configuración de Nginx y asegúrate de que esté redirigiendo correctamente las solicitudes al contenedor con la dirección correcta.
    • Configuración de la URL base en Laravel:
    - En tu archivo de entorno `.env` en Laravel, asegúrate de que la variable `APP_URL` esté configurada correctamente como `https://mysite.xyz`.
    • Laravel utiliza esta configuración para generar URL absolutas en tu aplicación. Si esta configuración no es correcta, es posible que se generen URL incorrectas.

    • Uso de asset() o url() en lugar de route():
    - En lugar de usar route('register') para generar la URL en tu formulario, puedes intentar usar url('register') o asset('register'). Estos métodos generarán la URL completa basada en la configuración de APP_URL.

    • Actualización de la sesión en Laravel:
    - Puede que sea necesario limpiar la sesión en Laravel para asegurarte de que no esté almacenando URLs incorrectas. Puedes probar a borrar las sesiones y luego probar nuevamente.

    • Revisión de la configuración de Docker:
    - Asegúrate de que la red creada por Docker esté permitiendo la comunicación adecuada entre Nginx en tu máquina host y la aplicación Laravel en el contenedor.

    Intenta seguir estas sugerencias para corregir el problema de la URL incorrecta que se está generando en tu aplicación Laravel cuando se accede a través del proxy inverso en Nginx. Si necesitas más ayuda, no dudes en preguntar.

    Respondida el Dec 18, 2020 a las 23:09 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Posibles causas y soluciones:

    1. Configuración incorrecta del proxy inverso nginx:

    Verifica que la configuración del proxy inverso nginx esté correcta, especialmente el nombre del servidor y la ruta proxy. Asegúrate de que el certificado SSL esté configurado correctamente para el nombre de dominio y de que el puerto 443 esté redirigido correctamente.

    2. Caché de Laravel:

    Borra la caché de Laravel ejecutando el comando php artisan cache:clear. Borra la caché del navegador y vuelve a cargar la página.

    3. Sesiones Laravel:

    Comprueba que la configuración de la sesión de Laravel esté utilizando un controlador de sesión que almacena las sesiones en la base de datos o en Redis. Verifica que la base de datos o Redis sea accesible desde el contenedor de Laravel.

    4. Dominio del contenedor:

    Inspecciona el archivo /etc/hosts dentro del contenedor de Laravel usando el comando docker exec -it laravel.test bash -c "cat /etc/hosts" para ver si mysite.xyz se resuelve en localhost. Si no es así, agrega una entrada para mysite.xyz que se resuelva en 127.0.0.1 dentro del contenedor.

    5. Comandos incorrectos de Artisan:

    Asegúrate de ejecutar los comandos de Artisan desde el contenedor de Laravel correcto. Verifica que el comando php artisan route:list dentro del contenedor produzca la ruta de registro correcta.

    6. Otros problemas:

    Comprueba si hay errores en los registros de Nginx y Laravel. Reinicia todos los contenedores de Laravel y Nginx para descartar cualquier problema transitorio.

    Pasos adicionales para depurar:

    Habilita los registros de Laravel y Nginx para capturar cualquier información adicional. Utiliza una herramienta como Postman o cURL para enviar solicitudes al sitio web y examinar las cabeceras de respuesta. * Verifica que el servidor web esté configurado para mostrar el puerto correcto en las URL generadas.

    Respondida el Dec 18, 2020 a las 23:13 - por Gemini

    Votos positivos: 0 | Votos negativos: 0