Kohei Nozaki's blog 

ProjectStageをJNDIで設定する


Posted on Tuesday Jan 21, 2014 at 07:39AM in Technology


環境

  • WildFly 8.0.0CR1

何をするの?

JSFのProjectStageをJNDIから取得するように設定してみます。このProjectStageというのはJSFエンジンに与えるパラメータの一種で、値としてはPRODUCTION(本番稼働フェーズ)、DEVELOPMENT(開発フェーズ)などが定義されています。開発フェーズではDEVELOPMENTにしておくと、問題発生時にデバッグのための情報が多く吐き出されたり、本番稼働フェーズではPRODUCTIONにしておくと、パフォーマンスが向上したりします。

基本的にはweb.xmlに定義するのですが、web.xmlに直接書いてしまうと本番稼働時にPRODUCTIONに変更したい、となったときに若干面倒です。そこでこの値をJNDIから取得するようにしてみます。

JNDIの設定

jboss-cliを起動

wildflyのbinディレクトリ内に存在するCLIの管理コンソールです。GlassFishのasadminに相当すると思われます。Windowsではjboss-cli.bat、Unix系ではjboss-cli.shを使って起動します。起動するとこんな感じになります

$ ./jboss-cli.sh
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
[disconnected /] 

接続

connect とコマンドを打つとAPサーバに接続するようです

[disconnected /] connect
[standalone@localhost:9990 /] 

JNDIエントリを新規作成

新たにJNDIエントリを追加するときはこれ。java:/env/jsf/ProjectStageがキー、Developmentが値になります

/subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage/:add(binding-type=simple,value=Development,class=java.lang.String)

こういう感じにsuccessと出ればOK

[standalone@localhost:9990 /] /subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage/:add(binding-type=simple,value=Development,class=java.lang.String)
{"outcome" => "success"}
[standalone@localhost:9990 /]

JNDIエントリを更新

既に作ったエントリを更新する場合はこんな感じ。java:/env/jsf/ProjectStageをUnitTestに変更する例はこちら

/subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage/:write-attribute(name=value,value=UnitTest)

JNDIエントリを確認

こんな感じ。一番右側のvalueというところに設定した値が出ています

[standalone@localhost:9990 /] ls /subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage
binding-type=simple     cache=undefined         class=java.lang.String  environment=undefined   lookup=undefined        module=undefined        type=undefined          value=UnitTest          
[standalone@localhost:9990 /] 

JNDIエントリの一覧

[standalone@localhost:9990 /] ls /subsystem=naming/binding
java:/env/jsf/ProjectStage  
[standalone@localhost:9990 /] 

まだ1つだけしか無いようですね

JNDIエントリを参照するJSFアプリを作ってみる

プロジェクトを作る

ここまでに述べた通りJNDIエントリは作成してあるものとします。ここに書いたのと同じ要領で空っぽのJavaEE7プロジェクトを作ります。プロジェクトの設定でCDIを有効にしておきます。これをやると空のbeans.xmlが作成されます。

web.xmlを作る

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>
	<resource-ref>
		<res-ref-name>jsf/ProjectStage</res-ref-name>
		<res-type>java.lang.String</res-type>
	</resource-ref>
</web-app>

jboss-web.xmlを作る

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
	<resource-ref>
		<res-ref-name>jsf/ProjectStage</res-ref-name>
		<res-type>java.lang.String</res-type>
		<jndi-name>java:/env/jsf/ProjectStage</jndi-name>
	</resource-ref>
</jboss-web>

CDI管理Beanを作る

package psjndi;

import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;

@Named
@RequestScoped
public class TestBean {

	public String getProjectStage() {
		return FacesContext.getCurrentInstance().getApplication().getProjectStage().toString();
	}
}

XHTMLを作る

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head> 
<body> 
#{testBean.projectStage}
</body> 
</html>

資源の配置場所を確認

