Linux環境へWebアプリケーションをデプロイしてみた

#はじめに
Spring+Java8と、MySQLを使ったwebアプリケーションを作ったが、ローカルでした動かしたことがなかった。
またLinux初心者でもあり、Linux環境へ手動でデプロイすることで、 実際のWebアプリケーションがどう動いているかを学んでみたかった。

#学習の目的
〜こんなことを学習したかった！〜

- ローカル開発環境として定番の『Linux』に慣れたい（コマンド操作、ディレクトリ構造、仮想環境など）
- デプロイ作業を自力で行うことで、サーバーでWebアプリケーションがどのように動いているか知りたい


#使用したツール・環境等
###ホスト側

- Windows10
- VirtualBox（仮想環境構築ツール）
- Vagrant（VirtualBox補助ツール）
- WindowsPowerShell（VirtualBox + Vagrant の起動）
- PuTTY（仮想環境のCentOSへのアクセスに使用）
- CyberDuck（ファイル転送ツール）
- Eclipse（作成したアプリケーションをwarファイルにエクスポート）

###ゲスト側（仮想環境）

- CentOS 6.8
- Tomcat 8.5.2
- MySQL 5.8x


##システムの全体像とゴールイメージ
###ゴール：ホストのブラウザからアプリにアクセスし、操作ができること
もう少し具体的に→「192.168.33.10:8080/アプリの名前」を叩くとアプリのインデックスページ（"/index" or "/"）にアクセスができること

＜システムの全体像＞
![linux_deploy1.jpg](https://qiita-image-store.s3.amazonaws.com/0/197517/8fce4815-c996-6dcf-02fe-f55e18fac2e7.jpeg)

#構築手順の振り返り
- ローカル仮想開発環境の構築
    - インストール作業
        - VirtualBox
        - Vagrant
        - PuTTY
- アプリケーション起動に必要なミドルウェアの準備
    - インストール作業（wgetとyumの使い分けに注意）
        - Java8
        - Tomcat
        - MySQL
    - デプロイ
        - tomcat編
            - Eclipseからプロジェクトのwarファイルを作成
            - warファイルをtomcat配下に設置
            - tomcat再起動〜アプリケーションマネージャでの起動確認
        - MySQL編
            - 管理者ユーザーデータを準備
    - 起動確認
        - ブラウザからのアクセス

# 反省
###所感
ぶっちゃけ得るものは多かった。
現場ではLinux環境で開発するのもままあるので、操作を覚えていて損はない。汎用性高し。
欲を言えば、追加でGit操作とか覚えられると後々便利。
###仮想環境はGUI or CLI ?
どっちでも良い。
私はCLI環境でやったが、これだと強制的にコマンド操作をしなければならないので、覚えられる反面Linuxのディレクトリ構造を知らないと色々詰まる。
個人的にはGUI環境で基本ターミナル操作・詰まった時にエクスプローラーを使用することで、ディレクトリイメージを掴む良い訓練になると思う。
###今回使用しなかったApache
今回はTomcatの簡易的なアプリケーションサーバー機能を使用した。一般的な役割は以下に示す通り、Apacheで起動するのがもっと学ぶことは多いと思う。

- Tomcat：サーブレットコンテナ
- Apache：アプリケーションサーバー

※参考：『ApacheとTomcat』https://qiita.com/yuji38kwmt/items/267d4ce618e80785f03d

###MySQLも別仮想環境に用意すべきか
一般的なWebアプリケーションは「クライアントサーバー形態」を取ることが多く、同じ環境にAPとDBが乗ることは殆ど無い。なので、現場を意識するなら仮想環境は別に用意したほうが良いだろう。Linux初心者である私は、Portとか考えるのが面倒と思ったので同一の環境で行った。


#おまけ1：学んだこと
###全体を通して
- Linuxへの恐怖がなくなった
- Windowsを使っていた時と同様のスピード感でCLIのLinuxを操作できるようになった
- ディレクトリやファイルの移動・作成、インストール等WebアプリケーションがLinuxの環境で動作する工程と仕組みをざっくりと理解した
    - 実際にはJenkins等のCIツールが自動でやってくれるので、こんな泥臭いことをする必要はないが

###Linux編
- Tab補完
    - コマンドラインでTabを押すとコマンド、ファイル名、ディレクトリ名などなど自動で補完してくれる。仮に一つに定まらなくても、連打するとサジェストしてくれるので、そこから必要なものをコピーすれば良い。Tabを打つ癖をつけるとコマンド操作がとても早くなるので、是非覚えてほしい
- vimの基本操作
    - vi 〇〇でファイルを作って、:wqで上書き保存して終了。困ったらesc連打。
コマンドラインからGitを使うときはcommitコメントはviかemacsだったりするし、何より突然のエディタ起動に怯えることがなくなって良い


#おまけ2：詰まったこと
###全体を通して
- Linux初心者にとっては、CLIでは何が原因なのか全く検討がつかなかった。

###Tomcat編
- Linuxのtomcatユーザー作成後、通常ユーザーで今までできたアクセスができなくなる
    - 【解決方法】通常のユーザーのパーミッションを上書きしてしまった。パーミッションを上書きし直した→http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230728/

- tomcatアプリケーションマネージャにおいて、起動エラーが出る
    - 【解決方法】tomcatのログを確認することで、起動失敗の原因を特定（Eclipseでいうコンソールに該当）

###起動確認編
- 一部のページにアクセスができない
    - 【解決方法】コントローラーのリクエスト処理におけるパスが一部絶対参照になっていたため、相対参照に修正。
- Tomcatでのアプリ起動は複数できるので、最初のパスは『192.168.33.10:8080/プロジェクト名/index』となる。
- Windows上で開発を行っていた際の最初のパスは『localhost:8080/index』だったので、絶対参照でも相対参照でも構わずミスに気づくことができなかった。


#おまけ3：学習すれば良かったこと
###アプリケーションごとに作成するLinuxユーザーの仕組み
tomcatやMySQLなどインストールごとに専用ユーザーを作るが、よくわからんないエラーを適当は方法で解決してしまったので、きちんと理解すればよかったと後悔


#参考文献
###書籍
『新しいLinuxの教科書』：https://www.amazon.co.jp/dp/4797380942
###Webサイト
ドットインストール『ローカル開発環境の構築 [Windows編] 』：https://dotinstall.com/lessons/basic_localdev_win_v2
Vagrant + VirtualBoxでWindows上に開発環境をサクッと構築する
CentOSにTomcatをインストールする：https://qiita.com/yukihigasi/items/f477e021cd909bfcde3e
https://qiita.com/nyantera/items/4bf29ca6f11bc797a9cb