Как настроить Nginx в качестве прокси?

Весь день и пол ночи пытаюсь настроить, уже сил нету(

Нужно xxx.com/adb отображался как yyy.com (с заменой всех ссылок с xxx.com/adb на yyy.com)
Вот кусок кода:
server {
        listen 80;
        server_name xxx.com;
        root /var/www/yyy.com/web;
location /adb/ {
            resolver 8.8.8.8;
            proxy_pass http://yyy.com;
            proxy_redirect off; 
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }


Данный конфиг хорошо работает с ip адресами, но с доменными именами работать не хочет.
Думал проблема в конечном сервере, заменил для эксперимента на другие доменные имена, а результат вообще странный получился. yandex.ru отказывается работать, ya.ru вроде работает. С некоторыми сайтами выдает ошибку 502 или 404 (но тут наверно не в ту сторону начал копать уже)
И подскажите плиз как заблокировать загрузку файла к примеру xxx.com/adb/logo.png с удаленного сервера.
  • Вопрос задан
  • 3787 просмотров
Решения вопроса 1
@xtreme
Снимаю порчу по SSH :)
server {
  listen 80;
  server_name xxx.com;
  root /var/www/yyy.com/web;
  location /adb/ {
    resolver 127.0.0.1;
    rewrite ^/adb/(.*)$ /$1 break;
    proxy_pass http://yyy.com;
    proxy_redirect default; #???
    proxy_set_header Host yyy.com;
  }
}


Не поленитесь поставить named на локалхост. В CentOS, например, достаточно запустить дефолтную конфигурацию (yum install bind && chkconfig named on && service named start). Так будет проще и быстрее резолвить, чем каждый раз стучаться в гуглоднс.
Далее - если не сделать rewrite с break, убрав ваш локейшн, то запрос на xxx.com/adb/ уйдет не на yyy.com, а на yyy.com/adb/. И если там такого урла нет - получим 404 или что-нибудь еще хуже.
Далее - если собрались проксировать трафик на yandex.ru, то при проксировании подставляйте заголовок "Host yandex.ru". Если оставить, как есть "Host $host", то получится, что на yandex.ru придет ваш запрос, который ищет xxx.com на хосте с yandex.ru, как следствие - 404.
Далее - nginx.org/ru/docs/http/ngx_http_proxy_module.html#... - стоит разобраться с proxy_redirect. Для разных узлов возможны разные значения. Обычно хватает default, но вполне может понадобиться и off или другие параметры.

Чтобы заблокировать xxx.com/adb/logo.png при проксировании:

location ~ ^/adb/logo\.png$ {
  empty_gif;
}


В location можно также и так:
location = /adb/logo.png {
Либо вместо empty_gif если надо отдавать свою картинку - тогда можно, например, сделать rewrite в нужный урл и отдавать картинку от себя.

P.S. Можно также сделать пару локейшнов для статических элементов, чтобы обрабатывать их отдельно и класть в локальный кеш - сокращается трафик и ускоряется доступ.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
server {                                                                                                                                                                                            
       listen  80;                                                                                                                                                                                        
       server_name yyy.com;                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                 
        location / {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://xxx.com/adb/;
        }
}
Ответ написан
merryjane
@merryjane
Системный администратор
Попробуйте в конфиг добавить resolver:
nginx.org/ru/docs/http/ngx_http_core_module.html#r...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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