Symfoware

Symfowareについての考察blog

Application Request Routingを利用したaspxとJava Servletの連携

Application Request Routingを利用して、IISとTomcatを連携してみました。
IIS 10とTomcat 8.5をApplication Request Routingで連携

・リクエストがあったらServletへリバースプロキシ
・Servletでパラメーターのチェック
・パラメーターのチェックを通過したらaspxのページを表示
・チェックでエラーの場合は別のページに転送

こういったことが可能なのか試してみます。


事例



作成するサンプルの事例として、
・/test.aspxを表示するとき、パラメーターチェック用のサーブレット/sample/SampleServletに転送
・urlクエリー文字列p=[値]をサーブレットでチェック
・[値]=ng(チェック不可)の場合はgoogleに転送
・[値]=ok(チェックOK)の場合は、forward.aspxを表示

こういうパターンを考えてみます。

・http://www.example.com/test.aspx?p=ng
googleへ転送

・http://www.example.com/test.aspx?p=ok
forward.aspxを表示

こんな感じです。



サーブレットに転送して値を取得



まず、サーブレットにリクエストを転送してクエリ文字列を取得するところまでやってみます。

サーブレットのソースはこのようになりました。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. @WebServlet("/SampleServlet")
  10. public class MyServlet extends HttpServlet {
  11.     private static final long serialVersionUID = 1L;
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13.         // 要求文字コードのセット
  14.         request.setCharacterEncoding("UTF-8");
  15.         // 応答文字コードのセット
  16.         response.setContentType("text/html; charset=UTF-8");
  17.         // 出力ストリームの取得
  18.         PrintWriter out = response.getWriter();
  19.         // クライアント(ブラウザ)への出力
  20.         out.println("<html lang=\"ja\">");
  21.         out.println("<head><title>値の確認</title>");
  22.         out.println("</head><body>");
  23.         out.println("<h1>パラメーター。</h1>");
  24.         out.println(request.getParameter("p"));
  25.         out.println("");
  26.         out.println("</body></html>");
  27.         // 出力ストリームを閉じる
  28.         out.close();
  29.     }
  30. }




IISのURL書き換えルールを変更します。

正規表現パターンを選択し、パターンは「^test.aspx.*」としました。

812_01.png


転送先は/sample/SampleServletを指定します。
クエリ文字列の追加にはチェックをつけておきます。

812_02.png


これで、http://[IISサーバー]/test.aspx?p=okを表示すると、狙い通りサーブレットからの応答が得られました。

812_03.png




パラメーターngの処理



パラメーターが「ng」の場合、googleに転送する処理を追加します。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. @WebServlet("/SampleServlet")
  10. public class MyServlet extends HttpServlet {
  11.     private static final long serialVersionUID = 1L;
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13.         // 要求文字コードのセット
  14.         request.setCharacterEncoding("UTF-8");
  15.         // 応答文字コードのセット
  16.         response.setContentType("text/html; charset=UTF-8");
  17.         
  18.         // 出力ストリームの取得
  19.         PrintWriter out = response.getWriter();
  20.         
  21.         String param = request.getParameter("p");
  22.         if ("ng".equals(param)) {
  23.             // IISのトップページが表示されてしまう。
  24.             //response.sendRedirect("https://www.google.co.jp/");
  25.             
  26.             out.println("<html lang=\"ja\">");
  27.             out.println("<head><title>redirect</title>");
  28.             out.println("<meta http-equiv=\"refresh\" content=\"0;URL=https://www.google.co.jp/\">");
  29.             out.println("</head><body>");
  30.             out.println("</body></html>");
  31.             
  32.         } else {
  33.         
  34.             // クライアント(ブラウザ)への出力
  35.             out.println("<html lang=\"ja\">");
  36.             out.println("<head><title>値の確認</title>");
  37.             out.println("</head><body>");
  38.             out.println("<h1>パラメーター。</h1>");
  39.             out.println(param);
  40.             out.println("");
  41.             out.println("</body></html>");
  42.         }
  43.         // 出力ストリームを閉じる
  44.         out.close();
  45.     }
  46. }




