BlogもどきのWeblog

備忘録と日々の呟きとメモとCGIの実験場とされる何か。
プロフィール

GLANSHE
絵描き担当らしい

Total: 15696
Today: 31
Yesterday: 225
最新の記事

コンテンツ

最新のコメント

最新のトラックバック

カテゴリー

リンク

ニコ動MyListLink

CGI::Session
ここんところ、PerlでJavaServletみたいな事をしようと色々遊んでいるところなのだけども、sessionの取得で予想外の事が起こった。

# セッションIDの取得
$sessionId = $self->getSessionId($cookieData, $formData);
$logger->debug("Before Session ID[" . $sessionId . "]");

# セッションの取得
$session = new CGI::Session($driver, $sessionId, {'Directory' => $dataSource});

# セッションIDは取得できたが、IDとしては無効である場合、新規セッションで作り直す
if(defined($sessionId) && $sessionId ne $session->id()){
  $logger->warn("This Session ID is Invalid");

  $session->close;
  $session->delete;
  $session = new CGI::Session($driver, undef, {'Directory' => $dataSource});

  $logger->warn("Create Other New Session ID[" . $session->id() . "]");
}else{
  if(!defined($sessionId)){
    $logger->info("Create New Session ID[" . $session->id() . "]");
  }else{
    $logger->info("Get Session ID[" . $session->id() . "]");
  }
}
# 有効期限を設定
$session->expire($expire . "s");

こんな感じでCGI::Sessionを使って取得してるんだけど、sessionを取得するのに妙に時間がかかる。

ログ
[2010-03-22 20:28:40.763][DEBUG][SessionManager:231] Before Session ID[f977f2da04ecc84d3e74df0f17885ecd]
[2010-03-22 20:28:40.819][INFO][SessionManager:249] Get Session ID[f977f2da04ecc84d3e74df0f17885ecd]

819 - 763 = 56

56msもかかっている。何故だ。

ファイルでセッション管理してから多少遅いのはわかるけど、そこまで時間かかるものかなー
SessionIdの暗号化とかデコードに時間かかってるのかなー

モジュールは使えるものは使っておいた方がいいのか、
速くする為に自分で作った方がいいのか。

そもそもCGI.pm使ってない時点で便利なもの使ってないんだからSessionも自分で作り直した方がいいのかなー

--------
[2010-03-23 15:01:12]
追記

CGI::Sessionを継承して色々と時間を計った結果、ドライバモジュールのロードで時間がかかっていました。

CGI::Session(Ver. 4.35)では、780行目で

$self->_load_pluggables();

で、ドライバで指定されたモジュールのロードを行っているため、時間がかかっているように見えます。

sub _load_pluggables では指定したモジュールをrequireでロードしているため、実行に時間がかかっているようです。

でも、そもそもモジュールのロードは use しても行われているため、CGIとして動作している場合は特に実行時間に差はありません。

mod_perlとかでモジュールをキャッシュしている場合は、CGI:Sessionを使用するとセッションを取得するたびにrequireされるため、余計な処理が増えていることになります。(キャッシュされているため、実際にロードされるわけではないが…)


time stamp:2010/03/23 00:43:22
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ DHCPサーバ
# aptitude install dhcp3-server

DHCPサーバを立てるインターフェースを限定する
# vi /etc/default/dhcp3-server

INTERFACES=""

INTERFACES="eth0"

DHCPで割り振られるアドレスは192.168.1.150〜200とする。
# vi /etc/dhcp3/dhcpd.conf

option domain-name "example.com";
option domain-name-servers ns1.example.com, ns2.example.com;
↑DNSサーバを指定?よくわかっていない。

defalut-lease-time 600;
max-lease-time 7200;

subnet 192.168.1.1 netmask 255.255.255.0 {
raige 192.168.1.150 192.168.1.200;
option domain-name-servers ns1.example.com, ns2.example.com;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
default-lease-time 600;
max-lease-time 7200;
}

再起動
/etc/init.d/dhcp3-server restart

ローカルPCで192.168.1.150アドレスが取得できたのでOK


time stamp:2010/03/22 14:31:32
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ 仮想メールボックス
postfix + courierで仮想メールボックスを利用する。
メールアドレスはいくつか発行したいけどその分linuxユーザ作るのは何か違うと思うので、仮想メールボックスを使ってメールアドレスだけ発行できるようにする。

