Настройка Apache для сокета.ввод-вывод и SSL / WSS

#node.js #apache #socket.io #wss #proxypass

#node.js #apache #socket.io #wss #proxypass

Вопрос:

Как следует из названия, я пытаюсь получить Apache и Socket.io (node.js ), чтобы хорошо играть, особенно на SSL. В настоящее время клиентское приложение на https://www.example.com использует сокет.ввод-вывод через SSL для подключения к серверу по [протоколу SSL]://socket.example.com/socket.io/?query_stuff *. Соединение с wss:// всегда терпит неудачу, поэтому сокет.ввод-вывод деградирует до https: //, который работает нормально. Но я хотел бы воспользоваться преимуществами протокола websocket и не полагаться на опрос через http (ы).

Linux и Apache

Версия сервера: Apache / 2.4.7 (Ubuntu)

Соответствующие моды: mod_proxy, mod_proxy_http, mod_proxy_wstunnel, mod_rewrite, mod_ssl

Iptables: я открыл порты 80, 443 и 9000.

Виртуальный хост:

Я создал виртуальный хост на *:443 с именем socket.example.com . Предполагаемая цель — отменить прокси [wss, https]://socket.example.com / чтобы указать на сокет.сервер ввода-вывода, работающий на http://localhost:9000 /. Вот оно, с удаленными посторонними битами:

 <VirtualHost *:443>
    ServerName socket.example.com
    DocumentRoot /var/www/example/socket.io/

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

    ## I have also tried the following RewriteRules: ##
    # RewriteRule /(.*)         http://localhost:9000/$1 [P,L]
    # RewriteRule /(.*)         http://localhost:9000/socket.io/$1 [P,L]

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/www.example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/keys/0001_key-certbot.pem
    SSLCACertificateFile  /etc/letsencrypt/ca-bundle.pem

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia Full

    ProxyPass / http://localhost:9000/
    ProxyPassReverse / http://localhost:9000/
</VirtualHost>
 

Успешное использование PHP websockets через SSL

Перед переключением на node.js для моего сервера websocket я использовал вышеупомянутый Apache VirtualHost для успешного маршрутизации wss://socket.example.com/ws_daemon.php чтобы ws://localhost:9000/ws_daemon.php . В этом сценарии я 1. удалил правила перезаписи и 2. изменил настройки ProxyPass на:

 ProxyPass / ws://localhost:9000/
ProxyPassReverse / ws://localhost:9000/
 

Но та же логика, похоже, не переносится на socket.io .

На данный момент у меня закончились идеи. Буду признателен за любую помощь!

Ответ №1:

Если вы используете <Location> блок, вы должны добавить к нему следующие строки:

 RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
RewriteRule /socket.io/(.*) ws://localhost:3000/socket.io/$1 [P]