タグ別アーカイブ: Apache httpd

svnで結果をたくさん入れたかった

Ubuntu Serverのアップグレードを行ったんだけど、apacheのconfファイルが色々と変わってて、それに伴って/etc配下をsvnに入れてた分の更新作業を行った。

Ubuntu Serverは12.04から14.04にアップグレードしたんだけれど、一つ前の13.10からapacheのconfのルールなどがちょくちょくかわったみたいで更新作業が結構発生した。

また標準で(?)くっついてくるモジュールが減ったらしく、前のバージョンでは存在したmodsのconfとloadファイルが無くなっていた。

自分は利用するconfファイルをすべてsvn管理下においているんだけど、アップグレードでaptによって削除されてしまったファイルがいくつか。

shell> cd /etc/apache2/
shell> svn st
...(前略)...
? mods-available/authn_core.load
! mods-available/authn_default.load
? mods-available/authn_socache.load
? mods-available/authz_core.load
? mods-available/authz_dbd.load
! mods-available/authz_default.load
? mods-available/buffer.load
? mods-available/cache_disk.conf
? mods-available/cache_disk.load
? mods-available/cache_socache.load
! mods-available/cern_meta.load
? mods-available/data.load
? mods-available/dialup.load
...(後略)....

svn stしてみると出てくるファイルのうち、?は新規に追加されたファイル、!は削除されてしまったファイル。
これらのファイルをsvn del、svn addしてみる。
手動でひとつひとつ追加、削除するのは大変なのでsvn stからcutをつかってxargsにわたしてみる。
svn stの!とか?からファイル名までは空白8文字で、cutに行頭から9文字を削除するオプションがあるらしくてそれをつかう。

shell> svn st | grep ! | cut -c9- | xargs svn del
D authn_default.load
D authz_default.load
D cern_meta.load
D disk_cache.conf
D disk_cache.load
D ident.load
D imagemap.load
D mem_cache.conf
D mem_cache.load
D version.load
shell> svn st | grep \? | cut -c9- | xargs svn add
A cache_disk.load
A cache_socache.load
A data.load
A dialup.load
A echo.load
...(後略)...

</pre>

というわけでたくさんのファイルを一括して処理できました。

addの方ではハテナマークをエスケープするためにバックスラッシュを追加した。またファイル名の途中にハテナやビックリが入っていると引っかかりそうなので、行頭から(-e ‘^!’)を入れた方がいいかも。

wgetでベーシック認証をかける方法

こんにちは、最近スノボによく行っている岡田洋一です。

スノボに行ったりしている間はサーバが自動で処理をしてくれたりする機能、いわゆるバッチ処理があるんですが、こちらがエラーになっていたのでその対処。

shell> wget -O - http://www.example.com/action.php
--2014-01-22 19:23:10-- http://www.example.com/action.php
Resolving www.example.com (www.example.com)... 192.168.1.1
Connecting to www.example.com (www.example.com)|192.168.1.1|:80... connected.
HTTP request sent, awaiting response... 401 Authorization Required
Authorization failed.

見ればベーシック認証でコケている様子。前はどこからでもアクセスできたんですが、今はアクセス制限をしているのでその対応ですね。

wgetのオプションを調べると –userと–passwordで設定する様子。

shell> wget -O - --user=username --password=somepassword http://www.example.com/action.php

