Jetty

Contents

Jettyとは


サーブレットコンテナの一種で、特に機能が限定されている分、軽量であるため、軽量サーブレットコンテナと呼ばれる。
Webサーバ機能も保持しているため、本プロダクトのみで、静的コンテンツも動的コンテンツも扱える。
主に、WebサーバにApacheを用いるまでもない小規模サイトで使用されるが、その軽量さを活かして、高いスループットが求められるWEBサイトでサーブレットコンテナ専用としても使用されている。
Jetty自体もJavaで開発されており、WORAを実現している。

各種URL



サーバー構築


構築環境





OS設定


ネットワーク


固定IPアドレス割り当て


次のファイルを編集する
# ifcfg-loはループバックインタフェースであるため、触らない
vi /etc/sysconfig/network-scripts/ifcfg-<インタフェース名>

以下では例として192.168.0.51/24を割り当てた
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.0.51
NETMASK=255.255.255.0
NETWORK=192.168.0.0
GATEWAY=192.168.0.1

ネットワークを再起動する
systemctl restart network

ip addressコマンドにより、インタフェースが有効になっていることを確認する
これによりホストマシンなどからSSHでログイン可能となる


firewalld


JettyのデフォルトポートはTCP/8080であるが、単体でWEBサーバとして動作させるので、TCP/80を開ける。
接続元IPアドレス制限は行わない。

HTTPを開ける

  1. 現在ルールが定義されていることを確認
    firewall-cmd --permanent --info-service=http
  2. 現在ルールが適用されていないことを確認する
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep http
  3. ルールを適用する
    firewall-cmd --add-service=http --zone=public --permanent
  4. ルールが適用されていることを確認する
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep http
  5. 設定を再読み込みして反映させる
    firewall-cmd --reload

HTTPSも開ける場合

  1. 現在ルールが定義されていることを確認
    firewall-cmd --permanent --info-service=https
  2. 現在ルールが適用されていないことを確認する
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep https
  3. ルールを適用する
    firewall-cmd --add-service=https --zone=public --permanent
  4. ルールが適用されていることを確認する
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep https
  5. 設定を再読み込みして反映させる
    firewall-cmd --reload

TCP/8080を開ける場合

  1. 現在ルールが定義されていないか確認
    firewall-cmd --permanent --info-service=jetty
  2. 新しいルールを定義
    firewall-cmd --new-service=jetty --permanent
    firewall-cmd --service=jetty --add-port=8080/tcp --permanent
  3. ルールが定義されていることを確認
    firewall-cmd --permanent --info-service=jetty
  4. 現在ルールが適用されていないことを確認する
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep jetty
  5. ルールを適用する
    firewall-cmd --add-service=jetty --zone=public --permanent
  6. ルールが適用されていることを確認する
    firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep jetty
  7. 設定を再読み込みして反映させる
    firewall-cmd --reload

ホスト名


ホスト名としてjettyを設定する
hostname jetty.corp
# 再起動しても有効にする
echo jetty.corp > /etc/hostname
再ログインすることで有効になる。

Java環境の構築


JDKをインストールする

ダウンロード



今回は2017/08/26時点の最新版「JDK8u144」をダウンロードする。
展開するだけで使用できる圧縮版(jdk-8u144-linux-x64.tar.gz)をダウンロードする。
ダウンロードの前に「Accept License Agreement」ラジオボタンにチェックを入れること。

ダウンロードの際はページに記載のハイパーリンク(http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz)からダウンロードしようとすると、エラーが発生するので、一旦PCでダウンロードを試み、それをキャンセル。
その際ダウンロードを行おうとしたURL(http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz?AuthParam=XXX_XXXXXのようになる)をコピーし、そこから改めてダウンロードする。
※Chromeではダウンロード元URLを取得できない。
※PCにダウンロードしてSCP転送でもよい。
curl -s -O <JDKのURL>

インストール


tar xzfv jdk-*.tar.gz*
rm -f jdk-*.tar.gz*

mv jdk* /usr/local/
ln -s /usr/local/jdk* /usr/local/jdk

環境変数


環境変数を設定し、パスを通す。
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

これによって「java」コマンドが実行できるようになったので、確認する。
java -version

