Slide 1

Slide 1 text

VPS契約 はじめての ハトネコエ

Slide 2

Slide 2 text

きっかけ

Slide 3

Slide 3 text

VPS契約のきっかけ 「nazoさんマストドンのアカウントどこで作ったんですか?」 「自分のサーバーで」 「アイエエエエ!ジサバ!ジサバナンデ!?」 「すでにあるウェブアプリ使うだけで楽だから、サーバー立ててみるといいですよ」 なるほど……と、すぐに影響される人間なのでまずはVPSの契約をしてみるのだった…

Slide 4

Slide 4 text

このスライドの目的 ・わたしのように初めてVPS契約をしてサーバーを立ててみる人が  Webアプリケーションを動かせるまで何をすればいいのか、の説明です ・「安く済ませる」を念頭に置いているため、サーバー数1つだったりとミニマムです ・Qiitaの記事が5つくらい書けそうな分量になりました

Slide 5

Slide 5 text

-第1章 VPS契約-

Slide 6

Slide 6 text

契約すると仮想マシンを提供してくれるよ VPS: Virtual Private Server [ホスト型] ・Virtual Box (Oracle) ・VMware Workstation Player [ハイパーバイザー型] ・Hyper-V (Microsoft) ・KVM (Qumranet) [コンテナ型] ・Docker

Slide 7

Slide 7 text

仮想マシンの仕組みの種類 [ホスト型] ホストOSにVirtual Boxなどの仮想化アプリケーションをインストール <ユーザー空間> 仮想化アプリケーションの力でゲストOSを作成 [ハイパーバイザー型] ハードウェアに直接KVMなどのカーネルモジュールをインストール(実用としてはホスト OSのカーネル空間にKVMをインストール) <カーネル空間> KVMの力で、1つのハードウェアに複数のOS(ゲストOS)をインストールできる [コンテナ型] ホストOSにDockerをインストール DockerEngineがホストOSのカーネルとCPUをコンテナに提供(ゲストOSは存在しない)

Slide 8

Slide 8 text

なるほど! 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にサポート終了のためかな)

Slide 9

Slide 9 text

閑話休題 Dockerの話になってましたが…

Slide 10

Slide 10 text

ConoHaと契約したよ! 「佐倉まりな」ちゃんとじゃなくて 「美雲このは」ちゃんと契約したよ! 絶対領域には勝てなかったよ!

Slide 11

Slide 11 text

真面目な理由 ・ConoHa (GMO) ・さくらのVPS (さくらインターネット) ・ServersMan@VPS (DTI) の間で迷った。 安さは圧倒的にServersManだが、 初期OSのUbuntuに16.04が無い。 さくらは初期費用と、プランの変更が 上位プランへのみなのがネック。 また、1GBプランでのSSD容量は ConoHaの方が大きかった。 ConoHa (SSD/HDDのみ) さくら (SSD/HDDは選択可能) ServersMan (HDDのみ)

Slide 12

Slide 12 text

ちなみに…… 言語設定:日本語 でログインした場合 言語設定:このは でログインした場合 最高だな?

Slide 13

Slide 13 text

大きな欠点 契約したその時間にちょうど障害で、 管理画面からサーバー一覧が 見られず、そのためIPアドレスが 確認できないというトラブルに……。 Twitterを見たところ 「サーバーにSSH接続できない」「ConoHaの障害でうちのマストドン落ちてます」などと 阿鼻叫喚が見られたので、商用に使うのはとてもお勧めできません。さくらにしましょう。 あと、その数日後にトップページで 私が見つけてしまったもの…… → あかん。

Slide 14

Slide 14 text

-第2章 ドメイン取得-

Slide 15

Slide 15 text

ドメイン契約 Let’s Encryptを試したい場合、ドメイン認証のために必須です。 DNSの設定に慣れるためにも取得するといいでしょう。 無料で済ますのであればFreenomがお手軽です。 最長で1年契約できます。(2年以上だと$9.95/yearでした。そんなに高くない)

Slide 16

Slide 16 text

