いわゆるLAMP的な環境を構築し、自前のJavaEEアプリをビルド&デプロイする、という特に真新しくもなんともないけどせっかく試したのでその手順を残してみた。
主な対象読者は、「Eclipse上でサーバサイドJavaの簡単なアプリを作れるようになってEclipseからの実行で内部でTomcat起動して動きを確認くらいはできるけど、そのソースをLinuxでビルドしたり、Linuxサーバ上で動作させるにはどうするんだろう」という方で、初心者向けの内容。
ここではWindows10上のVirtualBoxにUbuntu 18.04のVMを作り、そのVM上でビルドもデプロイも行う、という構成。
ビルド・APサーバ(Tomcat)・DBサーバ(MySQL)をすべて同じVM上で行っているが、もちろん分けても構わない。
- 使用するwebアプリ: zaki-lknr/javaee-memoapp2: JavaEE + MySQL習作
- 説明:
 
- 構成
- サーバ: Ubuntu 18.04
- Ubuntu 18.04(on VirtualBox) ホストOSからの通信
- VMからのインターネット接続とホストOS間通信を両立させるため、NICを2つ使う構成とする
 
- AP: Tomcat 8(apt)
- DB: MySQL 5.7(apt)
 
- サーバ: Ubuntu 18.04
Ubuntuのセットアップ
VirtualBoxで適当に…ホストOSのスペック次第でメモリは増やしてもよい。
インストールに使うイメージはUbuntu 18.04.1 LTS (Bionic Beaver)の64-bit PC (AMD64) server install imageを使用。
また、起動(OSインストール)の前に、ホストOSと通信するためにNICの追加を行う
VMを起動してOSインストール
ネットワーク設定
DHCP設定のenp0s3でDNS設定する構成であれば、こっちは空欄で進める。
Default G/Wについても、インターネットに出ていくenp0s3が(DHCPで)設定されるのであれば、ホストと直接通信するenp0s8は空欄。
ミラーサーバ
この設定でインストールし、ホストOSからVMへのSSHがつながり、ログイン後にVM上でaptがちゃんと動けばOK。
でもタイムゾーンの設定、やっぱりないよなー
デフォルトではGMTになっていて9時間ずれているので、タイムゾーンをAsia/Tokyoに設定しておく。
ソースの取得とアプリビルド
ちなみにEclipse環境でビルドしてwarファイルを作成する場合は、メニューからエクスポートするのが簡単。
Windows上のEclipseで作成したwarファイルをLinuxにコピーしても(基本的には)動く。
git clone
GitHubにv1.0.0として上げているので、git clone -b v1.0.0で取得。
zaki@etivaz:~/src$ git clone -b v1.0.0 https://github.com/zaki-lknr/javaee-memoapp2.git
Cloning into 'javaee-memoapp2'...
remote: Enumerating objects: 384, done.
remote: Counting objects: 100% (384/384), done.
remote: Compressing objects: 100% (158/158), done.
remote: Total 384 (delta 144), reused 355 (delta 115), pack-reused 0
Receiving objects: 100% (384/384), 39.46 KiB | 1.72 MiB/s, done.
Resolving deltas: 100% (144/144), done.
Note: checking out '3656f7114c526027c96c0a585b6a5152ce43947c'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b <new-branch-name>
zaki@etivaz:~/src$ ls
javaee-memoapp2
ちなみに、DBサーバのアドレスはlocalhostになっているので、アプリケーションサーバ(今回はTomcat)とは別のホストでDBを動かす場合はsrc/main/webapp/META-INF/context.xmlのurlの部分のlocalhostをDBサーバのアドレスに変更する。
 <Resource
  name="jdbc/memoapp_db"
  auth="Container"
  type="javax.sql.DataSource"
  maxTotal="100"
  maxIdle="30"
  maxWaitMillis="10000"
  username="memoapp"
  password="memoapp"
  driverClassName="com.mysql.jdbc.Driver"
  url="jdbc:mysql://localhost:3306/memoapp_db" />
