2014-11-26 2 views
0

На нашем сервере мы запускаем Apache уже на порту 80, на этом же сервере я хочу обслуживать socket.io, и я хотел бы подключиться к серверу socket.io также на порт 80. Так что я пытался получить Apache для прокси-порт 80. Я нашел это StackOverflow запись: https://serverfault.com/questions/616370/configuring-apache-2-4-mod-proxy-wstunnel-for-socket-io-1-0Настройка Apache 2.4.7 для проксирования socket.io

Что я сделал:

Я включил следующие модули Apache:

a2enmod rewrite proxy proxy_wstunnel 

я создал новый сайт в '/etc/apache2/sites-available/mysite.conf', со следующим концом нт:

<VirtualHost subdomain.mydomain.com:80> 
    Servername subdomain.mydomain.com 

    RewriteEngine On 
    RewriteCond %{REQUEST_URI} ^/socket.io   [NC] 
    RewriteCond %{QUERY_STRING} transport=websocket [NC] 
    RewriteRule /(.*)   ws://localhost:3001/$1 [P,L] 

    ProxyPass  /socket.io http://localhost:3001/socket.io 
    ProxyPassReverse /socket.io http://localhost:3001/socket.io 
</VirtualHost> 

На том же сервере, я сервер socket.io работает на порту 3001:

server.listen('3001', function(){ 
    console.log('Socket.io server listening on *:3001'); 
}); 


io.listen(server).on('connection', function(client) { 
    // Rest of the code 
} 

И Socket.io клиенты подключаются на этой подобласти сконфигурированной в апача:

var socket = io.connect('http://subdomain.mydomain.com/', {query: {extra_info : extra_info}}); 

Как только я запускаю клиента. Я не вижу ничего, приходящим в сервер Socket.io регистрации (я добавил много console.log() записей Все, что я вижу в консоли клиента является следующей ошибкой:.

GET http://subdomain.mydomain.com:8100/socket.io/?extra_info=fe4567&EIO=3&transport=polling&t=1416987210079-31 net::ERR_CONNECTION_TIMED_OUT 

Если подключить клиентов непосредственно к порту 3001 на сервере Socket.io http://subdomain.mydomain.com:3001 все просто работает нормально (когда я открыть порт 3001 на сервере Apache)

Я бегу следующие версии:.

  • Apache : 2.4.7
  • Socket.io s ервере & клиента: 1.2.1

EDIT:

Когда я изменить URL подключения в var socket = io.connect('http://subdomain.mydomain.com/', {query: {extra_info : extra_info}}); к http://subdomain.mydomain.com:80.

я получаю другую ошибку:

GET http://subdomain.mydomain.com/socket.io/?user_id=2&EIO=3&transport=polling&t=1418122378582-40 
(index):1 XMLHttpRequest cannot load http://subdomain.mydomain.com/socket.io/?extra_info=sdferr&EIO=3&transport=polling&t=1418122378582-40. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.178.158:8100' is therefore not allowed access. The response had HTTP status code 500. 

Я, хотя установка Access-Control-Allow-Origin заголовка в Apache будет решить эту проблему, но это не так. Я добавил это в файл /etc/apache2/sites-available/mysite.conf:

Header set Access-Control-Allow-Origin "*" 
+0

где этот порт пришел из '.... com: 8100/...'? я не мог видеть это в другой конфигурации ?! – Yazan

+0

Я не понимаю, откуда идет порт 8100. Не удается найти что-либо в файлах конфигурации. –

+0

как насчет конфигурации клиента? или код? – Yazan

ответ

0

Там, где 2 вещи идут не так. Прежде всего, вам нужно указать порт 80 в клиенте, чтобы иметь возможность подключения к порту 80. Так что я настроен клиент для подключения следующим образом:

io.connect('http://subdomain.mydomain.com:80/', {query: {extra_info : extra_info}}) 

После этого изменения вы получите проблемы несколько CORS. Единственное, что мне нужно было изменить - это восстановить файл JS клиента. В моем приложении AngularJS я включил Socket.io клиента файл JS следующим образом:

<script src="https://cdn.socket.io/socket.io-1.2.1.js"></script> 

мне нужно, чтобы изменить это:

<script src="http://subdomain.mydomain.com/socket.io/socket.io.js"></script> 

кажется, что socket.io клиент автоматически обслуживается ваш сервер socket.io. Если вы получите JS клиента с вашего собственного сервера, вы не получите никаких проблем с CORS.

+0

Я заслуживаю 50% от щедрости :( – Yazan

+0

О, я шутил, ты можешь вернуться, если хочешь :) и если ты его держишь, большое спасибо! – Yazan

+0

Возможно, у @MarkVeenstra у вас есть идея и для http://stackoverflow.com/questions/27526281/websockets-and-apache-proxy-how-to-configure-mod-proxy-wstunnel? Я на эту тему с тех пор ... но безуспешно – Basj

0

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

не уверен, как передать оба запроса на порт и extra_info, но идея состоит в том, чтобы установить порт.

io.connect('http://subdomain.mydomain.com/', {port: 80}) 

или это

io.connect('http://subdomain.mydomain.com:80/', {query: {extra_info : extra_info}}) 

удачи.

+0

Yazan, похоже, идет в правильном направлении. Немного странно, но добавление порта 80 в строку соединения в клиенте. Решает первый выпуск. Но я не получаю ошибку «Access-Control-Allow-Origin». Я попытался установить этот заголовок в Apache, но все еще получаю эту ошибку. Есть идеи? –

+0

Ну, это странно, хотя в ошибке все еще существует 8100, я думаю, что причиной была ошибка «Access-Control-Allow-Origin», поскольку доступ к сайту на другом порту считается другим доменом, поэтому применяется политика междоменного доступа. – Yazan

+0

У вас есть @Yazan любая идея для http://stackoverflow.com/questions/27526281/websockets-and-apache-proxy-how-to-configure-mod-proxy-wstunnel? – Basj

Смежные вопросы