ドメイン取得代行の業者選択 今回は1年目が99円、更新920円(いずれも税別)と 一番安いプランを扱っている『お名前.com』か『ムームードメイン』で tokyoドメインを取得しようと考え、最終的に『ムームードメイン』を選択しました。 『お名前.com』を選択しなかったのは以下の理由によります。 *初年度の価格を強調し過ぎる悪意あるサイト作りなのが気に入ってない *「Whois情報公開代行」が『お名前.com』のみ有料になる場合がある  (参考: お名前.comでドメイン取得時にWhois情報公開代行を忘れると大損 ) *会社で使っていた時に管理画面が使いにくかった覚えが…… 『ムームードメイン』は同じGMO傘下ながらも以上の問題がありませんでした。 管理画面も、『お名前.com』よりは幾分かわかりやすいです。

Slide 17

Slide 17 text

DNS設定 Freenomもムームードメインもお名前.comも、ドメインを取得すると DNS(ネームサーバー)を利用できます。 一方でさくらインターネットやConoHaの契約でもDNSは付いてきます。 ムームードメインの場合のみ、DNS設定でTTLの指定ができないので ConoHaのDNSに飛ばしてあげるのがいいです。 ConoHaでサーバーを作り直したとき 新しいIPアドレスをAレコードとして振る操作を、 ConoHaの管理画面内で完結できますしね。

Slide 18

Slide 18 text

-第3章 構成管理ツール-

Slide 19

Slide 19 text

構成管理ツールどうしよう? ゲストOSを好きに調理した設定をコード化できる構成管理ツール。 サーバーの設定を手動でやるのは、二度とおこないたくないくらい面倒だと、 以前AWSをさわってた頃に学んだので導入することは決めていました。 会社ではAnsible、でもChefとかItamaeとかも いいのかもしれない、と思い見てみました。 https://www.youtube.com/watch?v=FBF6WQayhdQ&t=5m34s

Slide 20

Slide 20 text

