2014-12-08 4 views
2

Я пытаюсь настроить веб-порты на моем приложении для рельсов. Мое приложение работает с клиентом iOS, который использует библиотеку SocketRocker.Websockets с основным приложением (nginx + пассажир + фей)

Как websockets backend я использую faye-rails драгоценный камень. Он интегрирован в рельсы приложения в качестве стойки промежуточного

config.middleware.delete Rack::Lock 
config.middleware.use FayeRails::Middleware, mount: '/ws', server: 'passenger', engine: {type: Faye::Redis, uri: redis_uri}, :timeout => 25 do 
    map default: :block 
end 

Он отлично работает, пока я не загрузить его на сервер производства с Nginx. Я пробовал много решений, чтобы передать запрос websocket на бэкэнд, но не повезло. Главное, что есть два сервера, но у меня есть только один. Моя идея заключалась в том, что мне просто нужно было проксифицировать запросы с/faye endpoint в/ws (для обновления заголовков). Какие правильные параметры proxy_pass должны быть в моем случае?

location /faye { 
    proxy_pass http://$server_name/ws; 
    proxy_buffering off; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    } 
+0

Любая удача, решающая это? В настоящее время у меня аналогичная проблема. –

+0

Я прекратил использование промежуточного программного обеспечения и запускал сервер сокетов отдельно. – NeverBe

+0

Точно, что я собираюсь делать, я думаю, это будет так. Спасибо! –

ответ

0

У меня была схожая проблема, и после некоторого времени я, наконец, смог заставить ее работать.

Я использую Nginx 1.8 с тонких сервера с драгоценным камнем 'Фей рельсами' и точками монтирования является /Faye

Моего Nginx конфигурация выглядит следующим образом:

upstream thin_server { 
    server 127.0.0.1:3000; 
} 

map $http_upgrade $connection_upgrade { 
     default upgrade; 
     ''  close; 
} 

server { 
    ... 
    proxy_redirect off; 
    proxy_cache off;  

    location = /faye { 
     proxy_pass http://thin_server; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
     chunked_transfer_encoding off; 
     proxy_buffering off; 
     proxy_cache off; 
    } 

    location/{ 
     try_files $uri/index.html $uri.html $uri @proxy; 
    } 

    location @proxy { 
     proxy_pass http://thin_server; 
     proxy_set_header X-Real-IP $remote_addr;      
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host;        
    }                
    ... 
}             

Последний поворотный пункт для меня, чтобы он работал, когда я установил «location =/faye». Прежде чем я попробовал «location/faye» и «location ~/faye», и это не удалось. Похоже, знак равенства = = предотвращает смешивание nginx с другими настройками местоположения.