この記事は、学校の卒業研究で提出した全40ページのレポートの内容とほぼ同じです。
下準備
サーバー機の準備 Linux(CentOS7)編
#→root権限
$→一般ユーザー権限
自宅で物理PCを使って構築する場合(OSインストール)
- インストールするメディアをダウンロードする
CentOS7の場合は[https://www.centos.org/download/]にてDVDISOをクリックし最寄りのサーバーからダウンロードする
[最寄りのサーバーを探す(TukubaかRiken)] - DVD or USBに書き込む
- 起動し、インストール画面に進める
- 以下の画面が出たら、左側の言語選択で「日本語」を選び「続行」をクリックして次の画面に行く
- しばらく待って「ソフトウェアの選択」をクリックします。
- 「サーバー(GUI 使用)」を選択し、「完了」をクリックします。
- 「インストール先」をクリックし、「完了」を押します。
- 「インストールの開始」をクリックし、インストールを開始します。
- インストール開始すると一般ユーザーとrootユーザーの作成の画面が出ます。
- rootのパスワードを設定をする
- ユーザー作成をする
※「このユーザーを管理者にする」はsudoを実行する権限を持つかどうかのチェックマークです。(今回はチェックマークを入れておきます) - 両方の設定を終えたら、インストール完了するまで、待つ
- 終えたら、右下の「再起動」をクリックして再起動をする。
- 再起動後、ライセンス同意とネットワーク関連の設定を行う
- 「ネットワークとホスト」は初期だとオフになってるので、オンにする
Linux(CentOS7)の初期設定をする
- まず最初にroot権限で更新プログラムをインストールし、再起動します。
# yum update -y
# reboot - 一般ユーザーを作ります(自宅の機器で入れた場合はインストール時に作成したユーザーがある場合はしなくて良い)
#adduser ユーザー名 - 認証鍵を作成
- Tera Termで認証鍵を生成
- 立ち上げたら、「キャンセル」を押す
- 上の「設定」→「SSH鍵認証」を選択する
- 鍵生成のウインドウが出る
- 鍵の種類
RSA1:SSH1で必要になるが脆弱性あり
DSA:SSH2で使えるが短めの鍵
RSA:長くて脆弱性は今はない - 鍵のフレーズ
万が一、認証鍵が盗まれてもパスフレーズが付いているとなりすましとして使えない
推奨されているパスフレーズは以下の通り- 10~30文字程度
- 推測しやすい文章を避ける
- 大文字小文字、数字、記号を混ぜる
- 鍵の種類
- 「生成」ボタンをクリックする
- パスフレーズの設定と公開鍵・秘密鍵を保存する
- 間違えやすい事
公開鍵(.pub)→サーバーに入れる
秘密鍵→クライアントで使う
- 間違えやすい事
- 立ち上げたら、「キャンセル」を押す
- Tera Termで認証鍵を生成
- 認証鍵を一般ユーザーに導入
- 一般ユーザーの標準ディレクトリに移動します。
$ cd ~フォルダー
- 一般ユーザーの標準ディレクトリに移動します。
- 一般ユーザーの標準ディレクトリ直下に「.ssh」というディレクトリを作る
$ mkdir .ssh - 先程作ったディレクトリに移動
$ cd .ssh - 「authorized_keys」というファイルに作成・公開鍵を書き込むをする
$ vi authorized_keys - フォルダに対して所有者の全権限を付与する
$ chmod 700 ~/.ssh/ - ファイルに対して所有者の書き込み・読み込み権限を付与する
$ chmod 600 ~/.ssh/authorized_keys - ユーザーにログインできるか確認する
失敗した場合はこの工程をやり直す - SeLinuxを無効化
- vimを使う場合
#vi /etc/selinux/config
enforcingをdisabledに書き換えます。
- vimを使う場合
- Firewallを使ってマシンに対するポート開放する
- firewall-cmdを使い、publicゾーンに(–zone=public)ポート番号を例外として追加します(–add-port)。永久的に(–permanent)
# firewall-cmd –add-port=(ポート番号)/tcp –zone=public –permanent - firewall-cmdを再読み込みします。(これで追加されたポート番号の設定が反映される)
# firewall-cmd –reload
- firewall-cmdを使い、publicゾーンに(–zone=public)ポート番号を例外として追加します(–add-port)。永久的に(–permanent)
- SSHの設定を変える
- SSHのポート番号を変える(6.でポート開放必須)
#Port 22→Port (ポート番号) # #←は外す - 一般ユーザーのみにする
PermitRootLogin yes→PermitRootLogin no - SSHの設定を適用する
#systemctl restart sshd.service
の後なんにも出なければ問題ない
- SSHのポート番号を変える(6.でポート開放必須)
この時点で10ページです。
Spigotのビルド方法
Spigotとは、有志がサーバー用拡張機能を追加やパフォーマンスを調整している
java 8が必ず必要、Oracleからダウンロードする
#yum install java-1.8.0-openjdk #CentOS系ではこれで導入可
- Gitというソフトをインストール
https://git-scm.com/ でGItをダウンロードしてインストールをする。 - BuildToolsを使ってコンパイルする
自分でコンパイルしないと開発者から快く思っていません。- 「https://hub.spigotmc.org/jenkins/job/BuildTools/」で最新版をダウンロードする(最新版以外は動作しないようになっている)
- 任意のフォルダ(ディレクトリ)にBuildTools.jarを入れる
- 右クリック後「Git Bash」を選択し、「java -jar BuildTools.jar –rev <ビルドしたいバージョン>」を実行する
起動方法
WindowsでSpigotを起動する場合
Spigotと同じ階層にbatファイルを作る
LinuxでSpigotを起動する場合
screenというパッケージを利用して運用すると管理が楽です。
#apt install screen -y #ubuntu系列
#yum install screen -y #CentOS系列
Spigotと同じ階層にshファイルを作る
中継サーバー(BungeeCord)編
BungeeCordとは、Minecraft用に作られた中継サーバーでありSpigotと組み合わて使える
流れは以下の図
BungeeCordを使うメリットはMineCraftサーバーの設置場所が中間サーバーにあるように見えて、実際の設置場所がユーザーから見えなくなる特性があるため、DDoS軽減としてBungeeCord単体をクラウドに置いて、自宅にMineCraftサーバーを置くという運用ができる
問題点
- パケット関連でMinecraftで大量の処理をしたら、BungeeCordにも負荷がかかる
- BungeeCordをいっぱい増やすと設定の管理が大変になる
中継サーバー(Nginx+BungeeCord)編
NginxのTCPプロキシ機能を使い、負荷がかかる部分を変える
導入方法
- ビルドに使うDeveloper Toolsを入れる
#yum groupinstall “Development Tools” “Development Libraries” -y - GitHubからNginxをクローンしてくる
#git clone https://github.com/nginx/nginx - クローンしてきたNginxのフォルダーに入る
#cd nginx - TCP/UDPモードで動くように設定する
#./auto/configure –prefix=/usr/local/nginx –without-http_rewrite_module –without-http_gzip_module –with-stream - ビルドとインストールをする
#make && make install - systemctlのサービスを登録する
#cat >> /usr/lib/systemd/system/nginx.service <<- “EOF”[Unit]
Description=nginx – high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forkingPIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.targetEOF - Nginxの設定を変更する
#rm -f /usr/local/nginx/conf/nginx.conf#
cat >> /usr/local/nginx/conf/nginx.conf <<- “EOF”
worker_processes 1; #動かすコア数
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream mcserver {
server 転送先:ポート番号;
}
server {
listen 25565; #ポート番号
proxy_pass mcserver; #転送先のグループ
proxy_protocol on; #接続元を転送先で通知する }
}
EOF - Nginxを起動させて問題ないか確認する
#systemctl restart nginx - Nginxの自動起動を有効にする
#systemctl enable nginx - BungeeCordの「proxy protocol」を有効にする
問題点
- 接続してるときに不定期に切断される。
- 1つのポート番号で転送先のグループでしか飛ばせない(マルチドメイン運用が出来ない)
- BungeeCordでしか接続元を通知できる機能が標準搭載していない
中継サーバー(HAProxy+BungeeCord)編
HAProxyとは、多機能なプロキシサーバであり、ソフトウェアロードバランサも構築も可能である
Minecraftでは、PROXY v2を使って接続元を通知している
導入方法
- ビルドに必要なソフトウェアをインストールする
#yum install gcc pcre-static pcre-devel -y - サイトからパッケージをダウンロードする
#wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.20.tar.gz - ダウンロードしたファイルを解凍する
#tar xfvz haproxy-1.8.20.tar.gz - 解凍したディレクトリに移動する
#cd haproxy-1.8.20/ - ビルドする設定をする
#make TARGET=linux2628 - ビルドインストールする
#make install - /etcに「haproxy」というディレクトリを作る
#mkdir -p /etc/haproxy - /var/lib/に「haproxy」というディレクトリを作る
#mkdir -p /var/lib/haproxy - /var/lib/haproxyに「stats」というファイルを作成する
#touch /var/lib/haproxy/stats - /usr/sbin/haproxyに/usr/local/sbin/haproxyのリンクを作る
#ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy - ./examples/haproxy.initを/etc/init.d/haproxyにコピーする
#cp ./examples/haproxy.init /etc/init.d/haproxy - /etc/init.d/haproxyの権限を所有者全権限・他実行以外の権限を付与する
#chmod 755 /etc/init.d/haproxy - デーモンを再起動して、さっき入れたファイルを読み込ます
#systemctl daemon-reload - HAProxyの自動起動をONにする
#systemctl enable haproxy - 元にあった設定ファイルを削除する
#rm -f /etc/haproxy/haproxy.cfg - 消した設定ファイルと同名で以下の内容を書き込む
cat >> /etc/haproxy/haproxy.cfg <<- “EOF”
#———————————————————————#
Example configuration for a possible web application. See the# full configuration options online.## http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
##———————————————————————
#———————————————————————#
Global settings
#———————————————————————
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user user #一般ユーザー名
group wheel #所属してるグループ名
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
listen minecraft #待受するポートのグループ
mode tcp # MinecraftはTCP接続
bind 0.0.0.0:25565 # Minecraftポート(25565)で待ち受け
option tcplog tcp-request inspect-delay 5s # 最大5秒の遅延までOK(SSLやMTPでは必要だけどMinecraftでは要らないかもしれない)
acl test_mc_1 payload(5,18) -m sub ドメイン名 # payload(*(1.8なら4,それ以降なら5),ドメインの文字数))
tcp-request content accept if test_mc_1 # 条件一致したら受け入れる
use_backend testi_mc_app_1 if testi_mc_1 # testi_mc_app_1のバックエンドへ
backend test_mc_app_1 #転送先の設定
server test_mc_ip_1 転送先のIPorドメイン:ポート番号 send-proxy-v2 #send-proxy-v2は転送先に接続元を通知する
EOF - HAProxyサービスを再起動する
#systemctl restart haproxy - BungeeCordの「proxy protocol」を有効にする
問題点
- 現時点でSRVでの接続が出来ない(ドメインレベルでの負荷分散は出来ない)
- BungeeCordでしか接続元を通知できる機能が標準搭載していない
中継サーバー(HAProxy+Minecraft[Spigot])編
HAProxyの構築は中継サーバー(HAProxy+BungeeCord)編 手順17までは同じである。
BungeeCordではプロキシプロトコルの対応は出来ているが、Minecrftサーバーは標準では対応されてないが、拡張機能によって対応させることが可能である
Windows環境を使って拡張機能をビルドする!
開発対応のJavaを入れる
Javaは2019年4月頃の一部有料化により、昔の手順ではアカウント登録が必要になってくる為、本レポートでは、開発者向けはOpenJDKを扱う事とする
- Amazon Corretto 8のダウンロードページにアクセスし、WindowsのJDK列にある「amazon-corretto-8.2**.04.2-1-windows-x**.msi」をダウンロードする
- ダウンロードしたインストーラーを起動して、「Next」をクリックする
- 「Setup Environment」の中にある「Setup JAVA_HOME」と「Add to PATH」が以下のマークになっていれば「Next」をクリックする
- 「Install」をクリックしてインストールを開始する
- この画面出たら、JDKのインストールは完了!
総合開発ツールを入れる
※今回は、少し古いNetBeansを使用する
- 日本語版NetBeansサイトにアクセスし、「最新版(日本語版)ダウンロード」をクリックする
- リダイレクトされ、英語表記のダウンロード一覧が表示される
「Older releases」にある「Find out more」をクリックする - 「Pre-Apache NetBeans versions」にある「https://netbeans.org/downloads/8.2/」をクリックする
- 表の「Java SE」の列にあるダウンロードをクリックし、インストーラーをダウンロードする
- ダウンロードした、インストーラーを起動させ「次へ」をクリックする
- 失敗例
- 入ってないにもかかわらず「開発対応のJavaを入れる」を飛ばした場合
- インストール済みの場合はこのようなメッセージが出る
- 入ってないにもかかわらず「開発対応のJavaを入れる」を飛ばした場合
- 失敗例
- ライセンス契約に同意して、「次へ」をクリックする
- JDKのディレクトリパスを確認して「次へ」をクリックする
- 「インストール」をクリックしてインストールを開始します。
- インストール完了するまで、しばらく待つ
- インストール完了したら、「終了」をクリックして閉じます。
(チェックマークは自由)
ソースコードをビルドする
- GitHubより「SpigotProxy」のリポジトリからソースコードをダウンロードする
- Gitというソフトウェアでクローンする
$git clone https://github.com/riku6460/SpigotProxy.git - Zipでダウンロードして、解凍する
- Gitというソフトウェアでクローンする
- NetBeansを起動する
- 起動したら、左上の「ファイル」から「プロジェクトを開く」をクリックして先程ダウンロードしたフォルダを読み込ませる
- 読み込ませたプロジェクトのプロジェクト名を右クリックし、「ビルド」をクリックしてビルドを開始する
- 出力ログで「BUILD SUCCESS」と出たら成功
- ビルドで出来たJarファイルは「target」のフォルダの中に生成される
- 出来たJarを、Minecraftサーバーの「plugins」というフォルダに入れると導入完了となる。
- あとはHAProxyの転送先・ポート番号とMinecraftサーバーのポート番号に合わせると、接続元が通知され接続ができる。
問題点
- 検証したサーバーでは全て不定期に一時的にサーバーの動作が止まる症状があった
ここまで28ページです。
運用監視ができるツールを紹介・導入
Glances
Glancesとは、Pythonで作られたコマンドラインモニタリングツールです。
導入方法
- EPELリポジトリをインストールします。
#yum -y install epel-release - Pythonをインストールします。
#yum install -y python-pip –enablerepo=epel - Pythonの管理ツールで更新をします。
#pip install –upgrade pip - Glancesと前提パッケージのインストールをします。
(とても終わるまでに時間が掛かる)
#curl -4 -L http://bit.ly/glances | /bin/bash
Zabbix
Zabbixとは、web上の運用監視システムで、プロセス監視やOSの使用状態が見れてます。
また、障害検知した場合は、Slack(Discord)やEmailで通知をすることも出来ます。
導入方法
※今回はZabbix4.2を導入します。
Zabbixサーバーのインストール
- Mysqlのリポジトリを入れる
#curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash - mysqlをインストールする
#yum install MariaDB-server MariaDB-client -y - mysqlを起動させます。
#systemctl start mariadb - mysqlの自動起動を有効にします。
#systemctl enable mariadb - データベースで文字化け対策をする
vi /etc/my.cnf.d/server.cnf
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4 - mysqlの初期設定をする
#mysql_secure_installation- 「Enter current password for root」→Enterキーを押す
- 「Set root password?」→ rootのパスワードを設定しますか?:yを送信する
- 「New password」→新しいパスワード:新しいパスワードを入力する
- 「Re-enter new password」→再度、新しいパスワード:新しいパスワードを入力する
- 「Remove anonymous users?」→匿名ユーザーは削除しますか?:yを送信する
- 「Disallow root login remotely?」→rootユーザーのリモートログインを禁止しますか?:yを送信する
- 「Remove test database and access to it?」→テストデータベースを削除しますか?:yを送信する
- 「Reload privilege tables now?」→ユーザ権限テーブルを再読込しますか?:yを送信する
- Zabbixのリポジトリを入れる
#rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm - Yumパッケージのキャッシュを削除します。
#yum clean all - Zabbixサーバー(親機)・エージェント(子機)・mysqlのモジュールをインストールします。
※予めremi等でphpをインストールした場合は、競合が起きるので、一度PHPをアンイストールしてください
#yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent - mysqlにログインします。
#mysql -uroot -p - データベース名「zabbix」というデータベースを作成します。
> create database zabbix character set utf8 collate utf8_bin; - zabbixというデータベースに対して「zabbix@localhost」を作成する
> grant all privileges on zabbix.* to zabbix@localhost identified by ‘パスワード’; - mysqlから抜ける
> quit; - データベースをインポートする
#zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix - zabbixのサーバーの設定ファイルの「DBPassword」にデータベースのパスワードを記入する(DBPasswordの手前にある#を消し忘れないように)
#vi /etc/zabbix/zabbix_server.conf - 「# php_value date.timezone Europe/Riga」の下に「php_value date.timezone Asia/Tokyo」を記入して、日本標準時間で動くようにする
#vi /etc/httpd/conf.d/zabbix.conf - Zabbix関連とWebサーバーを再起動して設定ファイルを再読込させます。
#systemctl restart zabbix-server zabbix-agent httpd - Zabbix関連とWebサーバーの自動起動を有効にします。
#systemctl enable zabbix-server zabbix-agent httpd - 「http://server_ip_or_name/zabbix 」にアクセスしたら、初期設定画面が出ます。
「Next step」をクリックし、次の画面に行く - 一通り見て、NG付いてないことを確認して、「Next step」をクリックし、次の画面に行く
- WebUIのZabbixをデータベースの情報を入れて、「Next step」をクリックし、次の画面に行く
- Zabbixサーバーのサーバー名を任意にできる。「Next step」をクリックし、次の画面に行く
- 最終確認画面が出るので、間違いが無ければ、「Next step」をクリックし、次の画面に行く
- Zabbixサーバーの設定が完了しました。「Finish」をクリックし、ログイン画面に行く
- ログイン画面では、まずUsername[Admin],pasword[zabbix]を入れてログインする
- ログイン後、トップページに飛びます。そして右上の人マークをクリックします。
- Language(言語)をJPに変更し、Updateをクリックする
- 管理→ユーザーをクリックしてユーザー管理を開き「ユーザー作成」をクリックし、ユーザー作成をする
- 以下の必須項目入れてユーザー作成をする
- エイリアス:ニックネーム的なもの
- グループ:管理グループで、「Zabbix administrators」に所属させるようにする
- パスワード:パスワード
- 言語:日本語(ja_JP)にする
- 権限→ユーザーの種類を「管理者」or「特権管理者」にする
- 右上のボタンを押して、一度ログアウトして、先程作成したユーザーにログインする。
- 管理→ユーザーをクリックしてユーザー管理を開き、「Admin」と「guest」を「Disabled」グループに所属させてユーザーを無効化する
- 最低限の設定は以上
Zabbixエージェントだけをインストールする
- Zabbixのリポジトリを入れる
#rpm -Uvh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm - Yumパッケージのキャッシュを削除します。
#yum clean all - Zabbixエージェント(子機)だけ
#yum install zabbix-agent -y - /etc/zabbix/zabbix_agentd.conf
Server=(Zabbix サーバー IP)
ServerActive=(Zabbix サーバーIP)
#Hostname=[Hostname] (コメントアウトもしくはZabbixサーバーで表示するホスト名) - ポート開放する
#firewall-cmd –add-port=10050/tcp –permanent - 設定→ホストから「ホスト作成」をクリックする
- 分かりやすいホスト名・エージェントのIPを入力し、グループを選択する
- ホストのグループを選択する
- テンプレートを選択する
※追加を押さないと追加されない- グループで絞れて、「Template OS Linux」をチェック入れて選択後、追加を押して、更新を押す
- グループで絞れて、「Template OS Linux」をチェック入れて選択後、追加を押して、更新を押す
- ホストのグループを選択する
Discordで障害の検知を通知する
- 「alertscripts」のディレクトリを探す。
#grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
# Option: AlertScriptsPath#
AlertScriptsPath=${datadir}/zabbix/alertscripts
AlertScriptsPath=/usr/lib/zabbix/alertscripts
/usr/lib/zabbix/にalertscriptsというディレクトリがあると分かった - 先程見つけた、ディレクトリに移動する
#cd /usr/lib/zabbix/alertscripts - GitHubからシェルスクリプトファイルをダウンロードする
#wget https://raw.githubusercontent.com/atomy/zabbix-discord/master/discord.sh - ダウンロード完了したファイルは実行権限無いので、実行権限を付与する
#chmod a+x discord.sh - webhookのURLとZabbixのURLを書き込む(6箇所書き換える所がある)
#vi discord.sh
https://zabbix.your-domain-bleh.foo/→zabbixのURL
https://discordapp.com/api/webhooks/xxx/yyy→通知先のwebhook - 管理→メディアタイプから「メディアタイプの作成」をする
- メディアタイプで以下の内容を書き込み、「更新」をクリックし保存する。
スクリプト名:discord.sh
【パラメータ】
{ALERT.SENDTO}
{ALERT.SUBJECT}
{ALERT.MESSAGE} - 設定→アクションから「アクションの作成」をする
- アクション名と実行条件を記入し
- 実行内容は以下の画像のように設定する(「ユーザーに送信」はサウンドで鳴る)
- トリガーでアクションされたらこんな感じになります。(なお、サイトでは警報音が鳴ってます。)
大抵は、調べたら出てくるのですが、なかなか出なかったりして頻繁にする作業は、マニュアル化したりして再構築できるようにしています。
ここまでお読みいただきありがとうございます。m(_ _)m
コメント