圧倒的Ansibleだった 出典:さくらのナレッジ 導入しやすく軽量な構成管理ツール「 Itamae」を使ってみよう( http://knowledge.sakura.ad.jp/knowledge/4341/ ) もっと下に続く表なのですが、ここの部分だけで心は決まりました。 「独自」がだるい予感しかしない一方、YAMLの安心感……。 ただ、フォローしておきますと繰り返し文に関してはAnsibleは弱いです。 その点ではきっとプログラミング言語を使用しているItamaeなどの強みが出るでしょう。

Slide 21

Slide 21 text

Ansibleの設定 ここからが大変なところです……。休日の多くを費やしました。 基本的には、リモートサーバーで試したことをAnsibleの書き方に直して足していく…… を繰り返していきます。 以下が作ったroleの一部です。次のスライドから1枚で概略を書いていきます。 - apt - user - dotfiles - core - mysql - ssh - firewall

Slide 22

Slide 22 text

apt これは単純です。 apt update, apt upgrade をおこなったのち、 「build-essential」「default-jre」「default-jdk」「emacs」「vim」「zsh」「tree」を インストールし、その後、不要になった依存パッケージを削除する apt autoremove を実行しています。

Slide 23

Slide 23 text

user ログインユーザーを作成します。 ハマりどころなのが、passwordの指定では 生のパスワードを記述するのでなく、 password_hash('sha512') フィルターを付与する必要があるところです。

Slide 24

Slide 24 text

dotfiles .bash_profile , .bashrc , .inputrc , .vimrc をホームディレクトリにコピーしてきます。 個人プロジェクトだから出来る横暴ですね(笑) .bash_profile を置いていないために .bashrc がSSHログイン時に読み込まれない、 という問題でしばらく悩んでいました。 src: xyz/ と書くと、role内のfilesディレクトリ直下の xyzディレクトリをコピーしてきますが、 src: files/ と書くと、role内のfilesディレクトリ直下 すべてのファイルをコピーしてきます。 これrole内のfilesディレクトリに「files」フォルダーあったら挙動は…?

Slide 25

Slide 25 text

core デフォルトエディタをnanoからvimに変更すること、 /etc/hosts の編集、 useradd のデフォルトシェルを sh から bash に変更、をやらせています。 useradd -D でなぜか変更できなかったのでファイルを直接編集してます。

Slide 26

Slide 26 text

when: is_init_mode サーバー設置後の最初にだけおこなえばいいタスクに付けてます。 また、ansibleが接続する際のユーザー名・ポートにも利用しています。 (初回のみ22番、rootのため) コマンドに -e is_init_mode=true と付与し 変数を渡してあげることで、 同じPlaybookを使いつつも 異なる挙動をさせてあげられます。

Slide 27

Slide 27 text

mysql MySQL関連パッケージをインストールし、 rootユーザーのパスワードを変更、 メインユーザーの作成、 conf.d以下へのコンフィグファイルの設置、 などをおこなっています。 rootって名前じゃない管理者アカウント作って rootログインは禁止するとかしないとな… などと改善の余地が残っています。

Slide 28

Slide 28 text

ssh authorized_keys を $HOME/.ssh に置くのと、 SSHポート番号の変更、 rootユーザーのログイン禁止、 必要あれば sshd の再起動をおこなっていま す。

Slide 29

Slide 29 text

nginx nginxをインストールして nginxの設定ファイル置いて 各プロジェクトにvhosts設定置いて 各プロジェクトのnginx logのためのlogrotate設定を置いて、 必要あればnginxの再起動、という流れです。 言葉に直すと簡単だけど、 nginxの設定ファイルを書くなどの慣れないことだらけで ここが一番時間かかったかと思います。

Slide 30

Slide 30 text

ufw ufwをインストールし(普通プリインストールされてるけど念のため)、 80(HTTP), 443(HTTPS), SSHポート、その他必要なポートを開放します。 なお、ufwはiptablesのラッパーらしく、 試しに sudo iptables --list を叩いてみると、 ufwで設定した内容が反映されていることが 確認できました。

Slide 31

Slide 31 text

letsencrypt 便利なことに標準aptリポジトリにあるので letsencrypt パッケージをインストールします。(yumやdnfでは certbot パッケージ) 証明書保管ディレクトリに指定ホスト名のディレクトリがあるか確認し、 無いのならば certonly で作成、という流れにしています。 その後 renew をcronに登録します。 (ログ見てないのでrenew動いてないかも…) これとnginxのvhosts設定を組み合わせ、 HTTPS化がおこなえました。

Slide 32

Slide 32 text

-第4章 アプリケーション設置-

Slide 33

Slide 33 text

なにを立てよう? 長くなりましたが、ブラウザからHTTPSでnginxのデフォルトページが開けたところで、 いよいよアプリケーションを設置します。 この頃にはマストドン熱がすっかり冷めてしまっていて、 「使わないもの立ててもな……」と思ったので GitLab の設置を考えました。 ……が、こっちは挫折しました。 なるべくprojectsディレクトリ以下でファイル管理するように 設定ファイルをいじっていたのですが上手くいかず……。 代わりに GitBucket を立ち上げることにしました。

Slide 34

Slide 34 text

GitBucketとは takezoeさん制作の、 Scalaで書かれたGitHubクローンです。 当初は完璧なGitHubクローンを 謳っており、右下のようなUIでしたが GitHubから警告があり現在は AdminLTEをベースにしたデザインに 落ち着いています。 参考: GitBucketのユーザインターフェースの変更について http://takezoe.hatenablog.com/entry/2016/03/21/031733

Slide 35

Slide 35 text

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 のようです)

Slide 36

Slide 36 text

Systemd Ubuntuのサービス管理は14.04の段階ではUpstartでしたが、 移行が進み現在ではSystemdによるサービス管理が標準となりました。 (よく知らなくて最初にUpstart用ファイルを書いたのは秘密だ……) このSystemd用ファイルはもちろんユーザーも作成でき便利…… なのですが、問題点として、Systemdのログファイルはバイナリで生成され、 sudo journalctl --unit=gitbucket のように journalctl コマンドを通して見るしかなくてけっこう不便です。 Supervisorをあとで知り、ログ生成の観点ではこっちのほうがよかったなと考えてます。

