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>