とりあえず以下を参考にして設定を進めた
http://www.geocities.jp/gokuraccoon/virtual.html


■仮想メールアドレス用のユーザを追加する。

作ったユーザを使用して仮想メールアドレスが配信される。

# adduser --uid=3000 vmail
/home/vmail
ができる


■仮想メールアドレスのユーザディレクトリを作る

# mkdir /home/vmail/[virtual_mail_user]
# maildirname /home/vmail/[virtual_mail_user]/Maildir
# chown -R vmail:vmail /home/vmail/[virtual_mail_user]/Maildir


■postfixの設定

# vi /etc/postfix/main.cf

virtual_transport = virtual
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:3000
virtual_gid_maps = static:3000
fallback_transport = virtual
local_recipient_maps =

を追加。

■上記説明

virtual_fallback_transport = virtual
ローカルに存在しないアドレスをvirtualに処理させる。

local_revipient_maps =
このを書いてないと上の設定が有効にならない。
これで数時間はまってた…

実ドメインのみの運用なので
virtual_mailbox_domainsは書かない。


■配送先の設定

virtual_mailbox_mapsで指定したファイルを作る。
# vi /etc/postfix/virtual_user

仮想メールアドレスのユーザ名と、その配送先(virtual_mailbox_baseからの相対アドレス)を書く。

[virtual_mail_user] [virtual_mail_user]/Maildir/

書いたら、hash形式のデータベースに変換する

# postmap /etc/postfix/virtual_user

virtual_user.dbが生成される。


■smtpサーバの認証設定に仮想メールアドレスのユーザを追加する

# saslpasswd2 -c -u example.co.jp [virtual_mail_user]


■POPとかIMAPでメールが受信できるようにする。

courier-popとかcourier-imapを使用している場合の話。

# cd /etc/courier/
# userdb [virtual_mail_user] set home=/home/vmail/[virtual_mail_user] uid=3000 gid=3000
# userdbpw -hmac-md5 | userdb [virtual_mail_user] set hmac-md5pw

userdbを更新
# makeuserdb


関連するものを全部再起動
# /etc/init.d/postfix restart
# /etc/init.d/courier-imap restart
# /etc/init.d/courier-pop restart
# /etc/init.d/courier-authdaemon restart
# /etc/init.d/saslauthd restart

メール送信、配送、受信まで実アドレス、仮想アドレス共に全部できたので問題なし。


■参考

virtual
virtual 配送エージェントと local 配送エージェント
ヽ( ・∀・)ノくまくまー(2006-10-25)
メールサーバの設定(バーチャルメールボックス編)
PostfixのFAQ


time stamp:2010/03/22 14:28:34
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ courier-pop | imap
・courier-pop(POPサーバ)
# aptitude install courier-pop

webベース管理のためにディレクトリを作成しますか?とか聞かれたので
面白そうなのでYesにしてみた。
でも大した設定項目はなかった。
と言うかこれをいじるためにapacheの設定を頑張ったのに結構無駄になってしょんぼり。

結局設定ファイルを手動で弄ることに。

CRAM-MD5で認証を通すことにする。

# vi /etc/courier/pop3d

POP3AUTH=""

POP3AUTH="CRAM-MD5 CRAM-SHA1"

・courier-imap(IMAPサーバ)
# aptitude install courier-imap

CRAM-MD5で認証を通すことにする。

# vi /etc/courier/imapd

IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"

IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"

POPとIMAPサーバはこれだけ。

・courier-authdaemon(認証用デーモン)
# aptitude install courier-authdaemon

POPとIMAPサーバで認証するためのデーモンを追加する。
これによってシステムパスワードとは別のメールパスワードが作れる。

# vi /etc/courier/authdaemonrc

パスワードを別途用意するために次を変更
authmodulelist="authpam"

authmodulelist="authuserdb"

ユーザ認証用DBを生成する。
# userdb [username] set home=/home/[username] uid=xxxx gid=xxxx
# chmod 600 /etc/courier/userdb

パスワードを設定する。
# userdbpw -hmac-md5 | userdb [username] set hmac-md5pw

# makeuserdb
userdb.dat、userdb.lock、userdbshadow.dat、.lock.userdbが生成される。