Slide 37

Slide 37 text

大ハマり! 画像が表示されない! アプリケーションを起動できたところで「さて見よう」とページを表示すると、 スタイルシートや画像などのアセットが404で表示されない! location / { proxy_pass 127.0.0.1:12345; } を location ^~ / { proxy_pass 127.0.0.1:12345; } とすることで直ったものの、なんでかがわからなくて 教えてください。

Slide 38

Slide 38 text

他には…… Jenkins と Gogs も立てました。 Jenkinsは立てたけど特にやることなくて全く使ってないです。 あの使いにくいUI、なんなんでしょうね…… GogsはGoで実装されているGitHubクローンです。 とても軽量でびっくりしています。 (※右図だとJenkinsがGitBucketより軽そうですが、  動かしてないからなだけで、ちゃんとアクセスしてると  200MB以上食いますしGitBucketを超えます) GitLabは700MBくらい食うそうです。本当?! 参考:GitBucket / Gogs / Gitea / GitLab のベンチマーク on Raspberry Pi 3 http://qiita.com/kounoike/items/7c42db90c42e280e1cab

Slide 39

Slide 39 text

-第5章 サーバー監視-

Slide 40

Slide 40 text

クラウド監視サービスの選択 『モニタリングサービス(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 から利用登録するのがいいでしょう。

Slide 41

Slide 41 text

DataDogはどうだったか? とても良いです。 登録して最初に エージェントのインストール方法が 出てくるのですが、その一覧に Ansibleが含まれていて、 公式のroleを利用することで 数行でセットアップできることが わかります。

Slide 42

Slide 42 text

DataDogエージェント監視項目の設定 本来は /etc/dd-agent/conf.d ディレクトリに 設定ファイルをYAML形式で書いて 置いていくのですが、 Ansibleでの設定の場合は 1つのYAMLファイルを置けば 公式のroleが代行してくれるので 監視項目を増やすのがとても楽です。

Slide 43

Slide 43 text

Mackerelとの比較 プロセス監視など、Mackerelで同様のことをするために必要なドキュメントを 読んできた印象ですと、DataDogの方がより簡単に設定をおこなえるように感じます。 一方で、DataDog最大の問題として、 無料プランだとアラートが使えない! といういかんともしがたい問題があります。 Mackerelは無料プランだとカスタムダッシュボードが作れないし、 両者とも無料プランでは満足できないよう上手くできているなと感じます……(笑) 料金はDataDogが $15 or $18 per host、Mackerelが ¥1800 per host、 保持期間は前者15ヵ月、後者400日、DataDogはメトリクス数制限なし、 そして数多くの連携があり、DataDogがちょっと優勢でした。

Slide 44

Slide 44 text

おわりに (感想)

Slide 45

Slide 45 text

Ansibleの設定はすぐ大きくなる 会社のAnsible設定おおきいなあ、と思っていて、 「個人サーバーだからミニマムに作ろう」と思って作り始めたのですが ふつうにディレクトリ数増えていって、こうなる運命なのだな……と思いました。 https://www.youtube.com/watch?v=BF1wMoUjOj0

Slide 46

Slide 46 text

nginxすごい 今回ダッシュボードでプロセスごとのメモリ量を見ることが多かったのですが、 nginxのメモリ使用量がずーっと 5MB付近あたりでとどまっていて、 「なに食べて生きてるのこの子・・・」と思いました。 以下のページが、同時接続数を上げたときの リクエスト処理量、メモリ使用量について触れています。 『これから始める人のためのNginx(1):高速・軽量・高機能……Nginxの基礎知識』 http://www.atmarkit.co.jp/ait/articles/1406/17/news013_2.html

Slide 47

Slide 47 text

参考文献(仮想マシンの仕組みの種類) ・VPSの仕組み https://blog.arena.ne.jp/vps/646 ・エンジニアなら知っておきたい「仮想マシン」のしくみ https://www.slideshare.net/TakeshiHasegawa1/20101031bpstudy38 ・ハイパーバイザ - Wikipedia https://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

Slide 48

Slide 48 text

参考文献(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/