apache2
=注意=
apacheのコンパイルにはgrepの更新が必要です。
以下のコマンドで"Bad egrep"と表示される場合はエラーが発生します。
$ if echo GNU | egrep '(GNU|BFD)' >/dev/null; then echo "Good egrep"; else echo "Bad egrep"; fi
ホームページを公開するにも、WEBメールシステムを作るにも必要なものが、http鯖(www鯖?)です。
ここでは、めちゃくちゃメジャーなapacheのバージョン2.0系をインストールします。
「新しいのはいいことだ」ということで。
「新しいのはいいことだ」
正確に言うと、新しいというより更新があるということ。
なぜ、更新されているのがいいのか?
バグが出る悪いソフトじゃないのか?と思う人も居ると思う。
まぁ、バグ修正もあるけど、更新されるってことはサポートがあるってことじゃん?
不測の事態にもすぐオリジナルの作者が対応してくれるってことだと思う。
だから、新しいのはいいことだ。
やること一覧 ・apache2のユーザー作成 ・thttpdのアクセスポート変更 ・APR関係のインストール ・apache2のインストール: Apache HTTPサーバのインストール コンパイルとインストール - Apache HTTP サーバ Linux Tips「ソ−スコンパイルのApacheも/etc/rc.d/init.d/下のスクリプトで制御させたい」 ・ユーザーディレクトリを有効にする ・バーチャルホストを有効にする ・設定変更時の注意点 ・ログの設定(最低限やっておきたいこと): Apache - JAVAに関する備忘録 HIDEKAZU PukiWiki Regular Expression(Riue ちゃんの正規表現講座) - Index Stray Penguin - Linux Memo (logrotate)
関連ページ ・grepとcoreutils
まずはapache2を動かすユーザーを作る。
apacheはデフォルトで「のーぼでぃ」とかいう
居るんだか居ないんだかわからないユーザーで動くようになっている。
まぁ、それはそれでいいと思うけど、(sambaもこの「のーぼでぃ」で動いているし・・・)
なんか変更できるみたいだから、管理しやすい(覚えやすい)ようにしておく。
でも、ありきたりにapacheとかhttpとかwwwとかは嫌だから今回は
ユーザー名:apache2
グループ名:httpd
で行こうと思う。
# groupadd -g 23 httpd # useradd -g httpd -u 23 -d /var/empty -s /bin/false apache2 注:このシェルだとログオン自体ができない(すべてのリクエストに失敗を返す) 注:まぁ、それ以前に正規のシェルじゃない(無効なシェルだ)し・・・ 注:ついでにディレクトリもempty(空)に指定してあるユーザーをロックする
# vipw または # vi /etc/passwd 変更点:! を * に書き換える「のーぼでぃ」
玄箱のWEBツールもhttp鯖で動いている(当たり前か
で、このhttp鯖はhttpの標準ポート(80)を使って動いている(これも当たり前か
でも、このままだとapacheはポート80を使えないので、公開用のアドレスが
http://www.hoge.com:8080/
といった感じになってしまう。
カッコ悪い・・・
まぁ、回避方法は以下の通り。
# vi /etc/thttpd.conf (変更) ┃port=8080 変更点:80を8080にthttpdの再起動
# /etc/init.d/thttpd restart 注:以降、玄箱の設定(WEBツール)は http://kuro-box:8080/ となる「http://www.hoge.com:8080/」
APR(Apache Portable Runtime)なる物をインストールする必要がある(かも?)
エラーで止まる人はAPRをインストールする。
$ wget http://ftp.kddilabs.jp/infosystems/apache//apr/apr-1.5.2.tar.gz $ tar xvfz apr-1.5.2.tar.gz $ cd apr-1.5.2 $ ./configure --prefix=/usr $ make $ make check # make installインストールされるもの: install files list(default): use command is: ls -pR /usr/local >~/bin.txt
[prefix]/bin: apr-1-config [prefix]/build-1: apr_rules.mk libtool make_exports.awk make_var_export.awk mkdir.sh [prefix]/include/apr-1: apr.h apr_*.h [prefix]/lib: apr.exp libapr-1.a libapr-1.la libapr-1.so* [prefix]/lib/pkgconfig: apr-1.pc
$ wget http://ftp.kddilabs.jp/infosystems/apache//apr/apr-util-1.5.4.tar.gz $ tar xvfz apr-util-1.5.4.tar.gz $ cd apr-util-1.5.4 $ ./configure --prefix=/usr --with-apr=/usr $ make $ make check # make installインストールされるもの: install files list(default): use command is: ls -pR /usr/local >~/bin.txt
[prefix]/bin: apu-1-config [prefix]/include/apr-1: apr_*.h apu.h apu_*.h expat.h [prefix]/lib: aprutil.exp libaprutil-1.a libaprutil-1.la libaprutil-1.so* libexpat.a libexpat.la libexpat.so* [prefix]/lib/pkgconfig: apr-util-1.pc
$ wget http://downloads.sourceforge.net/project/pcre/pcre/8.34/pcre-8.34.tar.gz $ tar xvfz pcre-8.34.tar.gz $ cd pcre-8.34 $ ./configure --prefix=/usr $ make $ make check # make installインストールされるもの: install files list(default): use command is: ls -pR /usr/local >~/bin.txt
[prefix]/bin: pcre-config pcregrep pcretest [prefix]/include: pcre.h pcre_scanner.h pcre_stringpiece.h pcrecpp.h pcrecpparg.h pcreposix.h [prefix]/lib: libpcre.a libpcre.la libpcre.so* libpcrecpp.a libpcrecpp.la libpcrecpp.so* libpcreposix.a libpcreposix.la libpcreposix.so* [prefix]/lib/pkgconfig: libpcre.pc libpcrecpp.pc libpcreposix.pc [prefix]/share/doc/pcre/* [prefix]/share/doc/pcre/html/* [prefix]/share/man/man1: pcre-config.1 pcregrep.1 pcretest.1 [prefix]/share/man/man3: pcre*.3 pcre16*.3 pcre32*.3 pcre_*.3APR/APR-util
httpd-2.2.31.tar.gzを探してくる。
Welcome! - The Apache HTTP Server Project
で、ユーザーのホームディレクトリにFFFTPで送る。
例のあれ
$ tar xvfz httpd-2.2.31.tar.gz $ cd httpd-2.2.31 $ ./configure --prefix=/opt/apache2 --enable-suexec \ --with-suexec-caller=apache2 --with-suexec-docroot=/home または(2.2.15以降) $ ./configure --prefix=/opt/apache2 --enable-suexec --enable-reqtimeout \ --with-suexec-caller=apache2 --with-suexec-docroot=/home または(proxy機能を追加) $ ./configure --prefix=/opt/apache2 --enable-suexec --enable-reqtimeout \ --with-suexec-caller=apache2 --with-suexec-docroot=/home \ --enable-proxy --enable-proxy-http --enable-proxy-ftp --enable-proxy-connect \ --enable-file-cache --enable-cache --enable-disk-cache --enable-mem-cache
option | 説明など |
--with-mpm= | apacheの動作タイプを変更する prefork(デフォルト)/worker/perchildが使用可能 phpを利用する場合にはpreforkが推奨されている |
--enable-suexec | suexecを有効にする |
--enable-reqtimeout | mod_reqtimeoutを有効にする |
--with-suexec-caller= | suexecの初期実行ユーザーの指定 |
--with-suexec-docroot= | suexecの実行ディレクトリの指定 |
--enable-proxy* --enable-*cache | proxy関係の機能を追加する |
\ | 改行しても実行に移らないようにする呪文 本来はバックスラッシュ(キーボードの右下にある/の右隣のキー) 日本語環境では\になる |
# strip -p /opt/apache2/bin/* # strip -p /opt/apache2/lib/*suexecの設定の確認
# /opt/apache2/bin/suexec -V ┃ -D AP_DOC_ROOT="/home" ┃ -D AP_GID_MIN=100 ┃ -D AP_HTTPD_USER="apache2" ┃ -D AP_LOG_EXEC="/opt/apache2/logs/suexec_log" ┃ -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" ┃ -D AP_UID_MIN=100 ┃ -D AP_USERDIR_SUFFIX="public_html" 注:デフォルトではユーザーID、グループIDともに100未満のユーザーでは 実行できないようになっています。なので、rootだとエラーが出ます。設定変更
# vi /opt/apache2/conf/httpd.conf (最低限の変更) ┃User apache2 ┃Group httpd ┃ ┃ServerName 玄箱のIP:80 ┃ServerName 取得ドメイン名:80 注:ServerNameにはDDNS名も登録しておく(複数表記可能)テスト1
# /opt/apache2/bin/apachectl start 玄箱( http://kuro-box/ )にアクセスして「予想に反して」ページが出るか確認 # /opt/apache2/bin/apachectl stop自動起動の設定
# cp /opt/apache2/bin/apachectl /etc/init.d/httpd # chmod 755 /etc/init.d/httpd # ln -s /etc/init.d/httpd /etc/rc.d/rc2.d/S25httpd # ln -s /etc/init.d/httpd /etc/rc.d/rc0.d/K25httpd # ln -s /etc/init.d/httpd /etc/rc.d/rc6.d/K25httpdテスト2(起動|再起動|停止)
# /etc/init.d/httpd start # /etc/init.d/httpd restart # /etc/init.d/httpd stop成功なら再起動
# shutdown -r nowで、確認
$ ps ax「デフォルトでコンパイル・ロードされるモジュール」
$ /opt/apache2/bin/httpd -l ┃Compiled in modules: ┃ core.c Apache のコア ┃ mod_access.c クライアントのホスト名や IP アドレスによってアクセス制御を行なう ┃ mod_auth.c テキストファイル形式の認証ファイルを使用した ユーザ認証機能を提供する ┃ mod_include.c サーバがパースする html ドキュメント ┃ mod_log_config.c サーバへのリクエストのロギング ┃ mod_env.c CGI スクリプト及び SSI ページに渡される環境変数を変更する機能を提供する ┃ mod_setenvif.c リクエストの特徴に基づいた環境変数の設定を可能にする ┃ prefork.c スレッドを使わず、先行して fork を行なうウェブサーバを実装 ┃ http_core.c ┃ mod_mime.c リクエストされたファイルの拡張子とファイルの振る舞い (ハンドラとフィルタ)、 内容 (MIME タイプ、言語、文字セット、エンコーディング) とを関連付ける ┃ mod_status.c サーバの活動状況と性能に関する情報を提供する ┃ mod_autoindex.c Unix の ls コマンドや Win32 の dir シェルコマンドに似た ディレクトリインデックスを生成する ┃ mod_asis.c 自分用の HTTP ヘッダの書かれているファイルを送信する ┃ mod_cgi.c CGI スクリプトの実行 ┃ mod_negotiation.c コンテントネゴシエーション 機能を提供する ┃ mod_dir.c 「最後のスラッシュ」のリダイレクトと、ディレクトリのインデックスファイルを扱う機能を提供する ┃ mod_imap.c Server-side imagemap processing ┃ mod_actions.c メディアタイプやリクエストメソッドに応じて CGI スクリプトを実行する機能を提供 ┃ mod_userdir.c ユーザ専用のディレクトリを提供 ┃ mod_alias.c ホストファイルシステム上のいろいろな違う場所を ドキュメントツリーにマップする機能と、 URL のリダイレクトを行なう機能を提供する ┃ mod_so.c 起動時や再起動時に実行コードとモジュールをサーバにロードする 内臓マニュアル http://kuro-box/manual/mod/ より解説抜粋(上記説明部分)と、これだけのモジュールが読み込まれます。
アドレス表記例:http://kuro-box/~ruche/
ユーザーのディレクトリからサイトを公開する方法
問題点は
# useradd -g users -d /home/ruche -s /bin/bash ruche # mkdir /home/ruche # passwd ruche # chown ruche /home/ruche設定ファイルの煮詰め
httpd.confを書き直して、 /opt/apache2/bin/httpd -t で確認。 を繰り返す。納得できる設定になるまで。ユーザーディレクトリ使用のための変更部分(参考程度)
# vi /opt/apache2/conf/httpd.conf (変更) ┃ Options FollowSymLinks Includes ExecCGI MultiViews (中略) ┃<Directory /home/*/public_html> ┃ AllowOverride FileInfo AuthConfig Limit Indexes ┃ Options MultiViews SymLinksIfOwnerMatch IncludesNoExec ┃# <Limit GET POST OPTIONS PROPFIND> ┃# Order allow,deny ┃# Allow from all ┃# </Limit> ┃ <LimitExcept GET POST OPTIONS PROPFIND> ┃ Order deny,allow ┃ Deny from all ┃ </LimitExcept> ┃</Directory> ┃ ┃<Directory /home/*/public_html/cgi-bin/> ┃Options ExecCGI ┃# SetHandler cgi-script ┃</Directory> 他に、管理者のメールアドレスなど 注:直す場所と結果は上記の通りですが、どこをどう直したか忘れました(をひ 他にやったこと rucheのディレクトリに public_html を作って「トロピカルフルーツ@避難所」をアップ(を cgiの改行コードがCR+LF(Win標準)なのでLFに変更 cgiのperlへのパスが間違ってるので修正(1行目:#!/usr/bin/perl)「public_html」
アドレス表記例:http://fuga.hoge.com/
アドレスが判りやすいので、多分、こっちがメインになっていくと思われ。
httpd.confの修正
# vi /opt/apache2/conf/httpd.conf (変更) ┃# ScriptAlias /cgi-bin/ "/opt/apache2/cgi-bin/" ScriptAliasをコメントアウト(404notFound防止) ┃# ### Section 3: Virtual Hosts 以下、全部コメントアウトhttp.confの最後にvhost.confを読み込むように指定する
# vi /opt/apache2/conf/httpd.conf
(追加)
┃# </VirtualHost>
┃Include conf/vhost.conf
vhost.confの作成(最低限の設定?)# vi /opt/apache2/conf/vhost.conf (新規) ┃NameVirtualHost *:80 ┃ ┃<VirtualHost *:80> ┃ ServerAdmin [your@mail] ┃ DocumentRoot /home/www/default ┃ ServerName fuga.hoge.com ┃ UserDir disable ┃ SuexecUserGroup ruche users ┃ <Directory "/home/www/default"> ┃ Options FollowSymLinks Includes ┃ AllowOverride None ┃ Order allow,deny ┃ Allow from all ┃ </Directory> ┃ <Directory "/home/www/default/cgi-bin"> ┃ Options ExecCGI ┃ AllowOverride None ┃ Order allow,deny ┃ Allow from all ┃ </Directory> ┃ ErrorLog logs/default-error_log ┃ CustomLog logs/default_log combined env=!nolog ┃</VirtualHost> 注:ServerAdminは省略可能(省略時はhttpd.confのメールアドレスを使用) 注:CGIを使わないなら赤文字の部分を削除する。 注:ログをaccessから分離する必要が無いなら青文字の部分を削除する。 注:combined env=!nolog は後で使うからここでは説明は省く。/home/www/defaultを作成
$ mkdir [-p] /home/www/default 注:適宜、chmodやchownを実行することhtmlを/home/www/defaultにUPする
--設定変更時の注意点--
設定変更をしたら構文チェックをしてapacheを再起動する
# /opt/apache2/bin/httpd -t
# /etc/init.d/httpd restart
バーチャルホストの確認方法
1.WAN側のproxyサーバーを経由する
2.おやじ氏のチェッカーを利用する
3.Winのhostsファイルを編集してしまう(あまりお勧めしません)
注:プロバイダがproxyサーバーを提供してるならそっちを使ったほうが楽
ルータのポートを開くのを忘れないように
問題発生時にはログを確認して状況を把握するのが基本となるわけだけど・・・
デフォルトのまま運用してしまうと
ウィルスにアクセスされて不必要なログができたり、
画像のアクセスログとかいろいろなログがいっぱい録られたり、
ログが肥大化したりして、
不必要なログに必要なログが埋もれて見づらくなってしまう。
だから、最低限やっておきたいことを記載しておく。
事前処置
# vi /opt/apache2/conf/httpd.conf
(変更)
┃#CustomLog logs/access_log common
ウィルスログの分離# vi /opt/apache2/conf/vhost.conf (追加) ┃##logging settings ┃ ┃#CSS,gif,png,jpg,js logging off ┃SetEnvIf Request_URI "\.(gif)|(jpe?g)|(png)|(css)|(js)$" nolog ┃#BGM files(midi,mp3) logging off ┃SetEnvIf Request_URI "\.(midi?)|(mp3)$" nolog ┃#local ip logging off ┃SetEnvIf Remote_Addr 192.168. nolog ┃#worm log is other log-file ┃SetEnvIf Request_URI "^/_mem_bin/" worm nolog ┃SetEnvIf Request_URI "^/_vti_bin/" worm nolog ┃SetEnvIf Request_URI "^/c/" worm nolog ┃SetEnvIf Request_URI "^/d/" worm nolog ┃SetEnvIf Request_URI "^/msadc/" worm nolog ┃SetEnvIf Request_URI "^/MSADC/" worm nolog ┃SetEnvIf Request_URI "^/scripts/" worm nolog ┃SetEnvIf Request_URI "^/default\.ida" worm nolog ┃SetEnvIf Request_URI "root\.exe" worm nolog ┃SetEnvIf Request_URI "cmd\.exe" worm nolog ┃SetEnvIf Request_URI "NULL\.printer" worm nolog ┃SetEnvIf Request_URI "NULL\.IDA" worm nolog ┃ ┃CustomLog logs/access_log combined env=!nolog ┃CustomLog logs/worm_log combined env=worm 注:別にhttpd.confに書いてもかまわない 管理しやすいからvhost.confに書いているだけ上記設定でもれるウィルスログの処理
$ cat /opt/apache2/logs/access_log | grep SEARCH ┃... "SEARCH /\x90\x02\xb1\x02\xb1 ... $ cat /opt/apache2/logs/error_log | grep "URI too long" ┃... request failed: URI too long (longer than 8190)処置方法
# vi /opt/apache2/conf/httpd.conf
(変更)
┃LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
ログの肥大化防止# vi /etc/logrotate.d/httpd ...ってviで書くよりも、Winで書いてFFFTPでアップしたほうが楽(を 設定はログローテートを参照。過去ログ保存用ディレクトリ(olddirの指定先)の作成
# mkdir /opt/apache2/logs/old長かった・・・orz
戻るなら押せ!