Help us understand the problem. What is going on with this article?

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

More than 5 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 が利用できるようになりました。

参考リンク

hidekuro
雑食。私がQiitaで公開する独自コードは、特に記載がない限り CC0 https://creativecommons.org/publicdomain/zero/1.0/deed.ja とします。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした