Я работаю с монолитным приложением 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