Apache2

  • Turbolinux 10 server
    • Apache 2 系の設定
    • 一般的な変更点のみ
  • CentOS 5.6
    • SELinuxとかconf.dとかを若干修正

contents

/etc/httpd/conf/httpd.conf

  • Apache本体の設定
  • MaxRequestsPerChild 5000
    • 子プロセスあたりの最大リクエスト数
    • 指定数以上のリクエストを受けると子プロセスは自動的に再起動する
    • メモリリーク対策
    • 0 で無制限
    • StartServers, MinSpareServers, MaxSpareServers, MaxClients, MaxRequestsPerChild あたりはサーバの負荷に応じていじってみると良いかも。
    • Apache2から処理の種類に応じて設定できるようになった。
      けどよく分からないから全部同じにしている。
  • ExtendedStatus On
    • /server-status が見れるようになる。
    • アクセス中のホスト名とかモジュールのバージョンが見えるので、
      あまり設定すべきではない。
    • 後述の Location も設定すること
  • User apache / Group apache
    • Apacheの動作権限
  • ServerAdmin sabakan@jamfunk.net
    • 管理者のメアド
    • 404の下部に表示される
  • ServerName katae.jamfunk.jp:80
    • サーバ名と標準ポート
  • ルートディレクトリの設定
  • DocumentRoot "/home/sabakan/public_html"
    • http://katae.jamfunk.jp/ と指定したときのホームディレクトリ
    • SELinuxが有効化されている状態で変更すると"documentroot must be a directory"でエラーになる
  • <Directory />
    <Directory />
        Options All MultiViews
        AllowOverride All
    </Directory>
    • / (=DocumentRoot) の設定
    • この設定では大開放設定なので、制限を付けてみても良いかも。
    • Apache 2.4系から書き方が変わったらしい
      #    Require all denied
          Require all granted
  • <Directory "/var/www/html">
    #<Directory "/var/www/html">
    #</Directory>
    • /var/www/html を使わないならコメントアウトして良い。
    • 今回の場合では DocumentRoot を元々設定してあった /var/www/html にしていないのでコメントアウト
  • ユーザディレクトリの設定
  • <IfModule mod_userdir.c>
    <IfModule mod_userdir.c>
        UserDir public_html
    </IfModule>
  • <Directory /home/*/public_html>
    <Directory /home/*/public_html>
        AllowOverride All
        Options All MultiViews
    </Directory>
    • そのディレクトリの設定
    • 例によって大開放
  • DirectoryIndex
    DirectoryIndex index.html index.html.var index.html index.htm index.shtml index.
    cgi index.php
    • 一行で
    • ファイル名を省略したときに呼び出すファイル名
    • 左から順番に試される。
  • モジュールの設定
  • HostnameLookups Off
    • ログに表示するアクセス元を逆引きするか
    • 処理が多くなると重くなるので、offの方が良いかも
  • AliasMatch
    AliasMatch ^/manual(?:/(?:de|en|fr|ja|ko|ru))?(/.*)?$ "/var/www/manual$1"
    <Directory "/var/www/manual">
    • /manual を公開する
    • 普通はいらないからこの項目を全てコメントアウトしても良いかも
  • ScriptAlias
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
    <Directory "/var/www/cgi-bin">
    • CGIを別ディレクトリに置かせる
    • 頭がこんがらがるから切って良いと思う
  • IndexOptions FancyIndexing FoldersFirst VersionSort NameWidth=*
    • Options で All または Indexes を指定しているときに
      ディレクトリ指定でファイル一覧を表示させるときの形式
    • NameWidth=* でファイル名が省略されるのを防げる
    • 後述の modencoding も参照
  • ReadmeName / HeaderName
    ReadmeName README.html
    HeaderName HEADER.html
    • Options Indexes でのヘッダとreadmeに表示するファイル
  • 文字コードの設定
  • DefaultLanguage ja
    • デフォルト言語
  • LanguagePriority ja en da nl et fr de el it ko no pl pt pt-br ltz ca es sv tw
    • 言語優先度
    • jaを頭に持ってきておいた方が無難
  • AddDefaultCharset EUC-JP
    • デフォルトの文字コード
    • TL11S の場合、UTF-8 にすると全て UTF-8 で解釈されるので、
      指定しない方が幸せになれるかも。
  • 実行権限の設定
  • AddHandler cgi-script .cgi
    • CGI実行権限を与える
  • AddOutputFilter INCLUDES .shtml
    • Server Side Include (SSI) を有効化
  • レスポンスの設定
  • <Location >
    <Location /server-status>
    <Location /server-info>
    • 前述の ExtendedStatus での詳細な設定
    • アクセス制限をかけるべき
    • Allow from .jamfunk.jp みたいな
  • <IfModule mod_proxy.c>
    #<IfModule mod_proxy.c>
    #ProxyRequests On~
    #<Proxy *>
    • 簡易プロクシ
    • 設定を間違えるとCyberSyndoromeのお世話になるから注意すること
  • ヴァーチャルホストの設定
  • NameVirtualHost *:80
    • ホスト名を利用したヴァーチャルホストを有効化する
  • <VirtualHost *:80>
    <VirtualHost *:80>
        ServerAdmin sabakan@jamfunk.net
        DocumentRoot /home/httproot/public_html
        ServerName katae.jamfunk.jp
        ErrorLog logs/httproot-error_log
        CustomLog logs/httproot-access_log common
    </VirtualHost>
    • 記述例
    • 原則として、定義していないヴァーチャルホストは最初に書いたものが適用される

