FFmpegとApacheによるHTTP Live Streaming配信

Cent OSのApacheのWebサーバ上でHTTP Live Streaming(HLS)配信を行う。
今回は手順簡略化のため、FFmpegによる動画コンテンツのトランスコードはWindows上で実施した。
PCブラウザはHLSをサポートしていないようなので、配信内容の確認はiOSAndroidのブラウザから実施すること。

FFMpegのインストール

  • Windows環境でのFFMpegのインストール方法は以下を参照のこと。

最新のFFMpegを導入しよう - 2008年度

動画コンテンツのトランスコード

  • Windows環境でのFFMpegによるトランスコード方法は以下を参照のこと。

blog.kokoni.jp

動画コンテンツの配信

  • ApacheのWebサーバ上でのHTTP Live Streaming配信方法は以下を参照のこと。

NginxとFFmpegを利用したHTTP Live Streaming配信 « Rest Term

ベンチャーブログ: HTTP Live Streamingを使ったサーバ構築

Ubuntu12.04におけるユーザ確認と作業ユーザ作成、インストール済みパッケージの確認

前任者からの引き継ぎが出来ず、現状を整理する羽目に。

ホスト名の確認と変更

  • 現在のホスト名を確認。
$ hostname
  • /etc/hostnameの変更。
$ sudo vi /etc/hostname
  • /etc/hostsの変更。
$ sudo vi /etc/hosts
127.0.0.1       localhost
127.0.1.1       hoge    ←新しいホスト名
  • ネットワークの再起動
$ sudo /etc/init.d/networking restart

現在のユーザ・グループの確認

  • 現在のユーザを確認。
$ sudo vi /etc/passwd
  • 現在のグループを確認。
$ sudo vi /etc/group
  • 不要なユーザを(ホームディレクトリごと)削除。
$ sudo userdel -r hoge
  • 不要なグループを削除。
$ sudo groupdel hoge

作業ユーザ作成

  • 作業グループを作成。
$ sudo groupadd -g 1234 hoge
  • 作業ユーザを作成(グループ、ホームディレクトリ、シェルも指定)。
    ※useraddを使用した場合はデフォルトでホームディレクトリや.bashrcが作成されないため、adduserを使用する。
$ sudo adduser --uid 1234 --gid 1234 --home /home/hoge --shell /bin/bash hoge
  • 作業ユーザのログインシェルを後から変更する場合は、以下の通り(例として/bin/bashを指定)。
$ sudo chsh hoge
hoge のログインシェルを変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
    ログインシェル [/bin/sh]: /bin/bash
  • 追加したユーザと作業グループの確認。
$ sudo id hoge
  • 作業ユーザをsudoグループに追加する場合は、以下のコマンドで編集。
$ sudo vigr
  • 以下のように編集。
sudo:x:**:hoge
  • 編集後、以下のメッセージが表示された場合は、grpconvで/etc/gshadowを更新。
/etc/group を変更しました。
整合性を保つために /etc/gshadow を変更する必要があるかもしれません。
その場合はコマンド 'vigr -s' を使ってください。
$ sudo grpconv
  • 作業ユーザのパスワードを設定(作業ユーザ作成時に指定している場合は不要)。
$ sudo passwd hoge

作業ユーザ用の公開鍵と秘密鍵の作成

  • 作業ユーザに変更。
$ su hoge
$ cd
$ ssh-keygen
  • 以下のメッセージに従い、各項目を入力。
    なお、ここで作成した「id_rsa」はsshでのリモートログイン時に使用するため、別マシンに保存しておく。
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa): <Enter>
Created directory '/home/hoge/.ssh'.
Enter passphrase (empty for no passphrase): <パスフレーズを入力し、Enter>
Enter same passphrase again: <パスフレーズを入力し、Enter>
Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
The key fingerprint is:
00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff hoge@hoge
The key's randomart image is:
  • 作成した.sshディレクトリに移動。
$ cd ~/.ssh
  • 以下のコマンドを実行。
$ cp -ip ./id_rsa.pub ./authorized_keys
$ chmod 600 authorized_keys

ssh の設定

  • sshd_configを編集。
$ sudo vi /etc/ssh/sshd_config
  • 以下のように編集(例)。
# rootでのログインを許可しない
PermitRootLogin no
# パスワード認証によるログインを禁止(公開鍵方式でしかログインさせない)
PasswordAuthentication no
# ログイン時の遅延を解消
GSSAPIAuthentication no
  • sshを再起動。