更に再起動・再ログインしても自動で設定されるようにbashrcに設定を追加する
echo "" >> /etc/bashrc
echo "# JAVA ENVIRONMENT VARIABLE" >> /etc/bashrc。
echo export JAVA_HOME=/usr/local/jdk >> /etc/bashrc
echo export PATH=\$JAVA_HOME/bin:\$PATH >> /etc/bashrc
echo export CLASSPATH=.:\$JAVA_HOME/lib/tools.jar:\$JAVA_HOME/lib/dt.jar >> /etc/bashrc


Jettyの構築


ダウンロード


ダウンロードページから最新のものをダウンロードする。
今回ダウンロードするバージョンのリンクはこちら

curl -s -O http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.6.v20170531/jetty-distribution-9.4.6.v20170531.tar.gz

インストール


インストールは展開して任意の場所に配置するだけである。

tar xzfv jetty-*.tar.gz
rm -f jetty-*.tar.gz

mv jetty-* /usr/local/`ls | grep jetty-* | sed -e "s/-distribution//g"`
ln -s /usr/local/jetty-* /usr/local/jetty

cd /usr/local/jetty

インストール確認


インストールできているか確認する。
bin/jetty.sh check

このコマンドを実行した際、インストールしたJavaとJETTYの情報が表示されているか確認しておく。


環境変数の追加


環境変数を設定して簡単に使えるようにしておく。
export JETTY_HOME=/usr/local/jetty
export PATH=$JETTY_HOME/bin:$PATH

次回ログイン時にも設定されるようにする。
echo "" >> /etc/bashrc
echo "# JETTY ENVIRONMENT VARIABLE" >> /etc/bashrc
echo "export JETTY_HOME=/usr/local/jetty" >> /etc/bashrc
echo "export PATH=\$JETTY_HOME/bin:\$PATH" >> /etc/bashrc

不要ファイルの削除


ドキュメントなど、サーバの実行に不要なファイルは消しておく。

インストールされているファイル


存在するファイルは以下














削除の実行





ROOTディレクトリの作成


Jettyはwarファイルなどのウェブアプリケーションのみならず、静的ファイルも設置できる。
静的ファイルは公開ディレクトリ直下のROOTディレクトリに配置する。
今回はインストールディレクトリ直下のwebappsを公開ディレクトリとし、静的ファイルを利用するものとして、ROOTディレクトリを作成する。
mkdir webapps/ROOT


実行ユーザ設定


Jettyを起動するユーザとそのグループを作成する。




所有者の変更


ユーザ”jetty”で起動するので所有者を変更しておく
chown jetty:jetty -R /usr/local/jetty*

初期設定


cat > start.ini << EOT
--module=server
--module=jsp
--module=jstl
--module=deploy
--module=setuid
--module=logging-jetty
--module=console-capture

--module=http
jetty.http.port=80

--module=requestlog
jetty.requestlog.filenameDateFormat=yyyyMMdd
jetty.requestlog.filePath=logs/requestyyyy_mm_dd.log
jetty.requestlog.append=true
jetty.requestlog.timezone=JST
EOT

起動


jetty.sh start &
接続確認を行う
curl -s http://localhost/test | head
「Error 404 – Not Found.」が返るが、「Powered by Jetty」とあり、Jettyが動作していることがわかる。

停止


jetty.sh stop

サービス登録


systemdのサービスとして登録する。
  1. サービスファイルを作成する
    cat > /etc/systemd/system/jetty.service << EOT
    [Unit]
    Description=Jetty Servlet Container & HTTP/HTTPS server
    After=local-fs.target network.target network-online.target
    
    [Service]
    Type=simple
    ExecStart=/usr/local/jetty/bin/jetty.sh start &
    ExecReload=/usr/local/jetty/bin/jetty.sh restart
    ExecStop=/usr/local/jetty/bin/jetty.sh stop
    User=jetty
    
    [Install]
    WantedBy=multi-user.target
    EOT
    1. サービスを有効化する
      systemctl enable jetty
    2. サービスが有効化されていることを確認する
      systemctl list-unit-files --type service --no-pager | grep jetty

ツール



jetty.sh




サブコマンド


start


Jettyをバックグラウンドで実行する。
stopサブコマンドで停止できる。
実行中は下記のパスにPIDファイルが生成される。
/var/run/jetty/jetty.pid

stop


バックグラウンドで実行中のJettyを停止する。

run


