読者です 読者をやめる 読者になる 読者になる

リアルタイムな掲示板で最終掲示板戦争に参戦

ちょっと前から ChatBBS というリアルタイムな掲示板を作っていて、タイミングよく Twitter で id:r7kamura最終掲示板戦争 の話を知ったので参戦することにした。

f:id:ttanimichi:20161002233503g:plain

2ch は Web1.0 の遺物

2ch は10年前の技術のまま全く進歩していない。Ajax すら使っていない、あのいかにも古臭いフォームで投稿する度にページ全体がリロードさせるのも許せないし、過去ログの dat 落ちとか意味が分からない。ひとつのスレッドに 1000 件までしか投稿できないという制限がクソで、それをユーザーがタイトルに "Part 42" みたいな通し番号を自分たちで振るという運用でカバーしている現状が残念すぎる。あんなゴミみたいなサイトが未だに相当なユーザー数を抱えているのは違和感があるし、今の技術を使えばもっと良い掲示板を作ることができるんじゃないかなと思っていた。

リアルタイムな電子掲示板

チャットと掲示板の合いの子という意味で ChatBBS という名前にした。

https://chatbbs.jp/

機能的にはまだシンプルだけど、誰かが投稿をするとリアルタイムにスレが更新される。自分の投稿も即スレに反映される。Slack がすごいなーと思っていて、今後は記事や画像のインライン展開みたいな Slack の一部の機能も参考にして機能追加していきたいなと思う。

技術的な話

Rails で作っている。リアルタイム通信には WebSocket を使っていて、WebSocket サーバーの部分は EventMachine ベースで作ったんだが、Node.js でゼロから作り直したいと思っている。Jack さんの 「Socket.IO は必要か?」または「WebSocket は通るのか?」問題について 2016 年版 を読んで、最近は Socket.IO について調べていたんだけど、WebSocket を扱う場合は Socket.IO で作るのが良さそうだと思った。Socket.IO が提供してくれる API はよく出来ているし、 Socket.IO を使わずに WebSocket で通信するアプリケーションを作る場合、結局は Socket.IO の API を再発明することになってしまうんじゃないかなと思った。

Let's Encrypt の証明書を取得して nginx を SSL 化して HTTP/2 に対応する

Ubuntu 16.04 で certbot の公式サイト を参考に Let's Encript の証明書を取得して nginx で SSL の設定をする。また、cron で証明書の更新を自動化する。ついでに HTTP/2 にも対応する。

証明書の取得

まず certbot をインストールする。

$ sudo apt-get install letsencrypt -y

証明書を取得する前に Web サーバーを止めておく。

$ sudo service nginx stop 

証明書を取得する。

$ sudo letsencrypt certonly --standalone -d ttanimichi.com -d www.ttanimichi.com

証明書と秘密鍵はそれぞれ以下の場所に配置される。

# 証明書
/etc/letsencrypt/live/ttanimichi.com/fullchain.pem
# 秘密鍵
/etc/letsencrypt/live/ttanimichi.com/privkey.pem

certbot のログは /var/log/letsencrypt/letsencrypt.log にある。

$ sudo cat /var/log/letsencrypt/letsencrypt.log

nginx の SSL 化

Let's Encrypt の証明書と秘密鍵を nginx の ssl_certificatessl_certificate_key に指定する。

# /etc/nginx/nginx.conf

    server {
        listen 443 ssl default_server;
        server_name ttanimichi.com;
        root /var/www/html/ttanimichi.com/public;

        ssl_certificate     /etc/letsencrypt/live/ttanimichi.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ttanimichi.com/privkey.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
    }

Web サーバーを起動。

$ sudo service nginx start

証明書の更新

証明書の更新は letsencrypt renew でできる。

$ sudo su
# /usr/bin/letsencrypt renew > /var/log/letsencrypt/renew.log
# exit

更新した際のログは /var/log/letsencrypt/renew.log に吐くことにした。

証明書の更新を cron で自動化する

Let's Encrypt の証明書は90日で有効期限が切れてしまうので cron で更新を自動化する。

sudo crontab -e

以下の一行を追記。

30 2 * * * /usr/bin/letsencrypt renew >> /var/log/letsencrypt/renew.log 2>&1

HTTP/2 に対応する

既に SSL 化が済んでいる場合、HTTP/2 に対応するには以下のように nginx の設定ファイルを一行書き換えるだけで良い。

- listen 443 ssl default_server;
+ listen 443 ssl http2 default_server;

Web サーバーを再起動。

$ sudo service nginx start

環境

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
$ cat /proc/version
Linux version 4.4.0-36-generic (buildd@lcy01-01) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) ) #55-Ubuntu SMP Thu Aug 11 18:01:55 UTC 2016
$ nginx -v
nginx version: nginx/1.10.1
$ sudo letsencrypt --version
letsencrypt 0.4.1