最初、「response.sendRedirect("https://www.google.co.jp/")」とすれば良いと思っていましたが、
どうもIISのトップページが表示されてしまいます。
htmlのrefreshタグを出力してリダイレクトを実現しました。

これで、パラメーターがng以外の場合はサーブレットの画面を表示。

812_04.png


ngに変更した場合は...

812_05.png

googleに転送されるようになりました。

812_06.png




forward.aspx



c:\inetpub\wwwrootにforward.aspxを作成しました。

・forward.aspx


  1. <%@ Page Language="C#" %>
  2. <script runat="server">
  3. protected void Page_Load(Object source, EventArgs e) {
  4.     if (IsPostBack) {
  5.         return;
  6.     }
  7.     literal1.Text = Request["from"];
  8. }
  9. </script>
  10. <html lang="ja">
  11. <head>
  12.     <title>test</title>
  13. </head>
  14. <body>
  15. <asp:Literal id="literal1" Text="asp:Literal" runat="server" />
  16. </body>
  17. </html>




サーブレットから転送されるパラメーターを表示します。
サーブレットのソースはこのようになりました。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.RequestDispatcher;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. @WebServlet("/SampleServlet")
  11. public class MyServlet extends HttpServlet {
  12.     private static final long serialVersionUID = 1L;
  13.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14.         // 要求文字コードのセット
  15.         request.setCharacterEncoding("UTF-8");
  16.         // 応答文字コードのセット
  17.         response.setContentType("text/html; charset=UTF-8");
  18.         
  19.         // 出力ストリームの取得
  20.         PrintWriter out = response.getWriter();
  21.         
  22.         String param = request.getParameter("p");
  23.         if ("ng".equals(param)) {
  24.             // IISのトップページが表示されてしまう。
  25.             //response.sendRedirect("https://www.google.co.jp/");
  26.             
  27.             out.println("<html lang=\"ja\">");
  28.             out.println("<head><title>redirect</title>");
  29.             out.println("<meta http-equiv=\"refresh\" content=\"0;URL=https://www.google.co.jp/\">");
  30.             out.println("</head><body>");
  31.             out.println("</body></html>");
  32.             
  33.         } else {
  34.             response.sendRedirect("/forward.aspx?from=Tomcat");
  35.         }
  36.         // 出力ストリームを閉じる
  37.         out.close();
  38.     }
  39. }




「from=Tomcat」というパラメーターを設定して、forward.aspxへリダイレクトしています。
これでtest.aspx?p=okを表示すると

812_07.png


forward.aspxが表示されました。

812_08.png


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/11/19(日) 19:27:19|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

IIS 10とTomcat 8.5をApplication Request Routingで連携

昔は
Webサーバー:IIS
アプリケーションサーバー:Tomcat
の構成を取るとき、mod_jkを使用していたかと思います。

最近は、ルーティングを行うIIS拡張が用意されているようで、こちらを使用すれば
狙った動作が行えるようです。
Application Request Routingを使ってみた

早速試してみます。


IIS



こちらの手順でインストールしたWindows Server 2016 + IIS 10.0の環境でテストしました。
Windows Server 2016 にIIS 10.0をインストールし、ASP.NETを有効化




Application Request Routing



こちらからインストーラーをダウンロードしました。
Application Request Routing

811_01.png


「ARRv3_0.exe」が取得できますので、実行します。
「インストール」をクリックしてインストールを実行。

811_02.png


ライセンスの確認です。
「同意する」をクリックするとインストールが開始されます。

811_03.png


インストール終了。「完了」をクリックします。

811_04.png


「終了」でインストーラーを終了します。

811_05.png


インストール後、IISマネージャーの画面を見ると、
・Application Request Routing
・URL書き換え
の機能が追加されています。

811_06.png




ルーティング



こちらで作成したサーブレットにルーティングしてみます。
Eclipse TomcatPluginでサーブレットアプリケーションの作成

