2007.12.24 Mon

CGIが動かない時の確認項目 改行コードが原因かも?

レンタルサーバー、自宅サーバー共通の話ですが、CGIを有効にしているにもかかわらずCGIが実行できないことがあります。
CGIが動かなくて困った、という場合は下記の点をご確認ください。

確認項目

  1. CGIが動作するディレクトリを確認。public_html/cgi-bin の下で動作可能な場合はpublic_html/cgi-bin に置いてください。
  2. perlのパスの確認 サーバー環境によって /usr/local/bin/perl であったり /usr/bin/perl の場合があります。
  3. CGIを転送するときにbinaryモードを利用ようして転送したか?サーバー環境によっては改行コードがLFでなければ動作しない場合があります。CGIプログラムの改行コードを CR-LF , CR の場合は LF に変更してください。
  4. CGIのパーミッションの設定。(パーミッションはディレクトリも含めて設定が必要です)
  5. apacheの設定で、<Direcotry>のOptionsにExecCGIを追加しているか確認



この中でも一番よく聞くのが改行コードが原因でCGIが実行ができないという状態です。改行コード自体はスクリプトと違いツールで確認しなければ、コードの違いがわかりません。CGIの改行コードを調べるにはフリーソフトでも簡単に調べることができるので、確認してみてはどうでしょうか?

参考サイト

2007.12.21 Fri

NTTフレッツのCTUとINTERLINKが自動的に切断・・・

外からサーバーにpingをうっても家に帰ってきてインターネットをしてみても、外に繋がらない。
原因はなんだろう・・・DNSかな・・なんて考えながら30分後NTTのCTUのINTERLINKセッションを再起動させてみると、外に繋がりました。

ん〜CTUでセッションが自動で切れてしまうというのはなんとも考え物です。どうやって対応したらいいのだろう?

2007.12.19 Wed

Apache バーチャルホストで自動サブドメイン作成

最近のブログではサブドメインを使ったユーザーディレクトリの公開が一般的となっています。ただ、ユーザーが追加されるたびにサブドメインをDNS Apacheに設定して設定を反映させるといった方法でもできなくはありませんが、自動サブドメインでユーザーディレクトリにアクセスするための方法を覚書。

Apacheのバーチャルドメイン機能を設定

# vi /etc/html/httpd.conf

NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin info@example.com
VirtualDocumentRoot /home/%1/public_html
ServerName example.com
ServerAlias *.example.com
</VirtualHost>

設定の反映

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

DNSの設定

a * グローバルIPアドレス

*を指定することで、サブドメインからのアクセスすべてが指定したグローバルIPへアクセスするようになります。

これでユーザーディレクトリのpublic_htmlへのアクセスがサブドメインで自動的にできるようになります。

参考サイト

2007.12.19 Wed

大規模システムを動かすために第一弾

第一弾 Mixi はてなクラスのシステムを動かすにあたって、どうやって環境を構築するかをテーマに今回は MySQL DB関連について調査した内容をまとめてみました。

MySQL機能・パフォーマンスチューニング編

MySQL負荷分散編

サーバー構築編

その他

2007.12.19 Wed

特定のディレクトリだけ文字コードをかえる

apacheのレスポンスヘッダの文字コードを Shift-jis に設定していると mrtg など euc で記述されているファイルを参照すると文字化けが発生してしまいます。

そこで特定のディレクトリだけ表示するレスポンスヘッダー文字コードを指定できないかな?ということでやってみた結果が以下の設定です。

<Directory "/var/www/mrtg">
AddType "text/html; charset=euc-jp" html
</Directory>

上記の設定を httpd.conf に設定することで /var/www/mrtg ディレクトリを参照したときは euc-jp で出力されるようになります。

参考サイト

2007.12.16 Sun

DiCE IPアドレスの検出ができない場合の設定

自宅サーバーなど動的なIPでサーバーを公開する場合、DiCEを使ってDNSの変更を自動で設定する必要があります。