ユーザごとのホームディレクトリを作る

  • UserDir public_html を指定すると
    /home/user/public_html = http://server/~user/ になる。
    • デフォルトでユーザディレクトリに public_html は作られてないので、
      各自作成させる必要がある。
      • mkdir ~/public_html
      • chmod 755 ~/public_html
        ディストリビューションによっては 700 かもしれないし、
        アクセス権限がデフォルトで自動的に設定してくれるかもしれない。
    • 新規ユーザ作成時に自動的に作るには
      • mkdir /etc/skel/public_html
      • chmod 755 /etc/skel/public_html

/etc/httpd/conf.d/mod_encoding.conf

  • Options Indexes を有効化したとき、ファイルシステムの漢字コードが化けるときがある。
    • 特にTrubolinux 10 server は、ファイルシステムはEUC-JPなのに、Apacheでは UTF-8 になっているので、化ける。
    • CentOS系は完全にUTF-8なので、問題ない模様。
      # mod_encoding を有効化
      EncodingEngine        on
      
      # サーバ側のファイルシステムの文字コード
      #SetServerEncoding     UTF-8
      SetServerEncoding     EUC-JP
      NormalizeUsername on
      
      # ブラウザ側のデフォルト文字コード 
      DefaultClientEncoding MSSJIS JA-AUTO-SJIS-MS
      # 面倒だから Microsoft 仕様に設定している。
  • 注意点
    • どうも "〜"(全角チルダ)はそれでも不安定になる模様
      • ブラウザ上では表示されているが、リンク先の % エンコードがうまくいっていない。

