2012年7月25日水曜日

Tomcat7 on ScientificLinux6

背景


最近、Rubyの勉強を行なっている。で、Rubyと言えばRailsと思い立った。

実は、CRubyではなくJRubyでコードを書いている。そのため、RailsもTomcatなどのJavaアプリケーション・サーバーで走らせることになる。

動かすだけが目的であるならば、GoogleAppEngineだって、JRrubyやRailsが動くのでそれでも良い。

しかし、先日さくらのVPSのりようを開始したりで手元に環境が揃っているため、自前でアプリケーション・サーバーを用意することにした。

動作させるOSはScientificLinux6。ちなみに、すでにJenkinsが動作しているサーバーであるため、ポートが重なったりしないよう気をつけなければならない。


手順


  • JDKのインストール
  • tomcatのインストール
  • tomcatの設定
  • apacheの設定


JDKのインストール


大事なのは、インストール作業よりも環境変数の登録。


# vim ~/.bashrc
export JAVA_HOME=/usr/java/default
export PATH="$PATH":$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar


#source .bashrc

tomcatのインストール


#wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-7/v7.0.29/bin/apache-tomcat-7.0.29.tar.gz
#tar xzf apache-tomcat-7.0.29.tar.gz
#mv apache-tomcat-7.0.29 /usr/local/tomcat
#rm -rf apache-tomcat-7.0.29.tar.gz

tomcatの設定

#vim /etc/profile.d/tomcat.sh
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat
export CATALINA_HOME=/usr/local/tomcat
export CLASSPATH=$CLASSPATH:/$CATALINA_HOME/common/lib

起動スクリプトの記述

#vim /etc/rc.d/init.d/tomcat

#!/bin/bash

# Tomcat7: Start/Stop Tomcat 7
#
# chkconfig: - 90 10
# description: Tomcat is a Java application Server.

. /etc/init.d/functions
. /etc/sysconfig/network
source /etc/profile.d/tomcat.sh

TOMCAT_USER=tomcat
LOCKFILE=/var/lock/subsys/tomcat

RETVAL=0
start(){
        echo "Starting Tomcat7: "
        su - $TOMCAT_USER -c "$CATALINA_HOME/bin/startup.sh"
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $LOCKFILE
        return $RETVAL
}

stop(){
        echo "Shutting down Tomcat7: "
        $CATALINA_HOME/bin/shutdown.sh
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
        return $RETVAL
}

case "$1" in
        start)
        start
        ;;
        stop)
        stop
        ;;
        restart)
        stop
        start
        ;;
        status)
        status tomcat
        ;;
        *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac
exit $?

apacheの設定


ポートの変更

#vim /usr/local/tomcat/conf/server.xml
#http://server:8080 でのアクセスを禁止する
#コメントアウト
      
#AJPのポートを変更する

#8009 -> 8020 に変更

AJPの設定

#vim /etc/httpd/conf.d/prozy_ajp.conf
ProxyPass /tomcat/ ajp://localhost:8020/
デーモンの起動

#/etc/rc.d/init.d/httpd restart
#/etc/rc.d/init.d/tomcat start

サービスの登録

#chkconfig --add tomcat
#chkconfig tomcat on
というわけで、次はRails

2012年7月23日月曜日

mydns.jpに繋がらなくなった


mydns.jpに繋がらなくなった。


事の発端

先日、mydns.jpからメールが来た。

IPアドレスの通知が10日間確認できません。
※注意
・一週間以上IPアドレスの通知がないと、エラーサイトに誘導します。
・一ヶ月以上ご利用がないと、全てのデータを削除しますのでご注意ください。


ipアドレスの通知は、30分おきにwgetコマンドでログインページにアクセスすることで行なっている。

確かに、mydns.jpのログを見るとアクセス履歴がない。どうやら、サーバーからmydns.jpへの接続がうまく行ってないらしい。


結論

悪さをしていたのは、iptablesだった。一度

/etc/rc,d/init.d/iptables stop


で止めた上で

ping www.mydns.jp


を叩いたら繋がった。一先ず、接続許可リストにwww.mydns.jpを加えて問題解決。しかし、色々と腑に落ちない。

