LINUX.ORG.RU
ФорумAdmin

nginx - прокси!!!


0

1

Всем доброго времени суток! Есть основной хост на нем nginx, KVM и в нем две виртуалки. Но почему-то nginx проксирует только на одну виртуалку. Сайты с другой виртуалки не открываются. Хотя в конфигах вроде все правильно. Подскажите, кто может, где и что подправить? О-очень нужно!!!

Ответ на: комментарий от note173

Это когда я одну виртуалку выключил, то такое ощущение что nginx обращается именно к ней и когда ее не находит пишет 502 Bad gateway а когда с включенной второй виртуалкой (ну той с которой сайты открываются) тогда мгновенно: Not Found

The requested URL /sch31/ was not found on this server.

Apache/2.2.16 (Ubuntu) Server at localhost Port 80

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

а в логах вот: 2011/06/04 23:45:25 [error] 15677#0: *7 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: sch61, request: «GET /sch31/ HTTP/1.1», upstream: "http://192.168.122.180:80/sch31/", host: «localhost»

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

Да блин опечатка у тебя в конфиге. Проверь внимательно все адреса. Проверь работают ли бэкенды если обратиться к ним напрямую, и т.д.

Короче у тебя не так много мест где может возникать ошибка :)

o
()
Ответ на: комментарий от o

Напрямую бэкенды работают. А где опечатка, ума не приложу... Если после обращения к бэкенду на одной вм, удалить его потом из nginx, на основном хосте и перезапустить nginx, то сайты на второй вм начинают открываться. Но перестают открываться на первой вм. Я думаю что в конфиге nginx не хватает какого-то ключа. Ну типа «работать с несколькими бэкендами сразу», но вот какого - это проблема!...

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

Хватит играть в ламеров и телепатов. Конфиги в студию. Не забудь заменить/затереть приватную инфу.

router ★★★★★
()
Ответ на: комментарий от router

nginx.conf:

user www-data; worker_processes 4; pid /var/run/nginx.pid;

events {    worker_connections 2048;    multi_accept on; }

