Laravel: получение правильного IP-адреса за балансировкой нагрузки AWS Elasti c Beanstalk с Docker - PullRequest
1 голос
/ 12 марта 2020

My Laravel 6.x состоит из Docker, работающего в прокси Elasti c Beanstalk с NGinx, который находится за балансировщиком нагрузки.

При такой настройке мне очень трудно получить правильный IP-адрес, который влияет на промежуточное программное обеспечение Throttle, поскольку IP Laravel получает либо с хост-машины, либо с балансировщика нагрузки ,

Итак, каждый пользователь согласен со всеми в отношении ограничений газа.

Есть идеи, как это исправить?

Это копия $ _SERVER. В этом случае правильный IP-адрес является первым в HTTP_X_FORWARDED_FOR. Правильный IP-адрес для этого сценария: 188.67.242.77.

Array
(
    ...
    [HTTP_X_REAL_IP] => 172.31.28.165
    [HTTP_X_FORWARDED_FOR] => 188.67.242.77, 172.31.28.165
    [HTTP_X_FORWARDED_PROTO] => https
    [HTTP_X_FORWARDED_PORT] => 443
    ... 
    [SERVER_SOFTWARE] => Apache/2.4.38 (Debian)
    [SERVER_NAME] => {MASKED}
    [SERVER_ADDR] => 172.17.0.3
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 172.17.0.1
    ...
    [REMOTE_PORT] => 47334
    ...
    [SCRIPT_NAME] => /index.php
    [PHP_SELF] => /index.php
    [REQUEST_TIME_FLOAT] => 1584032941.764
    [REQUEST_TIME] => 1584032941
)

Проверено изменение всего, что я мог представить в TrustProxies. php. protected $headers установлен на Request::HEADER_X_FORWARDED_AWS_ELB, Request::HEADER_X_FORWARDED_ALL, Request::HEADER_X_FORWARDED_FOR и protected $proxies на * и **. Смешал и сопоставил возможности. Не хорошо. Я получил либо 172.17.0.1 (IP-адрес хоста), либо 172.31.28.165 (IP-адрес балансировщика нагрузки)

Есть идеи?

Большое спасибо заранее

=== ОБНОВЛЕНИЕ 17 марта ===

Файл AWS прокси nginx файл

    map $http_upgrade $connection_upgrade {
        default        "upgrade";
        ""            "";
    }

    server {
        listen 80;

        gzip on;
            gzip_comp_level 4;
            gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
            set $year $1;
            set $month $2;
            set $day $3;
            set $hour $4;
        }
        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;

        access_log    /var/log/nginx/access.log;

        location / {
            proxy_pass            http://docker;
            proxy_http_version    1.1;

            proxy_set_header    Connection            $connection_upgrade;
            proxy_set_header    Upgrade                $http_upgrade;
            proxy_set_header    Host                $host;
            proxy_set_header    X-Real-IP            $remote_addr;
            proxy_set_header    X-Forwarded-For        $proxy_add_x_forwarded_for;
        }
    }

=== Обновление 18 марта ===

Файл apache vhost внутри Docker

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot ${APACHE_DOCUMENT_ROOT}

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

1 Ответ

0 голосов
/ 13 марта 2020

Если ваш экземпляр Laravel работает в контейнере Docker и обслуживается nginx, вы можете перезаписать REMOTE_ADDR на HTTP_X_REAL_IP в конфигурации nginx *1009* вашего виртуального хоста.

server {
    listen 80;

    index index.php index.html;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    root /var/www/public_html;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;

        # Override the load balancer IP with real IP.
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

...