cgiとphpページが荒らされることが多いのでバックアップ PHP/CGIについて ≫&link(公式マニュアル ─ CGI・SSIについて,http://www.sakura.ne.jp/support/manual/rs/tech_cgi.shtml) *関連ページ -[[ファイルマネージャー]](ファイルマネージャーでCGIを設置する方法や、削除できなくなったファイルの対策) *各言語について - Perl(このページ内で扱ってます) - PHP(このページ内で扱ってます) - [[Ruby]] - Python(話題に上がっていません) *CGIについて **CGIがうまく動かない! -さくらではCGIはsuExecでCGIを起動して所有者権限で動作するから、フォルダやスクリプトのパーミッションは755や705にする。777や707では動かない。 -ファイル名やフォルダ名は大文字/小文字で区別されます。意図してる通りのファイル名であるかチェック。適切でないと404エラーになったり、スクリプト内でファイルが呼び出せず500エラーになる場合があります。(FTPクライアントによっては大文字・小文字を自動で修正してしまう場合があるようなので注意) -CGIの説明書に書かれているパーミッションで動かなかったら、フォルダとスクリプトは755、それ以外は644にして試すのがいいかと。 --それで動いたら、705と604に下げて試すのもいいかと。 -ブラウザで直接参照しないデータファイルは600でOK(データファイル名が配布スクリプト既定のままでも覗き見出来ないから、それが安全) -フォルダ名にチルダが含まれていると動かない。 -WinやMacなら、必ずアスキーモードでFTP転送すること。バイナリモードだと改行コードの違いで動かない。 -さくらのレンタルサーバにインストールされているperlは64bit intなので、使用しているCGIが32bit intモードPerlのみでしか対応してないと動かない場合がある。 --参考⇒http://pc5.2ch.net/test/read.cgi/hosting/1096350526/877 -telnetでCGIの不良動作を確認してみるのもアリ。(たとえその気がなくても)恐ろしい量のメモリを占有していると503になるため、サクっと消すとサクっと動くようになる(下の項を参照)。 -やっぱりInternal Server Error(500)が出ます. --スクリプトに何らかのエラーが発生しています.以下について確認してみてください.検証はローカル環境で行うこと. --コメント外のスクリプト中に全角文字(全角スペース等)が含まれている. --文字コードが規定されているものではない.(Shift_JIS→EUC-JP等) --改行コードが規定されているものではない.(↑×3) --行末にセミコロンがない.文字列リテラルが適切に閉じられていない. --Perlについてはターミナルから「perl -c ファイル名」で構文チェックが行えます. -それでもどうしても動かなければ、スレ10-792の言葉を思い返そう。 ---( 一回、鯖上のCGIもローカル上のCGIも全部消してごらん。 そして、コーヒーなりお茶なりで一服してごらん。 落ち着いたら、もう一回CGIを落としてきて、 説明書きに書いてある通りに、何も考えずにやってごらん。 大混乱してるときには何やっても上手くいかないよ。 落ち着いてマターリと。 ---) **チャットCGIが頻繁に503 Service Temporarily Unavailableになるけど? -アカウント当たりの負荷限界以上にCGIを実行すると503がでる。 -不良プロセスが溜まっていなか確認しよう([[コントロールパネル]]→実行中のプロセスを見るには?) -503が出ることにより、他人の負荷影響を受けて重くなることがないようになっているから、同時に動作させるCGIの数を減らす、負荷の低いCGIに変更するなどで対策するしかない。 -重いCGIを使っていないのに、頻繁に503が出るようなら変ならサポートに相談を。 -どうしてもダメなら、アカウント当たりの負荷限界が高い上位プランへ移行すべし。試用期間を使って、よーく考えよー♪ **外部WEBサーバへのソケット通信できますか? ポートにもよります。80番ポートは使えるようになりました。 **$ENV{'REMOTE_HOST'}でリモートホスト読み取れない 7/27頃から取得できるようになりました(以前は一部のサーバでしか取得できなかった)。 ---( $remotehost = &nslook($ENV{'REMOTE_ADDR'}); sub nslook { local($x)=@_; local($ip,$addr); if ($x =~ /(?d+)?.(?d+)?.(?d+)?.(?d+)/ ){ #↑は↓に比べてなんか変じゃないか? # if ($x =~ /(?d+)?.(?d+)?.(?d+)?.(?d+)/ ){ $ip="$1.$2.$3.$4"; $addr = (gethostbyaddr(pack('C4',$1,$2,$3,$4),2))[0]; if ($addr ne "") { return $addr; } else { return $ip; } } return "$x"; } ---) キャッシュされるとはいえあんまDNS鯖に負担かけんようになー 上記のようにあるが$ENV{'REMOTE_HOST'}も取れるし、生ログにも記録されてる。プランか、.htaccessのアクセス制限にホストでの制限を入れてるせいか?(うちのは7/16からいけたよ) **ファイルマネージャーでCGIスクリプトを転送して設置したい [[ファイルマネージャー]]のページの記載内容でどうぞ。 **重いCGIをなるべく迷惑をかけずに実行したいのですが -niceやreniceを使って優先順位を下げましょう。 -参考 --→&link(FreeBSD 一般コマンドマニュアル NICE,http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=nice&dir=jpman-5.2.0%2Fman§=0) --→&link(FreeBSD システム管理者マニュアル RENICE,http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=renice&dir=jpman-5.2.0%2Fman§=0) **さくらサーバでPerlスクリプトを実行する場合 ---( 実行するPerlスクリプトを格納するフォルダ [1,5,7][0,1,4,5][1,5] 実行するPerlスクリプト [5,7][0,1,4,5][0,1,4,5] ---) -最小、フォルダ101&スクリプト500で動く。 -新たにPerlスクリプトを設置して「Internal Server Error」が消えない場合、フォルダ705&スクリプト705/755のパーミッションを試してみてはどうだろうか。 *PHPについて **PHPがうまく動かない! -PHPのモジュールがCGIタイプなので対応ファイルのパーミッションを実行可能に変えよう(705など) -phpはregister_globalsがoffなので$DATAで引数を取得できない為$DATA=$_GET['DATA']や$DATA=$_POST['DATA']を使用する必要がある。 -extract($_GET); extract($_POST);で一応対処は可能。 -MySQLで一部の命令を使用出来ないため、phpMyAdminでテキストデータの読み込みによるインポートができない。 -&verb(AddHandler php-script .hoge)も手 -&link(kankichi@blog:SAKURA edition: MT/カテゴリーのページ分割〜php化〜,http://kankichi.sakura.ne.jp/blog/archives/2004/10/20041016_1809_index.html#more) **xoopsのインストール画面が表示されずInternal Server Errorになる。 -フォルダとphpファイルのパーミッションを755か705にする。 数が多いからftpソフトにアップ時にパーミッションを変更する設定があるなら活用すべし。 (&link(公式のXOOPSインストールオンラインマニュアル,http://www.sakura.ne.jp/support/manual/rs/xoop_man.shtml) ) --特に''5.ファイルのアップロード''は他のPHPアプリにも応用が効くのでマスターすること。 ---FFFTP以外でアップ時にファイルのパーミッションを変更できるソフトってあるのか?教えて偉い人!! ---アップロード後に、telnet/ssh でログインして、以下のコマンドで一気に変更できる。(xoops/ は、/home/foo/www/xoops) --( find xoops/ -name "*.php" -exec chmod 755 {} \; --) -DBアカウントも取っておく。 ユーザー名とデータベース名は、ともにユーザー名で。DBホスト名はmysql*.db.sakura.ne.jpになる。 **p2をインストールしましたがcurlが使えません。 -curlのソースをサーバ上でコンパイルしてください。 -2004/8/21頃に自分でコンパイルしなくてもcurlが使えるようになったとの話もあり。www218で '''' したらしっかり CURL support:enabled とあった。 --www212も''''→CURL support:enabled と出た。 --www208も CURL support:enabled と出た。 **NucleusでFancyURLを使う方法 ---( ■ .htaccess の変更 ForceType application/x-httpd-php は ForceType application/x-httpd-cgi に変更 ■ extra/fancyurls/* の変更 ・先頭に "#! /usr/local/bin/php" の追加 ・serverVar('PATH_INFO') を serverVar('ORIG_PATH_INFO') に変更 でrootにコピー(実行属性付けてね) (※ fancyurls.config.phpは先頭にパスを追加しない) ・include('./ を include(' に変更 ( ./ を消す) ■ php.ini の編集 cgi.force_redirect=0 cgi.fix_pathinfo=1 ■ libs/globalfunctions.php の変更 ・262行目あたりの、 serverVar('PATH_INFO') を serverVar('ORIG_PATH_INFO') に変更 サイトのrootじゃなくてNucleus配下に専用の.htaccessやphp.iniを置くのが良い ※NP_CustomURLの導入も検討されたし。上記のような面倒なことをしなくても一発でスラッシュ区切りのURLにできる。 ---) **さくらサーバでPHPスクリプトを実行する場合 ---( (参考情報 2004/12/01) 実行するPHPスクリプトを格納するフォルダ ○ パーミッション705 × パーミッション707 × パーミッション777 × パーミッション704(当然Forbidden) ○ パーミッション701 実行するPHPスクリプトのパーミッション ○ パーミッション700 ○ パーミッション705 ○ パーミッション755 × パーミッション775 × パーミッション777 ○ パーミッション500 × パーミッション600 PHPスクリプトの1行目に #! /usr/local/bin/php を記述する必要は無し 記述があってもコメントアウト処理される データフォルダ等、内部処理に関連したファイルとフォルダは 上記の設定に因らない。 さくらサーバで新規にPHPスクリプトを設置して 「Internal Server Error」が消えない諸兄は フォルダ705、スクリプト705/755のパーミッションを 試してみてはどうだろうか。 (追記)  ベテランユーザは独自にPHP.iniを設定している模様であり 上記の方法が最適とは限らない。 ---) **さくらサーバで PEAR を自由に使いたい場合 PEAR はインストールされてはいるものの、バージョンが古いので基本的に使い物にならない。したがってローカルコピーを使用する。ローカルコピーの作り方は以下を参照。 SSHを使った方法、ftpを使った方法、どちらも可能。 http://pear.php.net/manual/ja/installation.shared.php 注意点としては、上ページで例としてあがっているコマンドは、そのまま実行すると 〜(チルダ)付きのフォルダが出来る。多分デフォルトシェルが (FreeBSDなので)tcsh のせい?あともしそのまま tcsh を使っているなら、パスの追加も .bashrc ではなく .cshrc に追加( $HOME/pear/bin )。 うまく言っていれば、ホームディレクトリに .pearrc というファイルが出来ていて、pear list とした時に、自分のローカルにインストールされた PEAR ライブラリが表示される。 PEAR パッケージを使うコードにおいていちいち include_path を書くのは面倒なので、php.ini をいじる。 ---( include_path=".:/home/HOME/pear/lib" ---) **さくらサーバで PHP エラーログを取りたい場合 php.ini に以下を追加。 ---( display_errors="0" error_reporting="2047" log_errors="1" error_log="/home/HOME/php-error.log" ---) ssh でログインして、php-error.log ファイルを先に作っておき、アクセス権を適切に設定する事も忘れない。 **GD使えますか? -使えます。 **ImageMagick使えますか? -使えます。 パスは ---( /usr/local/bin ---) です。 **NetPBM使えますか? -使えません。無理矢理インストールしようとしても駄目なようです。''他の人、確認求む。'' **zipinfo使えますか? -一応、存在はしてますが使えるかどうかは未確認です。 パスは ---( /usr/local/bin/zipinfo ---) です。 **unzip使えますか? -一応、存在はしてますが使えるかどうかは未確認。 パスは ---( /usr/local/bin/unzip ---) です。 **SQLite使えますか? -phpモジュールにv2.8系が入っているので使えます。 --ただしシェルのsqliteコマンドは導入されていません。 -サーバコントロールパネルの「PHP設定ファイルの編集」から、php.iniに次の2行を追加して下さい。 ---( extension_dir = "/usr/local/lib/php/20020429/" extension = "sqlite.so" ---) **.php以外の拡張子でphpを動かしたい -/usr/local/bin/phpを~/www/somewhereにphp.cgiという名前でコピーして、実行権を付けておく。 -.htaccessを設定する(下記例は.jsで使う場合) ---( AddHandler myphp-script .js Action myphp-script /somewhere/php.cgi ---) -次の、自分でインストールしたphp5を使う方法とほぼ同じ。自分でインストールするかわりに/usr/local/bin/phpをコピーするだけ。 - ''この方法を使う場合はphp.iniにcgi.force_redirect=0を書かないこと(わかる人は注意して使うこと)。セキュリティホールになります(以下2項目も同じ)。''→&link(受ける可能性がある攻撃,http://jp2.php.net/security.cgi-bin) **php5使えますか? -自分でインストールして設定すれば可能。 -自分でインストールしたphp5を~/www/somewhereにphp.cgiという名前でコピーして、実行権を付けておく。 -.htaccessを設定する(下記例は.php5で使う場合) ---( AddHandler myphp-script .php5 Action myphp-script /somewhere/php.cgi ---) -前の、php以外の拡張子でphpを使う方法とほぼ同じ。元からあるものをコピーするかわりに、自分でインストールしたものをコピーするだけ。 -参考サイト→&link(nazonoDiary,http://d.hatena.ne.jp/nazoking/20041213) **cronでphpを使いたい -phpのコマンドラインオプションとしてphpファイルを指定する。 -コントロールパネルの「サーバ情報の表示」などからphpのインストール場所を確認しておく。 -/usr/local/bin/phpにインストールされているなら、 ---( /usr/local/bin/php /home/アカウント名/hoge.php > /dev/null 例では実行結果がメールで飛んでくるのを防ぐために > /dev/nullを付けている。 ---) **ライトだけどphpを使いたい -基本的にライトではphpを使えませんが、自分でインストールすれば裏技的に使えるかも? -.htaccessを設定する(下記例は~/www/somewhereに設置して.phpで使う場合) ---( AddHandler myphp-script .php Action myphp-script /somewhere/php.cgi ---) -前の、php以外の拡張子でphpを使う方法・自分でインストールしたphp5を使う方法とほぼ同じ。php4でもphp5でも自分でインストールしたものをコピーするだけ。 -ただし、さくらにPHP利用が発覚した場合のリスクを考えて行うように。 -念のためサポートに連絡したところ、PHPを自分でインストールして使用する事は規約、禁止事項に触れる事柄ではなく、特に問題は無いとの事。ライトプランではtelnetやSSHが使えないので面倒ですが… **XML宣言を記述するとエラーを出力する -Parse error: syntax error, unexpected T_STRING このようなエラーが出力されたら次のように記述して工夫をしよう: ---( ' ?> ---) またはPHP設定ファイル(php.ini): ---( short_open_tag = Off ---) *SSIについて **execで上位ディレクトリのコマンドを呼び出せない セキュリティ上そうなってます(どうも最近のApache自体がそういう仕組みらしい)。 上位ディレクトリのコマンドを呼び出す必要があれば、そのコマンドを呼び出すよう記述したシェルスクリプト等をSSIで呼び出して使いましょう。 ちなみに、SSIのexecで呼び出した場合、rootは見ているウェブサイトのrootになるようです。 例えば、&verb(http://hogehoge.sakura.ne.jp/)(以下略)中だと/home/hogehoge/www/が/になります。 **基本的なコマンド(echo等、/binにあるような)がexecで呼び出せない それらの基本的なコマンドも、/bin等の上位ディレクトリなので、直接execで呼び出しはできません。 そのコマンドを呼び出すよう記述したシェルスクリプトをSSIのexecで呼び出して使いましょう。 *現状動作報告のあるモノ -Nucleus &link(japan.nucleuscms,http://japan.nucleuscms.org/) -MT(&link(オンラインマニュアル,http://www.sakura.ne.jp/support/manual/rs/mt_man.shtml) ) (ライトならBerkeley DBで動かせ) -Xoops (&link(オンラインマニュアル,http://www.sakura.ne.jp/support/manual/rs/xoop_man.shtml) )(スタンダードプラン以降) -WordpressME (&link(XOOPSのインストールマニュアルを参考のこと。,http://www.sakura.ne.jp/support/manual/rs/xoop_man.shtml) )(スタンダードプラン以降) -p2(ホスト規制に引っかかって書込みは不可。 ●(&link(2ちゃんねるビューア,http://2ch.tora3.net/) )を持っていればcurlをインストールすることによって投稿可能らしいが、 --2004/10/08現在2ch側のDeny規制により一部のサーバで●を使った読み込み/書き込みも不可) --deny from 202.181.96.0/20された模様…… -&verb(PukiWiki) (.htaccess を消しちまえ)→1.4.5_1だと消す必要はない。パーミションの設定をいじる。1.4.6は付属のINSTALL.txtのパーミッション通りで全て動きました。問題ありません。 -&verb(PukiWiki Plus!) (.htaccess を消しちまえ)→1.4.5_1だと消す必要はない。パーミションの設定をいじる。 -&verb(osCommerce) (php.ini にてregister_globals を On にする。但しさくらのサーバはSSLが使えない) -&verb(SquirrelMail)(さくらのWebメールに不満なら、これを導入)。HTTPS内で動かすヒント→[[https]] -&verb(mobileimap) 携帯電話用IMAPwebメーラ。(スタンダードプラン以上)http://www.namazu.org/~satoru/mobileimap/ -Gallery2 何の問題もなくインストール&利用できました -phpBB -joomla!じゃぱん &link(joomla.jp,http://www.joomla.jp/) -MODx 何の問題もなくインストールできる(スタンダードプラン以上)。DBサーバによってはインストール時のInnoDBの問題があるが対応可。フレンドリーURLを利用したい場合は.htaccessの記述の一部を変更し圧縮を無効にする -SimpleMachinesForum &link(simplemachines,http://simplemachines.org/) URLに?を用いないようにするには、php.iniにcgi.fix_pathinfo=1を加える -NOTA スタンダードプランで設置できました。デフォルトではOptions指定があるので.htaccessを消去。 *namazu のインストール アカウント名を hiroyuki とする。 まず、kakasi をインストールする。 ---( $ wget http://kakasi.namazu.org/stable/kakasi-2.3.4.tar.gz $ zcat kakasi-2.3.4.tar.gz | tar xvf - $ cd kakasi-2.3.4 $ ./configure --prefix=/home/hiroyuki/local $ make $ make install ---) /home/hiroyuki/local/bin に PATH を通すこと。そうでないと、namazu の実行が失敗する。 次に、namazu のインストール ---( $ wget http://www.namazu.org/stable/namazu-2.0.14.tar.gz $ zcat namazu-2.0.14.tar.gz | tar xvf - $ cd namazu-2.0.14 $ cd File-MMagic $ perl Makefile.PL LIB=/home/hiroyuki/local/lib INSTALLMAN3DIR=/home/hiroyuki/local/man $ make $ make install $ cd .. $ ./configure --disable-shared --prefix=/home/hiroyuki/local/namazu --with-pmdir=/home/hiroyuki/local/lib --with-libintl-prefix=/usr/local $ make $ make install ---) mknmz は /home/hiroyuki/local/namazu/bin/mknmz にインストールされます。 namazu.cgi は /home/hiroyuki/local/namazu/libexec/ にあります。 *使えたモジュールとインストール済みライブラリ/モジュール :''GD.pm'':http://homepage3.nifty.com/hippo2000/perltips/GD.html :''Perl/ライブラリ一覧(PL)'':[[perl/ライブラリ一覧]] :''Perl/モジュール一覧(PM)'':[[perl/モジュール一覧]] :''Ruby/ライブラリ一覧'':[[Ruby/ライブラリ一覧]] :''Python/ライブラリ一覧'':[[Python/ライブラリ一覧]]