Mavenインストール
まずMavenのインストール
の前に、aptlineの編集。
(デフォルトではmavenパッケージのあるuniverseリポジトリは設定されていない)
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu bionic main universe restricted multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu bionic-security main universe restricted multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu bionic-updates main universe restricted multiverse
これでapt updateしてapt install mavenする。
root@etivaz:~# apt install maven
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  ca-certificates-java default-jre-headless fontconfig-config
  fonts-dejavu-core java-common libaopalliance-java libapache-pom-java
  libatinject-jsr330-api-java libavahi-client3 libavahi-common-data
  libavahi-common3 libcdi-api-java libcommons-cli-java libcommons-io-java
  libcommons-lang3-java libcommons-parent-java libcups2 libfontconfig1
  libgeronimo-annotation-1.3-spec-java libgeronimo-interceptor-3.0-spec-java
  libguava-java libguice-java libhawtjni-runtime-java libjansi-java
  libjansi-native-java libjpeg-turbo8 libjpeg8 libjsr305-java liblcms2-2
  libmaven-parent-java libmaven-resolver-java libmaven-shared-utils-java
  libmaven3-core-java libnspr4 libnss3 libpcsclite1 libplexus-cipher-java
  libplexus-classworlds-java libplexus-component-annotations-java
  libplexus-interpolation-java libplexus-sec-dispatcher-java
  libplexus-utils2-java libsisu-inject-java libsisu-plexus-java libslf4j-java
  libwagon-file-java libwagon-http-shaded-java libwagon-provider-api-java
  libxi6 libxrender1 libxtst6 openjdk-11-jre-headless x11-common
Suggested packages:
  default-jre libaopalliance-java-doc libatinject-jsr330-api-java-doc
  libservlet3.1-java libcommons-io-java-doc libcommons-lang3-java-doc
  cups-common libasm-java libcglib-java libjsr305-java-doc liblcms2-utils
  libmaven-shared-utils-java-doc liblogback-java pcscd
  libplexus-cipher-java-doc libplexus-classworlds-java-doc
  libplexus-interpolation-java-doc libplexus-sec-dispatcher-java-doc
  libplexus-utils2-java-doc junit4 testng libcommons-logging-java
  liblog4j1.2-java libnss-mdns fonts-dejavu-extra fonts-ipafont-gothic
  fonts-ipafont-mincho fonts-wqy-microhei | fonts-wqy-zenhei fonts-indic
The following NEW packages will be installed:
  ca-certificates-java default-jre-headless fontconfig-config
  fonts-dejavu-core java-common libaopalliance-java libapache-pom-java
  libatinject-jsr330-api-java libavahi-client3 libavahi-common-data
  libavahi-common3 libcdi-api-java libcommons-cli-java libcommons-io-java
  libcommons-lang3-java libcommons-parent-java libcups2 libfontconfig1
  libgeronimo-annotation-1.3-spec-java libgeronimo-interceptor-3.0-spec-java
  libguava-java libguice-java libhawtjni-runtime-java libjansi-java
  libjansi-native-java libjpeg-turbo8 libjpeg8 libjsr305-java liblcms2-2
  libmaven-parent-java libmaven-resolver-java libmaven-shared-utils-java
  libmaven3-core-java libnspr4 libnss3 libpcsclite1 libplexus-cipher-java
  libplexus-classworlds-java libplexus-component-annotations-java
  libplexus-interpolation-java libplexus-sec-dispatcher-java
  libplexus-utils2-java libsisu-inject-java libsisu-plexus-java libslf4j-java
  libwagon-file-java libwagon-http-shaded-java libwagon-provider-api-java
  libxi6 libxrender1 libxtst6 maven openjdk-11-jre-headless x11-common
