Сделайте nginx для передачи имени хоста восходящего потока когда reverseproxying

Ну, кажется, что проблемой была Linode-определенная. Существует, в конфигурационном файле для VM, и установка "ядра" для этого была установлена в "Последних 2.6 Наследии (2.6.18.8-linode22". Я должен был изменить это на "Последние 2.6 Paravirt (2.6.38-linode31)", и затем ssh (и веб-сайты, подаваемые с этого сервера), все возвратились. Ух!

Я предполагаю, что ядро, для которого был настроен linode, было только для использования в версиях Ubuntu, более старой, чем 9,10. Откровенно я думал, что процесс обновления операционной системы будет заботиться об этом, но затем я действительно не понимаю все о том, как конфигурационный файл VM и OS VM взаимодействуют, таким образом, не удивительно, что я смог попасть в беду, я предполагаю.

Я думаю, возможно, что урок на дом - то, что при разрешении серверу, OS получает это, которое далеко устарело, существуют нечетные вещи, требуемые для процедуры обновления, которая не всегда будет в актуальнейшей документации, потому что мой бог, который находится все еще на версии, настолько старой. Тем не менее, я должен буду глубоко вздохнуть и думать немного прежде, чем попытаться обновить до следующей более новой OS.

Я предполагаю для своего следующего вопроса об отказе сервера, который я должен буду спросить о стратегиях обновления операционной системы сервера...

90
задан 23 May 2014 в 23:46
7 ответов

Фактически вы можете сделать это через proxy_set_header.

Подробнее см. Здесь: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header или см. Пример использования здесь: https: // stackoverflow.com/questions/12847771/configure-nginx-with-proxy-pass

Я включил динамический подход в указанную выше конфигурацию:

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

Вот пример со статическим именем хоста:

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            www.example.com;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}
109
ответ дан 28 November 2019 в 19:23

Итак, прочитав всю документацию по nginx (я действительно не смог разобрать код для восходящего модуля = (), я придумал это убогое решение. К сожалению, это решение не отслеживает отказавшие хосты, но просто выберите случайный вариант и перенаправьте на него запрос. Поэтому мне нужно настроить какой-то мониторинг, чтобы убедиться, что все серверы работают.

server {
        listen 80;
        server_name example.com;
        resolver 127.0.0.1;

        location / {
                set $upstream "";
                rewrite_by_lua '
                        local upstreams = {
                                "http://web1.dokku.localdomain",
                                "http://web2.dokku.localdomain",
                                "http://web3.dokku.localdomain",
                                "http://web4.dokku.localdomain"
                        }
                        ngx.var.upstream = upstreams[ math.random( #upstreams ) ] 
                ';
                proxy_pass $upstream;
        }
}
3
ответ дан 28 November 2019 в 19:23

У меня была такая же проблема, и в конце концов я решил ее с помощью двух уровней прокси. Вот как вы могли бы сделать для вашей ситуации (я думаю):

server {
  listen      8001 default_server;
  server_name web1.example.com;
  location / {
    proxy_pass       http://web1.local:80;
    proxy_set_header Host web1.local:80;
  }
}

server {
  listen      8002 default_server;
  server_name web2.example.com;
  location / {
    proxy_pass       http://web2.local:80;
    proxy_set_header Host web2.local:80;
  }
}

server {
  listen      8003 default_server;
  server_name web3.example.com;
  location / {
    proxy_pass       http://web3.local:80;
    proxy_set_header Host web3.local:80;
  }
}

upstream main {
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
  server 127.0.0.1:8003;
}

server {
  listen      80;
  server_name example.com;
  location / {
    proxy_pass http://main;
  }
}

Как вы можете видеть, хитрость заключается в создании локального сервера, отвечающего на определенный порт, который будет проксировать сервер, переписывая нужный Host для каждого сервера. Затем, вы можете использовать этот локальный сервер в своем восходящем потоке и, наконец, использовать его в реальном прокси.

.
28
ответ дан 28 November 2019 в 19:23

Мы передаем восходящий адрес в виде отдельного заголовка, как этот

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $host;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header       X-Upstream      $upstream_addr;
  }
}

Что, если бы вы попробовали?

server {
  listen 80;
  server_name example.com;
  location / {
    proxy_pass       http://main;
    proxy_set_header Host            $upstream_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    add_header       X-Host          $host;
  }
}
2
ответ дан 28 November 2019 в 19:23

Хотя цель кажется логичной, nginx не собирается изменять заголовок Host: таким образом, чтобы он соответствовал исходному . Вместо этого он обрабатывает восходящие доменные имена как CNAME в DNS - как способ доступа к IP-адресу.

Заголовки (и тело) запроса фиксируются перед восходящим потоком выбрано. Восходящий поток может изменить средний запрос, если он не отвечает, но запрос не изменяется.

2
ответ дан 28 November 2019 в 19:23

Хм. У меня аналогичная установка, в которой я просто выполнил

location / {
    ... 
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_pass ...;
}

Использование $ http_host (заголовок HTTP Host из входящего запроса) вместо $ host ( конфигурация имени хоста сервера) приводит к тому, что в моем тестировании тот же заголовок Host, переданный клиентом, передается восходящему потоку.

См. также https: // stackoverflow.com / questions / 14352690 / change-host-header-in-nginx-reverse-proxy .

1
ответ дан 28 November 2019 в 19:23

Поскольку другие люди уже писали об использовании переменной скрипта (например, $ upstream), вы можете установить ее, как хотите, и это решит проблему без дополнительного взлома заголовков.

Proxy Pass переменные сценария обработчика угроз другим способом, если значение не является условным (не содержит $ в имени), передается вышестоящему этапу на этапе настройки и используется позже.

Простой способ опустить эту проблему и получить Большинство преимуществ (бесплатной версии) восходящего потока будет использовать что-то вроде Split_Clients :

split_clients $request_uri $my_upstream {
              33%          server1.domainX.com;
              33%          server2.domainX.com;
# Always use DOT at end entry if you wonder why, read the SC code.
              *            server3.domainX.com;  
}
location / {
    ... 
    proxy_pass http://$my_upstream;
}

Приведенный выше пример выглядит почти так же, как и исходящий поток. Существуют и другие модули, выполняющие сопоставление, то есть chash_map_module , но поскольку они не входят в дерево, вам нужно будет построить их самостоятельно, что невозможно для некоторых вариантов использования /

0
ответ дан 28 November 2019 в 19:23

Теги

Похожие вопросы