m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

Mojolicious+Angularjsでwebsocket2

なんかStarmanではだめのよう


今更ながら、nginx+Mojolicious+WebSocketでチャットアプリに挑戦 - 鈍足ランナーのIT日記

ここの設定をまるごと拝借して構成

上記の設定を元に設定

nginxの設定ファイル
upstream chat {
     server 127.0.0.1:8012;
}

server {
    listen 80;
    server_name dev.example.com;
    root /var/www/tools/oreoreapp/reoreotsubuyakikun/public;
    access_log  /var/log/chat.access.log  main;

    location / {
        proxy_set_header X-Forwarded-Proto "http";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://chat;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
supervisord
[program:oreoreapp]
user=root
command=/var/www/tools/oreoreapp/app.sh
autostart=true
autorestart=true
stopsignal=QUIT
/var/www/tools/oreoreapp/app.sh
#!/bin/sh

# export
export PATH="/var/www/tools/app1/local/bin:/root/.plenv/shims:/root/.plenv/bin:/root/.phpenv/shims:/root/.phpenv/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"

# app start
cd /var/www/tools/oreoreapp/reoreotsubuyakikun
exec /root/.plenv/shims/hypnotoad -f app.psgi

※なんとなくフォアグラウンドで起動
※実行権限を別途付与

アプリ側の修正として

app.conf
{
  hypnotoad => {
    listen  => ['http://*:8012'],
    workers => 1
  }
};

※アプリ用のパラメータ設定を用意して

app.psgi
use Mojolicious::Lite;
use DateTime;
use Encode;
use JSON;
use utf8;

# 設定ファイルを読み込み
my $config = plugin('Config', {file => 'app.conf'});

# 接続人数
my $clients = {};

# Template with browser-side code
get '/' => 'index';

# WebSocket echo service
websocket '/echo' => sub {
  my $c = shift;

  my $id = sprintf "%s", $c->tx;
  $clients->{$id} = $c->tx;

  # Opened
  $c->app->log->debug('WebSocket opened.');

  # Increase inactivity timeout for connection a bit
  $c->inactivity_timeout(300);

  # Incoming message
  $c->on(message => sub {
    my ($c, $msg) = @_;

    $c->app->log->debug('mesage->' . $msg);

    my $dt   = DateTime->now( time_zone => 'Asia/Tokyo');

    for (keys %$clients) {
      my $_msg = "$msg";
      $clients->{$_}->send(JSON->new->utf8(0)->encode({
        hms  => $dt->hms,
        text => $_msg,
       }));
    }

  });

  # Closed
  $c->on(finish => sub {
    my ($c, $code, $reason) = @_;
    $c->app->log->debug("WebSocket closed with status $code.");
  });
};

app->start;

※app.confを読み込み処理を追加

所感

websocketなどはStarmanではうまく動かないのでmorboなどで対応するしかない。
morboにパラメータを付与して対応することもできるけど今回はhypnotoadで対応
しかし、なんかしょーもない感じのもの作ってしまったwww

複数接続に対応しているように見せかけで実際はあまり繋がらん(´・ω・`)
実際にあげてからクライアントの状態がどうなっているか確認しよう