上記の資源たちの配置はこんな感じになります。beans.xmlも存在する事を確認してください。

確認したらデプロイしてみます。

アクセスしてみる

JNDIに設定した通りDevelopmentと表示されます。

ProjectStageを変更してみる

jboss-cliから変更してみる

UnitTestに変更してみます。

[standalone@localhost:9990 /] /subsystem=naming/binding=java\:\/env\/jsf\/ProjectStage/:write-attribute(name=value,value=UnitTest)
{
    "outcome" => "success",
    "response-headers" => {
        "operation-requires-reload" => true,
        "process-state" => "reload-required"
    }
}
[standalone@localhost:9990 /] 

アプリにアクセスしてみる

これだけやってブラウザをリロードしてもDevelopmentのままです。まあoperation-requires-reloadとか言っているので再起動なりの作業が必要なのでしょう。そこで再起動かけてみます。Servers窓からWildFlyの右クリックメニューを表示してRestartを選びます。再起動したら再度リロードしてみます。 アプリの資源を一切触る事無く変更することができました。

ProjectStage一覧

  1. Development
  2. UnitTest
  3. SystemTest
  4. Production

Productionに近づくほど例外とかの詳細度が低くなっていきパフォーマンスが向上するらしい。うろ覚えですが、速くなる他にも、キャッシュとかの挙動が変わったりJSFが自動で用意するJavaScriptが差し替えられていたりしたような記憶が有ります。おそらくDevelopmentではデバッグしやすいJavaScriptが送られたりするのでしょう。

参考文献


ApacheとWildFlyをmod_jkで繋ぐ


Posted on Tuesday Jan 21, 2014 at 07:34AM in Technology


環境

  • さくらインターネット VPS 1G
  • CentOS 6.5
  • WildFly 8.0.0CR1
  • Apache 2.2.24
  • tomcat-connectors-1.2.37-src.tar.gz
  • ここに書いた作業をした後

何をするの?

ApacheとWildFlyをmod_jkで繋ぎます

mod_jkを入れる

ビルドとインストール

yumとかでインストール出来れば楽なのですが、見当たらなかったのでここからソースを取ってきます

sudo yum install httpd-devel
tar zxvf tomcat-connectors-1.2.37-src.tar.gz
cd tomcat-connectors-1.2.37-src/native
./configure --with-apxs=/usr/sbin/apxs
make -j 2
sudo make install

設定ファイルの雛型をコピー

sudo cp tomcat-connectors-1.2.37-src/conf/httpd-jk.conf /etc/httpd/conf.d
sudo cp tomcat-connectors-1.2.37-src/conf/workers.properties.minimal /etc/httpd/conf/workers.properties
sudo service httpd restart

動作確認

jk-status画面を表示したいのですが、localhostからのアクセスしか許可してないので、sshのトンネル経由でアクセスしてみる。手元の端末で以下を実行

ssh [SERVER ADDRESS] -L 10080:localhost:80

その後ブラウザでここを開いてみると

まだWildFly側で受け入れの設定はしてないけど一応動いてますね

WildFly側の設定

CLIの管理コンソールを起動する

sudo -u wildfly /usr/local/wildfly/bin/jboss-cli.sh

設定コマンドを打ち込む

connect
/subsystem=undertow/server=default-server/ajp-listener=myListener:add(socket-binding=ajp, scheme=http, enabled=true)
exit

こういう感じになればOK

$ sudo -u wildfly /usr/local/wildfly/bin/jboss-cli.sh
You are disconnected at the moment. Type 'connect' to connect to the server or 'help' for the list of supported commands.
[disconnected /] connect
[standalone@localhost:9990 /] /subsystem=undertow/server=default-server/ajp-listener=myListener:add(socket-binding=ajp, scheme=http, enabled=true)
{"outcome" => "success"}
[standalone@localhost:9990 /]

telnetで覗いてみる

ちゃんとポートが開いているようです