HTTP request sent, awaiting response... 401 Authorization Required
Reusing existing connection to www.example.co:80.
HTTP request sent, awaiting response... 200 OK
Length: 11206 (11K) 
Saving to: `STDOUT'

というわけでうまくいきました。

FreeBSDでwsgiを使ったtracがどうもおかしい

FreeBSDでwsgiを使ったtracがどうもおかしい。なんだか重い。もともとfcgiを利用してたんだけれどfcgi版のtrac(というかpythonかな)って重い、なのでwsgiにて動かすことにした。

過去にyubirdたんがdebianで、また別件でcentosにてwsgi版のtracを動かしたけどとっても快調だった。

どうやらapache+pythonでの最近のハヤリはwsgiらしい。ということでテキトウにインストールした。

さて、confの変更もすんで動かしてみたんだけれどどうにも重い。topすればpythonの名前でapacheから独立してプロセスが走り続けてたりする。なんかおかしいな、って。ログを見ると気になる記述が。

[Wed Apr 11 13:37:47 2012] [info] mod_wsgi (pid=1189): Attach interpreter ''.
[Wed Apr 11 13:37:52 2012] [info] mod_wsgi (pid=1189): Cleanup interpreter ''.
[Wed Apr 11 13:37:52 2012] [info] mod_wsgi (pid=1189): Terminating Python.
[Wed Apr 11 13:37:52 2012] [error] Exception KeyError: KeyError(34382823872,) in <module 'threading' from '/usr/local/lib/python2.6/threading.pyc'> ignored

最後の行にあるException KeyError: KeyErrorのあたり。なんかスレッド周りの処理でエラーが出てるらしい。

でググってみるとそれらしき記述を発見。

InstallationOnFreeBSD -  modwsgi - Python WSGI adapter module for Apache. - Google Project Hosting

http://code.google.com/p/modwsgi/wiki/InstallationOnFreeBSD

上記のgoogle codeによるとあれしろコレしろ、ってあるけど、結局最後にはwsgi3.3使ったら直ったよってことが。

調べてみるとwsgiのバージョンは2.8を使ってた。

shell> pkg_info -Ix wsgi
ap22-mod_wsgi-2.8_2 Python WSGI adapter module for Apache
shell> psearch wsgi

www/mod_wsgi              Python WSGI adapter module for Apache
www/mod_wsgi3             Python WSGI adapter module for Apache


どうやらバージョンデュアルツリー(っていう名前を今作った!)らしくて2系がstableで3系は実験的なのかな、両方存在してた。2系をアンインスコして3系を入れる。

shell> pkg_deinstall -f www/mod_wsgi
** No matching package found.
shell> portinstall –c www/mod_wsgi3

以上でちゃんといけたっぽい。めでたしめでたす。

でも早くなったかどうかは微妙、残念。

apache httpdでldapを用いてbasic認証を行うときにユーザとかを制限する

apacheで.htaccessを用いてbasic認証を行うとき、認証可能なユーザを選べるようにしてみた。

AuthzLDAPAuthoritative off
AuthName "ldap ninshou dayoyo"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPURL ldaps://192.168.1.1/ou=People,dc=l2tp,dc=org?uid
Require ldap-user user1 user2
#Require ldap-filter !(cn=except_user)

この設定を行う上で、 ldap-filterを選択した場合、フィルターをクォートしてしまうとうまくうごかなかった。

http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html#requiredirectives

ApacheのBasic認証にLDAPを利用する

apacheのBasic認証にLDAPを利用しようとしてみた。

サーバはOpenLdap24 on FreeBSD, クライアントはApache22 on CentOS6.2。

今回の方法はBasic認証でアクセス制御をしたい箇所に.htaccessを設置してみた。

shell> more .htaccess

AuthzLDAPAuthoritative off
AuthName "ldap ninshou dayoyo"
AuthType Basic
AuthBasicProvider ldap
#LDAPVerifyServerCert off
AuthLDAPURL ldaps://192.168.1.1/ou=People,dc=example,dc=com?uid
Require valid-user

コレだとうまくいかない。500のInernal Server Errorが帰ってしまう。ユーザ名とパスワードの組み合わせがうまくいかないのかと思いきや、他の手段で認証を試すとうまく通ってる。

apacheのerror_logをdebugレベルまで引き上げてログを見てみた。

shell> more httd-vhosts.conf

…前略…

# ldaptest
<VirtualHost *:80>
ServerAdmin hogetan<a href="mailto:[email protected]">@l2tp.org</a>
DocumentRoot /home/hogetan/public_ldap
ServerName ldap.l2tp.org
LogLevel debug
ErrorLog /var/log/httpd/ldap.l2tp.org-error.log
CustomLog /var/log/httpd/ldap.l2tp.org-access.log combined
</VirtualHost>

…後略…

shell> tail /var/log/httpd/ldap.l2tp.org-error.log

[Tue Feb 28 09:43:23 2012] [debug] mod_authnz_ldap.c(393): [client 192.168.1.5] [29473] auth_ldap authenticate: using URL <a href="ldaps://192.168.1.1/ou=People,dc=hoge,dc=info?uid">ldaps://192.168.1.1/ou=People,dc=hoge,dc=info?uid</a>
[Tue Feb 28 09:43:23 2012] [info] [client 192.168.1.5] [29473] auth_ldap authenticate: user yubird authentication failed; URI /favicon.ico [LDAP: ldap_simple_bind_s() failed][Can't contact LDAP server]
[Tue Feb 28 09:43:23 2012] [debug] mod_authnz_ldap.c(1105): [29467] auth_ldap url parse: `ldaps://192.168.1.1/ou=People,dc=l2tp,dc=org?uid', Host: 192.168.1.1, Port: 636, DN: ou=People,dc=l2tp,dc=org, attrib: uid, scope: base, filter: (null), connection mode: using SSL