0 upgraded, 54 newly installed, 0 to remove and 0 not upgraded.
Need to get 51.5 MB of archives.
After this operation, 206 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
:
:
done.
done.
root@etivaz:~# 
root@etivaz:~# logout
zaki@etivaz:~/src$ which mvn
/usr/bin/mvn
Mavenビルド
ビルドしてwarファイルを作成するには、pom.xmlのあるディレクトリでmvn packageを実行する。
zaki@etivaz:~/src$ cd javaee-memoapp2/
zaki@etivaz:~/src/javaee-memoapp2$ ls
LICENSE.txt  pom.xml  README.md  src
zaki@etivaz:~/src/javaee-memoapp2$ mvn package
:
:
[INFO] Packaging webapp
[INFO] Assembling webapp [memoapp2] in [/home/zaki/src/javaee-memoapp2/target/memoapp2]
[INFO] Processing war project
[INFO] Copying webapp resources [/home/zaki/src/javaee-memoapp2/src/main/webapp][INFO] Webapp assembled in [87 msecs]
[INFO] Building war: /home/zaki/src/javaee-memoapp2/target/memoapp2.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:01 min
[INFO] Finished at: 2019-01-18T15:21:56Z
[INFO] Final Memory: 19M/46M
[INFO] ------------------------------------------------------------------------
zaki@etivaz:~/src/javaee-memoapp2$ 
すると、targetディレクトリができ、配下にwarファイルが生成される。
zaki@etivaz:~/src/javaee-memoapp2$ ls
LICENSE.txt  pom.xml  README.md  src  target
zaki@etivaz:~/src/javaee-memoapp2$ ls target/
classes            maven-archiver  memoapp2
generated-sources  maven-status    memoapp2.war
zaki@etivaz:~/src/javaee-memoapp2$ ll -h target/memoapp2.war 
-rw-rw-r-- 1 zaki zaki 3.8M Jan 18 15:21 target/memoapp2.war
zaki@etivaz:~/src/javaee-memoapp2$ 
MySQLの設定
インストール
aptで。
root@etivaz:~# apt install mysql-server
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libaio1 libcgi-fast-perl libcgi-pm-perl libencode-locale-perl
  libevent-core-2.1-6 libfcgi-perl libhtml-parser-perl libhtml-tagset-perl
  libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl
  liblwp-mediatypes-perl libtimedate-perl liburi-perl mysql-client-5.7
  mysql-client-core-5.7 mysql-common mysql-server-5.7 mysql-server-core-5.7
Suggested packages:
  libdata-dump-perl libipc-sharedcache-perl libwww-perl mailx tinyca
The following NEW packages will be installed:
  libaio1 libcgi-fast-perl libcgi-pm-perl libencode-locale-perl
  libevent-core-2.1-6 libfcgi-perl libhtml-parser-perl libhtml-tagset-perl
  libhtml-template-perl libhttp-date-perl libhttp-message-perl libio-html-perl
  liblwp-mediatypes-perl libtimedate-perl liburi-perl mysql-client-5.7
  mysql-client-core-5.7 mysql-common mysql-server mysql-server-5.7
  mysql-server-core-5.7