ただし、環境によってはIP変更時に変更後のグローバルIPが正常に取得できないことがあるようです。※一般的には自動検出で問題ないはずです。

DiCEでグローバルIPが検出できるかテスト

# ./diced
=-=-=- DiCE DynamicDNS Client -=-=-=
Version 0.19 for Japanese
Copyright(c) 2001 sarad
:setup

IPアドレスの検出方法を指定してください
(0) 自動検出
(1) ローカルのネットワークアダプタから検出
(2) 外部のスクリプトから検出

<現在:0>
(N)変更しない (P)戻る

プライベートIPアドレスも検出対象ですか? (Y/N)
<現在:いいえ>
(P)戻る

IPアドレスの検出をテストしますか? (Y/N)
(P)戻る

この段階でIPが検出できなければ、外部のスクリプトから検出を選択して設定するようにします。

DiCEでグローバルIPを外部のスクリプトから検出

VALUE DOMAINのIPアドレス検出CGIを使用
http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip

:setup

IPアドレスの検出方法を指定してください
(0) 自動検出
(1) ローカルのネットワークアダプタから検出
(2) 外部のスクリプトから検出

<現在:0>

(N)変更しない (P)戻る

外部のスクリプトから検出を選択

スクリプトのURLを入力してください
<現在:>
(N)変更しない (P)戻る

>http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip

上記設定で外部のスクリプトを指定してIPの検出テストでIPが検出されるようになります。

2007.12.15 Sat

phpMyAdmin 自動ログアウトの設定

phpMyAdminでCookie認証の設定で使用している場合、ログイン状態で何も操作を行わない状態がしばらく続くと自動でログアウトしてしまいます。

システムの開発を行っている場合など、30分などすぐに経過してしまい、度々ログインし直さなければならないので、非常に手間です。

自動ログアウトを、デフォルトの30分から3時間に変更します。

# vi config.inc.php

以下の行を最終行に追加

$cfg['LoginCookieValidity'] = '10800';

Cookieの設定を変更した場合は、一度ブラウザを再起動して動作確認を行ってください。

参考サイト

2007.12.15 Sat

Apache 画像直リンクに制限をかける

ウェブ上に画像を掲載していると他のユーザーがその画像を直接他のサイトで表示させてしまうことがあります。折角公開している画像を他のサイトで勝手に使われないようにするために、直リンクの制限の設定をします。
※ダウンロード制限は今回はかけていないので、ダウンロードされた場合はどうしようもありません。

画像の直リンク制限設定

.htaccess または httpd.confに記述します。

SetEnvIf Referer example.com authoritative_site
<FilesMatch "\.(jpg|png|gif)$">
order deny,allow
Deny from all
Allow from env=authoritative_site
</FilesMatch>


動作確認

直リンクを記述したHTMLファイルを他のサーバーにアップロードし、アクセスしてみてください。画像が表示されない場合は、正常に機能しています。

参考サイト

2007.12.14 Fri

MRTGでのエラー原因

MRTGを設定していたときにエラーが出たので、原因と対応策を覚書。

設定ファイル作成時のエラー

# cfgmaker --ifref=descr --ifdesc=descr public@192.168.0.10 > /etc/mrtg/mrtg.cfg
SNMP Error:
no response received
SNMPv1_Session (remote host: "192.168.0.10" [192.168.0.10].161)
community: "public"
request ID: -2038233528
PDU bufsize: 8000 bytes
timeout: 2s
retries: 5
backoff: 1)
at /usr/bin/../lib/mrtg2/SNMP_util.pm line 627
SNMPWALK Problem for 1.3.6.1.2.1.1 on public@192.168.0.10::::::v4only
at /usr/bin/cfgmaker line 918
WARNING: Skipping public@192.168.0.10: as no info could be retrieved

snmpd の ネットワーク設定がうまくできていない場合は上記のようなエラーになります。
設定の変更

