SlideShare ist ein Scribd-Unternehmen logo
1 von 14
WebSocketでリアルタイム通信
stmkza (ストーム)
WebSocketとは?
• サーバからデータを送る方法
• ブラウザプラグインがいらない
• 軽い
• HTTP使えるならポート解放などは不要
• サーバもファイアウォールの設定不要
通信の中身
• HTTPで接続する
• Upgrade: WebSocket と Connection: upgrade でプロトコル切り替え
• 使うポートは80番ポート(SSLだと443)と、変わらない
• ↑にあるようにSSL使えます
• 実際の通信を見せようと思ったけれど、うまくできませんでした。。。
今から話すこと
• C++でサーバを実装してみる には時間が足りませんでした。。。。
• 時間がなくなったのは、今週ずっと夜はプライムビデオでアニメ観てたか
らです。。。すみません m(_ _)m
• さっきのような感じで宣伝?を続ける のもネタが尽きる。。。
• 実際に使う方法を説明することにします。Socket.io使います。
• バーチャル学生LT用に作ったチャットで使っているサーバを紹介します
普通のページに使ってるもの
Socket.ioで一番基本的な構成
Socket.io
Socket.ioで一番基本的な構成
Socket.io
問題点
そのままだと同一生成元ポリシーに引っかかる
サーバの生IPを知らせる必要がある
ファイアウォールに引っかかることがある
SSL対応するにはnodeでHTTPサーバ建てる必要ある
こうすれば解決する
Socket.io
ただし、このままだと
うまく動かないので、
nginxの設定を変える
nginxの設定
• Socket.ioが使うのは /socket.io/
• HTTPバージョンを1.1に限定する
• Upgradeヘッダを通す
• Connectionヘッダに "upgrade"を設定する
upstream socketio {
server 127.0.0.1:8080;
}
server {
server_name example.com;
root /path/to/webroot;
listen 80;
index index.php;
location ^~ /socket.io/ {
proxy_pass http://socketio;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
サンプルはGistにも書きました
ln.stmkza.net/socketio
CloudFlareの対応について
• 実は結構前(2014年くらい)からWebSocketに対応していたらしいです
• Networkから設定できる(デフォルトでON?)
サンプルはGistにも書きました
ln.stmkza.net/socketio
ご静聴ありがとうございました
サンプルはGistにも書きました
ln.stmkza.net/socketio
おまけ
• GDPR関係の事情でEUからのアクセスを拒否したいときにもCloudFlareが
便利です
• Network > IP Geolocation をONにするだけで HTTPヘッダに国コードが入
ってきます。
• これを使ってnginxでアクセス拒否するようにしました
設定内容
http {
map $http_cf_ipcountry $is_eu_access {
default no;
AT yes;
BE yes;
BG yes;
HR yes;
CY yes;
CZ yes;
DK yes;
EE yes;
FI yes;
FR yes;
DE yes;
GR yes;
HU yes;
IE yes;
IT yes;
LV yes;
LT yes;
LU yes;
MT yes;
NL yes;
PL yes;
PT yes;
RO yes;
SK yes;
SI yes;
ES yes;
SE yes;
}
}
server {
# 略
if($is_eu_access = yes) {
return 403;
}
}
ln.stmkza.net/cfeu
とても長いので、Gistをご覧ください
↓にURLが書いてあります

Weitere ähnliche Inhalte

Was ist angesagt?

WSHで遊ぼう!
WSHで遊ぼう!WSHで遊ぼう!
WSHで遊ぼう!bouzuya
 
フロントエンドの人にも知ってもらいたいサーバーの話
フロントエンドの人にも知ってもらいたいサーバーの話フロントエンドの人にも知ってもらいたいサーバーの話
フロントエンドの人にも知ってもらいたいサーバーの話Hironobu Saitoh
 
モダンブラウザストレージ
モダンブラウザストレージモダンブラウザストレージ
モダンブラウザストレージKazuyuki Mori
 
HttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かHttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かShigekiYamada
 
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけクラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけHironobu Saitoh
 
Cloud Core VPSにマイクラ鯖を立てた話
Cloud Core VPSにマイクラ鯖を立てた話Cloud Core VPSにマイクラ鯖を立てた話
Cloud Core VPSにマイクラ鯖を立てた話deflis
 
Mqttの通信を見てみよう
Mqttの通信を見てみようMqttの通信を見てみよう
Mqttの通信を見てみようSuemasu Takashi
 
Capybaraで雑にWebスクレイピング
Capybaraで雑にWebスクレイピングCapybaraで雑にWebスクレイピング
Capybaraで雑にWebスクレイピングKoji Nakamura
 
Jaws三都物語 storage gateway
Jaws三都物語 storage gatewayJaws三都物語 storage gateway
Jaws三都物語 storage gatewaymamoru tateoka
 
クラウドのようなVPS 「ConoHa」 を使ってみよう。
クラウドのようなVPS 「ConoHa」 を使ってみよう。クラウドのようなVPS 「ConoHa」 を使ってみよう。
クラウドのようなVPS 「ConoHa」 を使ってみよう。Hironobu Saitoh
 
このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会
このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会
このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会ConoHa, GMO INTERNET
 
RVM with Server Environment
RVM with Server EnvironmentRVM with Server Environment
RVM with Server EnvironmentYukimitsu Izawa
 
レンタルサーバー/Vps/クラウド
レンタルサーバー/Vps/クラウドレンタルサーバー/Vps/クラウド
レンタルサーバー/Vps/クラウドNaoyuki Sano
 
BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-Misao X
 
JAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LTJAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LT三七男 山本
 
今日はMongoDBの話はしない
今日はMongoDBの話はしない今日はMongoDBの話はしない
今日はMongoDBの話はしないAkihiro Kuwano
 

Was ist angesagt? (20)

Js kusen
Js kusenJs kusen
Js kusen
 
WSHで遊ぼう!
WSHで遊ぼう!WSHで遊ぼう!
WSHで遊ぼう!
 
フロントエンドの人にも知ってもらいたいサーバーの話
フロントエンドの人にも知ってもらいたいサーバーの話フロントエンドの人にも知ってもらいたいサーバーの話
フロントエンドの人にも知ってもらいたいサーバーの話
 
モダンブラウザストレージ
モダンブラウザストレージモダンブラウザストレージ
モダンブラウザストレージ
 
HttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かHttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何か
 
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけクラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
クラウドのようなVPS 「ConoHa」 を使ってみよう +おまけ
 
Cloud Core VPSにマイクラ鯖を立てた話
Cloud Core VPSにマイクラ鯖を立てた話Cloud Core VPSにマイクラ鯖を立てた話
Cloud Core VPSにマイクラ鯖を立てた話
 
Mqttの通信を見てみよう
Mqttの通信を見てみようMqttの通信を見てみよう
Mqttの通信を見てみよう
 
Capybaraで雑にWebスクレイピング
Capybaraで雑にWebスクレイピングCapybaraで雑にWebスクレイピング
Capybaraで雑にWebスクレイピング
 
Jaws三都物語 storage gateway
Jaws三都物語 storage gatewayJaws三都物語 storage gateway
Jaws三都物語 storage gateway
 
クラウドのようなVPS 「ConoHa」 を使ってみよう。
クラウドのようなVPS 「ConoHa」 を使ってみよう。クラウドのようなVPS 「ConoHa」 を使ってみよう。
クラウドのようなVPS 「ConoHa」 を使ってみよう。
 
このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会
このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会
このべん第一回 ~ 「ConoHaってどんなVPS?」を勉強して3,000円クーポンをもらっちゃおうの会
 
RVM with Server Environment
RVM with Server EnvironmentRVM with Server Environment
RVM with Server Environment
 
レンタルサーバー/Vps/クラウド
レンタルサーバー/Vps/クラウドレンタルサーバー/Vps/クラウド
レンタルサーバー/Vps/クラウド
 
node.js
node.jsnode.js
node.js
 
BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-
 
JAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LTJAWS-UG和歌山第0回キックオフミーティング LT
JAWS-UG和歌山第0回キックオフミーティング LT
 
20120525 mt websocket
20120525 mt websocket20120525 mt websocket
20120525 mt websocket
 
今日はMongoDBの話はしない
今日はMongoDBの話はしない今日はMongoDBの話はしない
今日はMongoDBの話はしない
 
Varnish
VarnishVarnish
Varnish
 

Ähnlich wie WebSocketでリアルタイム通信 (第13回学生LT資料)

websocket-survery
websocket-surverywebsocket-survery
websocket-surveryhogemaru_
 
PIC RoR Heroku
PIC RoR HerokuPIC RoR Heroku
PIC RoR Herokumgwsuzuki
 
Ratchetでweb socketを使ってみたよ.d0131.pub
Ratchetでweb socketを使ってみたよ.d0131.pubRatchetでweb socketを使ってみたよ.d0131.pub
Ratchetでweb socketを使ってみたよ.d0131.pubt Dash
 
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.Kensaku Komatsu
 
Webページが表示されるまで
Webページが表示されるまでWebページが表示されるまで
Webページが表示されるまでMasataka Suzuki
 
20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize Tools20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize ToolsKazuki Ueki
 
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要Shumpei Shiraishi
 
今さら聞けないWebサーバの基本知識と選び方
今さら聞けないWebサーバの基本知識と選び方今さら聞けないWebサーバの基本知識と選び方
今さら聞けないWebサーバの基本知識と選び方Endoh Shingo
 
公開型CMSとしてのTrac
公開型CMSとしてのTrac公開型CMSとしてのTrac
公開型CMSとしてのTracKazuya Hirobe
 
ネットワーク超入門
ネットワーク超入門ネットワーク超入門
ネットワーク超入門xyzplus_net
 
名古屋セキュリティ勉強会LT~学内CTFの話~
名古屋セキュリティ勉強会LT~学内CTFの話~名古屋セキュリティ勉強会LT~学内CTFの話~
名古屋セキュリティ勉強会LT~学内CTFの話~kataware
 
ソフトウェア開発が好きだ
ソフトウェア開発が好きだソフトウェア開発が好きだ
ソフトウェア開発が好きだKoichi Ota
 
Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法shigeki_ohtsu
 
WebSocketを学ぼう!
WebSocketを学ぼう!WebSocketを学ぼう!
WebSocketを学ぼう!Katsuki Chousa
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうmganeko
 
はじめてのWeb of Things
はじめてのWeb of ThingsはじめてのWeb of Things
はじめてのWeb of ThingsSaki Homma
 

Ähnlich wie WebSocketでリアルタイム通信 (第13回学生LT資料) (20)

websocket-survery
websocket-surverywebsocket-survery
websocket-survery
 
PIC RoR Heroku
PIC RoR HerokuPIC RoR Heroku
PIC RoR Heroku
 
Ratchetでweb socketを使ってみたよ.d0131.pub
Ratchetでweb socketを使ってみたよ.d0131.pubRatchetでweb socketを使ってみたよ.d0131.pub
Ratchetでweb socketを使ってみたよ.d0131.pub
 
Bpstudy20180725
Bpstudy20180725Bpstudy20180725
Bpstudy20180725
 
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.
最新Web 通信系API総まくり!WebRTC, Streams, Push api etc.
 
HTTP入門
HTTP入門HTTP入門
HTTP入門
 
Webページが表示されるまで
Webページが表示されるまでWebページが表示されるまで
Webページが表示されるまで
 
20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize Tools20161208 Classmethod Codenize Tools
20161208 Classmethod Codenize Tools
 
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要
 
今さら聞けないWebサーバの基本知識と選び方
今さら聞けないWebサーバの基本知識と選び方今さら聞けないWebサーバの基本知識と選び方
今さら聞けないWebサーバの基本知識と選び方
 
公開型CMSとしてのTrac
公開型CMSとしてのTrac公開型CMSとしてのTrac
公開型CMSとしてのTrac
 
ネットワーク超入門
ネットワーク超入門ネットワーク超入門
ネットワーク超入門
 
Lt
LtLt
Lt
 
名古屋セキュリティ勉強会LT~学内CTFの話~
名古屋セキュリティ勉強会LT~学内CTFの話~名古屋セキュリティ勉強会LT~学内CTFの話~
名古屋セキュリティ勉強会LT~学内CTFの話~
 
ソフトウェア開発が好きだ
ソフトウェア開発が好きだソフトウェア開発が好きだ
ソフトウェア開発が好きだ
 
Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法Node-v0.12のTLSを256倍使いこなす方法
Node-v0.12のTLSを256倍使いこなす方法
 
WebSocketを学ぼう!
WebSocketを学ぼう!WebSocketを学ぼう!
WebSocketを学ぼう!
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
 
はじめてのWeb of Things
はじめてのWeb of ThingsはじめてのWeb of Things
はじめてのWeb of Things
 
Webページで学ぶJavaScript2013 第7回
Webページで学ぶJavaScript2013 第7回Webページで学ぶJavaScript2013 第7回
Webページで学ぶJavaScript2013 第7回
 

WebSocketでリアルタイム通信 (第13回学生LT資料)

Hinweis der Redaktion

  1. みなさん初めまして、stmkza(ストーム)です。この前の多数決?で読み方が決まったので、アイコンを"あれ"っぽくしてみました(笑) LTとかの発表をするのは初めてなんですけども、いろいろ軽く今から発表させていただきます。 よろしくお願いします。 まず、今回発表する内容なんですけれども、バーチャル学生LTの視聴ページでは実はリアルタイム通信を使ってチャットとかプレイヤー操作とかをリモートでできるようにしてあるんですけど、その時にWebSocketを使ってみたんです。 その時に色々わかったこと とかをここで話させていただければなと思います。
  2. じゃあ、まずWebSocketの特徴をざっくりと説明させていただきます。 まず、WebSocketを一言で説明すると、「サーバからデータを送る方法」です。 今まではそういうリアルタイム通信がしたかったら、ネイティブアプリ作ったりFlashとかJavaApplet使っていましたが、WebSocketはJavaScriptから直接使えるので、プラグインがいらないんです。だから、スマホとかにも対応できます。 また、サーバもクライアントも軽いんです。今まで無理やりJavaScriptで実装するとなると、1秒ごとにサーバにリクエストを送ったり、Commet使って実装していたんですが、通信量的にも、最大コネクション数とか負荷的にも全くよろしくなかったんですが、WebSocketは専用のプロトコル作っちゃったので、負荷的がかなり小さいです。 また、ブラウザがする普通の通信と同じHTTPを使っているので、普通のページが開けるのであればWebSocketも使えます。ただ、プロクシとかが対応してないこともあるので、それだけは注意です。 サーバ側も新しくポートを開ける必要はないです。Webサーバの設定をいろいろ弄るだけですぐ使えるようにできます。
  3. 具体的な通信について軽く説明しようと思うのですが、通信の手順としては、 ・まず、HTTPで普通に接続して、 ・HTTPステータスコードの101番、Switching Protocolsと、Upgradeヘッダを使ってWebSocketプロトコルに切り替えます。 ・この時でもあくまでHTTPの中でプロトコル変えているので、HTTP1.0とHTTP1.1を切り替えているのと大して違いはありません。だから使うポートは変わりません。これがさっき「ポート開放がいらない」って言った理由です。 ・また、SSLはHTTPよりも下のレイヤーで動いているので、WebSocketだからSSLが使えないってことはありません。 ・本当はここで実際の通信を見せたかったのですが、Wiresharkがちゃんと働いてくれなかったので見せることができません、すみませんでした。。。
  4. それでは今から話すことについてですが、いろいろ考えましたが、 ・C++で実際にサーバを作ろうかと思っていましたが、時間がいつの間にか無くなってて諦めました。。。 ・今週、ずっとプライムビデオでアニメ見てたからです。あれ、結構危険ですよ。やめられなくなる ・だからと言って、さっきみたいなWebSocketの宣伝?を続けるほど詳しいわけではないから、 ・実際に使う方法を説明します。Socket.io使うといい感じにできそうだったので、今回はsocket.ioを使います ・ちなみにこれはバーチャル学生LTのチャットとかで使った技術なので、何か脆弱性見つけるヒントになるかもしれません。正直怖いです。。。。
  5. 普通のPHPで作ったページはこんな感じになってます。 php-fpmで動かしたのをnginxを通して、それをさらにCloudFlareでリバースプロキシします。
  6. そして、Socket.io使うときの一番基本的な構成は、node.jsでサーバ建てて、それに直接アクセスするっていう構成です。 開発時とかに使うと手軽でいいです。 ただ、もちろん問題点があって、
  7. そのままだとポートが違うので同一性制限ポリシーに引っかかります。node.jsでプレイヤーページも動かせばいいはずですが、同時アクセスとか負荷的に耐えれるか自信がないので、正直CloudFlareとnginxを通したいです。。。あ、でもこれは全く調べてないので、もしかしたら大丈夫かもしれません。ここにいるnoderの皆さんすみません m(_ _)m あとは、サーバの生IPでアクセスするとなると、SSHポートへのアタックとかDDoSが怖いのであまりやりたくないです。一応SSHポート変えて公開鍵認証にしてるけど怖いですw あとは、すでに80番ポート使ってるので他のポート使う必要あるんですが、そしたらファイアウォールに引っかかる環境からアクセスしてる時に使えないので、そこもまずい気がします。 さらに、SSLに対応させるにはSocket.io単体だと無理で、HTTPモジュール使ってサーバ作ってそれに紐づける必要があるらしいです。
  8. 自分的にはこのような感じで、さっきのPHPをnode.jsに変えたような構成にしたいので、これを目指して設定します。
  9. ただ、実際に試してみたらうまく動かなかったので、nginxの設定を変えました。
  10. こんな感じに設定したのですが、右のサンプルはGistにもあげたのでそちらを見てくれたらいいかと思います。QRコードはちょっとしばらく表示しておきます。 設定の大体の内容としては、 ・Socket.ioが使う /socket.io/に対して、 ・HTTP1.1を使わせて、 ・Upgradeヘッダをつけて、 ・Connection: upgradeを設定する っていうことをしました。Upgradeヘッダがnginxを通ると消えてしまうっぽかったので、このような設定が必要です。
  11. ちなみにCloudFlareはWebSocketに2014年くらいから対応していて、設定画面からWebSocketをONにできますが、デフォルトでONな気がして、この設定の必要性がよくわかりません。。。 Networkから設定できますが、プランによって最大接続数が違うっぽいです。 Freeプランだと"Hobby or demonstration site"って書いてあるんですが、具体的な制限値は見つけれませんでした。
  12. ということで、ご静聴ありがとうございました。
  13. おまけで、CloudFlareを使っているなら国の判別が簡単にできて、HTTPヘッダに CF-IPCountryとして国コードが追加されます。 これを使って、EUからのアクセスを拒否できます。「IP/Country Block」っていうアクセス元(もと)の国を拒否する設定は、月20ドルのProプラン以上じゃないと使えませんが、この機能を使うことでFreeプランでもそのような設定ができます。
  14. 具体的な設定内容ですが、EUに加盟してる国が多すぎるので、これもまたGistにあげました。ぜひご覧ください。 それではご静聴ありがとうございました。