いわゆる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>