#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]