Назад | Перейти на главную страницу

Проход прокси-сервера Apache в nginx

У меня в Apache следующая конфигурация:

RewriteEngine On


#APP
ProxyPass /abc/ http://remote.com/abc/
ProxyPassReverse /abc/   http://remote.com/abc/

#APP2
ProxyPass /efg/ http://remote.com/efg/
ProxyPassReverse /efg/   http://remote.com/efg/ 

Я пытаюсь использовать такую ​​же конфигурацию в nginx. После прочтения некоторых ссылок у меня есть:

server {
      listen 8081;
      server_name  localhost;
      proxy_redirect http://localhost:8081/ http://remote.com/;

      location ^~/abc/ {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_pass http://remote.com/abc/;
      }

       location ^~/efg/ {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_pass http://remote.com/efg/;
      }
    }

У меня уже есть такая конфигурация:

server {
        listen       8080;
        server_name  localhost;


        location / {
            root   html;
            index  index.html index.htm;
        }
        location ^~/myAPP {
            alias   path/to/app;
            index main.html;
        }

        location ^~/myAPP/images {
            alias   another/path/to/images
            autoindex on;
        }
    }

Идея здесь состоит в том, чтобы преодолеть проблему политики одинакового происхождения. Основные страницы находятся на localhost: 8080, но нам нужны вызовы ajax для http://remote.com/abc. Оба домена находятся под моим контролем.

Используя приведенную выше конфигурацию, вызовы ajax либо не достигают удаленного сервера, либо отключаются из-за перекрестного происхождения.

Вышеупомянутое решение работало в Apache и не работает в nginx, поэтому я предполагаю, что это проблема конфигурации.

Я думаю, здесь возникает неявный вопрос: нужно ли мне иметь два server декларации или их как-то объединить в одно?

РЕДАКТИРОВАТЬ: Добавлена ​​дополнительная информация

РЕДАКТИРОВАТЬ2: Я переместил всю конфигурацию proxy_pass в основной server объявление и изменил все вызовы ajax, чтобы они проходили через порт 8080. Теперь я получаю новую ошибку: 502 Connection reset by peer. Wireshark показывает пакеты, идущие в http://remote.com с неверной контрольной суммой IP-заголовка.

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

server {
  listen 8081;
  server_name  localhost;

  location /abc/ {
    proxy_pass http://remote.com/abc/;
    proxy_http_version 1.1;
    proxy_redirect http://localhost:8081/ http://remote.com/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  }

   location /efg/ {
    proxy_pass http://remote.com/efg/;
    proxy_http_version 1.1;
    proxy_redirect http://localhost:8081/ http://remote.com/;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  }
}

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

Если приведенная выше конфигурация не работает должным образом, добавьте информацию о том, что именно не работает и как именно это выходит из строя.

Редактировать: Я добавил также Хост заголовок к приведенной выше конфигурации, на всякий случай, если удаленный использует виртуальные хосты на основе имен.