再起動する。
/etc/init.d/courier-imap restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-authdaemon restart

ちゃんとIMAPもPOPも認証通ってメール見れたので問題なし。


time stamp:2010/03/22 14:21:18
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ postfix
# aptitude install postfix
↓を見てほぼそのまま設定
http://www.geocities.jp/gokuraccoon/smtp.html

ハードリンクできないので
# cp -a /etc/sasldb2 /var/spool/postfix/etc/
で誤魔化す。

telnetでlocalhost:25に接続してsmtpしゃべったら
gmailにメールが届かないので調査

http://blog.fkoji.com/2008/12291614.html
を発見

設定箇所
/etc/postfix/main.cf

myhostname = xxxx.ocn.ne.jp
relay_domains = $mydestination
relayhost = [smtp.xxxx.ocn.ne.jp]

のみでpostfix再起動→gmailにメール届きました。

thunderbirdで認証通らないので試行錯誤
やったこと
# chgrp postfix /var/spool/postfix/etc/sasldb2
# vi /etc/default/saslauthd

START=no

START=yes

# /etc/init.d/saslauthd restart

上記の何してもメールのログが変わらなかった。
解決した方法

# vi /etc/postfix/main.cf

mydomain = xxxxx.jp
myhostname = xxxx.ocn.ne.jp

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
permit_sasl_authenticated,
reject_unauth_destination
smtpd_sasl_security_options = noanonymous, noplaintext

smtpd_sasl_local_domainが、$myhostnameになってたのを
smtpd_sasl_local_domain = $myhostname

smtpd_sasl_local_domain = $mydomain
に変更。
gmailにメール飛ばす設定でmyhostnameを変えていたので、これが多分
認証用のsasldb2の設定で間違ってたんだと思う。

調べた先がService Temporarily Unavailableで見れなくてキャッシュから見た情報なので
一応こっちにもメモしておく

以下引用
>sendmail + sasl とかで CRAM-MD5 で SMTPAUTH してたときは、-u につけるドメイン(realm?)はたいした意味を持っていなかった (たとえば saslpasswd -u hoge ryuta とかやったときは user を "ryuta@hoge" とやれば良かった) ような気がするんですが、 Postfix + SASL の場合は /etc/postfix/main.cf の smtpd_sasl_local_domain と同じにしないと
>
>warning: SASL authentication failure: no secret in database
>
>と怒られました.

■引用元
つながらない…

メールが配送されるディレクトリを/home/[username]/Maildirに変更する。
デフォルト設定だと、メールが届くと/var/mail/[username]にファイルが作られて、
そこに全部受信メールが詰められる。(mailbox形式)
それによって/varが圧迫されるのが嫌なので、各ユーザの個人ディレクトリに置くようにする。

# vi /etc/postfix/main.cf

home_mailbox = Maildir/

を追加する。

再起動
# /etc/init.d/postfix restart


time stamp:2010/03/22 14:14:01
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ apache
# aptitude install apache2
前設定した時に大変なことになったので、
設定を弄る前に中身を固めてオリジナルをバックアップ。

何か入れるだけ入れて、一晩寝てからapacheを再起動したら
apache.confが意味不明なバイナリファイルになっていた。
courier-webadmin入れたから?原因不明。
一晩寝かせると動かなくなるプログラムがこれに該当するのではないか。

とりあえずバックアップしてたファイルから復帰。
バックアップ大事。

courier-webadmin入れてみたのでsslでhttpsで繋げるようにする。
次のサイトの通りにやってみた
http://d.hatena.ne.jp/toguni/20090312/1236823206

# vi /etc/apache2/sites-available/httpd-ssl.conf

下の方に/cgi-bin/ディレクトリの設定があったので流用した。

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride All
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

とした。

apache再起動
# /etc/init.d/apache2 restart

起動時にエラーが出て直したんだけど確か文法エラーばっかりだったので
特に問題はなかった気がする。


■CGI動作設定

# vi /etc/apache2/sites-enabled/000-default

<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Options ExecCGI FollowSymLinks
Order allow,deny
allow from all
</Directory>

Options ExecCGI FollowSymLinks
を追加

# vi /etc/apache2/mods-enabled/mime.conf

AddHandler cgi-script .cgi