http {

   ##    # Basic Settings    ##

   sendfile on;    tcp_nopush on;    tcp_nodelay on;    keepalive_timeout 10;    reset_timedout_connection on;    types_hash_max_size 2048;    # server_tokens off;

   # server_names_hash_bucket_size 64;    # server_name_in_redirect off;

   include /etc/nginx/mime.types;    default_type application/octet-stream;

   ##    # Logging Settings    ##

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

   ##    # Gzip Settings    ##

   gzip on;    gzip_disable «msie6»;

    gzip_vary on;     gzip_proxied any;     gzip_comp_level 8;     gzip_buffers 4 8k;     gzip_http_version 1.1;     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

   ##    # Virtual Host Configs    ##

   include /etc/nginx/conf.d/*.conf;    include /etc/nginx/sites-enabled/*; }

#mail { #   # See sample authentication script at: #   # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript # #   # auth_http localhost/auth.php; #   # pop3_capabilities «TOP» «USER»; #   # imap_capabilities «IMAP4rev1» «UIDPLUS»; # #   server { #      listen localhost:110; #      protocol pop3; #      proxy on; #   } # #   server { #      listen localhost:143; #      protocol imap; #      proxy on; #   } #}

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

крнфиг сайта:

server { listen *:80; server_name sch23;

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

location / { proxy_pass http://192.168.122.230:80/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 40m; client_body_buffer_size 512k;

proxy_connect_timeout 120; proxy_send_timeout 120; proxy_read_timeout 120;

proxy_buffer_size 512k; proxy_buffers 4 512k; proxy_busy_buffers_size 512k; proxy_temp_file_write_size 512k; #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #Static files location location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|html|flv|mp3)$ { root http://192.168.122.230:80/; }

}

zfiodor
() автор топика
Ответ на: комментарий от router

конфиг сайта:

server {
listen *:80;
server_name sch23;

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

location / {
proxy_pass http://192.168.122.230:80/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 40m;
client_body_buffer_size 512k;

proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;

proxy_buffer_size 512k;
proxy_buffers 4 512k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 512k;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#Static files location
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|html|flv|mp3)$ {
root http://192.168.122.230:80/; }

}

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

nginx.conf

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
   worker_connections 2048;
   multi_accept on;
}

http {

   ##
   # Basic Settings
   ##

   sendfile on;
   tcp_nopush on;
   tcp_nodelay on;
   keepalive_timeout 10;
   reset_timedout_connection on;
   types_hash_max_size 2048;
   # server_tokens off;

   # server_names_hash_bucket_size 64;
   # server_name_in_redirect off;

   include /etc/nginx/mime.types;
   default_type application/octet-stream;

   ##
   # Logging Settings
   ##

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

   ##
   # Gzip Settings
   ##

   gzip on;
   gzip_disable «msie6»;

    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 8;
    gzip_buffers 4 8k;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

   ##
   # Virtual Host Configs
   ##

   include /etc/nginx/conf.d/*.conf;
   include /etc/nginx/sites-enabled/*;
}


#mail {
#   # See sample authentication script at:
#   # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#   # auth_http localhost/auth.php;
#   # pop3_capabilities «TOP» «USER»;
#   # imap_capabilities «IMAP4rev1» «UIDPLUS»;
#
#   server {
#      listen localhost:110;
#      protocol pop3;
#      proxy on;
#   }
#
#   server {
#      listen localhost:143;
#      protocol imap;
#      proxy on;
#   }
#}

zfiodor
() автор топика

Почему в ошибке имя сервера sch61, а в конфиге sch23?

Tark ★★
()
Ответ на: комментарий от zfiodor

Мм. Все верно. Никакого ключа не надо, достаточно правильно написать конфиг. А для этого надо понимать что должно получиться в результате. Судя по приведенным тобой конфигам, ты сам этого не понимаешь, а я тем более :)

Если на разные бэкенды должны ссылаться разные сайты, значит укажи эти сайты в конфиге nginx. Иначе как он их должен различать по-твоему? А если тебе нужна балансировка - читай про upstream в доке nginx.

o
()
Ответ на: комментарий от router

Совершенно верно. На разных виртуальных хостах лежат разные сайты и мне нужно с одного внешнего ip к ним добираться.
Подскажите, люди добрые, как мне (и где) это прописать? Это мой первый такой опыт, раньше этого никогда не делал.

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

и мне нужно с одного внешнего ip к ним добираться.

любой веб сервер и front end различают сайты по имени сайта.

Браузер обращается и говорит:

GET /index.html HTTP/1.1
HOST: <имя хоста>
<перевод строки>

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

1) написать в строке браузера <имя сайта>

2) иметь возможность определить по этому имени, куда он обращается. Т.е. либо запись в DNS, либо, как временное решение, в /etc/hosts

Тебе нужно обращаться к этим сайтам по РАЗНЫМ именам, а вовсе не по IP. Если ты обращаешься по IP или любому имени, не известному nginx, он отправляет тебя на сайт по умолчанию - тот сайт, конфиг которого он распарсил первым при запуске.

router ★★★★★
()
Ответ на: комментарий от router

Т.е. в конфиге сайта д.б. имя сайта а не адрес? Или как? А где тогда прописать соотношение имен и адресов в /etc/hosts на основном хосте?

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

Ну где все подевались? Дайте пример хоть какой нибудь! Потому что лучше один раз увидеть чем сто раз услышать и рассуждать...

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

Т.е. в конфиге сайта д.б. имя сайта а не адрес? Или как? А где тогда прописать соотношение имен и адресов в /etc/hosts на основном хосте?

У тебя в конфиге и так имя, с этой стороны всё в порядке.

server_name sch23;

НО. там, откуда ты пытаешься подключиться, должно быть прописано в /etc/hosts

<ip nginx> sch32
<ip nginx> sch61

А лучше - в DNS, а не в /etc/hosts

Ну или как сказал anonymous, повесить эти сайты на разные порты, т.е.

server {
listen *:80;
server_name sch61;
[...]
location / {
proxy_pass http://192.168.122.231:80/;
[...]
server {
listen *:8080;
server_name sch23;
[...]
location / {
proxy_pass http://192.168.122.230:80/;
[...]
router ★★★★★
()
Ответ на: комментарий от zfiodor

пример — http://wiki.nginx.org/LikeApache
фронтэнд и проксируемый бэкэнд на разных портах, так что можно их на одном айпи держать и не надо с днс мучиться

anonymous
()
Ответ на: комментарий от router

Спасибо за <ip nginx> sch32 <ip nginx> sch61! Сейчас попробую.
А не счет разных адресов:
server {
listen *:80;
server_name sch61;
[...]
location / {
proxy_pass http://192.168.122.231:80/;
[...]
server {
listen *:8080;
server_name sch23;
[...]
location / {
proxy_pass http://192.168.122.230:80/;
[...]

А как тогда будет выглядеть адрес из интернета, не поменяется? И как сказать виртуалкам чтобы они слушали 8080 в место 80 в apache?

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

Ты что, вообще ничего не знаешь?

listen *:8080;


nginx будет слушать порт 8080, т.е. второй сайт будет доступен по адресу

http://<внешний ip>:8080

не забудь сходить по ссылке http://www.linux.org.ru/jump-message.jsp?msgid=6347037&cid=6348221
и добавить параметры в location

proxy_pass http://192.168.122.230:80/;


back end расположен по адресу 192.168.122.230, порт 80, для обращения использовать протокол http

router ★★★★★
()
Ответ на: комментарий от router

Я прошу прощения, конечно я знаю мало. Но насколько знаю запросы на http приходят по 80 порту. Как мне придет запрос по 8080 если только не руками написать? Или http по 8080 тоже обращается? Потому что если людям придется набирать http://<внешний ip>:8080 то это никому не понравится.

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

>Но насколько знаю запросы на http приходят по 80 порту. Как мне придет запрос по 8080 если только не руками написать?

Если в браузере явно указать потр, то HTTP запрос пойдёт на этот порт. Можешь хоть на 12345/tcp повесить nginx

Потому что если людям придется набирать http://<внешний ip>:8080 то это никому не понравится.


Вот для этого и придумали DNS. Чтобы админ сделал, а пользователям делать не пришлось. В DNS нужно прописать 2 имени (sch32.домен.ру и sch61.домен.ру), в конфиге nginx для сайта (с

server_name sch32.домен.ру

и

server_name sch61.домен.ру

Если нет возможности сделать это в DNS, всем пользователям придётся добавлять это в etc/hosts. Или, как уже говорили, - повесить сайты на разные порты

router ★★★★★
()
Ответ на: комментарий от router

У меня DNS зоны хранится у регистратора и там менять порт нельзя только IP. Может где то на моем сервере это можно сделать? А на виртуалке в etc/hosts добавил, не помогло...

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

>У меня DNS зоны хранится у регистратора и там менять порт нельзя только IP.

В DNS порт не указывается.

Либо ты добавляешь отдельное доменное имя для второго сайта
либо ты используешь то же самое доменное имя, но nginx будет обслуживать этот сайт на другом порту.

А на виртуалке в etc/hosts добавил, не помогло...


Браузер ты запускал на этой виртуалке?
etc/hosts нужно править на том хосте/виртуалке, где ты запускаешь браузер

router ★★★★★
()
Ответ на: комментарий от router

Повесил на разные порты 80 и 8080 заработало! Но теперь бы разобраться с dns... Потому что сейчас работает http://localhost/jtest - первый вариант и http://localhost:8080/sch23 - второй вариант. А как сделать чтоб без :8080?

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

Включи уже голову

Либо ты добавляешь отдельное доменное имя для второго сайта


либо ты используешь то же самое доменное имя, но nginx будет обслуживать этот сайт на другом порту.

router ★★★★★
()
Ответ на: комментарий от router

Так у меня же разные имена!? sch23 и jtest И еще такое вопрос, получается что все сайты с витраулки1 на порт 80 а виртуалки2 на порт 8080? А если появится третья виртуалка тогда 8081? Или как?

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

>А где это посмотреть?

У меня DNS зоны хранится у регистратора и там менять порт нельзя только IP


Ты можешь добавить в DNS зону ещё одно доменное имя, указывающее всё на тот же внешний IP nginx?

router ★★★★★
()
Ответ на: комментарий от router

Могу, но у меня нет своего dns сервера. Я могу только поменять адрес в dns записях у регистратора. Или там нужно добавить имя_сайта:8080 или как?

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

>Я могу только поменять адрес в dns записях у регистратора

омг. смотри - у тебя уже есть одна запись DNS(sch23 или как его), ведущая на ВНЕШНИЙ ip твоего сервера. Просто добавляешь вторую запись(sch31?) ведущую на ТОТ ЖЕ ip. Порты никакие указывать не нужно в DNS - разгребание портов займется фронтэнд..

Pinkbyte ★★★★★
()
Ответ на: комментарий от zfiodor

Могу, но у меня нет своего dns сервера.

И не нужно, достаточно DNS регистратора

Или там нужно добавить имя_сайта:8080 или как?

или как

  • У тебя есть зона DNS. домен.ру, например.
  • У тебя есть регистратор имён, поддерживающий эту зону
  • У тебя есть возможность добавлять доменные имена в зону домен.ру

НУЖНО:

I) Придумать 2 (два) имени:

1) имя, по которому будет доступен первый сайт ( например, sch23 )

2) имя, по которому будет доступен второй сайт ( например, sch61 )

II) Внести эти имена в DNS зоны домен.ру

III) Дождаться, когда изменения применятся

nslookup sch23.домен.ру

nslookup sch61.домен.ру

IV) настроить nginx:

server {
listen *:80;
server_name sch23.домен.ру;
[...]
location / {
proxy_pass http://<ip адрес бекенда sch32>:80/;
[...]
server {
listen *:80;
server_name sch61.домен.ру;
[...]
location / {
proxy_pass http://<ip адрес бекенда sch61>:80/;
[...]

V) Обращаться к сайтам по адресам sch23.домен.ру и sch61.домен.ру

VI) Оставить мой мозг в покое

router ★★★★★
()
Ответ на: комментарий от router

Прошу прощения за мозг, я не хотел докучать. Но раз уж так вышло... Мне ничего придумывать не надо. Есть уже купленные самостоятельные имена. Они сейчас крутятся у другого хостера. Шеф сказал перенести их в офис. И мне надо подготовить для них сервер. Имен (сайтов) штук 25. И лежать они будут на разных виртуалках. И у меня на сегодняшний день почти все работает кроме этого :8080 Насколько я понимаю, я у регистратора в управлении dns, я просто меняю ip старого хостера на наш реальный офисный (ну какой провайдер даст). А как быть с :8080 (еще раз прошу прощения) я пока не знаю. Дело в том, что при замене адреса у регистратора все запросы к моему серверу все равно будут посылаться по 80 порту, а не по 8080...

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

>Они сейчас крутятся у другого хостера. Шеф сказал перенести их в офис. И мне надо подготовить для них сервер.

И всё же 2 новых имени придумать придётся - для проверки перед переносом. Иначе могут быть сюрпризы

И у меня на сегодняшний день почти все работает кроме этого :8080


Зачем ты прицепился к 8080? Если у тебя есть возможность добавлять имена во внешний DNS, вешать сайты на другие порты НЕ НУЖНО.

В http://www.linux.org.ru/jump-message.jsp?msgid=6347037&cid=6348607
практически пошаговое howto

router ★★★★★
()
Ответ на: комментарий от router

У моего регистратора можно так:
1. «Указать новые NS»
2. «Использовать NS регистратора»
3. Зайти в управление DNS и там менять адреса или добавлять/удалять субдомены.
Просто я не до конца понимаю вот, к примеру, два придуманных мною имени sch23 sch61, куда мне нужно их там внести.
И можно ли все это проверять через localhost? И если нет, то может в этом и проблема?....

zfiodor
() автор топика
Ответ на: комментарий от zfiodor

Почитай уже как работает DNS не выноси мозг бедному router'у он и так уже тебе все разжевал настолько подробно что ученик 5 класса смог бы все настроить.

hidden_4003
()
Ответ на: комментарий от zfiodor

>Просто я не до конца понимаю вот, к примеру, два придуманных мною имени sch23 sch61, куда мне нужно их там внести.

3. Зайти в управление DNS и там менять адреса или добавлять/удалять субдомены.


NS - это другое.

Хорошая статья про DNS: http://www.opennet.ru/docs/RUS/dns1/

И можно ли все это проверять через localhost? И если нет, то может в этом и проблема?....


Кажется, он начал что-то понимать.

Теоретически - можно. Практически - я смогу проверить, ты - вряд ли.

router ★★★★★
()
Ответ на: комментарий от router

Ну почему теоретически ? В /etc/hosts пишешь www.domen.ru убеждаешься что с той машины где проверяешь адрес действительно правильный и тогда уже как обычно проверяешь.
Хотя у ТС я вижу сейчас ДНС воспринимается на уровне таинственных плясок шаманов вокруг костра.

hidden_4003
()
Ответ на: комментарий от router

Просто ТС как я понял добавил записи в /etc/hosts на сервере, а не на машине откуда слал запросы.

hidden_4003
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.