アーカイブ

‘CentOS’ タグのついている投稿

HTTP経由の、hg push で「abort: HTTP Error 500: Internal Server Error」発生を回避する方法

2009 年 11 月 29 日 oklab コメントはありません

CentOS5上に、Mercurialサーバを構築したのですが、hg push が正常に動作しませんでした。その原因と解決方法です。

レポジトリを作成する場合は、Linuxのアカウントでhg init を使いレポジトリを作成すると思います。この時レポジトリのオーナーは、いま使っているアカウントになります。hg pushコマンドをHTTP経由で行った場合は、Apacheの実行ユーザでレポジトリにアクセスしようとします。例えば、CentOS5の場合のデフォルトでは、Apacheの実行ユーザは、apache、実行グループはapacheになります。そのためhg initで作成したレポジトリは、HTTP経由でhg pushができるように、Apacheの実行ユーザにする必要があります。

普段使っているhogeユーザで、Mercurialのレポジトリを作成する例。ユーザがhogeになっているのが分かると思います。

[hoge@sc ~]$ hg init MyFirstProject
[hoge@sc ~]$ ls -l
合計 4
drwxrwxr-x 3 hoge hoge 4096 11月 29 21:29 MyFirstProject

例えば、実行ユーザをapacheにして、実行グループをapacheにする場合は以下のようにします。

[hoge@sc ~]$ sudo chown -R apache.apache MyFirstProject

ただこの場合は、このローカルマシンで作業をする場合に、apache を意識する必要があるので、普段使用するユーザと、apache ユーザ用のグループ(この場合はmyadmin)をgroupaddコマンドで作成したほうが管理が楽になると思います。

[hoge@sc ~]$ sudo chown -R apache.myadmin MyFirstProject

また、問題を解決する際にGoogleなどの検索エンジンを使うと思いますが、–debug -v –traceback で、実行時の詳細が取得できます。詳細なログで検索すれば解決方法が見つかるかもしれません。

