FFmpegとApacheによるHTTP Live Streaming配信
Cent OSのApacheのWebサーバ上でHTTP Live Streaming(HLS)配信を行う。
今回は手順簡略化のため、FFmpegによる動画コンテンツのトランスコードはWindows上で実施した。
PCブラウザはHLSをサポートしていないようなので、配信内容の確認はiOSやAndroidのブラウザから実施すること。
FFMpegのインストール
動画コンテンツのトランスコード
動画コンテンツの配信
- ApacheのWebサーバ上での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
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
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で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
ファイアウォールの設定
- iptablesを任意に編集。
# vi /etc/sysconfig/iptables
サーバ再起動
- サーバを再起動する。
# shutdown -r now