nginx
Ubuntu
Jenkins
glassfish
GitBucket

UbutnuにNginx+GlassFishでJavaEEサーバーを建ててみた

More than 3 years have passed since last update.

Ubuntu14.04 + nginx + GlassFish4 の環境を構築し、 JavaEE アプリケーションサーバー環境を建てたお話です。

本稿は次の2点に焦点を当てた記事です。


  • GlassFish4 のインストールと設定

  • nginx の設定

構築の目的は Jenkins, GitBucket の導入でした。

これについては WAR のデプロイ方法のみ記載しています。


Why GlassFish?

JavaEE7 以降における参照実装だから。

(寺田佳央 氏のブログより)


前提環境


  • UbuntuServer 14.04 導入済みで SSH 接続ができる状態である

  • aptitude で下記インストール済み


    • oracle-java8-installer (ppa:webupd8team/java)

    • nginx

    • unzip




作業


1. GlassFish4 のインストール

パッケージはないので GlassFish Server Open Source Edition 4.0 Download より

Full Java EE platform + Multilingual (他言語&フルパック)でダウンロードします。

/opt/glassfish4 にインストールして、ユーザーのホームディレクトリもそこにします。

まずはダウンロード

cd /opt

# sudo wget http://download.java.net/glassfish/4.0/release/glassfish-4.0-ml.zip
sudo curl -OL http://download.java.net/glassfish/4.0/release/glassfish-4.0-ml.zip

展開してアーカイブ削除

sudo unzip glassfish-4.0-ml.zip

sudo rm glassfish-4.0-ml.zip

glassfish ユーザー作成

sudo useradd -s /usr/sbin/nologin -d /opt/glassfish4 glassfish

sudo chown -R glassfish: /opt/glassfish4

起動

cd /opt/glassfish4

sudo bin/asadmin start-domain

セキュア管理の有効化(管理機能の使用時に認証を求められるようになる)

[hidekuro@ubuntu] /opt/glassfish4$ sudo bin/asadmin change-admin-password


Enter admin user name [default: admin]> (そのままEnter)
Enter the admin password> (初期は空なのでそのままEnter)
Enter the new admin password> (新しいパスワードを入力)
Enter the new admin password again> (もう1度)

[hidekuro@ubuntu] /opt/glassfish4$ sudo bin/asadmin enable-secure-admin

Enter admin user name> admin
Enter admin password for user "admin"> (設定したパスワードを入力)

これで、 http://localhost:4848 にアクセスすれば管理コンソールが表示されます。

(下の画像は仮想マシンで撮影したので URL は気にしないでください)

admin-login.jpg


2. GlassFish の自動起動を設定 with Upstart

init.d + insserv でも構いませんが、今風にということで。

次のようなジョブ設定ファイル /etc/init に作成します。

init.d とは違い、ここに置くだけで sudo start glassfish4 ができるようになります。


/etc/init/glassfish4.conf

# Job configuration info

description "GlassFish4 Domain Administration Server"
author "hidekuro"

# No logging
console none
# Or if you want to logging /var/log/upstart/glassfish4.log
#console log

# according to networking jobs.
start on started networking
stop on deconfiguring-networking

# Run as glassfish
setuid glassfish
setgid glassfish
umask 0022
chdir /opt/glassfish4

# start
exec /opt/glassfish4/bin/asadmin start-domain

# stop
pre-stop exec /opt/glassfish4/bin/asadmin stop-domain


これで、システム起動時にデフォルトの domain1 が起動されます。


NOTE

GlassFish を asadmin から起動すると、プロセスが2つ起動されます。


  • appserver-cli.jar (サーバー管理 CLI) を起動する Java プロセス

  • glassfish.jar (GlassFish サーバー本体) を起動する Java プロセス

また GlassFish は起動にも停止にもけっこう時間がかかるので、

おためしで sudo start|stop glassfish4 などをやるときは

ps aux でプロセスの状態を確認しながら行うようにして下さい。

start と stop を素早くやりすぎて「おかしいなー」と悩まれませぬよう。


NOTE2

この設定ファイルを作るにあたっていろいろ調べている際に Glassfish and Upstart という記事を見つけました。

GlassFishProject のメーリングリストでやりとりされていた Upstart による起動に関する話をとりあげたもので、実際に Upstart で GlassFish を適切に起動できるかどうかの考察記事です。

記事では、どのような記述をしても Upstart ジョブのメインプロセスを指定することができないので、 asadmin 経由ではなく自前で java コマンドからサーバーを立ち上げよう…とあります。

私の環境であれこれ動作検証した結果、 丁寧に起動と停止を行えば Upstart から exec asadmin で起動しても動作には問題ありませんでした。

ただし、前述のとおりジョブのメインプロセスがどれであるかを指定しきれないため、 restart はやらないほうがいいです。

いずれの場合も、管理サーバーのプロセスと各インスタンスのプロセスは別になってしまうので、 Upstart との相性はいまいちかもしれません。

安定・安全性を求めるならば init.d スクリプトの採用を検討して下さい。


TIPS

GlassFish の管理ドメインをいくつか作成する場合、 Upstart のインスタンス機構が利用できます。

ドメインごとにインスタンスを分けて起動するジョブ設定ファイルを Gist に置いときました。

glassfish4-domain1.conf には start on の設定があるので、システム起動時に起動されます。

glassfish4-das.conf は、ユーザーまたは別のジョブから呼び出すための設定がされています。

たとえば domain2 を手動で起動するには sudo start glassfish4-das DOMAIN=domain2 とします。


3. GitBucket, Jenkins のデプロイ