やったこと

まずは、pingを試してみる。

ping www.mydns.jp


は勿論、直接IPアドレスをターゲットにしたりもしたけどどうやら駄目。

次はtraceroute

見事に途中まで行って繋がらなくなっている。

この辺で困る。

routeコマンドでルーティングテーブル眺めたり、/etc/hostsとか/etc/resolver.confを眺めるも特に問題無さそう。

というか、mydns.jpにのみ繋がらない。

この辺で、@masawada君に頼んで彼のtracerouteの結果を見せてもらった。

どうも、mydns.jpの直前までは繋がっているらしい。と言うことはルーティングテーブルやDNSの設定ではないなー

って感じで悩んでて、ふとファイアーウォールかなー?と。

そういう訳で、iptablesの設定を変更してどうにか解決。

原因??


なんで、mydns.jpが弾かれていたのか結局謎。

接続拒否リストに載っていたとかってこともないし、特にブロックする設定にしていたわけでもない。

以前発生した似たような現象で、許可していない場所から、場所へのアクセスを全て弾く設定をしてしまっていたことがあったけど、今回はそういう事もない。

ただ1点気になるのはiptablesの設定ファイルの中に書いた

iptable -A INPUT -t filter -p tcp --syn -j DROP


コレが俺の思っている以上に強力なのではないだろうか。特に設定をしていないtcpパケットは弾くっていう意味で書いているつもりだけど、ぜんぜん違うのでは・・・?

iptables -L


を叩くと

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  jpn.www.mydns.jp     anywhere
ACCEPT     all  --  eu.www.mydns.jp      anywhere
ACCEPT     all  --  usa.www.mydns.jp     anywhere
ACCEPT     all  --  asia.www.mydns.jp    anywhere
ACCEPT     all  --  yoriko.mydns.jp      anywhere
ACCEPT     all  --  yoriko.mydns.jp      anywhere
ACCEPT     all  --  usa.www.mydns.jp     anywhere
ACCEPT     all  --  asia.www.mydns.jp    anywhere
ACCEPT     all  --  www.MyDNS.JP         anywhere
ACCEPT     all  --  eu.www.mydns.jp      anywhere
DROP       all  --  usa.www.mydns.jp     anywhere
DROP       all  --  asia.www.mydns.jp    anywhere
DROP       all  --  www.MyDNS.JP         anywhere
DROP       all  --  eu.www.mydns.jp      anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     udp  --  anywhere             anywhere            udp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere            udp dpt:http
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:nnsp
ACCEPT     udp  --  anywhere             anywhere            udp dpt:nnsp

ってなって、mydns.jpをDROPしてるし・・・?わからん・・・。わからんけど、今日は寝る。

2012年7月14日土曜日

Chrome Tech Night #3に参加したっ!

Google Japanオフィスに初めて潜入しました。





内容は、Google I/Oで行われたセッションの日本語訳。詳細は、Googleのブログを。

http://googledevjp.blogspot.jp/2012/07/chrome-tech-talk-night-3.html

ちなみに、僕自身はChrome Extensionは昨年のDevQuizで書いた経験しかありませんw

まずは、現状のChromeの話。

セキュリティ系統の話となると、パーミッションを設定してそれに同意した上でユーザはExtensionを導入するというシステムになっています。

丁度、Androidのアプリと同じ様な感じでしょうか。

しかしながら、現状では必要以上のパーミッションを要求するものや、システム上機能を有効利用できていないものが多くあるとのこと。

これらが生み出す問題は悪意のあるExtensionが公開されてしまう、ということよりもExtensionを利用することによって脆弱性が生み出されてしまうことの方が大きいそうです。

Extensionのコードを介して、WEBサイトに対してXSS攻撃が可能となったりするそうです。

さらに、APIももっと細かく提供することを考えているそうです。

これらのことが目指しているのは、開発者の意図をもっとはっきりとさせると言うこと。

つまり、「このExtensionを使うと、こういうことができるよ」から更に踏み込んで「この機能を実装するために、この仕組み(パーミッション)を利用するよ」

ということが分かるということかな、と。そう考えると、パーミッションの細分化やAPIの提供に加えて、App Storeでパーミッション毎に注釈なんかが付けられると嬉しいですね。