ちょっとプログラムを修正しました。


  1. package sample;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import javax.servlet.ServletException;
  5. import javax.servlet.annotation.WebServlet;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. @WebServlet("/SampleServlet")
  10. public class MyServlet extends HttpServlet {
  11.     private static final long serialVersionUID = 1L;
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13.         // 要求文字コードのセット
  14.         request.setCharacterEncoding("UTF-8");
  15.         // 応答文字コードのセット
  16.         response.setContentType("text/html; charset=UTF-8");
  17.         // 出力ストリームの取得
  18.         PrintWriter out = response.getWriter();
  19.         // クライアント(ブラウザ)への出力
  20.         out.println("<html lang=\"ja\">");
  21.         out.println("<head><title>Servletテンプレート</title>");
  22.         out.println("</head><body>");
  23.         out.println("<h1>Servletのテンプレートです。</h1>");
  24.         out.println("<img src=\"img/banar.png\">");
  25.         out.println("");
  26.         out.println("</body></html>");
  27.         // 出力ストリームを閉じる
  28.         out.close();
  29.     }
  30. }




今後のテスト用にimg/banar.pngを表示するように修正しています。

811_07.png


※バナーの作成はこちらのサイトを利用させていただきました。
進撃の巨人ロゴジェネレーター




IISの設定画面から「Application Request Routing」を選択。

811_08.png


右側「Proxy」の項目にある「Server Proxy Settings...」をクリック。

811_09.png


先頭の「Enable proxy」にチェックをつけて有効にします。

811_10.png


画面をスクロールして一番下「Proxy Type」の設定です。
「Use URL Rewrite to inspectioncoming requests」にチェック。
今回SSLは使用しないので、「Enable SSL offloading」のチェックは外しました。

「Reverse proxy」の項目に、サーブレットが動いているサーバーのIPとポートを入力します。
※今回は「192.168.1.4:8080」

入力が終わったら「適用」をクリックして内容を反映させます。

811_11.png


「URL書き換え」の項目を開きます。

811_12.png


新しくルールが追加されました。

811_13.png


内容を見てみると、http://192.168.1.4:8080/[パラメーター]に書き換えられることが確認できます。

811_14.png


IISが動いているサーバーは「192.168.1.102」です。
http://192.168.1.102/sample/SampleServletにアクセスすると、ちゃんとサーブレットが実行されました。

811_15.png






除外設定



画像はIISから配信するよう構成します。
c:\inetpub\wwwroot\sample\imgにbanar.pngという名前でこの画像を配置しました。

811_16.png


「URL書き換え」の画面を表示し、「規則の追加」をクリックします。

811_17.png


表示されるダイアログで「空の規則」を選択し、「OK」をクリック。

811_18.png


ルールの名前は適当に「画像配信」としました。
要求されたURLでは「パターンに一致する」を選択。

パターンは正規表現で指定できます。
今回は「img」ディレクトリへのアクセスはIISで配信するよう構成してみようと思います。
パターンに「.*/img/.*」と入力しました。/img/が含まれているURLはIISで処理します。

811_19.png


画面をスクロールして最下部。
アクションの種類は「なし」
「後続の規則の処理を停止する」にチェックをつけておきます。

811_20.png


新規作成したルールは末尾に追加されます。
サーブレットへproxyする前に処理しないとTomcat側の画像が表示されてしまうので、
右下「上に移動」をクリックして最初にルールが適用されるよう変更しておきます。

811_21.png

811_22.png


ブラウザを更新してやると、ちゃんとIISに配置したバナー画像が表示されました。

811_23.png




【参考URL】

Application Request Routingを使ってみた
関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/11/19(日) 16:02:14|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Redmine 3系 チケットやWikiの記述にHTMLタグを使用したい(redcloth3.rb)

Redmine 3.4.3をインストールしました。
Redmine 3.4.3をUbuntu Server 16.04へインストール(PostgreSQL, rbenv使用)

チケットやwikiにaタグを記載すると

810_01.png

エスケープされてしまいます。

