ゴールデンウィーク明け(2017/5/8)にあった社内勉強会の資料。 けっこうな分量書いたのでせっかくだからアップロード! はじめてのVPS契約のご参考に。
VPS契約はじめてのハトネコエ
View Slide
きっかけ
VPS契約のきっかけ「nazoさんマストドンのアカウントどこで作ったんですか?」「自分のサーバーで」「アイエエエエ!ジサバ!ジサバナンデ!?」「すでにあるウェブアプリ使うだけで楽だから、サーバー立ててみるといいですよ」なるほど……と、すぐに影響される人間なのでまずはVPSの契約をしてみるのだった…
このスライドの目的・わたしのように初めてVPS契約をしてサーバーを立ててみる人が Webアプリケーションを動かせるまで何をすればいいのか、の説明です・「安く済ませる」を念頭に置いているため、サーバー数1つだったりとミニマムです・Qiitaの記事が5つくらい書けそうな分量になりました
-第1章 VPS契約-
契約すると仮想マシンを提供してくれるよVPS: Virtual Private Server[ホスト型]・Virtual Box (Oracle)・VMware Workstation Player[ハイパーバイザー型]・Hyper-V (Microsoft)・KVM (Qumranet)[コンテナ型]・Docker
仮想マシンの仕組みの種類[ホスト型]ホストOSにVirtual Boxなどの仮想化アプリケーションをインストール <ユーザー空間>仮想化アプリケーションの力でゲストOSを作成[ハイパーバイザー型]ハードウェアに直接KVMなどのカーネルモジュールをインストール(実用としてはホストOSのカーネル空間にKVMをインストール) <カーネル空間>KVMの力で、1つのハードウェアに複数のOS(ゲストOS)をインストールできる[コンテナ型]ホストOSにDockerをインストールDockerEngineがホストOSのカーネルとCPUをコンテナに提供(ゲストOSは存在しない)
なるほど!WindowsでDockerを使ってLinuxを動かすのはこのコンテナ型の仕組み上、OSカーネルが異なるので無理だから、Virtual Boxのインストールが必要だったんだ!そして、2017/3/2にリリースされたDocker CE for Windowsではホスト型のVirtual Boxを使用することをやめ、ハイパーバイザー型であるHyper-Vを使うことでパフォーマンスを高めたと!……しかしHyper-V拡張セッションはWindows 8.1 Proからの導入のため、Docker CE for Windowsの必須環境は Windows10 Pro / Enterprise というなかなか限定された環境にw(Windows 8.1が見捨てられてるのは2018/1/9にサポート終了のためかな)
閑話休題Dockerの話になってましたが…
ConoHaと契約したよ!「佐倉まりな」ちゃんとじゃなくて「美雲このは」ちゃんと契約したよ!絶対領域には勝てなかったよ!
真面目な理由・ConoHa (GMO)・さくらのVPS (さくらインターネット)・ServersMan@VPS (DTI)の間で迷った。安さは圧倒的にServersManだが、初期OSのUbuntuに16.04が無い。さくらは初期費用と、プランの変更が上位プランへのみなのがネック。また、1GBプランでのSSD容量はConoHaの方が大きかった。ConoHa(SSD/HDDのみ)さくら(SSD/HDDは選択可能)ServersMan(HDDのみ)
ちなみに……言語設定:日本語でログインした場合言語設定:このはでログインした場合最高だな?
大きな欠点契約したその時間にちょうど障害で、管理画面からサーバー一覧が見られず、そのためIPアドレスが確認できないというトラブルに……。Twitterを見たところ「サーバーにSSH接続できない」「ConoHaの障害でうちのマストドン落ちてます」などと阿鼻叫喚が見られたので、商用に使うのはとてもお勧めできません。さくらにしましょう。あと、その数日後にトップページで私が見つけてしまったもの…… →あかん。
-第2章 ドメイン取得-
ドメイン契約Let’s Encryptを試したい場合、ドメイン認証のために必須です。DNSの設定に慣れるためにも取得するといいでしょう。無料で済ますのであればFreenomがお手軽です。最長で1年契約できます。(2年以上だと$9.95/yearでした。そんなに高くない)
ドメイン取得代行の業者選択今回は1年目が99円、更新920円(いずれも税別)と一番安いプランを扱っている『お名前.com』か『ムームードメイン』でtokyoドメインを取得しようと考え、最終的に『ムームードメイン』を選択しました。『お名前.com』を選択しなかったのは以下の理由によります。*初年度の価格を強調し過ぎる悪意あるサイト作りなのが気に入ってない*「Whois情報公開代行」が『お名前.com』のみ有料になる場合がある (参考: お名前.comでドメイン取得時にWhois情報公開代行を忘れると大損 )*会社で使っていた時に管理画面が使いにくかった覚えが……『ムームードメイン』は同じGMO傘下ながらも以上の問題がありませんでした。管理画面も、『お名前.com』よりは幾分かわかりやすいです。
DNS設定Freenomもムームードメインもお名前.comも、ドメインを取得するとDNS(ネームサーバー)を利用できます。一方でさくらインターネットやConoHaの契約でもDNSは付いてきます。ムームードメインの場合のみ、DNS設定でTTLの指定ができないのでConoHaのDNSに飛ばしてあげるのがいいです。ConoHaでサーバーを作り直したとき新しいIPアドレスをAレコードとして振る操作を、ConoHaの管理画面内で完結できますしね。
-第3章 構成管理ツール-
構成管理ツールどうしよう?ゲストOSを好きに調理した設定をコード化できる構成管理ツール。サーバーの設定を手動でやるのは、二度とおこないたくないくらい面倒だと、以前AWSをさわってた頃に学んだので導入することは決めていました。会社ではAnsible、でもChefとかItamaeとかもいいのかもしれない、と思い見てみました。https://www.youtube.com/watch?v=FBF6WQayhdQ&t=5m34s
圧倒的Ansibleだった出典:さくらのナレッジ 導入しやすく軽量な構成管理ツール「Itamae」を使ってみよう( http://knowledge.sakura.ad.jp/knowledge/4341/ )もっと下に続く表なのですが、ここの部分だけで心は決まりました。「独自」がだるい予感しかしない一方、YAMLの安心感……。ただ、フォローしておきますと繰り返し文に関してはAnsibleは弱いです。その点ではきっとプログラミング言語を使用しているItamaeなどの強みが出るでしょう。
Ansibleの設定ここからが大変なところです……。休日の多くを費やしました。基本的には、リモートサーバーで試したことをAnsibleの書き方に直して足していく……を繰り返していきます。以下が作ったroleの一部です。次のスライドから1枚で概略を書いていきます。- apt- user- dotfiles- core- mysql- ssh- firewall
aptこれは単純です。apt update, apt upgrade をおこなったのち、「build-essential」「default-jre」「default-jdk」「emacs」「vim」「zsh」「tree」をインストールし、その後、不要になった依存パッケージを削除するapt autoremove を実行しています。
userログインユーザーを作成します。ハマりどころなのが、passwordの指定では生のパスワードを記述するのでなく、password_hash('sha512') フィルターを付与する必要があるところです。
dotfiles.bash_profile , .bashrc , .inputrc , .vimrc をホームディレクトリにコピーしてきます。個人プロジェクトだから出来る横暴ですね(笑).bash_profile を置いていないために .bashrc がSSHログイン時に読み込まれない、という問題でしばらく悩んでいました。src: xyz/ と書くと、role内のfilesディレクトリ直下のxyzディレクトリをコピーしてきますが、src: files/ と書くと、role内のfilesディレクトリ直下すべてのファイルをコピーしてきます。これrole内のfilesディレクトリに「files」フォルダーあったら挙動は…?
coreデフォルトエディタをnanoからvimに変更すること、/etc/hosts の編集、useradd のデフォルトシェルを sh から bash に変更、をやらせています。useradd -D でなぜか変更できなかったのでファイルを直接編集してます。
when: is_init_modeサーバー設置後の最初にだけおこなえばいいタスクに付けてます。また、ansibleが接続する際のユーザー名・ポートにも利用しています。(初回のみ22番、rootのため)コマンドに -e is_init_mode=true と付与し変数を渡してあげることで、同じPlaybookを使いつつも異なる挙動をさせてあげられます。
mysqlMySQL関連パッケージをインストールし、rootユーザーのパスワードを変更、メインユーザーの作成、conf.d以下へのコンフィグファイルの設置、などをおこなっています。rootって名前じゃない管理者アカウント作ってrootログインは禁止するとかしないとな…などと改善の余地が残っています。
sshauthorized_keys を $HOME/.ssh に置くのと、SSHポート番号の変更、rootユーザーのログイン禁止、必要あれば sshd の再起動をおこなっています。
nginxnginxをインストールしてnginxの設定ファイル置いて各プロジェクトにvhosts設定置いて各プロジェクトのnginx logのためのlogrotate設定を置いて、必要あればnginxの再起動、という流れです。言葉に直すと簡単だけど、nginxの設定ファイルを書くなどの慣れないことだらけでここが一番時間かかったかと思います。
ufwufwをインストールし(普通プリインストールされてるけど念のため)、80(HTTP), 443(HTTPS), SSHポート、その他必要なポートを開放します。なお、ufwはiptablesのラッパーらしく、試しに sudo iptables --list を叩いてみると、ufwで設定した内容が反映されていることが確認できました。
letsencrypt便利なことに標準aptリポジトリにあるのでletsencrypt パッケージをインストールします。(yumやdnfでは certbot パッケージ)証明書保管ディレクトリに指定ホスト名のディレクトリがあるか確認し、無いのならば certonly で作成、という流れにしています。その後 renew をcronに登録します。(ログ見てないのでrenew動いてないかも…)これとnginxのvhosts設定を組み合わせ、HTTPS化がおこなえました。
-第4章 アプリケーション設置-
なにを立てよう?長くなりましたが、ブラウザからHTTPSでnginxのデフォルトページが開けたところで、いよいよアプリケーションを設置します。この頃にはマストドン熱がすっかり冷めてしまっていて、「使わないもの立ててもな……」と思ったので GitLab の設置を考えました。……が、こっちは挫折しました。なるべくprojectsディレクトリ以下でファイル管理するように設定ファイルをいじっていたのですが上手くいかず……。代わりに GitBucket を立ち上げることにしました。
GitBucketとはtakezoeさん制作の、Scalaで書かれたGitHubクローンです。当初は完璧なGitHubクローンを謳っており、右下のようなUIでしたがGitHubから警告があり現在はAdminLTEをベースにしたデザインに落ち着いています。参考: GitBucketのユーザインターフェースの変更についてhttp://takezoe.hatenablog.com/entry/2016/03/21/031733
GitBucketの動かし方gitbucket.war をダウンロードしてきてあとはjava -jar gitbucket.war --port=12345 --gitbucket.home=/path/to/projectを実行するだけです。簡単に環境を汚染することなく実行できるので楽です。Tomcat や Jetty で gitbucket.war を管理する方法もありましたが、それらの設定をするのが面倒だったので単純にSystemd用ファイルを書いてサービス化させることにしました。(なお、 java -jar gitbucket.war で起動したときのJavaServletは コード見た感じだと Jetty のようです)
SystemdUbuntuのサービス管理は14.04の段階ではUpstartでしたが、移行が進み現在ではSystemdによるサービス管理が標準となりました。(よく知らなくて最初にUpstart用ファイルを書いたのは秘密だ……)このSystemd用ファイルはもちろんユーザーも作成でき便利……なのですが、問題点として、Systemdのログファイルはバイナリで生成され、sudo journalctl --unit=gitbucketのように journalctl コマンドを通して見るしかなくてけっこう不便です。Supervisorをあとで知り、ログ生成の観点ではこっちのほうがよかったなと考えてます。
大ハマり! 画像が表示されない!アプリケーションを起動できたところで「さて見よう」とページを表示すると、スタイルシートや画像などのアセットが404で表示されない!location / {proxy_pass 127.0.0.1:12345;}をlocation ^~ / {proxy_pass 127.0.0.1:12345;}とすることで直ったものの、なんでかがわからなくて教えてください。
他には……Jenkins と Gogs も立てました。Jenkinsは立てたけど特にやることなくて全く使ってないです。あの使いにくいUI、なんなんでしょうね……GogsはGoで実装されているGitHubクローンです。とても軽量でびっくりしています。(※右図だとJenkinsがGitBucketより軽そうですが、 動かしてないからなだけで、ちゃんとアクセスしてると 200MB以上食いますしGitBucketを超えます)GitLabは700MBくらい食うそうです。本当?!参考:GitBucket / Gogs / Gitea / GitLab のベンチマーク on Raspberry Pi 3http://qiita.com/kounoike/items/7c42db90c42e280e1cab
-第5章 サーバー監視-
クラウド監視サービスの選択『モニタリングサービス(Mackerel、Datadog、New Relic)入門!』( http://qiita.com/uzresk/items/fa58720acbe7672607c9 )を参考に見比べたところ、どれも良さそうでしたので、会社ではMackerelを使っているからDataDogを使ってみようと軽い気持ちで選択しました。New Relicは値段が高いイメージが頭についてたため無料プランが無いとそのときは勘違いしていました。LITEプランがありますし、AWS利用者向けにはSTANDARDプランがあるようですね。三社の中だとNew Relic STANDARDプランがデータ保持期間1週間と、他の社の無料プランが1日であることに比べて充分長いですので、AWS利用者はhttps://newrelic.com/partner/aws から利用登録するのがいいでしょう。
DataDogはどうだったか?とても良いです。登録して最初にエージェントのインストール方法が出てくるのですが、その一覧にAnsibleが含まれていて、公式のroleを利用することで数行でセットアップできることがわかります。
DataDogエージェント監視項目の設定本来は /etc/dd-agent/conf.d ディレクトリに設定ファイルをYAML形式で書いて置いていくのですが、Ansibleでの設定の場合は1つのYAMLファイルを置けば公式のroleが代行してくれるので監視項目を増やすのがとても楽です。
Mackerelとの比較プロセス監視など、Mackerelで同様のことをするために必要なドキュメントを読んできた印象ですと、DataDogの方がより簡単に設定をおこなえるように感じます。一方で、DataDog最大の問題として、無料プランだとアラートが使えない! といういかんともしがたい問題があります。Mackerelは無料プランだとカスタムダッシュボードが作れないし、両者とも無料プランでは満足できないよう上手くできているなと感じます……(笑)料金はDataDogが $15 or $18 per host、Mackerelが ¥1800 per host、保持期間は前者15ヵ月、後者400日、DataDogはメトリクス数制限なし、そして数多くの連携があり、DataDogがちょっと優勢でした。
おわりに(感想)
Ansibleの設定はすぐ大きくなる会社のAnsible設定おおきいなあ、と思っていて、「個人サーバーだからミニマムに作ろう」と思って作り始めたのですがふつうにディレクトリ数増えていって、こうなる運命なのだな……と思いました。https://www.youtube.com/watch?v=BF1wMoUjOj0
nginxすごい今回ダッシュボードでプロセスごとのメモリ量を見ることが多かったのですが、nginxのメモリ使用量がずーっと 5MB付近あたりでとどまっていて、「なに食べて生きてるのこの子・・・」と思いました。以下のページが、同時接続数を上げたときのリクエスト処理量、メモリ使用量について触れています。『これから始める人のためのNginx(1):高速・軽量・高機能……Nginxの基礎知識』http://www.atmarkit.co.jp/ait/articles/1406/17/news013_2.html
参考文献(仮想マシンの仕組みの種類)・VPSの仕組み https://blog.arena.ne.jp/vps/646・エンジニアなら知っておきたい「仮想マシン」のしくみ https://www.slideshare.net/TakeshiHasegawa1/20101031bpstudy38・ハイパーバイザ - Wikipediahttps://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6・Hyper-V - Wikipedia https://ja.wikipedia.org/wiki/Hyper-V・Linuxキーワード - カーネル・モジュール http://itpro.nikkeibp.co.jp/article/Keyword/20081107/318745/・Linux標準の仮想化技術「KVM」の仕組み http://www.atmarkit.co.jp/ait/articles/0903/12/news120.html・KVMの仕組み - Qiita http://qiita.com/saikoro-steak/items/05c88fdc385712ccce89・30分で仮想サーバ(KVMホスト)環境を構築する https://www.agilegroup.co.jp/technote/kvm-server.html・【仮想化】KVMとqemuとlibvirtの違い・関係 – ZacoDesign http://zacodesign.net/blog/?p=1393・Tech Basics/Keyword:Docker http://www.atmarkit.co.jp/ait/articles/1407/14/news122.html・Dockerを使ってみる必要が出てきた http://usado.jp/spdsk/2016/09/02/post-593/・How is this possible? CentOS container on Ubuntu (newbie question)https://forums.docker.com/t/how-is-this-possible-centos-container-on-ubuntu-newbie-question/21558
参考文献(Docker CE for Windows)・無償の「Docker for Windows」で手軽にLinuxコンテナを利用するhttp://www.atmarkit.co.jp/ait/articles/1609/01/news053.html・「Windows Serverコンテナ」「Hyper-Vコンテナ」「Linuxコンテナ」「Docker」の違いとは?http://www.atmarkit.co.jp/ait/articles/1611/04/news028.html・【追記】Windows 8.1のメリットは、Hyper-V 拡張セッション http://pcmanabu.com/windows-8-1-hyper-v/・Windows 10で様々なOSを楽しむ【Hyper-V】http://pcmanabu.com/windows-10%E3%81%A7%E6%A7%98%E3%80%85%E3%81%AAos%E3%82%92%E6%A5%BD%E3%81%97%E3%82%80%E3%80%90hyper-v%E3%80%91/