0 upgraded, 21 newly installed, 0 to remove and 0 not upgraded.
Need to get 21.0 MB of archives.
After this operation, 162 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
[snip]
Setting up mysql-client-5.7 (5.7.24-0ubuntu0.18.04.1) ...
Setting up mysql-server-5.7 (5.7.24-0ubuntu0.18.04.1) ...
update-alternatives: using /etc/mysql/mysql.cnf to provide /etc/mysql/my.cnf (my.cnf) in auto mode
Renaming removed key_buffer and myisam-recover options (if present)
Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.
Setting up mysql-server (5.7.24-0ubuntu0.18.04.1) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Processing triggers for systemd (237-3ubuntu10.11) ...
Processing triggers for ureadahead (0.100.0-20) ...
clientも入るしそのまま起動する。
あれ?パスワードとかどうなってるんだろう?
ログイン
rootユーザであればパスなしで入れる
root@etivaz:~# mysql -u root 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.24-0ubuntu0.18.04.1 (Ubuntu)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
mysql> 
文字コードの設定
Ubuntu 18.04のMySQLのデフォルト文字コードは日本語になっていない
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql> 
ので、デフォルトの文字コードをutf8に設定する。
Ubuntu18.04のMySQLの設定ファイルは/etc/mysql/my.cnfにあるが、これはリンクになっていて実体は/etc/mysql/mysql.cnfになっている。
また、ファイルの中をみると/etc/mysql/conf.d/と/etc/mysql/mysql.conf.d/にあるファイルをincludeするような内容になっているので、/etc/mysql/mysql.conf.d/charset.cnfを作成する
[mysqld]
character-set-server=utf8
これでsystemctl restart mysqlすれば
mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)
mysql> 
character_set_serverのデフォルト文字コードがutf8になる。
(character_set_databaseがlatin1になっているが、これから新規作成するDBはutf8になるっぽい)
アプリ用DBとユーザの作成
ここと一緒だけど再掲
mysql> create database memoapp_db;
Query OK, 1 row affected (0.00 sec)
mysql> create user memoapp identified by "memoapp";
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on memoapp_db.* to memoapp;
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| memoapp_db         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
mysql> 
これでmemoapp_dbができた。
memoappで入ると
zaki@etivaz:~$ mysql -u memoapp -p -D memoapp_db
Enter password:  (←"memoapp"と入力)
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.24-0ubuntu0.18.04.1 (Ubuntu)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| memoapp_db         |
+--------------------+
2 rows in set (0.00 sec)
mysql> show create database memoapp_db;
+------------+---------------------------------------------------------------------+
| Database   | Create Database                                                     |
+------------+---------------------------------------------------------------------+
| memoapp_db | CREATE DATABASE `memoapp_db` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+------------+---------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
ちゃんと入れる。
これでDBサーバの準備はOK
Tomcatの設定
インストール
これもaptで
root@etivaz:~# apt install tomcat
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package tomcat
root@etivaz:~# apt install tomcat8
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  authbind libapr1 libcommons-collections3-java libcommons-dbcp-java
  libcommons-pool-java libecj-java libtcnative-1 libtomcat8-java
  tomcat8-common
Suggested packages:
  libcommons-collections3-java-doc libcommons-dbcp-java-doc
  libgeronimo-jta-1.1-spec-java ant ecj tomcat8-admin tomcat8-docs
  tomcat8-examples tomcat8-user
The following NEW packages will be installed:
  authbind libapr1 libcommons-collections3-java libcommons-dbcp-java
  libcommons-pool-java libecj-java libtcnative-1 libtomcat8-java tomcat8
  tomcat8-common