$ sudo /etc/init.d/ssh restart

インストール済みパッケージの確認

  • 以下のコマンドで確認。
$ dpkg -l | grep <確認したいパッケージ名>

EC2インスタンスから名前解決ができない問題

AWSのEC2インスタンス上で、名前解決ができない問題が発生。
ネットワークの設定は、以下の通り。

$ vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
TYPE=Ethernet

上記環境で外部のホスト対しpingを打つと、以下のようになる。

$ ping google.com
ping: unknown host google.com

nslookupでは、以下のようになる。

$ nslookup google.com
;; connection timed out; trying next origin
;; connection timed out; no servers could be reached

どうやら名前解決ができてないらしい。

resolv.confにGoogle Public DNSを追加してみる。

$ sudo vi /etc/resolv.conf
; generated by /sbin/dhclient-script
search ap-northeast-1.compute.internal
nameserver 172.16.0.23    ←EC2のPublicDNS
nameserver 8.8.8.8        ←Google Public DNSを追加

上記変更後、再びnslookupを実行すると、名前解決ができた。

$ nslookup google.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   google.com
Address: 216.58.220.174

EC2のPublicDNSで名前解決ができない原因は不明…。

MongoDBのユーザのパスワード変更

MongoDBインストール済みのクライアントのターミナルからMongoシェルを起動

$ mongo --host 192.168.0.*** --port 27017 --authenticationDatabase admin -u <ユーザ名> -p <パスワード> <DB名>

Andminに切り替え

> use admin
switched to db admin

パスワード変更

> db.changeUserPassword(<ユーザ名>, <変更後のパスワード>)

パスワード変更完了。

詳細は以下を参照のこと。 Change a User’s Password — MongoDB Manual 3.0.2

MongoDB接続ポートにクライアントから接続できない問題

MongoDB接続ポートに対し、クライアントから接続できない問題が発生。 原因を検証する。

以下のリンクが参考になりそう。 blog.asial.co.jp

クライアントからpingでの接続確認

  • 以下のコマンドを実行。
$ ping 192.168.0.***
  • 以下の応答が返るので、サーバと物理的には接続されている。
PING 192.168.0.*** (192.168.0.***) 56(84) bytes of data.
64 bytes from 192.168.0.***: icmp_seq=1 ttl=64 time=94.9 ms

クライアントからtelnetでの接続確認

  • 以下のコマンドを実行。
$ telnet 192.168.0.*** 27017
  • MongoDB接続ポートに接続できない。
Trying 192.168.0.***...
telnet: connect to address 192.168.0.***: Connection refused

サーバでポートの状態を確認

  • 以下のコマンドを実行。
netstat -ant | grep 27017
  • MongoDB接続ポートはLISTENになっているが、ローカル(127.0.0.1)アクセスしか受け付けていないことが判明。
tcp        0      0 127.0.0.1:27017             0.0.0.0:*                   LISTEN

mongod.confの変更

  • 調べたところ、mongod.confを変更する必要があったことが判明。
  • mongod.confの編集。
$ sudo vi /etc/mongod.conf
  • 以下のように編集。
# Listen to local interface only. Comment out to listen on all interfaces.
#bind_ip=127.0.0.1    ←コメントアウト
  • MongoDBを再起動。
$ sudo mongod -f /etc/mongod.conf --shutdown
$ sudo mongod -f /etc/mongod.conf
  • 再度、ポートの状態を確認。
netstat -ant | grep 27017
  • MongoDB接続ポートが全てのIPアドレスに対しLISTENになっている。
tcp        0      0 0.0.0.0:27017               0.0.0.0:*                   LISTEN

MongoDB接続ポートに対しクライアントから再度接続すると、無事接続に成功。

Linuxでの固定IPアドレスの設定方法

よく忘れるのでメモ。

固定IPアドレスを設定。

※再起動により初期化される

# /sbin/ifconfig eth0 192.168.1.***

固定IPアドレスを恒常的に設定。

  • 設定ファイルを編集。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
  • 以下のように編集(例)。
