NGINX 액세스 로그의 Laravel 인증 사용자 ID

11341 단어 nginxlogginglaravel
디버깅 및/또는 쉬운 검색을 위해 NGINX 액세스 로그에 사용자 ID가 있으면 특정 사용자에 대한 로그를 빠르게 찾을 수 있어 편리합니다.

이를 달성하기 위한 2가지 부분이 있습니다.
  • 미들웨어를 사용하여 Laravel 앱에 응답 헤더로 사용자 ID를 추가합니다.
  • NGINX 로그 형식의 일부로 사용자 ID를 추가하고 액세스 로그에 해당 로그 형식을 사용합니다
  • .

    응답 헤더로 사용자 ID 추가



    이 목적을 위해 미들웨어를 사용하는 것이 가장 합리적이며 Laravel과 PHP 8 구문 덕분에 정말 간단하게 만들 수 있습니다.
    app/Http/Middleware/AppendUserIdToResponse.php 파일을 만듭니다.

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    use Symfony\Component\HttpFoundation\Response;
    
    class AppendUserIdToResponse
    {
        public function handle(Request $request, Closure $next): Response
        {
            /** @var \Symfony\Component\HttpFoundation\Response $response */
            $response = $next($request);
    
            $response->headers->set('x-user', $request->user()?->id ?? '-');
    
            return $response;
        }
    }
    


    Note: I'm taking $request->user()?->id here but nothing is stopping you from using $request->user()?->username if that makes more sense for you.



    우리는 항상 헤더를 추가하지만 사용자가 로그인하지 않은 경우 헤더가 전혀 설정되지 않은 경우 NGINX가 기본적으로 사용하는 -로 기본 설정됩니다.

    다음으로 이 새로운 미들웨어를 app/Http/Kernel.php 배열의 $middleware에 등록할 것입니다.

        /**
         * The application's global HTTP middleware stack.
         *
         * These middleware are run during every request to your application.
         *
         * @var array
         */
        protected $middleware = [
            // \App\Http\Middleware\TrustHosts::class,
            \App\Http\Middleware\TrustProxies::class,
            \Fruitcake\Cors\HandleCors::class,
            \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
            \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
            \App\Http\Middleware\TrimStrings::class,
            \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    +       \App\Http\Middleware\AppendUserIdToResponse::class,
        ];
    


    Note: We are adding it to the global middleware stack to make sure it runs for every request instead of needing to register it per route.



    이것은 Laravel 측을 위한 것입니다(배포하는 것을 잊지 마십시오)!

    NGINX 로그 형식에 사용자 ID 추가



    이 부분은 좀 더 "맞춤형"이며 NGINX 및 로그 형식을 설정한 방법에 따라 다르지만 한 번 시도해 보겠습니다!

    사용자 정의 로그 형식은 /etc/nginx/nginx.conf (http {} 블록 내)에서 정의할 수 있으며 다음과 같이 보일 수 있습니다.

    log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        '"$host" sn="$server_name" '
                        'rt=$request_time '
                        'ua="$upstream_addr" us="$upstream_status" '
                        'ut="$upstream_response_time" ul="$upstream_response_length" '
                        'cs=$upstream_cache_status '
                        'uid="$upstream_http_x_smls_user"';
    


    Note: this log_format is the log format required by NGINX Amplify and used as an example.



    여기에 사용자 ID를 추가하려면 다음을 수행합니다.

    log_format main_ext '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for" '
                        '"$host" sn="$server_name" '
                        'rt=$request_time '
                        'ua="$upstream_addr" us="$upstream_status" '
                        'ut="$upstream_response_time" ul="$upstream_response_length" '
    -                   'cs=$upstream_cache_status';
    +                   'cs=$upstream_cache_status '
    +                   'uid="$upstream_http_x_user"';
    


    마지막에 추가된uid="$upstream_http_x_user"에 주목하세요. 사용자uid="1"가 로그인되어 있으면 1로, 로그인한 사용자가 없으면 uid="-"로 렌더링됩니다.

    사용자 정의log_format가 없는 경우 기본combined 형식을 사용하고 있을 수 있습니다. combined 필드가 추가된 이 로그 형식uid을 추가하십시오.

    log_format combined_with_user_id '$remote_addr - $remote_user [$time_local] '
                                     '"$request" $status $body_bytes_sent '
                                     '"$http_referer" "$http_user_agent" '
                                     'uid="$upstream_http_x_user"';
    


    그런 다음 가상 호스트에서 access_log 항목을 찾고 올바른 로그 형식이 사용되었는지 확인해야 합니다.

    server {
        ...
        access_log /var/log/nginx/access.log combined_with_user_id; # or whatever you named your log format
        error_log /var/log/nginx/error.log warn;
        ...
    }
    


    마지막 선택적 단계가 하나 있는데, 이는 응답에서 이 헤더를 숨기는 것입니다. 보안 문제가 아니어야 하지만 응답에 해당 헤더를 포함할 이유가 없으므로 숨길 것입니다.

    vhost 구성에서 fastcgi_pass 섹션을 찾아 fastcgi_hide_header x-user; 를 추가하면 다음과 같이 보일 수 있습니다.

    location = /index.php {
        include                           /etc/nginx/fastcgi_params;
    
        fastcgi_param HTTPS               on;
        fastcgi_param HTTP_SCHEME         https;
        fastcgi_param SCRIPT_FILENAME     $realpath_root$fastcgi_script_name;
    
        fastcgi_pass                      php80;
        fastcgi_index                     index.php;
        fastcgi_hide_header               x-user;
        fastcgi_hide_header               x-powered-by;
        fastcgi_split_path_info           ^(.+\.php)(.*)$;
    }
    


    마무리



    이러한 변경을 수행한 후 NGINX는 사용자uid="1"가 로그인한 경우 1를 추가하거나 액세스 로그 항목에 로그인한 사용자가 없는 경우 uid="-"를 추가해야 합니다.

    한 가지 주의할 점은 이것이 "동적"요청, 즉 Laravel/PHP에서 처리하는 요청에만 작동하므로 정적 파일(예: CSS/JS)에는 항상 uid="-" 가 있다는 것입니다.

    좋은 웹페이지 즐겨찾기