# vi /etc/snmp/snmpd.conf

com2sec mynetwork 192.168.0.0/24 public
※IPアドレスではなくネットワークアドレスを設定します。

設定の反映

# service snmpd restart


集計実行時のエラー

# mrtg /etc/mrtg/mrtg.cfg
ERROR: Line 8 ( WorkDir: /home/aaa/public_html/mrtg) in CFG file (/etc/mrtg/mrtg.cfg) does not make sense

mrtgの設定ファイル編集

#vi /etc/mrtg/mrtg.cfg

WorkDirの先頭の半角空白を削除

# for UNIX
WorkDir: /home/aaa/public_html/mrtg

# for UNIX
WorkDir: /home/aaa/public_html/mrtg

起動

# mrtg /etc/mrtg/mrtg.cfg

ディレクトリに問題がなければ正常に稼動しました。

参考サイト

2007.12.12 Wed

CentOS5 quota 容量制限の設定

ユーザーディレクトリの容量制限を行う場合の設定。以下の設定では50M以上は書き込めないようにしています。

quotaがインストールされているか確認

# rpm -q quota

インストールされていない場合

# yum -y install quota

quotaを有効にするディレクトリを設定

# vi /etc/fstab

quotaをかけたいディレクトリの4番めの項目に ",usrquota"を追加

/dev/hdb1 /home ext3 defaults,usrquota 1 2

設定を反映させるためにファイルシステムを再マウント

# mount -o remount /home

設定が反映されていることを確認

# mount
/dev/hda1 on /home type ext3 (rw,usrquota)

usrquotaが表示されれば設定が反映されている
※設定が反映されてquotaを使える状態になっているだけで、有効にはなっていません。

ディスクの使用量記録ファイルを作成

# quotacheck -a

quotaを有効にする

# quotaon -auv ※無効にする場合は quotaoff

ユーザーに制限を設定する

# edquota user01

Disk quotas for user user01 (uid 5xx):
blocks soft hard inodes soft hard
40 50000 50000 10 0 0

soft hardの単位はKbyteです。
softとhardの値を同じにした場合、指定した容量で即書き込み禁止となります。

複数のユーザーに同じ設定を行う場合

user01のquotaの設定をuser02にコピーすることが出来ます。

# edquota -p user01 user02

参考サイト

2007.12.12 Wed

Apache 2.2.6 に mod_layout 5 を導入

mod_layoutとはホームページのヘッダーとフッターにHTMLを表示させるプログラムです。用途としてはレンタルサーバーの広告、サイトの下の署名、サイトデザインのテンプレートなどで使うと非常に便利です。

Apacheをパッケージインストール済みの状態でmod_layout5を導入しています。

導入環境

CentOS 5
Apache 2.2.6 パッケージインストール版

#yum -y install httpd
#yum -y install httpd-devel


mod_layout 5.0のインストール

# wget http://download.tangent.org/mod_layout-5.0.tar.gz
# tar xvfz mod_layout-5.0.tar.gz
# vi Makefile

APXS=apxs
APACHECTL=apachectl

APXS=/usr/sbin/apxs
APACHECTL=/etc/rc.d/init.d/httpd

# make
# make install

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

mod_layoutの設定

vi /etc/httpd/conf/httpd.conf

以下を最終行に追加
※記述する場所によっては指定したディレクトリでのみ有効にすることが可能です。

AddOutputFilter LAYOUT html
LayoutHeader /header.html
LayoutFooter /footer.html

動作確認

ウェブにアクセスし、header.html footer.html の内容が表示されているか確認する。

LayoutHeader に /var/www/html/header.htmlのように絶対パスで指定することも出来ますが、その場合はHTML(動的なスクリプト)として表示されるのではなくただのテキストファイルとして、ウェブ上に内容が表示されます。

参考サイト

2007.12.12 Wed

Apache 1.3.37 インストール Centos 5