810_02.png

ここはリンクになってほしい。



lib/redcloth3.rb



Wikiの記述にHTMLタグを使用したい

lib/redcloth3.rbを編集すればよいとのことですが、そんなファイルないよ...

探しまわった結果、パスが変わっています。


lib/redmine/wiki_formatting/textile/redcloth3.rb




Redmine 3系からでしょうか?
変更となったバージョンは調べてませんが、このファイルを編集してやります。
Redmineは/opt/redmine-3.4.3にインストールしています。


$ vi /opt/redmine-3.4.3/lib/redmine/wiki_formatting/textile/redcloth3.rb




ファイルの末尾、1214行目付近に「ALLOWED_TAGS」の項目があります。


  1. ALLOWED_TAGS = %w(redpre pre code kbd notextile)



参考にしたサイトに従い、aとfontを追記してみます。


  1. ALLOWED_TAGS = %w(redpre pre code kbd notextile a font)




編集がおわったらRedmineを再起動。
再度チケットの画面を見てみると、無事エスケープされずリンクになっていました。

810_03.png


関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/11/18(土) 19:08:48|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Redmine 3.4.3をUbuntu Server 16.04へインストール(PostgreSQL, rbenv使用)

Ubuntu Server 16.04へRedmine 3.4.3をインストールしてみます。

こちらを参考にしました。
Redmine 3.0.0をDebian 7(Wheezy)にインストールする



Rubyのインストール



rbenvを使用しました。
Ubuntu 16.04にrbenvでRubyのバージョンを管理する

Rubyのバージョンは2.4.2です。


$ ruby --version
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]






PostgreSQLのインストール



データベースはPostgreSQL 10.1を使用します。
PostgreSQL 10.1をUbuntu 16.04へインストールし、外部からの接続を許可




Redmineのインストール



gemでbundlerをインストール。


$ gem install bundler --no-rdoc --no-ri




Redmineのソースコードを取得し展開します。


$ cd /opt
$ sudo wget http://www.redmine.org/releases/redmine-3.4.3.tar.gz
$ sudo tar xzf redmine-3.4.3.tar.gz




PostgreSQL接続ドライバのビルド時にヘッダーが必要なので、事前にインストールしておきます。
合わせて、Redmineで使用するライブラリのビルド時に必要となるimagemagickをインストールしておきます。


$ sudo apt install postgresql-server-dev-10
$ sudo apt install imagemagick libmagickcore-dev libmagickwand-dev




/opt/redmine-3.4.3でbundle installコマンドを実行します。
これでRedmineが依存しているライブラリがインストールされます。
--withoutで使わないmysqlやsqliteをインストールしないようにしておきました。
※このオプション、もう過去のものかも。


$ cd /opt/redmine-3.4.3
$ bundle install --without development test mysql sqlite






データベースの作成



PostgreSQLに「redmine」というデータベースを作成します。
ユーザーの「pgadmin」は事前に作成しておきました。


