Как заставить BrowserSync работать с прокси-сервером nginx?
(при необходимости см. мой последний вопрос для получения дополнительной информации.)
я разрабатываю приложение, которое использует развязанный фронт и бэкэнд:
- бэкэнд-это приложение Rails (подается на
localhost:3000
), который в основном предоставляет API REST. - интерфейс-это приложение AngularJS, которое я создаю с глотком и обслуживаю локально (используя BrowserSync) on
localhost:3001
.
чтобы получить два конца разговаривать друг с другом, почитая политика того же происхождения, я настроил nginx в качестве прокси-сервера между двумя, доступными на localhost:3002
. Вот мой nginx.conf:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 3002;
root /;
# Rails
location ~ .(json)$ {
proxy_pass http://localhost:3000;
}
# AngularJS
location / {
proxy_pass http://localhost:3001;
}
}
}
в основном, любые запросы на .json
файлы, которые я отправляю на сервер Rails, и любые другие запросы (например, для статических активов), я отправляю на сервер BrowserSync.
задача BrowserSync из my gulpfile.coffee
:
gulp.task 'browser-sync', ->
browserSync
server:
baseDir: './dist'
directory: true
port: 3001
browser: 'google chrome'
startPath: './index.html#/foo'
это все в принципе работает, но с пара предостережений, которые я пытаюсь решить:
- когда я запускаю задачу gulp, основываясь на конфигурации выше, BrowserSync загружает вкладку Chrome в
http://localhost:3001/index.html#/foo
. Поскольку я использую прокси-сервер nginx, мне нужен порт 3002. Есть ли способ сказать BrowserSync: "запуск на порту 3001, но запуск на порту 3002"? Я попытался использовать абсолютный путь дляstartPath
, но он ожидает только относительный путь. - я получаю (казалось бы, доброкачественную) ошибку JavaScript в консоли каждый раз BrowserSync запускается:
WebSocket connection to 'ws://localhost:3002/browser-sync/socket.io/?EIO=3&transport=websocket&sid=m-JFr6algNjpVre3AACY' failed: Error during WebSocket handshake: Unexpected response code: 400
. Не уверен, что это означает точно, но я предполагаю, что BrowserSync каким-то образом запутан прокси-сервером nginx.
как я могу исправить эти проблемы, чтобы получить это работает без проблем?
Спасибо за любой вклад!
4 ответов
чтобы получить больше контроля над тем, как открывается страница, используйте opn вместо механизма синхронизации браузера. Что - то вроде этого (в JS-извините, мой сценарий кофе немного ржавый):
browserSync({
server: {
// ...
},
open: false,
port: 3001
}, function (err, bs) {
// bs.options.url contains the original url, so
// replace the port with the correct one:
var url = bs.options.urls.local.replace(':3001', ':3002');
require('opn')(url);
console.log('Started browserSync on ' + url);
});
Я не знаком с Nginx, но согласно на этой странице, решение второй проблемы может выглядеть примерно так:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
# ...
# BrowserSync websocket
location /browser-sync/socket.io/ {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
мне удается только путем добавления /browser-sync/socket.io
директива proxy_pass на URL-адрес.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
# ...
# BrowserSync websocket
location /browser-sync/socket.io/ {
proxy_pass http://localhost:3001/browser-sync/socket.io/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
вы также можете сделать это со стороны gulp / browsersync очень просто, используя его опции прокси-сервера:
gulp.task('browser-sync', function() {
browserSync({
...
proxy: 'localhost:3002'
});
});
это означает, что ваш браузер подключается к browsersync напрямую, как обычно, через gulp, за исключением прокси nginx. Пока ваш интерфейс не жестко кодирует хосты / порты в URL-адресах, запросы к Rails будут проходить через прокси-сервер и иметь тот же источник, поэтому вы все равно можете публиковать и такие. Это может быть желательно для некоторых, поскольку это изменение для параметра развития в разделе Развитие вашего кода (залпом+browsersync в) против conditionalizing/изменение конфигурация nginx, который также запускается в производство.
настройка браузера-синхронизация для работы с приложением python (django), которое работает на uwsgi через websocket. Приложение Django имеет префикс /app для создания url-адреса, который выглядит какhttp://example.com/app/admin/
server {
listen 80;
server_name example.com;
charset utf-8;
root /var/www/example/htdocs/static;
index index.html index.htm;
try_files $uri $uri/ /index.html?$args;
location /app {
## uWSGI setup
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:///var/run/example/uwsgi.sock;
uwsgi_param SCRIPT_NAME /app;
uwsgi_modifier1 30;
}
location /media {
alias /var/www/example/htdocs/storage;
}
location /static {
alias /var/www/example/htdocs/static;
}
}