Apache 1.3系のインストールログ
DSOをサポートさせmod_rewriteモジュールを導入しています。

Apache 1.3.37のインストール

# cd /usr/local/src
# wget http://archive.apache.org/dist/httpd/apache_1.3.37.tar.gz
# tar zxvf apache_1.3.37.tar.gz
# cd apache_1.3.37/
# ./configure --enable-module=so --enable-module=rewrite --enable-shared=rewrite --enable-rule=SHARED_CORE
# make
# make install

Apache の設定 ( httpd.conf )

# vi /usr/local/apache/conf/httpd.conf

LoadModule rewrite_module libexec/mod_rewrite.so
AddModule mod_rewrite.c

2行が記述されていることを確認する。その他の設定は各自の環境に合わせて行ってください。

Apache の起動・停止

# /usr/local/apache/bin/apachectl start
# /usr/local/apache/bin/apachectl stop

動作確認

http://ウェブサーバーIP/ でページが表示されることを確認する

参考サイト

2007.12.12 Wed

PHP safe_mode セーフモードの設定

PHP のセーフモードは、共有サーバでのセキュリティの問題を解決するための設定です。ということで、一体どういう状態になるのか?何が制限されるのかを調べてみました。

PHP をsafe_mode セーフモードに変更

# vi /etc/php.ini

safe_mode = Off

safe_mode = On

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

セーフモードの詳細

共有サーバーでメール関数も制限したい場合

# vi /etc/php.ini

disable_functions =

disable_functions = mail

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

とすることで mail() 関数の使用を禁止することができます。

safe_modeの動作確認

#vi info.php

<?php phpinfo(); ?>

上記で作成したinfo.phpにアクセスすし、safe_modeの項目がOnになっていれば正常にsafe_modeで動作しています。

2007.12.09 Sun

CentOS5 apache2.2 + mod_layout 導入

ホームページのヘッダーフッターを表示させるための、モジュールをapache2.2に導入したときのログ。思わぬ落とし穴にはまりました・・・。

導入環境

Centos 5
apache 2.2 (パッケージインストール版)
mod_layout 5

mod_layout導入手順

# wget http://download.tangent.org/mod_layout-5.0.tar.gz
# tar xvfz mod_layout-5.0.tar.gz
# make
# make install

# service httpd restart

mod_layoutの設定

ヘッダーフッターを挿入したいページと同じディレクトリに.htaccessを作成し以下の内容を記述

# vi .htaccess

AddOutputFilter LAYOUT html htm cgi php
LayoutHeader /var/www/html/header.html
LayoutFooter /var/www/html/footer.html

はまった内容

インストールは問題なくできたのに、表示されない状態になってしまいました。再インストールを行ったり、設定をいろいろ変えてみたりしていていたのですが、ようやく原因がわかりました。

mod_deflate と mod_layout は共存ができません・・・

mod_deflateを無効にしてみたところ正常に表示されるようになりました。

設定参考サイト

2007.12.09 Sun

念願の外付けDVDドライブを買っちゃいました

念願の外付けDVDドライブを買っちゃいました

先月からPCのドライブの調子が悪く DVDドライブのはずなのにCDしか読み込んでくれないという不便な状態が続いていました。

ググッてみてもDELLのドライブは故障のページが沢山でてくるし、しょうがないのかなということで、ついに買っちゃいましたよ。

早速フル稼働状態で焼き続けています。ひたすらたまっていた未バックアップ状態のデータ達。これで一安心です。

それにしても最近はPCやPCパーツが安くなってきてますね。久々にドライブを購入しようとおもってアマゾンで探してみたら5000円ちょっとで2層書き込み18倍のDVDドライブが買えるなんて

若干衝動買いに近いものがありました

2007.12.06 Thu

ProFTPDのPortの変更方法

FTP通信ポートの設定、21番以外にしたい場合、inetd設定のためにポート定義名を/etc/servicesに追加します。