Jettyをフォアグラウンドで実行する。
実行後コントロールが復帰しないが、バックグラウンドモードで動作させるとkill以外に停止させる手段がない。
その為、通常はバックグラウンドで起動するstartサブコマンドを使用したほうが良い。
Jetty自体のパラメータ変更などの動作検証をする際に使用するのが良い。

restart


バックグラウンドで実行中のJettyを再起動する。

check


Jettyの動作環境、動作状況を出力する。

supervise


daemontoolsのsuperviseプログラムを使用してプロセス監視を行う際にのみ利用する。

設定


各種ファイルについて


参考:http://www.eclipse.org/jetty/documentation/current/quick-start-configure.html#_jetty_start_configuration_files

Jettyの設定を行うファイルは以下の3つに分かれる。



プロパティファイル(.ini)


プロパティファイルはstart.iniまたはstart.dディレクトリは以下に配置した*.iniファイルによって記述される。
これらのファイルは配置するだけで、自動で起動時にロードされる。
また、起動時のオプションとして与えることもできる。
設定の優先順位は
  1. 起動オプション
  2. start.ini
  3. start.dディレクトリ
    である。
    同じ優先順位の設定内に同じプロパティを複数書いた場合、最後に指定したものが有効になる。

初期設定(start.ini)


#===========================================================
# Jetty Startup
#
# Starting Jetty from this {jetty.home} is not recommended.
#
# A proper {jetty.base} directory should be configured, instead
# of making changes to this {jetty.home} directory.
#
# See documentation about {jetty.base} at
# http://www.eclipse.org/jetty/documentation/current/startup.html
#
# A demo-base directory has been provided as an example of
# this sort of setup.
#
# $ cd demo-base
# $ java -jar ../start.jar
#
#===========================================================

# To disable the warning message, comment the following line
--module=home-base-warning

# ---------------------------------------
# Module: ext
# Adds all jar files discovered in $JETTY_HOME/lib/ext
# and $JETTY_BASE/lib/ext to the servers classpath.
# ---------------------------------------
--module=ext


# ---------------------------------------
# Module: server
# Enables the core Jetty server on the classpath.
# ---------------------------------------
--module=server

### ThreadPool configuration
## Minimum number of threads
# jetty.threadPool.minThreads=10

## Maximum number of threads
# jetty.threadPool.maxThreads=200

## Thread idle timeout (in milliseconds)
# jetty.threadPool.idleTimeout=60000

### Common HTTP configuration
## Scheme to use to build URIs for secure redirects
# jetty.httpConfig.secureScheme=https

## Port to use to build URIs for secure redirects
# jetty.httpConfig.securePort=8443

## Response content buffer size (in bytes)
# jetty.httpConfig.outputBufferSize=32768

## Max response content write length that is buffered (in bytes)
# jetty.httpConfig.outputAggregationSize=8192

## Max request headers size (in bytes)
# jetty.httpConfig.requestHeaderSize=8192

## Max response headers size (in bytes)
# jetty.httpConfig.responseHeaderSize=8192

## Whether to send the Server: header
# jetty.httpConfig.sendServerVersion=true

## Whether to send the Date: header
# jetty.httpConfig.sendDateHeader=false

## Max per-connection header cache size (in nodes)
# jetty.httpConfig.headerCacheSize=512

## Whether, for requests with content, delay dispatch until some content has arrived
# jetty.httpConfig.delayDispatchUntilContent=true

## Maximum number of error dispatches to prevent looping
# jetty.httpConfig.maxErrorDispatches=10

## Maximum time to block in total for a blocking IO operation (default -1 is to use idleTimeout on progress)
# jetty.httpConfig.blockingTimeout=-1

## Cookie compliance mode of: RFC2965, RFC6265
# jetty.httpConfig.cookieCompliance=RFC6265

### Server configuration
## Whether ctrl+c on the console gracefully stops the Jetty server
# jetty.server.stopAtShutdown=true

## Timeout in ms to apply when stopping the server gracefully
# jetty.server.stopTimeout=5000

## Dump the state of the Jetty server, components, and webapps after startup
# jetty.server.dumpAfterStart=false

## Dump the state of the Jetty server, components, and webapps before shutdown
# jetty.server.dumpBeforeStop=false

## The name to uniquely identify this server instance
#jetty.defaultSessionIdManager.workerName=node1

## How frequently sessions are inspected
#jetty.sessionInspectionInterval.seconds=60


# ---------------------------------------
# Module: jsp
# Enables JSP for all webapplications deployed on the server.
# ---------------------------------------
--module=jsp


