У Вас есть 2 опции.
Используйте другой IP, как Вы упомянули.
Необходимо будет вручную отредактировать конфигурацию IIS 7 из командной строки. Я обрисовал в общих чертах шаги здесь: ссылка
Выполнение этого переопределит настройки по умолчанию IIS 7, чтобы позволить тому же сертификату использоваться на различных сайтах с тем же IP. Это - общий шаг, все должны были занять в IIS 6-7 дней.
Так как Varnish работает на каждом сервере, на котором запущен nginx, источник соединения с точки зрения nginx - 127.0.0.1, а не балансировщик нагрузки.
set_real_ip_from 192.168.255.0/24;
Вот в чем проблема; nginx не будет «доверять» заголовку X-Forwarded-For
, когда соединение исходит из 127.0.0.1 (процесс Varnish); все, что он доверяет, - это вся сеть 192.168.255.0/24. Добавьте авторизацию, чтобы доверять заголовку, когда Varnish отправляет его.
set_real_ip_from 127.0.0.1;
Edit:
nginx плохо себя ведет при синтаксическом разборе заголовка X-Forwarded-For
для "реального" IP-адреса клиента; он ищет последнюю запись в заголовке, которая никогда не является реальным IP-адресом клиента, если имеется более одной записи. См. этот вопрос для получения дополнительной информации об этой проблеме.
I ' г рекомендовать заставить Varnish прекратить добавлять собственный заголовок X-Forwarded-For
. Вы захотите удалить эту часть функции vcl_recv
:
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
Укажите текущую конфигурацию vcl, если вам нужна помощь, что нужно изменить для вас, так как это может быть явно настроено или добавлено по умолчанию (или оба).
Edit 2:
Замените это на функцию vcl_recv
в вашей конфигурации Varnish; он объединяет настройки, которые вы настроили, с поведением по умолчанию, удаляя при этом обман X-Forwarded-For
, который присутствует по умолчанию.
sub vcl_recv {
call detect_device;
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
return(lookup);
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
# Default logic follows; it's normally appended.
# It'll still be appended, but having the return(lookup)
# prevents its use. X-Forward-For header behavior removed.
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
return (lookup);
}
Похоже, ваш балансировщик нагрузки не передает IP-адрес клиента ни в одном заголовке. Поскольку вы не сказали, что вы используете для балансировщика нагрузки, невозможно дать конкретное решение, но в целом вы хотите настроить балансировщик нагрузки на размещение IP-адреса клиента в одном из заголовков (например, X-Forwarded-For
). Вы также можете назначить для этого собственный заголовок, если хотите.
Если ваш балансировщик нагрузки устанавливает X-Forwarded-For, то я бы настроил ваши серверы Varnish так, чтобы он устанавливал заголовок, отличный от X-Forwarded-For, чтобы у вас есть полная видимость как IP-адреса клиента, так и того, какой сервер обработал запрос.
Предположим, что ваш балансировщик нагрузки использует заголовок X-Forwarded-For
как для HTTP, так и для HTTPS, тогда ...
sub vcl_recv {
...
set req.http.X-Forwarded-For = req.http.X-Forwarded-For;
server {
...
set_real_ip_from 192.168.255.0/24;
real_ip_header X-Forwarded-For;
Я добавлю , что вы действительно должны запускать только 1 экземпляр Varnish, это лишает смысла иметь несколько кешей (так как балансировщик нагрузки может передавать запрос к экземпляру без грунтовки Varnish). Ваши показатели попадания будут еще хуже, не говоря уже о том, что это просто пустая трата ресурсов.