以前は、いくつかのpython WebSocketソケットのリッスンと組み合わせて、HTTPサービングにApacheを使用してきましたが、ここでは明らかに機能しません。
私はいつでもwebsocketのものを別のサーバーに移動できますが、2番目のVPSにお金を払うのは避けたいです(ローカルではなくネットワーク経由でデータベースと通信する必要があります)。これを行う良い方法はありますか(nodejs、nginx、..?)、または頭痛の種ではありませんか?
別の可能性は、Apacheでmod_proxyを使用して、リクエストをWebSocketサーバーにリダイレクトすることです。
はい、 node.js を使用します。 Express または connect はHTTPファイルサービス用、 socket.io はWebSocketスタッフ用です。
例:
var express = require("express");
var app = express.createServer();
app.get('/', function(req, res){
res.redirect("/index.html");
});
app.configure(function(){
app.use(express.static(__dirname + '/public'));
});
app.listen(80);
var io = require('socket.io');
var socket = io.listen(app);
socket.on('connection', function(client){
client.on('message', function(){...});
})
もちろん、これを行うことができます。
まず、Apacheのバージョンを確認する必要があります。 2.4+バージョンが必要です。 Ubuntu 14.4で私のサーバーのコマンドを表示します。
次に、必要なApacheモジュールをオンにします。
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel
ドメインのオープン設定。私の場合はファイルへのパスでした。
/etc/Apache2/sites-available/myDomain.pl.conf
次に、このコードを追加します
<VirtualHost>
.
.
.
RewriteEngine on
RewriteCond %{QUERY_STRING} transport=polling
RewriteRule /(.*)$ http://localhost:3001/$1 [P]
ProxyRequests off
ProxyPass /socket.io ws://localhost:3001/socket.io
ProxyPassReverse /socket.io ws://localhost:3001/socket.io
ProxyPass /socket.io http://localhost:3001/socket.io
ProxyPassReverse /socket.io http://localhost:3001/socket.io
</VirtualHost>
最後にApacheを再起動します
service Apache2 restart
楽しんで!
安全なウェブソケットのために、私がしなければならないことは、これらの3行をhttps virthualhostに追加することだけでした:
<VirtualHost *:443>
[...https config...]
SSLProxyEngine On
ProxyPass "/web_socket" "wss://localhost:7300/web_socket"
ProxyPassReverse "/web_socket" "wss://localhost:7300/web_socket"
</VirtualHost>
そしてmod_proxy_wstunnel Apacheモジュールを有効にします(私はApache 2.4.10を実行しています):
a2enmod proxy_wstunnel
Javaサーバーがオプションの場合、GlassFish(およびグリズリー)は同じポートでHTTPとwebsocketsの両方のトラフィックをサポートします。