さて、それも踏まえて今後のことですが、現在Extensionの開発に必用なManifestファイルのversion1を利用しているアプリは2013年末に向けて使えなくなるそうです。

ベンダーは、アップデートと今後の開発はvesion2で行いなさいと言うこと。

今まで開発をしてこなかった僕は、勝ち組ということでしょうかね。


引き続いてChorme Appの未来の話。

これらの実装はまだ行われておらず、App Storeでの公開はできないとのことですが、とは言えwktkする内容でした。

Chrome APPはWEBアプリらいくなHosted APPと、ウィジェットらいくなPackaged APPに分けられるそうですが、話の感じとしてPackaged APPに力が入っている感じでした。

今後はアプリを Chromeの起動→アプリの起動、ではなくてWindowsならスタートメニュー、MacならDockから起動できるように、

さらにブラウザの外枠を外したUIや複数ウィンドウへの対応更に、アプリ内で踏んだリンクは新しいブラウザで起動するようにするなど、ブラウザの枠を超えた存在を作るそうです。

まるで、Adobe Airですね。ネィティブのSilverRightでもイイかもしれませんが?

さらに、オフラインへの対応の強化。これは、オフライン状態への自動的な切り替えや、オンライン時の自動同期などの提供です。

そして、盛り上がったのが新しいAPIの提供。例えば、ハードウェアへの直接的なアクセス。今までもWEBカメラは利用できていましたが、更にBluetoothやUSBデバイスへのアクセスが可能に。

そして、TCP,UDPを利用したネットワークへのアクセスなど思いの外下層レイヤのAPIの提供が実装されていてびっくりでした。

実際にGoogleI/Oではデモで、LEGO MINDSTORMをPCに接続したゲームパッドから、Chromeを介してBluetoothで操作するものが動いていたそうです。

さらに、どなたかの質問で挙げられたのが、TCPやUDPでアクセスできるのであればlistenポートを作ってしまえばサーバーアプリケーションを作成することが出来るのではないかというもの。

詳細はドキュメントを読んでくださいということでしたが、Chromeがサーバーになれば例えば本格的なWEBサーバーと言うよりも、集まった仲間同士で何かをやるグループウェア的な使い方ができるかもしれません。

というか、各種IRCやチャットサービスの利用やSSHの利用なんかも実装できますね。すでにExtensionで提供されているものもありますが、もっとセキュアな実装で再登場するかもしれませんん。公開鍵認証使えるとか。

さてセッション終了後は懇親会。皆さんテンションが高くて!!

何人かの方とお話をしましたが、どうもGoogleが目指しているものは「プラットフォームとしてのChrome」何じゃないかということでした。

アプリを動かすのもChrome、WEBページを見るのもChrome、そしてもしかしたらサーバーも・・・?

IE6なんて、今となっては残念なブラウザもありますが「ブラウザって何?」なユーザに対して「このアプリを利用するには、Chromeを入れる必用があります」

と、説明をするなんてアプローチが可能になるってことでしょうかね。

それはそれでアレですけど・・・

モバイル版のChromeも配信され、Extensionは使えないものの盛り上がっている今、明るくてwktkなセッションを聞くことができてほんとうに楽しかったです。

ChromeNote や ChromeBoxでOSとしてのChromeも今後どんどん盛り上がっていくと更に楽しいと思います。

僕も、Extensionを書いたりしてCommitしていきたいですね。

最後に、Extensionの開発などで利用できるサイトのURLを4個ほど貼り付けておきます。

Google Chrome -- Google Developers
https://developers.google.com/chrome/

Google Chrome Extensions -- Google Code
https://developer.chrome.com/trunk/apps/about_apps.html

Google Chrome -- GitHub
https://github.com/GoogleChrome

HTML5ROCKS
http://www.html5rocks.com/ja/

2012年7月12日木曜日

僕もNginx+Wordpressだっ!



先日のこと。



こんな流れでnginx使ってWEBサーバーを立てることになった。インストールと設定のメモを記述。

環境はさくらVPSで動く、ScientificLinux6。

公式でバイナリパッケージが配布されているので、yumを使ってインストールが可能。