例としてftpAAAというサービス名で8021番ポートを割り当てます。

servicesに追加

# vi /etc/services

ftpAAA 8021/tcp
ftpAAA 8021/udp

ProFTPDの設定

# vi /etc/proftpd.conf

Port 21

Port 8021

xinetdの設定

# vi /etc/xinetd.d/xproftpd

service ftp

service ftpAAA

# /etc/rc.d/init.d/xinetd restart

これで8021番ポートからProFTPDにアクセスできます。

参考サイト

ProFTPD詳細設定項目参考

2007.12.06 Thu

SELinuxを有効にしたまま ProFTPD を使用する方法

SELinuxが有効になっている場合、ユーザーのパスワードを参照することができずログインすることができません。

SELinux全てを無効にするのではなくFTPのみSELinuxを無効にしてProFTPDを設定してみます。

SELinuxについての参考サイト

ProFTPD導入環境

  • CentOS 5
  • SELinux 有効

xinetdのインストール

xinetd がインストールされていない場合のみ実行してください。

xinetd参考サイト

xinetdインストール

# yum -y install xinetd

xinetd起動

# /etc/rc.d/init.d/xinetd start

xinetd自動起動設定

# chkconfig xinetd on

proftpdのインストール

# wget http://dag.wieers.com/rpm/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
# rpm -Uvh rpmforge-release-0.3.6-1.el5.rf.i386.rpm
# rpm -Uvh http://ftp.belnet.be/packages/dries.ulyssis.org/redhat/el4/en/i386/RPMS.dries/rpmforge-release-0.2-2.2.el4.rf.i386.rpm
# sed -i 's/enabled = 1/enabled = 0/g' /etc/yum.repos.d/rpmforge.repo
# yum -y --enablerepo=rpmforge install proftpd

ProFTPD設定の設定

# vi /etc/proftpd.conf

standaloneモードからinetdモードに変更

ServerType standalone

ServerType inetd

ルートディレクトリの設定

DefaultRoot ~ !adm

DefaultRoot ~/public_html !wheel

最終行に追加

ExtendedLog /var/log/proftpd/access.log WRITE,READ default
ExtendedLog /var/log/proftpd/auth.log AUTH auth
TimesGMT off
PassivePorts 10000 10030
※PASVモード用ポートとして1024以上の任意のポートを指定

xinetdでproftpdを起動する設定

# vi /etc/xinetd.d/xproftpd

service ftp
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.proftpd
log_on_success += HOST PID
log_on_failure += HOST
nice = 10
env = TZ=JST-9
}

SELinux でFTPを動かす場合

以下のコマンドを実行

# setsebool -P ftp_home_dir 1

  • Pを設定することでreboot時にも設定が保存されたままになります。


xinetdを起動してproftpdを使う

# /etc/rc.d/init.d/xinetd restart
# chkconfig xinetd on
# chkconfig xproftpd on

FTPクライアントから接続してみる。正常に接続できれば終了です。

参考サイト

2007.12.06 Thu

Flashをデフォルトでアクティブに設定する方法

ウェブ上でFlashを表示させる場合、普通にタグを設定してしまうとデフォルトでアクティブになりません。

参照させるだけのFlashであれば特に問題はありませんが、リンク、アクションのあるFlashの場合は一度クリックしてアクティブ状態にしないと動作しません。

これではユーザーも使いにくいので、デフォルトでアクティブになる設定を紹介します。

FlashタグをJavascriptに記述

普通のFlash用のタグ

<OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0 height=480 width=700 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
<PARAM NAME="movie" VALUE="./flash.swf">
<PARAM NAME="quality" VALUE="high">
<embed src="flash.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="700" height="480"></embed>
</OBJECT>

flash.js というファイルを作成し以下のように記述します。

普通のFlash用のタグをdocument.write('')で囲みflash.jsに保存