[hoge@sc ~]$ hg push --debug -v --traceback
Traceback (most recent call last):
 File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 43, in _runcatch
 return _dispatch(ui, args)
 File "/usr/lib/python2.4/site-packages/mercurial/dispatch.py", line 441, in _dispatch
 raise error.RepoError(_("There is no Mercurial repository"
RepoError: There is no Mercurial repository here (.hg not found)
abort: There is no Mercurial repository here (.hg not found)!

http://ubuntuforums.org/showthread.php?p=7539735

カテゴリー: サーバ構築 タグ: ,

CentOS5でのindex.phpとindex.htmlのDirectoryIndex評価順序

2009 年 11 月 27 日 oklab コメントはありません

httpd.confのDirectoryIndexを変更しても、index.htmlとindex.phpの評価順序が変更されなかったので評価順序を調べてみました。バーチャルホストで運用している際に、評価順序としては、以下のようになります。

  1. VirtualHost ディレクティブ内で定義した、Directoryディレクティブ内の、DirectoryIndex
  2. /etc/httpd/conf.d/php.conf に記述されたDirectoryIndex
  3. /etc/httpd/conf/httpd.conf に記述されたサーバデフォルトのDirectoryIndex

CentOS5でphp環境をyumでインストールした場合、以下のような/etc/httpd/conf.d/php.confが追加されます。この設定ファイルにより、PHP5のモジュールがロードされ、Apacheはphp拡張子を理解できるようになります。また、URLでディレクトリアクセスした場合には、DirectoryIndexで定義された、index.phpを確認し、ある場合はindex.phpを実行し、無い場合は、HTTPステータス404をクライアントに返却するようになります。

#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#

LoadModule php5_module modules/libphp5.so

#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php

#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps

そのため、以下のようにhttpd.conf のDirectoryIndexの最後にindex.phpを追加して、html拡張子を先に評価しようとしても、

DirectoryIndex index.html index.html.var index.php

実際には、php.conf側のDirectoryIndexが先に評価されるため、以下のような定義と同様になるようです。

DirectoryIndex index.php index.html index.html.var index.php

CentOS5の場合は、index.htmlとindex.phpの評価順序を変更したい場合は、httpd.confのDirectoryIndexにindex.phpを追加するのではなく、php.conf側で以下のように指定したほうがよいのかもしれません。

DirectoryIndex index.html index.php
カテゴリー: PHP タグ:

CentOS5にMercurial1.3をインストール

2009 年 11 月 25 日 oklab コメントはありません

CentOS5にMercurial1.3をインストールした際に、マルチレポジトリ環境を構築したのですが、ブラウザでレポジトリのリストが表示されない状態になってしまいました。その時のトラブルシューティングです。

CentO+S5.4では、RPMForegeをインストールすれば、yum管理でMercurial1.3がインストールできます。ローカルでMercurialを使う環境を整えるのは比較的簡単にできますが、レポジトリ公開用の環境構築に癖があります。CVSやSVNの場合は、ブラウザベースでレポジトリを公開する場合は、一般的にViewvcなどが使われますが、Mercurialでは、標準で用意されています。標準で用意されている機能としては、以下の3つがあります。

  • hg serveコマンドによる簡易サーバ
  • レポジトリを1つ公開するためのhgweb
  • 複数のレポジトリを公開するためのhgwebdir

hgwebサーバの構築または、hgwebdirサーバの構築には、以下の構築手順書があります。

  • http://mercurial.selenic.com/wiki/PublishingRepositories
  • http://mercurial.selenic.com/wiki/modwsgi

CentOS5.4の場合は、mod_wsgi はyumでインストールできるのでwsgi環境を整える(Pythonの環境)を整えるのは難しくありません。

私の場合は、上記手順書で、hgwebdirサーバの構築を行ったのですが、http://mercurial.selenic.com/wiki/modwsgiの「3.3 Mercurial」で書かれている設定ではブラウザからレポジトリ公開のトップページは表示できるけれど、レポジトリ一覧が表示できない状態でした。以下のように、CGI 設定ファイルに当たるhgweb.config を絶対パスで指定することで解決できました。

from mercurial import demandimport; demandimport.enable()
from mercurial.hgweb.hgwebdir_mod import hgwebdir
application = hgwebdir('/var/www/myhg/hgweb.config') # 絶対パス

トラブルシューティングの手順としては、

  1. コマンドラインでMercurialのテストプロジェクトを作って動作確認する。これによりMercurial自体に問題ないことを検証。
  2. hgweb,hgwebdirを使わずに、hg serveコマンドで簡易サーバを立てて、ブラウザからのアクセスを行う。ここでファイアウォールやブラウザ環境に問題ないことを確認。
  3. hgwebdirの構築を行って動作確認。問題がある場合は、パーミッション、Apacheの設定、hgweb.config の設定などが考えられます。
#hg serve -p 8111 --webdir-conf /var/www/myhg/hgweb.config

SVNとViewvcで構築した場合は、SVN自体の管理と、Viewvcの管理が必要になりますが、Mercurialでは、単体でViewvcのようなソースコードブラウザの管理ができ、また複数のレポジトリをサーバの再起動せずに反映させることが可能です。

また、yumでmercurial1.3をインストールした場合、以下ディレクトリに、hgwebdir.wsgiが存在するのでこれをコピーして使います。

[root@xxx ~]# rpm -ql mercurial-1.3.1-1.el5.rf | grep hgwebdir
/usr/lib/python2.4/site-packages/mercurial/hgweb/hgwebdir_mod.py
/usr/lib/python2.4/site-packages/mercurial/hgweb/hgwebdir_mod.pyc
/usr/lib/python2.4/site-packages/mercurial/hgweb/hgwebdir_mod.pyo
/usr/share/doc/mercurial-1.3.1/contrib/hgwebdir.fcgi
/usr/share/doc/mercurial-1.3.1/contrib/hgwebdir.wsgi
カテゴリー: サーバ構築 タグ: ,

CentOS5.2 yum updateをしたらinitctlが制御できずshutdownできない

2009 年 5 月 17 日 oklab コメントはありません

CentOS5.2 yum updateをしたらinitctlが制御できずshutdownできない

timeout opening/writing control channel /dev/initctl

yumコマンドで一気にいろいろなソフトウェアをアップデートすると実行中のソフトウェアとの整合性が取れなくなって発生するようで、上記のメッセージが表示されました。 telinitコマンドでinitの初期化をしようとしても正常に終了できない状態でした。英語圏の情報を調べてみたら、theNthDoctor’s Dumped His Brain Again… timeout opening/writing control channel /dev/initctlこの記事の方が同じような症状で、いろいろトラブルシューティングを試しているようでした。私も通常のrebootコマンドを実行したのですが、コマンドが正常に終了しませんでした。-fで強制実行オプションを付けると問題なく再起動できるようです。RAID構成のため電源ボタンで強制終了するのがちょっと嫌だったので、rebootコマンドでとりあえず解決できてよかったです。

reboot -f

*どうやら、CentOS5.2からCentOS5.3にアップデートしたら、環境によってこの問題が発生するようです。

カテゴリー: サーバ構築 タグ: ,