$ psql -h localhost -U pgadmin -d postgres
Password for user pgadmin:
psql (10.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=# create database redmine;
CREATE DATABASE
postgres=# \q




config/database.ymlを新規作成。


$ vi config/database.yml




データベースの接続情報を記載します。


production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: pgadmin
  password: "P@ssw0rd"




rakeコマンドでデータベースの初期化を行います。


$ rake generate_secret_token
Could not find gem 'pg (~> 0.18.1)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.




エラーになりました。

どうやら、bundle install実行時にdatabase.ymlに記載されているadapterを読み取り、
適したドライバをインストールしているようです。

database.ymlは作成したので、再度bundle installを実行。


$ bundle install --without development test mysql sqlite
...
Fetching pg 0.18.4
Installing pg 0.18.4 with native extensions
...




PostgreSQLへの接続ライブラリがインストールされました。
再度データベースの初期化を実行。


$ rake generate_secret_token
$ RAILS_ENV=production rake db:migrate




デフォルトの日本語データを設定。


$ RAILS_ENV=production rake redmine:load_default_data

Select language: ar, az, bg, bs, ca, cs, da, de, el, en, en-GB, es, es-PA,
et, eu, fa, fi, fr, gl, he, hr, hu, id, it, ja, ko, lt, lv, mk, mn, nl, no,
pl, pt, pt-BR, ro, ru, sk, sl, sq, sr, sr-YU, sv, th, tr, uk, vi, zh, zh-TW [en] ja




webrickで動作確認します。


$ ruby bin/rails server webrick -e production -b 0.0.0.0




http://[サーバーIP]:3000を表示すればログイン画面が表示されます。
初期ID、パスワードは共に「admin」
※ログインすると最初にパスワードの変更を求められました。

[管理] - [情報]を確認します。

809_01.png


Redmine version:3.4.3.stable
Ruby version:2.4.2-p198 (2017-09-14) [x86_64-linux]
Rails version:4.2.8



Ruby 2.4.2 + Redmine 3.4.3が動いています。


webサーバーでの動作はこちらが参考になると思います。

Apache + passenger
Redmine 2.3.1をDebian 7(Wheezy)にインストールする

nginx + Puma
Puma + nginxでRedmine 2.6を動かす

nginx + jungle
jungleを使用して、Pumaをデーモンで自動起動する

関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/11/18(土) 18:48:03|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Ubuntu 16.04にrbenvでRubyのバージョンを管理する

今までRVMを使用していたのですが、rbenvも使ってみようと思います。

こちらを参考にさせていただきました。
Ubuntu14.04 に rbenv をインストールして Ruby のバージョン管理



rbenvのインストール



まず、インストール済のバッケージを最新に更新しておきます。


$ sudo apt update
$ sudo apt upgrade




rubyのビルドに必要なパッケージをインストール。


$ sudo apt install git build-essential libssl-dev



rbenvを取得


$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build




.profileを編集。


$ vi ~/.profile




末尾に以下の内容を追記。


export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"




追記した内容を反映。


$ source ~/.profile




ちゃんとコマンドを認識していますね。


$ rbenv --version
rbenv 1.1.1-6-g2d7cefe







Rubyのインストール



インストール可能なバージョンの一覧を表示してみます。


$ rbenv install --list




現時点では、2.4.2が最新のようです。
バージョンを指定してインストールしてみます。


$ rbenv install 2.4.2
Downloading ruby-2.4.2.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.bz2
Installing ruby-2.4.2...

BUILD FAILED (Ubuntu 16.04 using ruby-build 20170914-15-g449ba6b)

Inspect or clean up the working tree at /tmp/ruby-build.20171118173115.12067
Results logged to /tmp/ruby-build.20171118173115.12067.log

Last 10 log lines:
installing rdoc:             /home/baranche/.rbenv/versions/2.4.2/share/ri/2.4.0/system
installing capi-docs:         /home/baranche/.rbenv/versions/2.4.2/share/doc/ruby
The Ruby readline extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
Try running `apt-get install -y libreadline-dev` to fetch missing dependencies.

Configure options used:
--prefix=/home/baranche/.rbenv/versions/2.4.2
LDFLAGS=-L/home/baranche/.rbenv/versions/2.4.2/lib
CPPFLAGS=-I/home/baranche/.rbenv/versions/2.4.2/include




エラーになりました。
警告通りlibreadline-devをインストールしてリトライ。


$ sudo apt install libreadline-dev
$ rbenv install 2.4.2
Downloading ruby-2.4.2.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.bz2
Installing ruby-2.4.2...
Installed ruby-2.4.2 to /home/baranche/.rbenv/versions/2.4.2




インストール成功です。
しかし、この状態でrubyコマンドを実行してもエラーになります。


$ ruby --version
rbenv: ruby: command not found

The `ruby' command exists in these Ruby versions:
2.4.2





「rbenv global」で使用するrubyのバージョンを指定してやります。


$ rbenv global 2.4.2




これでrubyコマンドが認識されました。


$ ruby --version
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/11/18(土) 17:46:18|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