まずはそれぞれの WAR をダウンロードしておきます。

cd /tmp

curl -OL https://github.com/takezoe/gitbucket/releases/download/1.13/gitbucket.war
curl -OL http://mirrors.jenkins-ci.org/war/latest/jenkins.war

ホームディレクトリを作成します。

cd /var/lib

sudo mkdir gitbucket jenkins
sudo chown -R glassfish: gitbucket
sudo chown -R glassfish: jenkins

管理コンソールにログインし、 GitBucket, Jenkins のホームディレクトリを指定するシステムプロパティ設定します。

構成 > server-config > システム・プロパティ を開き、 プロパティの追加 ボタンを押してプロパティを記述し、最後に 保存 ボタンで保存します。

プロパティの内容は次のとおりです。


  • JENKINS_HOME=/var/lib/jenkins

  • gitbucket.home=/var/lib/gitbucket

props.png

アプリケーション > デプロイ を開きます。

deploy.png

ここの操作は Tomcat のマネージャーアプリと似てます。

先ほどダウンロードした WAR を指定します。

画面下部の「タイプ」などは WAR を選択すれば自動設定されます。

deploy2.jpg

デプロイしたら http://localhost:8080/gitbuckethttp://localhost:8080/jenkins にアクセスしてみてください。


4. GlassFish ネットワーク・リスナーの設定

この状態だと GlassFish 上の Web アプリケーションに直接アクセスできてしまいます。

今回は Nginx をリバースプロキシとしてアクセスさせたいので、ローカルのみ待ち受けるようにします。

管理コンソールの 構成 > server-config > ネットワーク構成 > ネットワーク・リスナー を開き、 http-listener-1http-listener-2 の待ち受けポートを 127.0.0.1 に変更します。

listener.png

Nginx の設定で POST サイズを 20M に広げる予定なので、 http-listener-1HTTPタブ > 最大ポスト・サイズ を 20MB にしておきます。(1024 x 1024 x 20 = 20971520)

post.png


5. オレオレ証明書の作成

※当然ですがちゃんとした証明書がある場合はそれを使って下さい。

まずは秘密鍵の作成

[hidekuro@ubuntu] ~$ openssl genrsa -out server.key -aes256 2048


Generating RSA private key, 2048 bit long modulus
.............................................................+++
...................+++
e is 65537 (0x10001)
Enter pass phrase for server.key: (パスフレーズを入力)
Verifying - Enter pass phrase for server.key: (もう一度)

CSR (証明書署名要求ファイル) の作成

[hidekuro@ubuntu] ~$ openssl req -new -key server.key -out server.csr


Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Tama
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company
Organizational Unit Name (eg, section) []:Development Dept
Common Name (e.g. server FQDN or YOUR name) []:www.yourdomain.net
Email Address []:yourmail@yourdomain.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: (そのままEnter)
An optional company name []: (そのままEnter)

サーバー証明書を生成

[hidetaka@ubuntu] ~$ openssl x509 -req -in server.csr -signkey server.key -out server.crt


Signature ok
subject=/C=JP/ST=Tokyo/L=Tama/O=YourCompany/OU=DevelopmentDept/CN=www.yourdomain.net/emailAddress=yourmail@yourdomain.net
Getting Private key
Enter pass phrase for server.key:(秘密鍵のパスフレーズを入力)

秘密鍵のパスフレーズを削除し、使用時の入力要求を回避する。

※ローカルお試しでやるなら最初からパスフレーズなしの秘密鍵でもいいんですが…

[hidekuro@ubuntu] ~$ cp server.key server.key.orig

[hidekuro@ubuntu] ~$ openssl rsa -in server.key.orig -out server.key

Enter pass phrase for server.key.orig:(秘密鍵のパスフレーズを入力)
writing RSA key

ここまでで次のようなファイルがあるはずです。


  • server.crt -- サーバー証明書

  • server.key -- パスフレーズが削除された秘密鍵ファイル

  • server.key.orig -- パスフレーズつき秘密鍵ファイル

  • server.csr -- 証明書署名要求ファイル

このうち server.key と server.crt を使います。


6. Nginx の設定

先ほど作ったサーバー証明書を Nginx のフォルダに移動しておきます。

(特に必要ありませんが Nginx で使うファイルなので分かりやすいように)

sudo mv ~/server.crt /etc/nginx/server.crt

sudo mv ~/server.key /etc/nginx/server.key

// Qiita Markup に Nginx があってびっくりした


/etc/nginx/site-available/default

server {

listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name localhost;

# 強制的に HTTPS にリダイレクト
rewrite ^ https://$host$request_uri$is_args$args permanent;
}

server {
listen 443 ssl;
server_name localhost;

root html;

ssl on;
ssl_certificate server.csr;
ssl_certificate_key server.key;

ssl_session_timeout 5m;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;

# Proxy 先にリクエスト元オリジナルのHTTPヘッダを渡す
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;

location @backend {
proxy_pass http://localhost:8080;

# see "Jenkins behind an NGinX reverse proxy" - Jenkins Wiki
# https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+behind+an+NGinX+reverse+proxy
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 20m; # GlassFish のリスナーの設定と合わせる
client_body_buffer_size 128k;
}

location / {
# 静的ファイルが見つからなければバックエンドにパスする
try_files $uri $uri/ @backend;
}
}


設定ファイルをテストします。

[hidekuro@ubuntu] ~$ sudo nginx -t


nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

テストが OK だったら Nginx を再起動します。

sudo service nginx restart

以上で、 Nginx を通して GlassFish 上で動作する GitBucket, Jenkins が利用できるようになりました。


参考リンク