DEVICE=eth0                 ←デバイス名
ONBOOT=yes                  ←システム起動時の有効化・無効化設定
BOOTPROTO=none              ←固定IPの場合はstatic、IP割り当てない場合はnone、DHCPの場合はdhcp
HWADDR=XX:XX:XX:XX:XX:XX    ←MACアドレス
TYPE=Ethernet               ←インタフェースのデバイスタイプ
#DHCP_HOSTNAME=example.com  ←DHCPサーバに通知するホスト名
IPADDR=192.168.1.***        ←IPアドレス
NETMASK=255.255.255.0       ←ネットマスク
#NETADDR=192.168.1.0        ←ネットワークアドレス、通常はIPアドレスとネットマスクより自動判断
#BROADCAST=192.168.1.255    ←ブロードキャストアドレス、通常IPアドレスとネットマスクより自動判断
USERCTL=no                  ←root権限以外でデバイス制御を許可するか否か
PEERDNS=no                  ←DHCPで取得したDNSサーバのアドレスを/etc/resolv.confに反映するか否か、DHCPの場合は通常yes
GATEWAY=192.168.1.1         ←デフォルトゲートウェイのIPアドレス
IPV6INIT=no                 ←IPv6の有効化・無効化設定

Node.js0.10.25とMongoDB2.6.9を使用したサーバ環境構築

前回作成したサーバイメージに、Node.js0.10.25とMongoDB2.6.9を使用したサーバ環境を構築する。
なお、本サーバイメージはCentOS6.6のインストール直後である。

ネットワークの設定

  • ifcfgを編集。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
  • 以下のように設定(DHCP環境の場合)。
DEVICE=eth0
#HWADDR=***
TYPE=Ethernet
#UUID=***
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp

パッケージのアップデート

  • パッケージをアップデート。
# yum update

グループとユーザの追加

  • グループは以下のコマンドで追加。
# groupadd -g <GID> <グループ名>
  • ユーザは以下のコマンドで追加。
# useradd -g <グループ名> -u <UID> <ユーザ名>
  • ユーザ追加時にホームディレクトリとシェルと指定する場合は、以下のコマンドで追加。
# usermod -g <グループ名> -d <ホームディレクトリ> -s <シェル> -u <UID> <ユーザ名>
  • 追加したユーザとグループの確認。
# id <ユーザ名>
  • ユーザをwheelグループに追加する場合は、以下のコマンドで編集。
# vigr
  • 以下のように編集。
wheel:x:10:<ユーザ名>
  • パスを編集する場合、以下のように編集。
# vi /home/<ユーザ名>/.bashrc
  • 以下のように編集(例)。
PATH="$PATH":/opt/bin
  • ユーザのパスワードは、以下のコマンドで設定。
# passwd <ユーザ名>

sudoの設定

  • /etc/sudoersを編集。
visudo
  • 以下のように編集(例)。
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/opt/bin
%wheel        ALL=(ALL)       ALL

公開鍵と秘密鍵の作成

  • rootから作業ユーザに変更。
# su <ユーザ名>
$ cd
$ ssh-keygen
  • 以下のメッセージに従い、各項目を入力。
    なお、ここで作成した「id_rsa」はsshでのリモートログイン時に使用するため、別マシンに保存しておく。
Enter file in which to save the key (/home/<ユーザ名>/.ssh/id_rsa): <Enter>
Created directory '/home/<ユーザ名>/.ssh'.
Enter passphrase (empty for no passphrase): <パスフレーズを入力し、Enter>
Enter same passphrase again: <パスフレーズを入力し、Enter>
Your identification has been saved in /home/<ユーザ名>/.ssh/id_rsa.
Your public key has been saved in /home/<ユーザ名>/.ssh/id_rsa.pub.
The key fingerprint is:
00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff <ユーザ名>@<ホスト名>
The key's randomart image is:
  • 作成した.sshディレクトリに移動。
cd ~<ユーザ名>/.ssh
  • 以下のコマンドを実行。
$ cp –ip ./id_rsa.pub ./authorized_keys
$ chmod 600 authorized_keys
  • rootに変更。
$ exit

ssh の設定

  • sshd_configを編集。
# vi /etc/ssh/sshd_config
  • 以下のように編集(例)。
# rootでのログインを許可しない
PermitRootLogin no
# パスワード認証によるログインを禁止(公開鍵方式でしかログインさせない)
PasswordAuthentication no
# ログイン時の遅延を解消
GSSAPIAuthentication no

NTPの設定

  • 時刻同期デーモンを停止。
# /etc/init.d/ntpd stop
  • ntp.confを編集。
# vi /etc/ntp.conf
  • 以下のように編集。
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server -4 ntp.nict.jp
server -4 ntp.nict.jp
server -4 ntp.nict.jp
server -4 ntp.nict.jp
  • 時刻を同期。
