Обратные прокси-серверы Nginx для сервера Rails 4 / сервера и поддоменов VueJS - PullRequest
0 голосов
/ 21 июня 2019

Я работаю с монолитным приложением Rails 4 со старым внешним интерфейсом.Моя основная цель: создать новый автономный интерфейс в VueJS и сохранить сервер Rails в качестве API, а nginx ликвидирует разрыв между ними.

Создание прототипа в моей среде разработки было сложной задачей.Вот где я стою:

  • В текущем приложении используются поддомены с подстановочными знаками, поэтому мне нужно иметь возможность обрабатывать XYZ.localhost URL-адресов, независимо от того, каким может быть XYZ.
  • Веб-пакетСервер разработчика существует на http://localhost:8080.По умолчанию я намерен переадресовывать прокси-вызовы на этот сервер.
  • Устаревший сервер Rails dev существует на http://localhost:3000.Я намерен отменить прокси-вызовы, начиная с /api/ здесь.В большинстве запросов он ожидает субдомен, поэтому http://clumsypanda.localhost/api/candy должен использовать прокси на http://clumsypanda.localhost:3000/candy.

Я думаю, что у меня есть два первых недостатка: nginx предоставляет мне содержимое VueJS, когда я посещаю http://XYZ.localhost.Я получаю только 502 сообщения об ошибках на http://XYZ.localhost/api/whatever.В частности, отчеты nginx:

XYZ.localhost не может быть разрешен (3: хост не найден), клиент: :: 1, сервер: localhost, запрос: "POST / api / login HTTP / 1.1", хост:" XYZ.localhost ", реферер:" http://XYZ.localhost/"

Это моя конфигурация nginx:

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /usr/local/var/log/nginx/access.log  main;
    error_log /usr/local/var/log/nginx/error.log;

    server {
        listen       80;
        listen       [::]:80;
        server_name  localhost;

        location ~ ^/api/ {
            proxy_pass http://$host:3000;
            proxy_set_header Real-IP $remote_addr;
            proxy_set_header Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NginX-Proxy true;
            proxy_redirect off;

            rewrite ^/api(.*)$ $1 break;
        }

        location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Real-IP $remote_addr;
            proxy_set_header Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header NginX-Proxy true;
            proxy_redirect off;
        }
    }

    include servers/*;
}

Я слышал, что использование переменных в предложениях proxy_pass вызывает некоторые странныеDNS resolver voodoo, поэтому я отредактировал свой файл hosts (/etc/hosts на OS X), чтобы он выглядел так:

127.0.0.1   localhost *.localhost
255.255.255.255 broadcasthost
::1             localhost

1 Ответ

0 голосов
/ 10 июля 2019

Я в конце концов понял это сразу после экспериментов с Баджиллионом. Мне нужно было захватить поддомен и применить его к заголовкам прокси. Кроме того, мне потребовался блок восходящего потока, чтобы заставить nginx сам разрешить домен.

upstream rails_api {
  server 127.0.0.1:3000;
}

server {
    listen       80;
    listen       [::]:80;
    server_name  ~^(?<subdomain>.+)\.localhost;
    location ~ ^/api/ {
        proxy_pass http://rails_api;
        proxy_set_header Real-IP       $remote_addr;
        proxy_set_header Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header NginX-Proxy   true;
        proxy_set_header Host          $subdomain.localhost:3000;
        proxy_redirect off;

        rewrite ^/api(.*)$ $1 break;
    }

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Real-IP $remote_addr;
        proxy_set_header Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header NginX-Proxy true;
        proxy_set_header Host        $host;
        proxy_redirect off;
    }
}
...