# ---------------------------------------
# Module: resources
# Adds the $JETTY_HOME/resources and/or $JETTY_BASE/resources
# directory to the server classpath. Useful for configuration
# property files (eg jetty-logging.properties)
# ---------------------------------------
--module=resources


# ---------------------------------------
# Module: deploy
# Enables webapplication deployment from the webapps directory.
# ---------------------------------------
--module=deploy

# Monitored directory name (relative to $jetty.base)
# jetty.deploy.monitoredDir=webapps
# - OR -
# Monitored directory path (fully qualified)
# jetty.deploy.monitoredPath=/var/www/webapps

# Defaults Descriptor for all deployed webapps
# jetty.deploy.defaultsDescriptorPath=${jetty.base}/etc/webdefault.xml

# Monitored directory scan period (seconds)
# jetty.deploy.scanInterval=1

# Whether to extract *.war files
# jetty.deploy.extractWars=true

# ---------------------------------------
# Module: jstl
# Enables JSTL for all webapplications deployed on the server
# ---------------------------------------
--module=jstl


# ---------------------------------------
# Module: websocket
# Enable websockets for deployed web applications
# ---------------------------------------
--module=websocket


# ---------------------------------------
# Module: http
# Enables a HTTP connector on the server.
# By default HTTP/1 is support, but HTTP2C can
# be added to the connector with the http2c module.
# ---------------------------------------
--module=http

### HTTP Connector Configuration

## Connector host/address to bind to
# jetty.http.host=0.0.0.0

## Connector port to listen on
# jetty.http.port=8080
jetty.http.port=8090

## Connector idle timeout in milliseconds
# jetty.http.idleTimeout=30000

## Connector socket linger time in seconds (-1 to disable)
# jetty.http.soLingerTime=-1

## Number of acceptors (-1 picks default based on number of cores)
# jetty.http.acceptors=-1

## Number of selectors (-1 picks default based on number of cores)
# jetty.http.selectors=-1

## ServerSocketChannel backlog (0 picks platform default)
# jetty.http.acceptorQueueSize=0

## Thread priority delta to give to acceptor threads
# jetty.http.acceptorPriorityDelta=0

## HTTP Compliance: RFC7230, RFC2616, LEGACY
# jetty.http.compliance=RFC7230

基本設定


一般設定


jetty.home

Jettyがインストールされているディレクトリ。
この値は固定であり、設定しても変更されない。

jetty.base

WEBアプリケーションをデプロイするディレクトリ。
設定ファイルはここで指定したディレクトリから読み込まれる。

パラメータ”jetty.home”と同じでもよいが、公式には別のパスにすることが推奨されている。
別のパスにすることによって、jetty.homeディレクトリは一切変更する必要がなくなるので、バージョンアップの際、移行が容易になるからである。

ただ、プロパティファイル”start.ini”とwebappsディレクトリ程度しか使用しないのであれば、jetty.homeディレクトリと同じでもよいだろう。


user.dir

ログ出力など、Jettyに組み込まれたサードパーティのライブラリで使用されるパスである。
一定の場所に設定すべきである。

serverモジュール


サーバとして動作させるための基本的な設定を行う。



スレッドプール

minThreads

# Minimum number of threads




HTTP全般

# Scheme to use to build URIs for secure redirects




















ログ


ログ関連はモジュール有効化以外は下記パスのファイルで設定する。
vi $JETTY_HOME/resources/jetty-logging.properties

console-captureモジュール


標準(エラー)出力に出力されるログをファイルに出力する設定を行う。


dir

ログの出力ディレクトリ。
相対パスを記述すると$jetty.baseからの相対パスとなる。
プロパティ”filePath”でこのプロパティを指定しないと、このディレクトリに出力されない。


append

既存のファイルがある場合、追記するかどうか。


retainDays

過去のログを何日残すかどうか。


timezone

ログに記載される時刻のタイムゾーン



requestlogモジュール


アクセスログ関係の設定を行う。
ログファイルは日次で自動でローテーションされるが、ログファイル名に日付を含めなければならない。


dir

ログの出力ディレクトリ。
相対パスを記述すると$jetty.baseからの相対パスとなる。
プロパティ”filePath”でこのプロパティを指定しないと、このディレクトリに出力されない。


filePath