0 upgraded, 10 newly installed, 0 to remove and 0 not upgraded.
Need to get 7,791 kB of archives.
After this operation, 10.1 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
[snip]
Creating config file /etc/default/tomcat8 with new version
Adding system user `tomcat8' (UID 112) ...
Adding new user `tomcat8' (UID 112) with group `tomcat8' ...
Not creating home directory `/var/lib/tomcat8'.
Creating config file /etc/logrotate.d/tomcat8 with new version
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Processing triggers for systemd (237-3ubuntu10.11) ...
Processing triggers for ureadahead (0.100.0-20) ...
root@etivaz:~# 
これでインストール・起動まで完了。
デフォルトでは8080/tcpでLISTENしている
root@etivaz:~# ps aux | grep tomcat
tomcat8   3825  3.4  5.7 2676088 116668 ?      Sl   01:24   0:08 /usr/lib/jvm/default-java/bin/java -Djava.util.logging.config.file=/var/lib/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -XX:+UseConcMarkSweepGC -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat8 -Dcatalina.home=/usr/share/tomcat8 -Djava.io.tmpdir=/tmp/tomcat8-tomcat8-tmp org.apache.catalina.startup.Bootstrap start
root@etivaz:~# ss -anp
Netid State   Recv-Q  Send-Q                               Local Address:Port           Peer Address:Port   
tcp   LISTEN  0       100                                              *:8080                      *:*      users:(("java",pid=3825,fd=39))  
webappのデプロイ
ビルドしたwarファイルを(Ubuntu18.04のTomcat8の場合は)/var/lib/tomcat8/webappsへ配置する。
root@etivaz:~# ll /var/lib/tomcat8/
total 20
drwxr-xr-x  5 root    root    4096 Jan 20 01:24 ./
drwxr-xr-x 39 root    root    4096 Jan 20 01:24 ../
lrwxrwxrwx  1 root    root      12 Aug 13 20:23 conf -> /etc/tomcat8/
drwxr-xr-x  2 tomcat8 tomcat8 4096 Aug 13 20:23 lib/
lrwxrwxrwx  1 root    root      17 Aug 13 20:23 logs -> ../../log/tomcat8/
drwxr-xr-x  2 root    root    4096 Jan 20 01:24 policy/
drwxrwxr-x  3 tomcat8 tomcat8 4096 Jan 20 01:24 webapps/
lrwxrwxrwx  1 root    root      19 Aug 13 20:23 work -> ../../cache/tomcat8/
root@etivaz:~# ls /var/lib/tomcat8/webapps/
ROOT
root@etivaz:~# 
root@etivaz:~# mv ~zaki/src/javaee-memoapp2/target/memoapp2.war /var/lib/tomcat
8/webapps/
root@etivaz:~# ls /var/lib/tomcat8/webapps/
memoapp2  memoapp2.war  ROOT
root@etivaz:~# 
するとTomcatがwarを展開してアプリを起動してくれる。
デプロイを含めてログは/var/log/tomcat8/catalina.outに出力される。
20-Jan-2019 01:31:00.494 INFO [localhost-startStop-2] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/var/lib/tomcat8/webapps/memoapp2.war] has finished in [2,051] ms
起動したらブラウザからアクセスする。
適当にテキスト入力
DBにもレコードがちゃんと保存されている
mysql> select * from memo_data;
+---------+----------+--------+--------------------------------------------------------+---------------------+---------------------+
| memo_id | category | title  | memo                                                   | create_date         | modified_date       |
+---------+----------+--------+--------------------------------------------------------+---------------------+---------------------+
|       1 |        0 | test   | test message                                           | 2019-01-20 07:07:04 | 2019-01-20 07:07:04 |
|       2 |        0 | メモ   | カレーは粉でできてるのでカロリーゼロ                   | 2019-01-20 07:07:17 | 2019-01-20 07:07:17 |
+---------+----------+--------+--------------------------------------------------------+---------------------+---------------------+
2 rows in set (0.00 sec)
文字コード設定せずにlatin1のままだと…
Windowsで構築した環境と異なり、デフォルトだと日本語入力をしようとすると
日本語で入力した部分が????となってしまう。
というのも、DBに文字列がちゃんと保存されていないため。
mysql> show tables;
+----------------------+
| Tables_in_memoapp_db |
+----------------------+
| memo_data            |
+----------------------+
1 row in set (0.00 sec)
mysql> select * from memo_data;
+---------+----------+-------+--------------+---------------------+---------------------+
| memo_id | category | title | memo         | create_date         | modified_date       |
+---------+----------+-------+--------------+---------------------+---------------------+
|       1 |        0 | test  | test message | 2019-01-20 01:36:57 | 2019-01-20 01:36:57 |
|       2 |        0 | ???   | ?????        | 2019-01-20 01:38:14 | 2019-01-20 01:38:14 |
+---------+----------+-------+--------------+---------------------+---------------------+
2 rows in set (0.00 sec)
mysql> 










