Ну, кажется, что проблемой была 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.
Я предполагаю для своего следующего вопроса об отказе сервера, который я должен буду спросить о стратегиях обновления операционной системы сервера...
Фактически вы можете сделать это через 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;
}
}
Итак, прочитав всю документацию по 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;
}
}
У меня была такая же проблема, и в конце концов я решил ее с помощью двух уровней прокси. Вот как вы могли бы сделать для вашей ситуации (я думаю):
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 для каждого сервера. Затем, вы можете использовать этот локальный сервер в своем восходящем потоке и, наконец, использовать его в реальном прокси.
.Мы передаем восходящий адрес в виде отдельного заголовка, как этот
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;
}
}
Хотя цель кажется логичной, nginx не собирается изменять заголовок Host: таким образом, чтобы он соответствовал исходному . Вместо этого он обрабатывает восходящие
доменные имена как CNAME
в DNS - как способ доступа к IP-адресу.
Заголовки (и тело) запроса фиксируются перед восходящим потоком выбрано. Восходящий поток может изменить средний запрос, если он не отвечает, но запрос не изменяется.
Хм. У меня аналогичная установка, в которой я просто выполнил
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 .
Поскольку другие люди уже писали об использовании переменной скрипта (например, $ 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 , но поскольку они не входят в дерево, вам нужно будет построить их самостоятельно, что невозможно для некоторых вариантов использования /