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]