ログの出力パス。
パス中の文字列”yyyy_mm_dd”の部分はプロパティ”filenameDateFormat”で置き換えられる。
プロパティ”filenameDateFormat”でどのような書式であろうと、このプロパティ中の日付部分は必ず”yyyy_mm_dd”である必要がある。


filenameDateFormat

ログファイルのファイル名中で用いられる日付部分の書式。
SimpleDateFormatクラスで指定できる書式である必要がある。


retainDays

過去のログを何日残すかどうか。


append

既存のファイルがある場合、追記するかどうか。


extended

詳細なログ情報を出力するかどうか。


cookies

クッキーの内容を記録するかどうか。


timezone

ログに記載される時刻のタイムゾーン



loglatency

応答時間を記録するかどうか。
ミリ秒で記録される。


logging-jettyモジュール


アプリケーションログの設定を行う。


log.class

ログ出力クラスを指定する。



log.class

ログ出力クラスを指定する。



LEVEL

ログ出力レベルを指定する。
ALLの場合は、DEBUGが除かれるので注意。




STACKS

スタックトレースを出力するかどうかを指定する。



SOURCE

ソースコードの位置を出力するかどうかを指定する。



セキュリティ


sslモジュール (httpsモジュール)


SSL/TLS関係の設定を行う。
HTTPSモジュールを読み込むとこのモジュールも自動で読み込まれる。


ネットワーク

host

SSL/TLS接続を許可するインタフェース(IPアドレス)を指定する


port

SSL/TLS接続を待ち受けるポート番号を指定する

idleTimeout

アイドル状態になった接続のタイムアウト時間



soLingerTime

Lingerタイムアウトまでの時間を設定する。
Lingerタイムアウトとはソケットにclose命令が出されても、直ちに閉じずに、未送信データの送信とその受信応答受け取りが完了するまでソケットのクローズを待機する時間である。



証明書・秘密鍵データベース

keyStorePath

秘密鍵データベースのパスを指定する。
相対パスを指定する場合、$jetty.baseが基点となる。


trustStorePath

証明書データベースのパスを指定する。
相対パスを指定する場合、$jetty.baseが基点となる。


keyStoreType

使用する鍵データベースの種類



trustStoreType

使用する証明書データベースの種類



keyStoreProvider

使用する鍵データベースの提供元



trustStoreProvider

使用する証明書データベースの提供元


keyStorePassword

秘密鍵データベースのパスワードを指定する。
パスワードはOBF、MD5、CRYPT形式が扱え、それぞれを生成するには次のコマンドを実行する。
java -cp $JETTY_HOME/lib/jetty-util-*.jar org.eclipse.jetty.util.security.Password <パスワード>


trustStorePassword

証明書データベースのパスワードを指定する。
パスワードはOBF、MD5、CRYPT形式が扱え、それぞれを生成するには次のコマンドを実行する。
java -cp $JETTY_HOME/lib/jetty-util-*.jar org.eclipse.jetty.util.security.Password <パスワード>


keyManagerPassword

鍵マネージャーのパスワードを指定する。
パスワードはOBF、MD5、CRYPT形式が扱え、それぞれを生成するには次のコマンドを実行する。
java -cp $JETTY_HOME/lib/jetty-util-*.jar org.eclipse.jetty.util.security.Password <パスワード>


acceptor / selector

acceptorとは新たな接続を受け付け、ソケットを生成するスレッドのことである。
selectorとは生成されたソケットを管理するスレッドのことである。

acceptors

acceptorスレッドの数



acceptorQueueSize

ServerSocketChannel backlog (0 picks platform default)


acceptorPriorityDelta

Thread priority delta to give to acceptor threads


selectors

selectorスレッドの数



Strict-Transport-Security(SSL/TLS使用の要求)

stsMaxAgeSeconds

max age in seconds for a Strict-Transport-Security response header (default -1)


stsIncludeSubdomains

include subdomain property in any Strict-Transport-Security header (default false)


クライアント証明書

needClientAuth

クライアント証明書を必須とするかどうか


wantClientAuth

クライアント証明書を要求するかどうか。
ただし、クライアントが証明書を送信しなかったとしても接続を拒否しない。


キャッシュ

sslSessionCacheSize

SSLセッションのキャッシュサイズ


sslSessionTimeout

SSLセッションのキャッシュのタイムアウト時間



再ネゴシエーション

renegotiationAllowed

利用中のSSL通信で使用している暗号化パラメータについて再設定要求がクライアントからあった場合、受け付けるかどうか。


