首页 > 解决方案 > 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 地址。

请在这种情况下指导我。

标签: laravelkubernetes

解决方案


因为我不想要受保护的 $proxies = '*'

抱歉,您似乎没有太多选择。要么您必须知道允许的 IP 范围。或相应地配置您的网络服务器。引用 Laravel 使用的 Symfony Doc。

一些反向代理(如 AWS Elastic Load Balancing)没有静态 IP 地址,甚至没有您可以使用 CIDR 表示法定位的范围。在这种情况下,您需要非常小心地信任所有代理。

将您的 Web 服务器配置为不响应来自负载平衡器以外的任何客户端的流量。对于 AWS,这可以通过安全组来完成。

一旦你保证流量只会来自你信任的反向代理,配置 Symfony 总是信任传入的请求:

https://symfony.com/doc/current/deployment/proxies.html#but-what-if-the-ip-of-my-reverse-proxy-changes-constantly


推荐阅读