Index表示のファイルアイコンをもっときれいにしてみる。

  • Apache で Option Indexes している場合、ディレクトリを指定すると
    ディレクトリ一覧が表示される。
    • アイコンが古い。。。
    • きれいなものに差し替えてしまいましょう。
  • デスクトップ環境 KDE のアイコンを使います。
  • アイコンをコピーする
    • mkdir /home/httproot/public_html/icons
    • cp -R /var/www/icons/* /home/httproot/public_html/icons
      • Apache オリジナルアイコン
    • cp -R /usr/share/icons/crystalsvg/32x32/* /home/httproot/public_html/icons
      • KDE アイコン
    • chown -R httproot:httproot /home/httproot/public_html/icons
  • 設定の適用(アイコンのディレクトリを差し替える)
    • vi /etc/httpd/conf/httpd.conf
      #Alias /icons/ "/var/www/icons/"
      Alias /icons/ "/home/httproot/public_html/icons/"
      # apache の DocumentRoot が /home/httproot/public_html に設定されている場合
      
      #<Directory "/var/www/icons">
      <Directory "/home/httproot/public_html/icons">
          Options Indexes MultiViews
          AllowOverride None
          Order allow,deny
          Allow from all
      </Directory>
      
      # disable apache default icons
      #AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
      
      #AddIconByType (TXT,/icons/text.gif) text/*
      #AddIconByType (IMG,/icons/image2.gif) image/*
      #AddIconByType (SND,/icons/sound2.gif) audio/*
      #AddIconByType (VID,/icons/movie.gif) video/*
      
      #AddIcon /icons/binary.gif .bin .exe
      #AddIcon /icons/binhex.gif .hqx
      #AddIcon /icons/tar.gif .tar
      #AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
      #AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
      #AddIcon /icons/a.gif .ps .ai .eps
      #AddIcon /icons/layout.gif .html .shtml .htm .pdf
      #AddIcon /icons/text.gif .txt
      #AddIcon /icons/c.gif .c
      #AddIcon /icons/p.gif .pl .py
      #AddIcon /icons/f.gif .for
      #AddIcon /icons/dvi.gif .dvi
      #AddIcon /icons/uuencoded.gif .uu
      #AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
      #AddIcon /icons/tex.gif .tex
      #AddIcon /icons/bomb.gif core
      
      #AddIcon /icons/back.gif ..
      #AddIcon /icons/hand.right.gif README
      #AddIcon /icons/folder.gif ^^DIRECTORY^^
      #AddIcon /icons/blank.gif ^^BLANKICON^^
      
      # enable KDE icons
      AddIconByEncoding (CMP,/icons/mimetypes/tgz.png) x-compress x-gzip
      
      AddIconByType (TXT,/icons/mimetypes/txt.png) text/plain
      AddIconByType (IMG,/icons/mimetypes/images.png) image/*
      AddIconByType (SND,/icons/mimetypes/mime_audio.png) audio/*
      AddIconByType (VID,/icons/mimetypes/mime_video.png) video/*
      
      AddIcon /icons/filesystems/exec.png .bin .exe
      AddIcon /icons/mimetypes/binary.png .hqx
      AddIcon /icons/mimetypes/tar.png .tar
      AddIcon /icons/mimetypes/tgz.png .Z .z .tgz .gz .zip .lzh .rar .cab
      AddIcon /icons/mimetypes/postscript.png .ps .ai .eps
      AddIcon /icons/filesystems/www.png .html .shtml .htm
      AddIcon /icons/mimetypes/text.png .txt
      AddIcon /icons/mimetypes/source_c.png .c
      AddIcon /icons/mimetypes/source_p.png .py
      AddIcon /icons/mimetypes/dvi.png .dvi
      AddIcon /icons/mimetypes/shellscript.png .sh .shar .csh .ksh .tcl .bat
      AddIcon /icons/mimetypes/tex.png .tex
      AddIcon /icons/mimetypes/core.png core
      
      AddIcon /icons/actions/1uparrow.png ..
      AddIcon /icons/mimetypes/readme.png README
      AddIcon /icons/filesystems/folder_open.png ^^DIRECTORY^^
      AddIcon /icons/blank.gif ^^BLANKICON^^
      
      # enable KDE icons (additional)(Apacheでは定義されていないもの)
      AddIcon /icons/mimetypes/font_bitmap.png .fnt
      AddIcon /icons/mimetypes/font_truetype.png .ttf .ttc
      AddIcon /icons/mimetypes/log.png .log
      AddIcon /icons/mimetypes/midi.png .mid
      AddIcon /icons/mimetypes/pdf.png .pdf
      AddIcon /icons/mimetypes/real.png .ra .ram
      AddIcon /icons/mimetypes/rpm.png .rpm
      AddIcon /icons/mimetypes/source_cpp.png .cpp
      AddIcon /icons/mimetypes/source_h.png .h
      AddIcon /icons/mimetypes/source_java.png .j .js
      
      AddIcon /icons/mimetypes/wordpirocessing.png .doc
      AddIcon /icons/mimetypes/spreadsheet.png .xls
      AddIcon /icons/mimetypes/source_pl.png .conf .ini
      AddIcon /icons/mimetypes/make.png .dll
      AddIcon /icons/actions/compfile.png .lnk
      AddIcon /icons/mimetypes/template_source.png .vbs
      
      DefaultIcon /icons/mimetypes/empty.png

ファイル一覧 (Options Indexes)が西ヨーロッパ言語(ISO)になる

  • Options Indexes でファイル一覧を許可している場合
    ファイル一覧で日本語ファイル名を表示させると
    DefaultCharset だろうが mod_encoding だろうが何を設定しても
    エンコードが 西ヨーロッパ言語(ISO)になってしまう。
    • 最近オプションが追加されたらしい。。。
    • 各ディレクティブ(Options Indexes を定義しているところ)に
          IndexOptions Charset=EUC-JP

Tipsサイト

サイトにBasic認証をかける

  • たとえば、http://server/~test/requireauth/ = /home/test/public_html/requireauth/ 以下に認証をかけたい場合
  • vi /home/test/public_html/requireauth/.htaccess
    AuthName "テスト認証です"
    AuthType Basic
    AuthUserFile /home/test/.htpasswd
    require valid-user
    • AuthNameは認証ダイアログに表示されるサイト名
    • AuthUserFile は不可逆暗号化されたパスワードを保存するファイルのパス
      できれば公開ディレクトリ外に置いたほうが吉
  • htpasswd -c /home/test/.htpasswd testuser
    New password:
    Re-type new password:
    Adding password for user testuser
    • ひとりひとりユーザを追加する
    • 2人目以降は -c はいらない
  • ヒント
    • Userminでwebブラウザ上から.htaccess や .htpasswdを作れる機能がある。

サイトにDigest認証をかける

  • テスト中
    • IEのバージョンによって、getメソッドのCGIがバグるとの噂。

Option Indexesしたときの Welcome ページを無効化

  • vi /etc/httpd/conf.d/welcome.conf
    • 全部コメントアウト

phpのアップロードサイズをディレクトリごとに設定する

  • デフォルト
    memory_limit = 128M
    post_max_size = 8M
    upload_max_filesize = 2M
  • .htaccessで設定する(mod_phpで稼働している場合のみ有効)
    php_value memory_limit 500M
    php_value post_max_size 500M
    php_value upload_max_filesize 500M
  • .user.iniで設定する(mod_phpでもFastCGIでもどちらでも有効)
    memory_limit = 500M
    post_max_size = 500M
    upload_max_filesize = 500M
    • /etc/php,iniでuser_ini.filename = ".user.ini"でuser-defined php.iniを許可している場合のみ有効

Suexecにする

  • ApacheがCGIやphpを起動するとユーザapacheで動く。
    • ログファイルや設定ファイルをapacheで作られると、削除できなかったり移転が面倒だったり。
    • アップするときにログやアップロード用のディレクトリを、パーミッション777で作るけど、同居ユーザから丸見え書き放題だから怖い。
    • 各ユーザ権限で動かしてしまえ。
  • 前提
    • CentOS 6.3 x86_64
    • コンパイルはしない。yumとかスクリプトにこだわる。
  • 設定変更
    • mkdir /var/www/home
    • mount --bind /home /var/www/home
      • homeディレクトリを無理矢理/var/www/homeにマウントする。
      • 別パーティションや別サーバからmountしているならbindではなく、おとなしく普通のマウントをする。
    • vi /etc/fstab
      /home /var/www/home none bind 0 0
      • 再起動時に自動でマウント。
    • chmod 701 /home/hoge
    • chmod 701 /home/hoge/public_html
      • もしOptions Indexesしているならpublic_htmlは704にする。
    • vi /etc/httpd/conf/httpd.conf
      <VirtualHost *:80>
          ServerAdmin root@localhost
          DocumentRoot /var/www/home/hoge/public_html
          ServerName test.example.com
          ErrorLog logs/test.example.com-error_log
          CustomLog logs/test.example.com-access_log common
          SuexecUserGroup user user
      </VirtualHost>
      • SuexecUserGroupを書くとそのユーザ・グループで起動する。
    • phpのFastCGIとSuexec対応
    • vi /etc/php.ini
      user_ini.filename = ".user.ini"
      • user-defined php.iniを有効化。
      • FastCGIにすると.htaccessのphp_valueが反映されないため。
    • vi /etc/httpd/conf.d/php.conf
      #AddHandler php5-script .php
      #AddType text/html .php
      Action php-fcgi /cgi-bin/php-cgi
      AddType php-fcgi .php
    • ln -s /usr/bin/php-cgi /var/www/cgi-bin/php-cgi
  • vi /etc/httpd/conf/httpd.conf
    ScriptAlias /php-hoge /var/www/cgi-bin/hoge/php-hoge
    <VirtualHost *:80>
        ServerAdmin root@localhost
        DocumentRoot /var/www/home/hoge/public_html
        ServerName test.example.com
        Action php-hoge /php-hoge
        AddHandler php-hoge .php
    </VirtualHost>
  • mkdir /var/www/cgi-bin/hoge
  • chmod 711 /var/www/cgi-bin/hoge
  • chown hoge:hoge /var/www/cgi-bin/hoge
  • vi /var/www/cgi-bin/hoge/php-hoge
    #!/bin/sh
    exec /usr/bin/php-cgi
  • chmod 700 /var/www/cgi-bin/hoge/php-hoge
  • chown hoge:hoge /var/www/cgi-bin/hoge/php-hoge
  • /etc/init.d/httpd restart
  • テスト用
    • vi /home/hoge/public_html/whoami.cgi
      #!/usr/bin/perl
      print "Content-Type: text/plain;\n\n";
      print "user: " . `whoami` . "\n";
      exit 0;
    • chmod 700 /home/hoge/public_html/whoami.cgi
      • apacheではなく、ユーザ名が出てくるはず。
    • vi /home/hoge/public_html/whoami.php
      <?php
      echo 'php is running as user: ' . exec('whoami');
      ?>
    • chmod 600 /home/hoge/public_html/phpinfo.php
      • おなじく、apacheではなく、ユーザ名が出てくるはず。
    • vi /home/hoge/public_html/phpinfo.php
      <?php
      echo phpinfo();
      ?>
    • chmod 600 /home/hoge/public_html/phpinfo.php
      • Server APIにCGI/FastCGI、_SERVER["ORIG_SCRIPT_FILENAME"]にScriptAliasで指定したスクリプトが出てくるはず。
  • その他のフォロー
    • 各ディレクトリやファイルの権限
      ホームディレクトリ701
      public_htmlや各ディレクトリ701
      Option Indexesするディレクトリ705
      Webに公開するファイル604
      CGI(Perl, シェルなど)700
      php, 実行させない.pl, 見せないファイル600
      • なお、CGIやphpに読み書きさせるディレクトリも701または705で良い。
    • session.save_pathの必要なphpの設定
      • phpMyAdminなど、sessionを使うものはphp.iniのsession.save_path = "/var/lib/php/session"を見ている。
      • Suexecしているとユーザ権限で動くため、apache権限のフォルダに書けない。
      • .user.iniを有効にして、session.save_pathを/home/hoge/php_session等に変更する必要がある。

php 5.3にmcryptをRPMでインストールする

転送を圧縮する (mod_deflate)

  • vi /etc/httpd/conf.d/deflate.conf (新規作成)
    <Location />
      # テキストを圧縮対象にする
      AddOutputFilterByType DEFLATE text/html text/plain text/xml
      # Netscape対策
      BrowserMatch ^Mozilla/4 gzip-only-text/html
      BrowserMatch ^Mozilla/4\.0[678] no-gzip
      # Microsoft Internet Explorerは何が何でも圧縮させる
      BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
      # 圧縮比対応プロクシ対策
      Header append Vary User-Agent env=!dont-vary
    </Location>

DoS対策 (mod_evasive)

  • DoSで叩かれると鯖負荷だけでは無く、NW負荷も高くなり、プロバイダにも怒られる(´・ω・`)
    • ApacheにDoS対策モジュールがあるので、インストールしてみる。
  • CentOS6 + yum EPELレポジトリ
    • yum install --enablerepo=epel mod_evasive
  • 設定
    • vi /etc/httpd/conf.d/mod_evasive.conf
      # モジュール有効化
      LoadModule evasive20_module modules/mod_evasive20.so
      <IfModule mod_evasive20.c>
          # ハッシュテーブルのサイズ(よく分からないからデフォルト値にした)
          DOSHashTableSize    3097
          # しきい値
          #   DOSPageCount (pages) / DOSPageInterval (sec) または
          #   DOSSiteCount (pages) / DOSSiteInterval (sec) を超えると
          #   DOSBlockingPeriod (sec) の間そのIPには403を返すようになる。
          DOSPageCount        2
          DOSSiteCount        50
          DOSPageInterval     1
          DOSSiteInterval     1
          DOSBlockingPeriod   50
          # アラート
          DOSEmailNotify      alert@example.com
          # ログディレクトリ(拒否ったIPのファイル名ができあがる)
          DOSLogDir           "/var/log/mod_evasive"
          # ホワイトリスト
          DOSWhitelist   127.0.0.1
          DOSWhitelist   172.27.*.*
      </IfModule>
  • ログディレクトリ
    • mkdir /var/log/mod_evasive
    • chown apache:apache /var/log/mod_evasive
  • アラートメールはPostfixか何か、/bin/mailxが稼働できる環境でないと飛ばない。
  • テスト
    • ab -n 30 -c 10 http://example.com/
      • abしてわざと引っかかってみる。
      • ホワイトリストに入っていないまたは入れていないホストから試してみること。
      • /var/log/messagesに以下のメッセージが出る。
        Sep 11 15:15:00 websvr1 mod_evasive[13848]: Blacklisting address 192.168.0.2: 
        possible DoS attack.