renegotiationLimit

利用中のSSL通信で使用している暗号化パラメータについて再設定要求がクライアントからあった場合、最大何回まで受け付けるか。


その他

sniHostCheck

Server Name Indication(SNI)とはSSL/TLS使用時にクライアントがアクセスしたいドメイン名を指定することで、同一のサーバが複数のドメイン名用の証明書を使い分けることができる、SSLの拡張機能である。
クライアントから要求されたホスト名が実際にサーバが保持するSNIと一致するかどうかチェックしてから証明書を返すかどうか。


useCipherSuitesOrder

暗号アルゴリズムを設定された順序で選択して使用するかどうか。
このオプションはJava8以降で使用可能である。
特定の暗号アルゴリズムを使用する、または使用しないように設定することもできる。



リライト


rewriteRequestURI


URLの書き換えを有効にするかどうか



rewritePathInfo


パスの書き換えを有効にするかどうか



originalPathAttribute


書き換えた後に書き換え前のパスをURLのクエリとして渡すようにする。
そのクエリの属性名(キー)を指定する。


プロキシ・バランサ


フォワード・リバースプロキシサーバとして動作させることができる。
実態はサーブレットであり、サーバで特定のパスに対し、プロキシ用のサーブレットが内部でHTTPクライアントとして処理を行い、結果を返す。

バランサは複数のホストにリクエストを転送できる機能である。
X-Forwarded-ForなどのHTTPヘッダは特に設定しなくても自動で生成される。

プロキシ・バランサモジュール


プロキシ、またはバランサの機能を使用する際に設定する。



共用設定

servletClass

プロキシ機能を実現するサーブレットのクラスを指定する。
デフォルトのProxyServletの場合、フォワードプロキシとして動作する。
リバースプロキシの場合は、設定変更する必要がある。



maxThreads




maxConnections




idleTimeout




timeout




hostHeader

forces the host header to a particular value
XMLファイルに設定追加が必要

viaHost

the name to use in the Via header: Via: http/1.1 <viaHost>
XMLファイルに設定追加が必要

whiteList

comma-separated list of allowed proxy hosts
XMLファイルに設定追加が必要

blackList

comma-separated list of forbidden proxy hosts
XMLファイルに設定追加が必要

プロキシ用設定

servletMapping

プロキシ対象とするパスを指定する。
つまり、プロキシサーブレットが動作するパスである。



proxyTo

リバースプロキシ(org.eclipse.jetty.proxy.ProxyServlet$Transparent)として使用するときのみ指定可能。
ただし、対応するXMLファイルには本パラメータは記載がないので、追記が必要。
vi $JETTY_HOME/etc/jetty-proxy.xml
追記内容は下記。
           <Call name="setInitParameter">
             <Arg>proxyTo</Arg>
             <Arg><Property name="jetty.proxy.proxyTo"/></Arg>
           </Call>



バランサ用設定

stickySessions

同じ接続元からのアクセスを前回と同じサーバに転送するかどうか。




balancerMember.<name>.proxyTo

リクエストの転送先と、パスの書き換え設定を行う。
name部分には転送先のホスト名を記載する。
ただし、設定ファイル(.xml)はワイルドカードを使用した設定ができないので、プロパティファイル(.ini)に記載しても、変更時にプロパティファイルだけでなく、設定ファイル(.xml)の修正が必要になる。
その為、プロパティファイルには記載せずに、設定ファイルにのみ記載した方がよい。



モジュールファイル(.mod)


モジュールファイルにはプロパティ一覧が記載されている。


モジュール一覧


find modules -name "*.mod" | sed -e "s/.*\///g" -e "s/.mod//" | sort




基本機能


server

サーバ機能を使用するモジュール。


リライト


rewrite

リクエストされたURLの書き換えを行う

rewrite-compactpath

スラッシュが複数連続して並んだのURLをスラッシュ一つに書き換える
例えば http://example.com/aaa///index.html を http://example.com/aaa/index.html のように修正する。


rewrite-customizer

URL以外のHTTPリクエスト内容を書き換える

設定ファイル(.xml)


設定ファイルはetcディレクトリ内に格納されているが、参照元のモジュールファイルを変更すれば、etcディレクトリ以外でも保存可能である。

プロキシ


プロキシサーバとしての機能を有効にするモジュール

proxy

プロキシ設定を行う

proxy-protocol