# ntpdate ntp.nict.jp
  • 時刻同期デーモンを起動。
# /etc/init.d/ntpd start
  • 数分経ったら、以下のコマンドで時刻が同期しているかを確認。
# ntpq –p
  • 以下のようにremoteのホスト名の左横に「*」がついていたら同期完了。
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp-a2.nict.go. .NICT.           1 u   32   64  377   98.748    9.511  91.679
+ntp-b2.nict.go. .NICT.           1 u   39   64  377   93.339    5.348 283.719
+ntp-a3.nict.go. .NICT.           1 u   53   64  377   92.676    5.236 207.158
*ntp-b3.nict.go. .NICT.           1 u   30   64  377   81.482   -6.739  70.909

基本パッケージのインストール

  • yumで各パッケージをインストール。
# yum install gcc gcc-c++ make ...

追加パッケージの手動インストールの準備

  • yumを使用せずインストールする追加パッケージのため、インストール用ディレクトリを作成。
# mkdir -p /opt/build/distfiles
  • ライブラリパスの追加。
sudo sh -c "echo /opt/lib >> /etc/ld.so.conf"

MongoDBのインストール

# touch /etc/yum.repos.d/mongodb.repo
# vi /etc/yum.repos.d/mongodb.repo
  • 以下のように編集。
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
  • yumでMongoDBをインストール。
# yum install mongo-10gen mongo-10gen-server
  • yum.confを編集。
# vi /etc/yum.conf
  • yumでアップデートされないように、以下のように編集。
exclude=mongo-10gen,mongo-10gen-server

FreeType(※ImageMagickで使用)のインストール

  • 公式サイトからソースコードのアーカイブファイルをダウンロード。
# cd /opt/build/distfiles
# curl -L -O http://download.savannah.gnu.org/releases/freetype/freetype-2.4.11.tar.bz2
  • アーカイブファイルを解凍。
# cd /opt/build
# tar jxvf distfiles/freetype-2.4.11.tar.bz2
cd /opt/build/freetype-2.4.11
env CC=gcc CXX=g++ ./configure --prefix=/opt ; make
  • インストール。
# make install
  • 以下のエラーが発生した場合、internalディレクトリを手動で作成し、再度インストールする。
rmdir: failed to remove `/opt/include/freetype2/freetype/internal': そのようなファイルやディレクトリはありません
  • internalディレクトリを作成。
# mkdir /opt/include/freetype2/freetype/internal

Ghostscriptフォント(※ImageMagickで使用)のインストール

  • 公式サイトからソースコードのアーカイブファイルをダウンロード。
# cd /opt/build/distfiles
# curl -L -O http://jaist.dl.sourceforge.net/sourceforge/gs-fonts/ghostscript-fonts-std-8.11.tar.gz
  • アーカイブファイルを解凍。
# cd /opt/share
# tar zxvf /opt/build/distfiles/ghostscript-fonts-std-8.11.tar.gz

ImageMagickのインストール

# yum install ImageMagick-6.5.4.7

Node.jsのインストール

  • 公式サイトからソースコードのアーカイブファイルをダウンロード。
# cd /opt/build/distfiles
# curl -O http://nodejs.org/dist/v0.10.25/node-v0.10.25.tar.gz
  • アーカイブファイルを解凍。
# cd /opt/build
# tar zxvf distfiles/node-v0.10.25.tar.gz
# cd /opt/build/node-v0.10.25
# ./configure –prefix=/opt ; make
  • インストール。
# make install
  • rootで実行できるようにリンクを作成。
# ln -s /usr/local/bin/node /opt/bin/node
# ln -s /usr/local/bin/npm /opt/bin/npm

Node.js用パッケージのインストール

  • パッケージをローカルインストール。
# cd <サーバアプリを置くディレクトリ>
# npm install <パッケージ名>
  • パッケージをグローバルインストール。
# cd <サーバアプリを置くディレクトリ>
# npm install -g <パッケージ名>

共有ライブラリの反映

  • 以下のコマンドで反映。
# /sbin/ldconfig

IPv6の無効化

  • 設定ファイルを編集。
# vi /etc/sysconfig/network
  • 以下の行を追加。
NETWORKING_IPV6=no

ファイアウォールの設定

# vi /etc/sysconfig/iptables

サーバ再起動

  • サーバを再起動する。
# shutdown -r now