コメントを外す。適宜 .pl とかも増やしたり。

apache再起動
# /etc/init.d/apache2 restart

動いたので終了。


■ユーザディレクトリのpublic_htmlディレクトリの中身をwebに公開できるようにする。

/etc/apache2/mods-enabledにuserdirを追加する
# cd /etc/apache2/mods-enabled
# ln -s /etc/apache2/mods-available/userdir.conf /etc/apache2/mods-enabled/
# ln -s /etc/apache2/mods-available/userdir.load /etc/apache2/mods-enabled/

CGIを使えるようにする
# vi /etc/apache2/mods-enabled/userdir.conf

Options MultiViews Indexes SymLinsIfOwnerMatch IncludesNoExec

Options MultiViews Indexes SymLinsIfOwnerMatch IncludesNoExec ExecCGI ForrowSymLinks

apache再起動
# /etc/init.d/apache2 restart


■Perlモジュールとかを入れる

Image::Magicを使うのでインストール

perlのみで使う場合はperlmagickをインストールすればいい。
# aptitude install perlmagick

Ubuntu自体で使わないなら間違ってimagemagickをインストールしないように。

Jcode.pmを使うのでインストール

# perl -MCPAN -e shell

cpan[1]> install Jcode

怒られた。
Could not read '/root/.cpan/build/Jcode-2.07-ghXxdQ/META.yml'. Falling back to other methods to determine prerequisites
Can't exec "make": No such file or directory at /usr/share/perl/5.10/CPAN.pm line 7698.
DANKOGAI/Jcode-2.07.tar.gz
make -- NOT OK

調べたら何かが足りないらしい。何が足りてなかったのかはよくわからない。
# aptitude install build-essential

再度
# perl -MCPAN -e shell
cpan[1]> install Jcode

Could not read '/root/.cpan/build/Jcode-2.07-ghXxdQ/META.yml'. Falling back to other methods to determine prerequisites
cp Jcode/Nihongo.pod blib/lib/Jcode/Nihongo.pod
cp Jcode.pm blib/lib/Jcode.pm
Manifying blib/man3/Jcode::Nihongo.3pm
Manifying blib/man3/Jcode.3pm
DANKOGAI/Jcode-2.07.tar.gz
make -- OK
Warning (usually harmless): 'YAML' not installed, will not store persistent state
Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/append.....ok
t/convert....ok
t/getcode....ok
t/h2z........ok
t/jfold......ok
t/length.....ok
t/mime.......ok
t/new........ok
t/perl581....ok
t/regex......ok
t/tr.........ok
All tests successful.
Files=11, Tests=244, 3 wallclock secs ( 3.12 cusr + 0.24 csys = 3.36 CPU)
DANKOGAI/Jcode-2.07.tar.gz
make test -- OK

今度は大丈夫だったみたい。

Digest::SHA1を使うのでインストール

cpan[2]> install Digest::SHA1

All tests successful.
Files=3, Tests=17, 0 wallclock secs ( 0.14 cusr + 0.01 csys = 0.15 CPU)
GAAS/Digest-SHA1-2.12.tar.gz
make test -- OK

問題なし

CGI::Sessionを使うのでインストール
先にCGIをインストール

cpan[3]> install CGI

途中でどこかのサーバへアクセス失敗してリトライしまくってるけど
Ctr+C押したらリトライ終了した。

一応、ちゃんと終了したけど問題なのか?

cpan[4]> install CGI::Session

問題なし

Tie::IxHashを使うのでインストール

cpan[5]> install Tie::IxHash

問題なし


time stamp:2010/03/22 14:09:09
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ samba
# aptitude install samba
sambaユーザの設定をする

# smbpasswd -a アカウント名
パスワード入力でsamba用のアカウント作成。

設定はバックアップしたファイルをそのまま使った。

設定方法はこの辺を参照


time stamp:2010/03/22 14:05:27
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ SSH
# aptitude install openssh-server
とりあえずインストール

クライアントからの接続をプレインテキストでの認証にしておくと辞書攻撃とかが怖いのでdsaで鍵を作ってその鍵を持ってないと認証できないようにする。

作業を行っている途中でログイン不可能になるのを防ぐため、必ず接続状態のウインドウを開いた状態で作業を行う。