参照先リポジトリの設定。
#vim /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/6/$basearch/
gpgcheck=0
enabled=1

インストール
#yum -y  --enablerepo=nginx install nginx

php-fpmのインストール

リポジトリの追加
#rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi 
#rpm -ivh http://ftp.yz.yamagata-u.ac.jp/pub/linux/fedora/epel/6/i386/epel-release-6-7.noarch.rpm
#rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm  

URLの変更
#vim /etc/yum.repos.d/remi.repo

mirrorlist=http://rpms.famillecollet.com/enterprise/$releasever/remi/mirror


mirrorlist=http://rpms.famillecollet.com/enterprise/6/remi/mirror

インストール
#yum install -y php php-fpm php-devel php-cli php-xml php-mysql php-mbstring php-gd --enablerepo=remi

nginxの設定ファイルの編集
#vim /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    server_tokens off;
    gzip  on;

    server {
            listen 80;
            server_name _;

            root /usr/local/www/yoriko.mydns.jp;
            index index.php index.html index.htm;
            charset utf-8;

            access_log /var/log/yoriko.access.log;
            error_log /var/log/yoriko.error.log;

            location = /robots.txt { access_log off; log_not_found off;}
            location = /favicon.ico { access_log off; log_not_found off;}

            location ~*\.php$ {
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_index index.php;
                    fastcgi_param SCRIPT_FILENAME
                    $document_root$fastcgi_script_name;
                    fastcgi_intercept_errors on;
                    include fastcgi_params;
            }

            location ~/\. {
                    deny all;
                    access_log off;
                    log_not_found off;
            }
    }
    include /etc/nginx/conf.d/*.conf;
}

php-fpmの設定ファイルの編集
#vim /etc/php-fpm.d/www.conf

user = nginx
group = nginx
pm = static
php_admin_flag[expose_php] = off

デーモンの起動
#/etc/rc.d/init.d/nginx start
#/etc/rc.d/init.d/php-fpm start
ひとまずこの手順で、phpがブラウザで動作します。あとは、普通にWordPressをインストールするだけ。

ただ、.htaccessとか無いのでパーマリンクの設定などをどうするのかは要調査です。

2012年7月4日水曜日

ADK2012がやってきた

GoogleI/O二日目のセッション"ADK2.0"に参加すると、引換券が貰える。それをGear Pick Up(おみやげ配ってた所)に持って行くと、ADK2012をもらうことができた。

引換券表

引換券裏
 前回のADKはArduinoMegaをベースに色々とセンサーを乗せたものだったが、今回は明確に目覚まし時計となっている。

目覚まし時計

ご開帳

別アングル
 目覚まし時計としての他、オーディオファイルの再生機能も持っているらしい。

本体内部にセンサー類が搭載されていて、NFCや加速度センサー、温度センサー、光センサーなどが利用可能。

制御用のアプリケーションも配布されている。ADK2012

起動画面。BluetoothかUSBで接続する。

スタート画面。色々な機能にアクセスできる。

アラーム設定画面。

LEDの色の設定画面。
なお、目覚まし時計ADK単体で設定が可能だし、オーディオファイルの再生はAndroid4.1以降の端末ならBluetoothでファイルを送信して再生することが可能。


ソースコードやIDEは既に公開されている。Arduinoを搭載しているのでProcessingが利用可能だが、セッションではCを利用していた。

端末とはBluetoothかUSBで接続をするが、USBの場合は両方の端子がMicroBとなっているケーブルを利用する。

無線による通信のサポートがここまで行き届いているのは有難い限り。

しかし、気になるのはアナログ、デジタルI/Oポートが無い点。今回はADK単体とAndroidで完結する物作りに制限されるということだろうか。

あるいは、ボードを取り外すことができるのか?

サンプルコードを読んだりしてなんかやろうと考えてます。NFC使いたい。

今後の販売などのアナウンスはまだ出てないようです。でも、その内出るのではないかな?

しかし、所詮Arduinoなので適当なボードとシールドを買ってくれば同等のものが実装可能なハズ。そういうアプローチで「ADK2012俺Ver」とかやるのも、面白いのかもしれません。