$ telnet localhost 8009
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^]

telnet> quit
Connection closed.
$ 

Apache側の設定

ここではとりあえず何も考えず全部WildFlyに飛ばすことにします

sudo sh -c 'cat > /etc/httpd/conf.d/jk.conf' <<EOF
<IfModule jk_module>
    JkMount /* lb
</IfModule>
EOF
sudo service httpd restart
]]>

終わったらグローバルIPアドレス経由でアクセスしてみましょう。

単純な設定しかしてませんがとりあえず繋がったようですね。管理コンソールは9990番ポート経由でないとアクセス出来ないので、リモートから80番経由で管理コンソールを触られる心配はないようです。

参考文献


さくらVPSにJRE, WildFly, PostgreSQL, Apacheを入れる


Posted on Tuesday Jan 21, 2014 at 07:24AM in Technology


環境

  • さくらインターネット VPS 1G
  • CentOS 6.5
  • ここに書いた作業をした後

何をするの?

  1. JRE (jre-7u51-linux-x64.rpm) を入れる
  2. WildFly (wildfly-8.0.0.CR1.tar.gz) を入れる
  3. PostgreSQL 9.2.6を入れる
  4. Apacheを入れる

JREを入れる

いまのところこのへんにあります。私はjre-7u51-linux-x64.rpmを取ってきました。

<![CDATA[
sudo rpm -ivh jre-7u51-linux-x64.rpm
]]>

動作確認

$ java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)
$ 

WildFlyを入れる

ユーザを作ります

sudo useradd wildfly

tarballを展開します

sudo tar zxvf wildfly-8.0.0.CR1.tar.gz -C /usr/local --no-same-owner
sudo chown -R wildfly:wildfly /usr/local/wildfly-8.0.0.CR1
sudo ln -s /usr/local/wildfly-8.0.0.CR1 /usr/local/wildfly

設定ファイルを作ります

sudo mkdir /etc/java
sudo sh -c 'cat > /etc/java/java.conf' <<EOF
export JAVA_HOME=/usr/java/default
EOF
sudo sh -c 'cat > /etc/default/wildfly.conf' <<EOF
export JBOSS_HOME=/usr/local/wildfly
export JBOSS_USER=wildfly
export LANG=ja_JP.UTF-8
EOF

ログとpid出力用のディレクトリを作ります

sudo mkdir /var/run/wildfly
sudo mkdir /var/log/wildfly

起動スクリプトを置きます

sudo cp /usr/local/wildfly-8.0.0.CR1/bin/init.d/wildfly-init-redhat.sh /etc/init.d/wildfly
sudo chkconfig --add wildfly
sudo chkconfig wildfly on

起動してみます

$ sudo service wildfly start
Starting wildfly:                                          [  OK  ]
$

ログとpidファイルを確認してみます

$ ls -l /var/log/wildfly
合計 8
-rw-r--r-- 1 root root 4670  1月 19 11:54 2014 console.log
$ ls -l /var/run/wildfly
合計 4
-rw-r--r-- 1 wildfly wildfly 6  1月 19 11:54 2014 wildfly.pid
$ 

ログを見てみます

=========================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: /usr/local/wildfly

  JAVA: /usr/java/default/bin/java

  JAVA_OPTS:  -server -XX:+UseCompressedOops -Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true

=========================================================================

11:48:59,714 INFO  [org.jboss.modules] (main) JBoss Modules version 1.3.0.Final
11:49:05,184 INFO  [org.jboss.msc] (main) JBoss MSC version 1.2.0.CR1
11:49:05,351 INFO  [org.jboss.as] (MSC service thread 1-2) JBAS015899: WildFly 8.0.0.CR1 "WildFly" starting
11:49:07,201 INFO  [org.xnio] (MSC service thread 1-1) XNIO version 3.2.0.Beta4
11:49:07,208 INFO  [org.jboss.as.server] (Controller Boot Thread) JBAS015888: Creating http management service using socket-binding (management-http)
11:49:07,216 INFO  [org.xnio.nio] (MSC service thread 1-1) XNIO NIO Implementation Version 3.2.0.Beta4
11:49:07,278 INFO  [org.jboss.remoting] (MSC service thread 1-1) JBoss Remoting version (unknown)
11:49:07,302 INFO  [org.jboss.as.clustering.infinispan] (ServerService Thread Pool -- 33) JBAS010280: Activating Infinispan subsystem.
11:49:07,314 INFO  [org.jboss.as.naming] (ServerService Thread Pool -- 41) JBAS011800: Activating Naming Subsystem
11:49:07,325 INFO  [org.jboss.as.webservices] (ServerService Thread Pool -- 50) JBAS015537: Activating WebServices Extension
11:49:07,317 INFO  [org.jboss.as.security] (ServerService Thread Pool -- 46) JBAS013171: Activating Security Subsystem
11:49:07,376 INFO  [org.jboss.as.security] (MSC service thread 1-2) JBAS013170: Current PicketBox version=4.0.20.Beta2
11:49:07,395 INFO  [org.jboss.as.jsf] (ServerService Thread Pool -- 39) JBAS012615: Activated the following JSF Implementations: [main]
11:49:07,616 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 49) JBAS017502: Undertow 1.0.0.Beta30 starting
11:49:07,665 INFO  [org.jboss.as.naming] (MSC service thread 1-2) JBAS011802: Starting Naming Service
11:49:07,646 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-1) JBAS017502: Undertow 1.0.0.Beta30 starting
11:49:07,715 INFO  [org.jboss.as.mail.extension] (MSC service thread 1-4) JBAS015400: Bound mail session [java:jboss/mail/Default]
11:49:07,716 INFO  [org.jboss.as.connector.logging] (MSC service thread 1-4) JBAS010408: Starting JCA Subsystem (IronJacamar 1.1.2.Final)
11:49:07,725 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 28) JBAS010403: Deploying JDBC-compliant driver class org.h2.Driver (version 1.3)
11:49:07,775 INFO  [org.jboss.as.connector.deployers.jdbc] (MSC service thread 1-1) JBAS010417: Started Driver service with driver-name = h2
11:49:07,947 INFO  [org.wildfly.extension.undertow] (ServerService Thread Pool -- 49) JBAS017527: Creating file handler for path /usr/local/wildfly/welcome-content
11:49:07,978 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-3) JBAS017525: Started server default-server.
11:49:08,004 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) JBAS017531: Host default-host starting
11:49:08,497 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-4) JBAS017519: Undertow HTTP listener default listening on /127.0.0.1:8080
11:49:09,116 INFO  [org.jboss.as.remoting] (MSC service thread 1-2) JBAS017100: Listening on 127.0.0.1:9999
11:49:09,147 INFO  [org.jboss.as.server.deployment.scanner] (MSC service thread 1-1) JBAS015012: Started FileSystemDeploymentService for directory /usr/local/wildfly/standalone/deployments
11:49:09,248 INFO  [org.jboss.ws.common.management] (MSC service thread 1-3) JBWS022052: Starting JBoss Web Services - Stack CXF Server 4.2.3.Final
11:49:09,310 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-4) JBAS010400: Bound data source [java:jboss/datasources/ExampleDS]
11:49:09,474 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management
11:49:09,475 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990
11:49:09,475 INFO  [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.CR1 "WildFly" started in 10253ms - Started 184 of 232 services (78 services are lazy, passive or on-demand)
ログはもう一カ所 /usr/local/wildfly/standalone/log にもあります。こっちがメインっぽいです。

listenしているポートを確認してみます

$ netstat -an | grep LISTEN | grep tcp
tcp        0      0 127.0.0.1:9999              0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:8080              0.0.0.0:*                   LISTEN      
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:9990              0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN      
$ 
localhostしかlistenしてないのでこのままでいいかな。

WildFlyの管理ユーザを作ります

別に今すぐは使いませんが一応。

sudo -u wildfly /usr/local/wildfly/bin/add-user.sh [USERNAME] [PASSWORD]

Webの管理コンソールから設定状況を見てみます

手元の端末でトンネルを作ります

ssh [IP ADDRESS] -L 10080:localhost:80 -L 19990:localhost:9990

ここにアクセスするとトンネル経由でWebの管理コンソールにアクセス出来ます。ユーザ名とパスワードは先ほど入力した物を使います。

止めてみます

$ sudo service wildfly stop
Stopping wildfly:                                          [  OK  ]
$ ps -Af | grep java
kyle     25222 24452  0 11:58 pts/0    00:00:00 grep java
$
問題なさげ。一応リブートしてシャットダウンスクリプトと起動スクリプトが走るか確認しておくとベターかも。

PostgreSQLを入れる

インストール

<![CDATA[
sudo yum install http://yum.postgresql.org/9.2/redhat/rhel-6-x86_64/pgdg-centos92-9.2-6.noarch.rpm
sudo yum install postgresql92-server postgresql92-contrib
sudo service postgresql-9.2 initdb
sudo chkconfig postgresql-9.2 on
]]>

WildFlyから接続できるように認証方式を変更する

sudo -u postgres cp /var/lib/pgsql/9.2/data/pg_hba.conf /var/lib/pgsql/9.2/data/pg_hba.conf.bak
sudo -u postgres sed -i -e "s/^host    all             all             127.0.0.1\/32            ident/host    all             all             127.0.0.1\/32            md5/" /var/lib/pgsql/9.2/data/pg_hba.conf

動かしてみる

$ sudo service postgresql-9.2 start
Starting postgresql-9.2 service:                           [  OK  ]
$

Apacheを入れる

インストール

sudo yum install httpd
sudo chkconfig httpd on

動かしてみる

$ sudo service httpd start
Starting httpd:                                            [  OK  ]
$

アクセスしてみる

普通に手元の端末のブラウザからアクセス可。

参考文献


さくらVPSの初期設定をしてみる


Posted on Tuesday Jan 21, 2014 at 06:43AM in Technology


環境

  • さくらインターネット VPS 1G
  • CentOS 6.5

何をするの?

  1. 一般ユーザを作る
  2. 作ったユーザの公開鍵を置く
  3. 作ったユーザがsudo出来るようにする
  4. sshのパスワード認証を無効化
  5. ssh以外のポートが空いてない事を確認
  6. iptablesでsshとhttp以外を遮断
  7. IPv6を無効化

接続まで

Webから申し込みをして5分ほどで、IPアドレスとrootアカウントのパスワードが書かれた仮登録完了メールが届くが、この時点ではまだ起動していないのでVPSコントロールパネルから起動してやらないといけない。さらにVPSコントロールパネルからリモートコンソールを開くとOSの起動ログが見える。リモートコンソールでログインプロンプトが表示されたのを確認してからsshで接続すると良い。

OSのアップデート

まあ一応ログインしたらすぐやっておく。やってみたけど特に何も更新はなかった。

yum update

ユーザを作る

面倒くさいけどsshでrootログイン出来るとか若干気持ち悪いのでやっておきましょう。こういう感じ

# adduser kyle
# passwd kyle
ユーザー kyle のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。
# 
終わったら作ったユーザでログインし直しましょう。

公開鍵を置く

こんな感じかと

<![CDATA[
cd
mkdir .ssh
chmod 700 .ssh
cat > .ssh/authorized_keys << EOF
[YOUR PUBLIC KEY HERE]
EOF
chmod 600 .ssh/authorized_keys
]]>
実行するとこうなる
$ ls -ld .ssh
drwx------ 2 kyle kyle 4096  1月 19 09:08 2014 .ssh
$ ls -l .ssh
合計 4
-rw------- 1 kyle kyle 408  1月 19 09:08 2014 authorized_keys
$ 

sudo出来るようにする

suしてvisudoを起動します

$ su - 
パスワード:
# visudo
起動したら一番下に以下を追加。面倒くさいので全部パスワード不要にする。
kyle    ALL=(ALL)       NOPASSWD: ALL
確認してみよう
$ sudo whoami
root
$ 
大丈夫そうですね

sshのパスワード認証を無効にする

日常的にブルートフォースアタック的なものが飛んでくる今日においては嫌な感じなので無効にしておきましょう

cd /etc/ssh
sudo cp sshd_config sshd_config.bak
sudo sed -i -e "s/^PasswordAuthentication yes/PasswordAuthentication no/" sshd_config
変更したら再起動
sudo service sshd restart
万が一入れなくなったらWebのリモートコンソールからログインしてなんとかしましょう。

空いてるポートを確認する

$ netstat -an | grep LISTEN | grep tcp
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      
tcp        0      0 :::22                       :::*                        LISTEN      
tcp        0      0 ::1:25                      :::*                        LISTEN      
$ 

22と25だからsshとメールですかね。外に向けて空いてるのはsshだけだ。

ポートスキャンサービスを使って空いてるポートを確認する

25番が空いてるか閉じてるか手元の端末から叩いても分からない(そもそも25番向けの外向きパケットはほとんどのISPで遮断される?)し、念のためポートスキャンサービスを使って確かめてもらいます。

ここを使います。GRC | ShieldsUP! — Internet Vulnerability Profiling ここで問題なのがこのサービスは、そのサービスにアクセスしたIPアドレスに対してしかスキャンかけてくれない事ですね。まあしょうがない。ゆえに若干力技ですがsshを使ってsocksのトンネル(?)を使ってアクセスします。手元の端末で以下を叩くと手元の端末でsocksサーバが立ち上がります。Windowsでもputtyの設定でゴニョゴニョすればsocksサーバ立てられたはず。

ssh [YOUR VPS IP ADDRESS HERE] -D 1080
こうすると手元の1080番にsocksサーバが立ち上がり、VPSを通じてWebアクセスができるようになります。socks用WebブラウザとしてはOperaが良い。OSのプロキシの設定いじらなくても独立した設定をアプリで持ってくれるので。こんな感じになります

Proceedっていうボタン押して遷移する画面でAll Service Portsを押すとポートスキャンが始まります

----------------------------------------------------------------------

GRC Port Authority Report created on UTC: 2014-01-19 at 00:55:26

Results from scan of ports: 0-1055

    1 Ports Open
 1055 Ports Closed
    0 Ports Stealth
---------------------
 1056 Ports Tested

NO PORTS were found to be STEALTH.

The port found to be OPEN was: 22

Other than what is listed above, all ports are CLOSED.

TruStealth: FAILED - NOT all tested ports were STEALTH,
                   - NO unsolicited packets were received,
                   - A PING REPLY (ICMP Echo) WAS RECEIVED.

----------------------------------------------------------------------

開いてるのはsshだけですね。25番は127.0.0.1に対してしかlistenしてないから出てきません。

iptablesの設定

別にこのままでもいいのですが、PING返したくないし、一応念のためにiptablesの設定もします。sshとhttpだけ開けます。

sudo sh -c 'cat > /etc/sysconfig/iptables' <<EOF
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
COMMIT
EOF
sudo service iptables restart

この状態で再度ポートスキャンしてみるとこんな感じ

----------------------------------------------------------------------

GRC Port Authority Report created on UTC: 2014-01-19 at 04:32:40

Results from scan of ports: 0-1055

    1 Ports Open
    1 Ports Closed
 1054 Ports Stealth
---------------------
 1056 Ports Tested

The port found to be OPEN was: 22

The port found to be CLOSED was: 80

Other than what is listed above, all ports are STEALTH.

TruStealth: FAILED - NOT all tested ports were STEALTH,
                   - NO unsolicited packets were received,
                   - NO Ping reply (ICMP Echo) was received.

----------------------------------------------------------------------

IPv6の無効化

Apacheの設定とかで微妙にはまりそうな気配なので無効化しておく

sudo cp /etc/sysconfig/network /etc/sysconfig/network.bak
sudo sed -i -e 's/NETWORKING_IPV6="yes"/NETWORKING_IPV6=no/' /etc/sysconfig/network
echo 'options ipv6 disable=1' | sudo sh -c 'cat > /etc/modprobe.d/disable-ipv6.conf'
sudo chkconfig ip6tables off

参考文献


動かしてみる


Posted on Tuesday Jan 21, 2014 at 06:40AM in JBatch


jbatch(JSR352)とはJavaEE7から入ったバッチフレームワークの規格です。WildFly8ではGlassFish4とは別の実装が使われています。すごく簡単なのをWildFly8で動かしてみます。

環境

  • WildFly 8.0.0CR1
  • Eclipse等々はここで設定した状態

CDIの設定をする

プロジェクトの設定を開いてProject Facetsを選びCDIにチェックを入れてOKを押します。

ジョブXMLファイルを作る

ジョブを起動すると、まずこのXMLファイルがロードされます。JSR352ではアプリ開発者はこのXMLファイルとartifactと呼ばれるクラス群を作る必要があります。まずXMLファイルが読まれ、ここに書かれた通りにartifactが呼び出されます。

作る場所はこのへん.画像では/src/main/javaの下になっていますが,XMLファイル等のJavaソース以外のものは/src/main/resourcesに置くのが望ましいです.war内の位置で言うとclasses/META-INFの下になります。このファイルの名前がバッチの名前になります。

内容はとりあえずこんな感じ。
<?xml version="1.0" encoding="UTF-8"?>
<job id="job001" version="1.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
	<step id="step001">
		<batchlet ref="testBatchlet"/>
	</step>
</job>

Batchletを作る

Batchletは簡単な処理を書くときに使います。バルク処理とかをやるときは、ここで紹介するBatchletではなく、chunk方式と呼ばれるartifactを使ったほうがよいです。作るクラス1つだけで簡単なのでここではBatchletを作ります。XMLファイルとartifactはCDIの名前でひも付けるので、作る場所はどこでも良いです。

package com.example;

import javax.batch.api.AbstractBatchlet;
import javax.inject.Named;

@Named
public class TestBatchlet extends AbstractBatchlet{

	@Override
	public String process() throws Exception {
		System.out.println("Hello JSR352");
		return "SUCCESS";
	}
}

Servletを作る

バッチを動かす際の起点にします。ブラウザでServletにGETを飛ばすとバッチが動き出す感じです。定時実行とかスケジュール実行がしたければEJBタイマでやることもできます。

package com.example;

import java.io.IOException;
import java.util.Properties;

import javax.batch.runtime.BatchRuntime;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		long executionId = BatchRuntime.getJobOperator().start("job001", new Properties());
		response.getWriter().write("execution id: " + executionId);
	}
}

動かしてみる

デプロイしたらブラウザでアクセスしてみましょう

動いているようです。それっぽいログも出ています

ジョブを実行するとDB等にかなり詳細な履歴が残せるのですが、WildFly8のデフォルトではインメモリデータベースに格納されるだけになっているようで、後から参照する方法とかは少し調べましたが不明です。DBに残すようにする設定の方法はまた別途調べる予定。

JobOperator#start()で返るのはexecutionIdといって、このIDを使って実行中のバッチを止めたり、途中で死んだバッチを再実行したりできます。バッチの実行ごとに採番されます。リロードすると数字がインクリメントされていきます。