■鍵の作成

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/silvia/.ssh/id_dsa):

ここでエンター押すとディレクトリが作成される

Created directory '/home/silvia/.ssh'.

パスワード入れる
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

~/.ssh/以下に
id_dsa
id_dsa.pub
というファイルができる。
id_dsaが秘密鍵、id_dsa.pubが公開鍵

公開鍵をauthorized_keysに書き写す
これを鍵束として用いる(らしい。DSA以外の認証にも使用?)
$ cat id_dsa.pub >> authorized_keys


■Windows側の設定

UTF-8 Teraterm Proの使用を前提とする。

作った秘密鍵id_dsaをWindowsに持ってくる。
適当なディレクトリに配置。MyDocumentは怖いからだめだとか。

Teraterm起動する
メニューの設定→SSH認証を選択

「RSA/DSA鍵を使う」にチェック入れて、持ってきた秘密鍵を指定する。


■SSHサーバの設定

# vi /etc/ssh/sshd_config

ルートでのログイン禁止
PermitRootLogin no

公開鍵の格納ディレクトリを指定する
コメント取る
#AuthorizedKeysFile %h/.ssh/authorized_keys

AuthorizedKeysFile %h/.ssh/authorized_keys

もっとセキュリティを上げたい場合、ログインできるユーザを限定
AllowUsers [ssh_user]

再起動
# /etc/init.d/ssh restart

Teraterm起動してサーバに接続、パスフレーズが通ればOK


パスが通ったので、プレインテキストでの認証を不許可にする。

# vi /etc/ssh/sshd_config

プレインテキストのパスワードでのログインを禁止
PasswordAuthentication no

再起動
# /etc/init.d/ssh restart

プレインテキストでログインできなくて、DSA鍵でのログインができればOK


time stamp:2010/03/22 13:55:23
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ インストール
■CDからインストール。

前構築した環境はルートパーティションが小さすぎてアップグレードが出来なくなったりしたので、その教訓からルートパーティションを大きめに取る。
/boot 1G
/ 2G
/home 200G
/usr 10G
/var 10G
/opt 10G
残り適当

前システムから、interface、iptables、sambaの設定ファイルをバックアップしておいた。


■ネットワーク

/etc/network/interfaceを編集
LANに接続出来るようにする。
ネットワークカードが逆になってる可能性があるので注意。

インターネットへの繋ぎ方をすっかり忘れていた。

# pppoeconf

コマンドで設定を行う。英語ばっかで読めないけど勘で設定

LANで繋いだPCからサーバ通してインターネットに繋ぐ設定をする
# vi /etc/sysctl.conf

#net.ipv4.ip_forward=1
がコメントアウトされてるのでコメント除去

バックアップしたiptablesの設定を叩けば多分接続インターネットに接続出来るはず。

iptablesの設定が自動で動作するようにする

設定ファイルが
/etc/ppp/set_iptables.sh
にあるとする

# ln -s /etc/ppp/set_iptables.sh /etc/network/if-pre-up.d/set_iptables
if-pre-up.dからシンボリックリンクを張ってやれば、ネットワークの設定時に自動的にiptablesが設定される。


■ユーザの追加

adduserを使うと対話的に作成できる

# adduser linux_user


■その他

ホームディレクトリ配下の
.bashrcファイルにコマンドのエイリアスとかがあるのでそこでllとかが開放できる。

sudoが面倒な場合は無効化する。
先にパスワード設定をしないと入れなくなるので注意

HDDを自動マウントする。
起動時に認識するHDDの順番によってsdaとsdbが入れ替わったりして面倒なので。というか前、それで操作ミスをして/root配下を全部消したとかいう問題を起こした…
そこでマウントするデバイスのUUIDを指定してやると確実。
システムディレクトリがそうなってるので真似した。

# blkid /dev/sda1
/dev/sda1: UUID="2cd2016b-3de6-46a1-81e4-471f9b5cd62b" TYPE="ext3"

とか出るので、

# vi /etc/fstab

UUID=2cd2016b-3de6-46a1-81e4-471f9b5cd62b /mnt/samba ext3 relatime 0 2

みたいに設定する。


■参考
nabeの雑記帳
パスワード用ランダム文字列生成用スクリプト


time stamp:2010/03/22 12:46:55
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:
何かしら