なんかエラー出てる。Can’t contact LDAP serverとか言われてる。

いろいろ悩んで湯バード先生にヘルプを求めた結果、ldapsのsがいけないんじゃ無いか、ってことに。sslの証明書の検証が悪いのではないか、ということだ。今回のldapサーバはオレオレ証明書を利用しており、今までもldap.confなどでことごとく証明書の認証でコケた経験があった。

試しにldapsじゃない、ldapな待ち受けに接続にいくとすんなりつながった。

で、証明書の検証をしないようにするオプションを探して有効にしてみた。

http://httpd.apache.org/docs/2.2/mod/mod_ldap.html#ldapverifyservercert

このオプションで注意しなくてはいけないのは、.htaccessなどには記述できない、ということ。virtualhostディレクティブとかでもダメ、グローバルディレクティブじゃないとダメっぽい。

shell> grep LDAPVerify httpd.conf

LDAPVerifyServerCert Off

この設定を入れたらldapsでもうまくいった。

とにかくldaps+オレオレ証明書の場合には証明書の検証問題に注意しろ、ってことで。めでたしめでたし。

PHPのエラーログをsyslog経由で出力する

1. PHPのエラーログ

PHPではエラーログを出力することが出来る。PHPのエラーログは、php.iniで定義される出力方法、出力条件に従って、error_logの項目で定義された方法によって出力される。例えばapacheでmod_phpを経由してphpを利用した場合にブラウザにエラー情報を出力するか否か、などなど。

そして出力方法のところには、ファイル若しくはsyslogを指定出来たりもする。この項目はerrro_logで示される。

shell> grep error_log /usr/local/etc/php.ini
; Log errors into a log file (server-specific log, stderr, or error_log (below))
; Set maximum length of log_errors. In error_log information about the source is
;error_log = filename
error_log = syslog
;error_log = /var/log/php_error.log

ここにerror_log=syslogと書けばローカルホストのsyslogdへログを送る。なので後はローカルホストのsyslogを設定すればおk。

なお、送られるログのファシリティはuser、apache+mod_phpで利用したときにはタグ(プログラム名)はhttpd。

プログラム名はphpで送られるのかと思ったのだけれど、httpdで送られているので間違えやすく注意が必要。

2. ファイルとsyslogの両方に出力したい

さて、コレでひとまずsyslogへログを出力出来るようにはなったんだけど、現状syslogサーバへログを転送しているのでこれだとローカルのログファイルへは書き込まれない。

コレを書き込めるようにするため、error_logを二行に渡って書いてみたりしたけどダメだった。なのでsyslog側で対処してやる。

なお、プログラム名のhttpdとそれを受け取るファイルの場所は連続して書き込まないとダメだったりする。書き出すファイルの所有者はsyslogdのユーザ。

shell> egrep '@|http|php' /etc/syslog.conf
*.*                                             @loghost
!httpd
*.*                                             /var/log/php.log
shell> touch /var/log/php.log

shell> /etc/rc.d/syslogd restart

なおコレで出力される形式はphp.iniで設定されるものとはちょっと違うのでちょっと残念。

続きを読む PHPのエラーログをsyslog経由で出力する

phpMyAdminをインストール

1. phpMyAdminをインストール

最近の鯖の移転に合わせてphpMyAdminも移動することになった。

まずは対象のホストでphpMyAdminをインストールする。ホストはFreeBSDなのでportsを利用する。

shell> portinstall –c databases/phpmyadmin
shell> pkg_info -Ix phpMyAdmin
phpMyAdmin-3.4.7    A set of PHP-scripts to manage MySQL over the web

今回のインストールはapacheもphpも入ってなかったのでコレに合わせてインストールされた。

途中のコンパイルオプションでmod_phpを作成するのを忘れないように。

また、mysqliモジュールも必要だったり。

続きを読む phpMyAdminをインストール