laravel - Laravel:使用负载均衡器和 kubernetes 的后台作业中,用户的 IP 地址返回为 127.0.0.1
问题描述
我正在使用 docker + kubernetes 和 aws 负载均衡器部署我的 laravel 应用程序。
有一个中间件“EventLogger”在用户登录系统后运行。此记录器记录用户的 IP 地址并保存到 mongo db。
这是中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
use App\Models\EventLogger as Logger;
use App\Models\OauthClient;
use Jenssegers\Agent\Agent;
use App\Models\Advertisement;
use App\Jobs\ProcessEventLogger;
class EventLogger
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $event = null)
{
//$request->request->add(["event" => $event]);
$request->merge(["event" => $event]);
return $next($request);
}
public function terminate($request, $response)
{
if($response->getStatusCode() != 200){
return;
}
$response_contents = $response->getContent();
//allow only status = true responses
if(false == json_decode($response_contents)->status){
return;
}
if (env('APP_ENV') === 'testing') {
$client_id = 3;
} else{
if ($request->event == Logger::LOGIN) {
$client_id = $request->client_id;
} else {
$client_id = Auth::user()->token()->client_id;
}
}
$agent = new Agent();
$agent->browser();
$agent->device();
$agent->platform();
ProcessEventLogger::dispatch($request->all(),$response, Auth::user()->id, $request->ip(),$client_id, $response_contents, $request->coin_id,$agent->browser(),$agent->device(),$agent->platform());
}
}
ProcessEventLogger
是后台排队作业,工作正常。
问题$request->ip()
总是返回127.0.0.1
我已经尝试了这里回答的大多数解决方案,但是有一个解决方案使用了受信任的 laravel 中间件代理。
我如何使用该功能,因为我不想要protected $proxies = '*'
并且我无法提供代理 IP 地址,因为每次我重新启动 Pod 时,都会生成新的 IP 地址。
请在这种情况下指导我。
解决方案
因为我不想要受保护的 $proxies = '*'
抱歉,您似乎没有太多选择。要么您必须知道允许的 IP 范围。或相应地配置您的网络服务器。引用 Laravel 使用的 Symfony Doc。
一些反向代理(如 AWS Elastic Load Balancing)没有静态 IP 地址,甚至没有您可以使用 CIDR 表示法定位的范围。在这种情况下,您需要非常小心地信任所有代理。
将您的 Web 服务器配置为不响应来自负载平衡器以外的任何客户端的流量。对于 AWS,这可以通过安全组来完成。
一旦你保证流量只会来自你信任的反向代理,配置 Symfony 总是信任传入的请求: