Laravel Sail (docker), nginx 反向代理 - Html 呈现 localhost:8002 而不是 site.xyz

Posted

技术标签:

【中文标题】Laravel Sail (docker), nginx 反向代理 - Html 呈现 localhost:8002 而不是 site.xyz【英文标题】:Laravel Sail (docker), nginx reverse proxy - Html renders localhost:8002 instead of site.xyz 【发布时间】:2021-03-28 16:03:13 【问题描述】:

我开始使用 nginx 反向代理测试新的 Laravel Sail docker-compose 环境,这样我就可以在本地机器上开发时从真实的 tld 访问我的网站。

我的设置是: 操作系统 - 安装了 nginx 和 docker 的 Ubuntu Desktop 20。

在主机上启用 Nginx 站点:

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;
        


我的主机 /etc/hosts 文件中还有 127.0.0.1 mysite.xyz

还有我的 docker-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

当我从主机访问 mysite.xyz 时,网站加载正常。

我遇到的问题是,在我可以通过访问注册页面 (https://mysite.xyz/register) 从主机看到的注册页面上,表单操作是:http://localhost:8002/register

生成上述url的那段代码是<form method="POST" action=" route('register') ">

这是一个问题,因为我没有从 localhost:XXXX 访问该站点,而是从 mysite.xyz 访问该站点,该站点通过 nginx 反向代理并最终指向 http://localhost:8002/register **

我检查了什么:

在我的 Laravel .env 文件中,APP_URL 是 mysite.xyz 如果我通过 ssh 进入 Sai 容器并启动 artisan tinker 然后运行 ​​route('register') 它输出 https://mysite.xyz/ 如此清晰,容器内的 laravel 应用程序似乎行为正确。

有趣的是,它在渲染html响应时,将注册路由渲染为http://localhost:8002/register

我尝试在整个项目中搜索 localhost:8002,我可以在 /storage/framework/sessions/asdofhsdfasf8as7dgf8as7ogdf8asgd7 中找到它 那段文字说: s:3:"url";s:27:"http://localhost:8002/login";

所以会话似乎认为它是 localhost:8002 但 tinker 认为它是 mysite.xyz

我也是一个 docker noob,所以谁知道我错过了什么。我迷路了:)

【问题讨论】:

您的.env 文件中的APP_URL 值是什么? 它是mysite.xyz php artisan config:cache && php artisan route:cache && php artisan view:cache?你能试试这个吗 @onlineThomas 上面的命令不走运。在 docker 容器内,应用程序似乎知道它的名称是什么。从 docker 容器中,如果我 curl mysite.xyz/login,我会得到包含 mysite.xyz urls 的输出 html - 这是正确的。但是当我通过反向代理从主机访问该站点时,我看到 localhost:8002 【参考方案1】:

“问题”在于您的 nginx 配置,而不是您的代码:

proxy_pass http://localhost:8002;

Laravel 在 CLI(控制台)中使用 APP_URL 或在代码中使用 config('app.url')env('APP_URL') 时使用。对于所有其他操作(例如通过路由助手构建 URL),Laravel 从请求中获取 URL:

URL Generation, Laravel 8.x Docs

url 助手可用于为您的应用程序生成任意 URL。生成的 URL 将自动使用方案(HTTP 或 HTTPS)和主机来自应用程序正在处理的当前请求

您需要做的是在您的 nginx 配置中传递正确的 URL 和端口,方法是添加:

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

有关该主题的更多信息,您可能需要查看这篇文章:Setting up an Nginx Reverse Proxy

【讨论】:

以上是关于Laravel Sail (docker), nginx 反向代理 - Html 呈现 localhost:8002 而不是 site.xyz的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Sail 正在关闭每个 Sails 命令的旧 Sail 进程

Laravel Sail 不会在 Ubuntu 20.04 上构建 - groupadd:无效的组 ID 'sail'

laravel、sail shell 和sails artisan 命令停止工作

LARAVEL SAIL 出错 [php_network_getaddresses: getaddrinfo failed]

带有 Laravel Sail 和版本控制的 Laravel 8 开发项目

在 Laravel 上使用 Sail 时没有匹配的清单错误