document.write('<OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0 height=480 width=700 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>');
document.write('<PARAM NAME="movie" VALUE="./flash.swf">');
document.write('<PARAM NAME="quality" VALUE="high">');
document.write('<embed src="flash.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="700" height="480"></embed>');
document.write('</OBJECT>');


Javascriptに記述したFlashをウェブに表示

Flashを表示させた居場所に

<script src="flash.js"></script>

を記述することでアクティブ状態のFlashを表示させることができます。

ファイル名、パスなどについては各自の環境に合わせてください。

2007.12.06 Thu

広告主向け a8.netのアフェリエイト設定 ( php )

A8の広告からユーザーが流れてきたことを確認する方法の紹介。

A8からのアクセスと一般のアクセスをわけるためCookie 書き込み用ファンクションページへA8からアクセスを流してもらうようにします。

ファンクションページの作成

適当なファイル名でファンクションページを作成

<?php
# クッキーの書き込み
$value = "a8net";
$timeout = time() + 30 * 60; // 30 × 60秒
setcookie("tag",$value,$timeout,'/','example.com');

# トップページ表示
header("Location:index.html");
?>

動作説明
tag という名前のCookie変数に a8netという文字列を格納し、30分間はその情報を保持する。
ドメインを設定することで、そのドメイン内でしかCookieは有効になりません。

Cookieの情報がある間に購入、登録した場合は、A8からユーザーが来たことを判定できるという仕組みです。

サーバーの時間を正確に

サーバーの時間とローカルの時間がずれていると
Cookieの保存期間が正常に動作しません。

サーバーの時間が45分ずれていた場合、30分間Cookieを保存する設定にしていたとしても、保存した時点でCookieの有効期限が過ぎている状態になるので、Cookieに情報を保存することができなくなります。

2007.12.05 Wed

ついにHDDアクセス不能に・・・

以前エラーをはいていたHDDのその後です。

end_request: I/O error, dev hda, sector xxxxxxx

というエラーをひたすらはき続けています。
ついに終わってしまったようで。お疲れ様でした。smartで事前に監視していたため、必要な情報はすべてバックアップ済みでとりあえずは問題はありません。

参考サイト

2007.12.04 Tue

Apache ~(チルダ)なしでユーザーディレクトリのページを表示

Apache のユーザーディレクトリ機能を初期設定のまま有効にするとユーザーのページを表示させるには、

http://サイトアドレス/~user/

となります。

~を使わずユーザーディレクトリにアクセスする方法について

# vi /etc/httpd/conf/httpd.conf

AliasMatch ^/([^/]+)/(.*) /home/$1/public_html/$2
# 表示 : http://サイトアドレス/user/

または

AliasMatch ^/userdir/([^/]+)/(.*) /home/$1/public_html/$2
# 表示 : http://サイトアドレス/userdir/user/

設定を反映

service httpd restart


^/([^/]+)/(.*)を設定したときの警告について

[warn] The Alias directive in /etc/httpd/conf/httpd.conf at line 566 will probably never match because it overlaps an earlier AliasMatch.
[warn] The ScriptAlias directive in /etc/httpd/conf/httpd.conf at line 591 will probably never match because it overlaps an earlier AliasMatch.
[warn] The Alias directive in /etc/httpd/conf/httpd.conf at line 866 will probably never match because it overlaps an earlier AliasMatch.

上記警告が出る場合は、

Alias /icons/ "/var/www/icons/"
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
Alias /error/ "/var/www/error/"

で設定がかぶっているために警告がでています。このままでも正常に動作することは可能です。ただ、 icons cgi-bin error を aliasする必要が無い場合は、コメントアウトすることで、警告文がでなくなります。

注意点

ルートディレクトリ直下のディレクトリ名と同じユーザーは作成しないようにしてください。ユーザーを作成し、ディレクトリ名がかぶってしまった場合は、ユーザーディレクトリを参照するようになってしまいます。

参考サイト

システム構築に関する覚書トップページへ