非暗号化通信でのプロキシを有効化する

proxy-protocol-ssl

暗号化通信でのプロキシを有効化する

http-forwarded


Jettyがプロキシ経由でアクセスされた際にJettyがプロキシサーバを透過的に扱うモジュール


jetty.xml


jettyサーバに対して設定を行う。


webdefault.xml


全てのウェブアプリケーションの設定ファイル”web.xml”に対してデフォルトの設定を与える。



Tips


認証設定


Digest認証


一括認証設定


全てのWEBアプリケーションに対してDigest認証を行うよう設定する。
1つのWEBアプリケーションにログインすると別のWEBアプリケーションに対しては改めてのログインは不要となる。
$JETTY_HOME/webapps/ROOT配下の静的ファイルに対しても認証がかかってしまうので注意。
これを回避するには、WEBアプリケーション個別に設定をしなければならない。


echo "admin: password,admin1,admin2" > users
chown jetty:jetty users

パスワードを暗号化する場合は以下
echo "admin: `java -cp $JETTY_HOME/lib/jetty-util-9.4.6.v20170531.jar org.eclipse.jetty.util.security.Password password 2>&1 | grep MD5`,admin1,admin2" > users




個別認証設定


特定のWEBアプリケーションに対してのみ認証をかける場合は以下の設定を行う。
個別のWEBアプリケーションに設定を行うことで、細かなパスのみに認証をかけるということがやりやすい。

以下ではWEBアプリケーションtest.warファイルをデプロイするという前提である。


echo "admin: password,admin1,admin2" > users
chown jetty:jetty users

パスワードを暗号化する場合は以下
echo "admin: `java -cp $JETTY_HOME/lib/jetty-util-9.4.6.v20170531.jar org.eclipse.jetty.util.security.Password password 2>&1 | grep MD5`,admin1,admin2" > users


今回は1つ目のJettyホームディレクトリ直下に置くことにする。
cat > $JETTY_HOME/test-web.xml << EOT
<?xml version="1.0" encoding="UTF-8"?>
<web-app
\txmlns="http://xmlns.jcp.org/xml/ns/javaee"
\txmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\txsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
\tmetadata-complete="false"
\tversion="3.1">
\t
\t<security-constraint>
\t\t<web-resource-collection>
\t\t\t<url-pattern>/*</url-pattern>
\t\t</web-resource-collection>
\t\t
\t\t<auth-constraint>
\t\t\t<role-name>admin</role-name>
\t\t</auth-constraint>
\t\t<login-config>
\t\t\t<auth-method>DIGEST</auth-method>
\t\t</login-config>
\t</security-constraint>
</web-app>
EOT
sed -i -e "s/\\\\t/\t/g" $JETTY_HOME/test-web.xml
chmod 640 $JETTY_HOME/test-web.xml
chown jetty:jetty $JETTY_HOME/test-web.xml


SSL/TLS



予めSSL/TLS証明書と秘密鍵を用意しておく必要がある。
この時、自己生成した公開鍵・秘密鍵ペアを使用する場合と使用しない場合で手順が異なる。



リバースプロキシ


/proxy/へのアクセスを10.0.0.1:8080に転送する。
リバースプロキシはバランササーブレットを使用して行う。

  1. xmlファイルを変更する
    vi $JETTY_HOME/etc/jetty-proxy.xml
    他の「<Call name=”setInitParameter”>」の末尾に下記を追記する。
                <Call name="setInitParameter">
                  <Arg>balancerMember.10.0.0.1:8080.proxyTo</Arg>
                  <Arg>http://10.0.0.1:8080</Arg>
                </Call>
                <Call name="setInitParameter">
                  <Arg>stickySessions</Arg>
                  <Arg><Property name="jetty.proxy.stickySessions" default="false" /></Arg>
                </Call>
  2. start.iniを修正する
    cat >> $JETTY_HOME/start.ini << EOT
    
    --module=proxy
    jetty.proxy.servletClass=org.eclipse.jetty.proxy.BalancerServlet
    jetty.proxy.servletMapping=/proxy/*
    EOT
  3. 設定を反映する
    systemctl restart jetty
    or
    jetty.sh restart

Notice: Trying to get property 'queue' of non-object in /usr/local/wordpress/wp-includes/script-loader.php on line 2876

Warning: Invalid argument supplied for foreach() in /usr/local/wordpress/wp-includes/script-loader.php on line 2876