目次
Spring Boot でサーバプログラムを作り、 AWS EC2 Amazon Linux にデプロイしました。 その時のサーバ設定等を記録しています。
環境
Maven ではなく gradle を使います。
- Spring Boot 1.2.3
- Tomcat 8
- Java 1.8
- MySQL 5.6 (AWS RDS)
- gradle 3.4
- Kotlin 1.0.0
ビルド関連設定
必須の設定
Spring Boot のドキュメント にも記載されている必須の設定を行います。
アプリケーションコードの追加
main
メソッドを含むクラスが SpringBootServletInitializer
を継承するように変更します。 そして、 configure
メソッド を オーバライド します。 Spring Boot のドキュメントでは Application
クラス となっていますが、 私はMain
クラスにしていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com.sample.application; import org.springframework.boot.SpringApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.context.web.SpringBootServletInitializer; @SpringBootApplication public class Main extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Main.class); } public static void main(String[] args) { SpringApplication.run(Main.class, args); } } |
gradle の設定
build.gradle
にも設定を加える必要があります。
1 2 3 4 5 6 |
apply plugin: 'war' war { baseName = 'sample_application' version = '1.0.0' } |
baseName
と version
の設定はなくても構いません。 apply plugin: 'war'
は war を作るために必要です。
そして、 更に次の記述を追加します。
1 2 3 4 5 6 7 |
dependencies { providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' } configurations { providedRuntime } |
きっと dependencies
のところには他にもいくつかの行が存在していると思います。 そこに providedRuntime
の行を追加してください。
この部分の詳しい説明は Spring Boot のドキュメント をご参照ください。
結果、私の使っている build.gradle
は次のようになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
buildscript { ext.kotlin_version = '1.0.0' repositories { mavenCentral() } dependencies { classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.2.3.RELEASE' classpath 'org.springframework:springloaded:1.2.1.RELEASE' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'java' apply plugin: 'spring-boot' apply plugin: 'kotlin' apply plugin: 'war' war { baseName = 'sample_application' version = '1.0.0' } sourceCompatibility = '1.8' targetCompatibility = '1.8' repositories { mavenCentral() } dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile 'org.springframework.boot:spring-boot-starter-web' compile 'org.springframework.boot:spring-boot-starter-thymeleaf' compile 'org.springframework.boot:spring-boot-starter-data-jpa' compile 'mysql:mysql-connector-java:5.1.35' compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "org.json:json:20160212" providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' } jar.baseName = 'sample_application' sourceSets { main.java.srcDirs += 'src/main/kotlin' } configurations { providedRuntime } processResources { filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [ activeProfiles: project.properties['activeProfiles'] ?: "development" ] } |
ここまでの変更で、 ./gradlew build
を実行すると warファイル が build/libs
ディレクトリ内に生成されるようになりました。
環境ごとの設定
環境ごとに設定ファイルを作っていない場合は考慮する必要がありません。
Spring Boot では、 application.properties
というファイルに server.address
や spring.datasource.url
などの設定値を書くことができます。 私はここで下の3つのファイルを追加して、開発をしていました。
- application-develpment.properties
- application-local.properties
- application-production.properties
./gradlew build
で jar や war を作った場合は、 java -jar -Pspring.profiles.active=xxxxx xxxx.jar
といったように実行できるのですが、 Tomcat にデプロイした後はパラメータを設定できないので、ビルド時に設定しておく必要があります。
そこで、 build.gradle
に次の記述を追加します。
1 2 3 4 5 |
processResources { filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [ activeProfiles: project.properties['activeProfiles'] ?: "development" ] } |
Gradle 3.0 以上 で、 build.gradle を Kotlin で書くことができるようになっています。 Kotlin で書く場合、 filter
のところは次のようになります。
1 2 3 4 5 6 7 8 9 10 |
tasks.withType(org.gradle.language.jvm.tasks.ProcessResources::class.java) { this.filter( mapOf( "tokens" to mapOf( "activeProfile" to (project.properties["activeProfile"] ?: "default") ) ), org.apache.tools.ant.filters.ReplaceTokens::class.java ) } |
activeProfiles
の値を ?:
を使って書いているのは、 activeProfiles
が設定されなかった場合にもビルドを成功させるためです。 そうしておかないと、 Intellij IDEA などでプロジェクトを開いた場合に、 ビルドに失敗してプロジェクトを開くことができません。
そして、 application.properties
に spring.profiles.active=@activeProfiles@
を書き加えます。 私の application.properties
は次のようになりました。
1 2 3 |
server.address=0.0.0.0 spring.profiles.active=@activeProfiles@ |
これにより、ビルド時のコマンドは ./gradlew -PactiveProfiles=xxxxx build
となります。 xxxxx
のところには、 私の場合は local
, development
, production
が入ります。
サーバ構築
AWS EC2 Amazon Linux でサーバを構築します。
必要なプログラムのインストール
Apache や Nginx はインストールしないやり方です。
Java
EC2 から gitリポジトリ を取得し、 EC2内でビルドして同一サーバ内にデプロイする方法をとったため、 Java は 1.8 の SDK をインストールしました。 Oracle のサイトから rpm パッケージ をダウンロードしてインストールします。 私は、 ダウンロードした rpm ファイル は /usr/local/src
に入れるようにしています。
git
git コマンド が必要なので次のコマンドでインストールします。
1 |
sudo yum install git-core |
Tomcat
Tomcat をインストールします。 Spring Boot は Tomcat を内蔵しているので、 sudo nohup java -jar ...
というコマンドで起動することもできますが、 今回は Tomcat を使用します。
Amazon Linux 上 で次のコマンドを実行します。
1 |
sudo yum install tomcat8 |
これにより Tomcat がインストールされ、 Tomcat は service
コマンド を使って起動できるようになります。
サーバ起動時に Tomcat が自動で起動するように、 次のコマンドを実行しておきます。
1 2 |
sudo chkconfig --level 345 tomcat6 on chkconfig --list tomcat8 # 設定確認 |
Tomcat 設定
Tomcat で 80番ポートをリッスンするようにしたいので 次の変更を行います。 Nginx等を使って 80番ポートへのリクエストを8080番ポートにつなぐ場合は必要ありません。
1 2 3 |
sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 sudo service iptables save sudo service iptables restart |
そして、 /usr/share/tomcat8/conf/server.xml
を変更します。 ファイルの所有者が tomcat
になっているので sudo -u tomcat vim /usr/share/tomcat8/conf/server.xml
で tomcat
ユーザとして変更を行います。 ファイルの途中、 <Connector port="8080" ...
というノードがあるので、 そこに proxyPort="80"
という属性値を追加します。
1 2 3 4 |
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" proxyPort="80" /> |
この変更が終わったら、 Tomcat を再起動しておきます。
デプロイ
手作業でデプロイを行います。 コマンドで自動デプロイをする場合は Gradle: 自動デプロイ もご参照ください。
コンパイル
プロジェクトディレクトリに移動して ./gradlew build
または ./gradlew -PactiveProfiles=xxxx build
でビルドします。
Tomcat への配置
Tomcat のディレクトリに war を配置します。
1 |
sudo -u tomcat cp build/libs/sample_application-1.0.0.war /usr/share/tomcat8/webapps/ROOT.war |
Tomcat の再起動
Tomcat を再起動します。
1 |
sudo service tomcat8 restart |
この後でサーバの80番ポートにアクセスすると、 ページが表示されます。