Edit
Aapche 2のインストール。

現在、apacheの主流は、2.2系ではあるが、2.4系バージョンより、速度向上+メモリ節約+スレッドの改善がされ、nginx に比べて同時接続数が100以上あたりから極端にレスポンスが低下する問題などが改善されている。しかし、未だ nginx に速度面では及ばない部分はあるが、多くの mod モジュールなどの資産もあり、まだまだ主力のwebサーバーといえる。

Edit
前処理

Apache 2.4.xからはAPR(Apache Portable Runtime)と、APR-utilが同梱されていないため、APR とAPR-util のライブラリをダウンロードし、この手順に従いインストールしておく。

Edit
最新版のダウンロードとコンパイル

# wget http://ftp.kddilabs.jp/infosystems/apache//httpd/httpd-2.4.25.tar.gz
# tar zxvf httpd-2.4.25.tar.gz
# cd httpd-2.4.25

moduleの全コンパイルを実行

オプション名概要
--with-included-aprsrclibにダウンロードし展開したソースを利用する

enable-mod-shared=allでも外部ライブラリに依存するものはコンパイルされないため、全モジュール込みのコンパイルには以下を利用

# ./configure --enable-so --enable-ssl --with-ssl=/usr/local/ssl --enable-modules=most  (下の指定しないときこのmostを利用)
             --enable-mods-shared="all ssl cache proxy authn_alias mem_cache file_cache charset_lite dav_lock disk_cache"
# make
# make install

その他のサンプル

# ./configure --enable-so --enable-mods-shared=all --enable-ssl
           --enable-proxy --enable-proxy-connect --enable-proxy-ftp
           --enable-proxy-http --enable-proxy-ajp --enable-proxy-balancer
           --with-ssl=/usr/local/ssl

※mod_SSL をインストールするには、予めOpenSSLをインストールしておき、./configureに追加で「--with-ssl=/usr/local/ssl」の設定が必要です。

※configureで下記のエラーがでる場合

configure: error: ... Error, SSL/TLS libraries were missing or unusable

この場合には、「--with-ssl=/usr/local/src/openssl-0.9.8l」などと、インストール元をしている場合が多い。

注意)一部のmoduleの名前がバージョンによって、変更されていたりします。

mod_access.so  廃止    ->   mod_authz_host.so  など

できあがったhttpdに何のmodが同梱されているかを確認してみる。

# httpd -l

Edit
セキュリティトラブル

※注意、mod_deflate.so 等がSELinuxのセキュリティに掛かってくる場合がありますので、その際は、モジュールのセキュリティ設定を変更してください。

# cd /usr/local/apache2/modules
# chcon -c -v -R -u system_u -r object_r -t textrel_shlib_t mod_deflate.so

Edit
起動準備

apacheサーバー(httpd)を、Linuxのサービスとして登録することで、OSが起動時に自動的に起動されるようになる。

Edit
サービスへの登録

# cp <sourcefile-directory>/build/rpm/httpd.init /etc/init.d/httpd
# chkconfig --add httpd
# chkconfig httpd on

apache2.4 でとりあえずサービス登録したい時(ソースからインストールした場合など)は、

# ln -s /usr/local/apache2/bin/apachectl /etc/init.d/httpd

でhttpd を書き直す。

Edit
設定ファイルの修正

下記のように修正します。

# emacs /etc/init.d/httpd
  httpd=${HTTPD-/usr/local/apache2/bin/httpd}    (/usr/local/apache2の中のファイルに指定)
      CONFFILE=/usr/local/apache2/conf/httpd.conf (confファイルも一緒)
  killproc $httpd   (Stopコマンドの中でpid指定のオプションを削除)

Edit
apacheコマンドのパスを通す

# emacs /etc/profile
      pathmunge /usr/local/apache2/bin    <- パス設定の上に追加

Edit
古いコマンドの削除

通常はhttpdを最初にyumでインストールしない場合にはこのファイルは存在しない。

# rm /usr/sbin/httpd

Edit
Apache用のユーザとグループの作成

# groupadd apache  (すでにグループapacheがあれば必要ありません)
# useradd -g apache apache  (すでにユーザーapacheがあれば必要ありません)

Edit
apache2のmodulesをライブラリとして登録(開発用)

# emacs /etc/ld.so.conf.d/httpd.conf
  /usr/local/apache2/lib
  /usr/local/apache2/modules
# ldconfig

Edit
httpd.confの設定について

Yumでインストールすると、/etc/httpd 以下のフォルダに設定ファイルが存在しますが、先ほど、起動ファイルを変更したので、今後の設定ファイルの位置は変更されます。

Edit
拡張ファイルの自動読み込み設定

# emacs /usr/local/apache2/conf/httpd.conf
  #
  # Include Extention Module
  #
  Include conf/extra/*.conf

これで、conf/extra/以下のファイルが自動読み込みされます。

Edit
Basic認証のパスワード作成

# cd /usr/local/apache2
# htpasswd -mc htpasswd narushima     <- narushima というIDを作成

注意!-m オプションでMD5暗号を選ばないと、crypt()関数によって暗号化されるが、この関数ではパスワードは最初の8文字のみしかチェックされない!詳しくはapache公式ページを参照の事。

soモジュールのconf設定

ServerRoot "/usr/local/apache2"            <- apache2がInstallされている場所
Listen 80

Rubyの設定

 LoadModule ruby_module modules/mod_ruby.so
<IfModule mod_ruby.c>
  <Files *.rbx>
    SetHandler ruby-object
    RubyHandler Apache::RubyRun.instance
  </Files>
</IfModule>

Edit
<Virtualhost><Directory><Location>について

Edit
1つのIPで複数のSSLドメインの管理

Apache 2.2.12以降+OpenSSL0.9.8f以降では、SNI(Server Name Indication)という技術に対応することで、1つのIPに対しても複数のSSLドメインが持てるようになった。ワイルドカード証明書のように運用に制限が入る方法でないので非常に便利である。

# emacs httpd.conf
  SSLStrictSNIVHostCheck off  <- SNIチェックエラーを返さず最初のSSL定義でSSL処理。
  <VirtualHost *:443>

<virtualhost> 項目以降は通常のhttpと同じだが、当然SSL関係の定義もこの中に設定する。
(以前はSSLは1つだけだったため、基本的に<virtualhost>項目の外側に記述していた)
※注)このSNI技術はクライアントもその技術に対応していないと参照することができない
※注)ブラウザのセキュリティ設定の中に、TLS 1.1以上を利用するとすることで利用できるようになるブラウザも存在する

Edit
XST対策

XST対策として、httpd.confに、「TraceEnable Off」の文を先頭あたりに1行追加する。 また、SSLの暗号に対する脆弱性の指定に対して以下の設定を確認する。

SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXP:+eNULL
SSLProtocol all -SSLv2

※SSLの調査に関する参照ページ

Edit
その他のApacheファミリのインストール

Edit
APR ( Apache Potable Runtime )

APR関係の公式

# wget http://ftp.riken.jp/net/apache//apr/apr-1.5.1.tar.gz
# tar zxvf apr-1.5.1.tar.gz
# cd apr-1.5.1
# ./configure
# make
# make install
# echo /usr/local/apr/lib > /etc/ld.so.conf.d/apr.conf
# ldconfig

<rpmを作成してインストール>

# wget http://archive.apache.org/dist/apr/apr-1.5.1.tar.bz2
# rpmbuild -tb --clean apr-1.5.1.tar.bz2   <- エラーでとまる。
# mv apr-1.5.1.tar.bz2 /root/rpmbuild/SOURCES/
# vi root/rpmbuild/SPECS/apr.spec
   %doc --parents html
   ↓変更
   %doc html
# rpmbuild -bb --clean /root/rpmbuild/SPECS/apr.spec
# rpm -Uvh /root/rpmbuild/RPMS/x86_64/apr-1.5.1-1.x86_64.rpm /root/rpmbuild/RPMS/x86_64/apr-devel-1.5.1-1.x86_64.rpm

Edit
APR-Util APRのUtility

APR-Utilのアーカイブには、何故か古いexpatのライブラリが同梱されている。それが悪さをする場合があり、--with-expat オプションを利用すること。

# wget http://ftp.riken.jp/net/apache/apr/apr-util-1.5.4.tar.gz
# tar zxvf apr-util-1.5.4.tar.gz
# cd apr-util-1.5.4
# ./configure --with-apr=/usr/local/apr --with-berkeley-db=/usr/local/BerkeleyDB --with-expat=/usr/local/src/expat-2.0.1 --with-pgsql=/usr/local/pgsql
# make
# make install

<rpmでのインストール>

# yum install libuuid.devel db4-devel postgresql-devel freetds-devel unixODBC-devel nss-devel
# http://ftp.riken.jp/net/apache/apr/apr-util-1.5.4.tar.bz2
# rpmbuild -tb --clean apr-util-1.5.4.tar.bz2   <- エラー発生
# mv apr-1.5.1.tar.bz2 /root/rpmbuild/SOURCES/
# vi root/rpmbuild/SPECS/apr-util.spec
   %doc --parents html
   ↓変更
   %doc html
# rpmbuild -bb --clean /root/rpmbuild/SPECS/apr-util.spec
# rpm -Uvh /root/rpmbuild/RPMS/x86_64/apr-1.5.1-1.x86_64.rpm /root/rpmbuild/RPMS/x86_64/apr-devel-1.5.1-1.x86_64.rpm

Edit
distcache-devel のインストール

# wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/18/Everything/source/SRPMS/d/distcache-1.4.5-23.src.rpm
# rpmbuild --rebuild --clean distcache-1.4.5-23.src.rpm
#  rpm -Uvh distcache-1.4.5-23.x86_64.rpm distcache-devel-1.4.5-23.x86_64.rpm

Edit
その他の依存ライブラリ

# yum install mailcap lua-devel libxml2-devel pcre-devel

Edit
NEON(C言語用WebDAVライブラリ)

NEON Official Page

# wget http://www.webdav.org/neon/neon-0.29.6.tar.gz
# tar zxvf neon-0.29.6.tar.gz
# cd neon-0.29.6
# ./configure --with-libxml2 --with-ssl --enable-shared
# make
# make install

Edit
httpd.conf に追加

# emacs /usr/local/apache2/conf/extra/httpd-ssl.conf
  #
  # SSL Virtual Host Context
  #
  SSLCertificateFile /usr/local/apache2/conf/server.crt
  SSLCertificateKeyFile /usr/local/apache2/conf/server.key

Edit
ファイルのコピー

# mkdir ssl.key ssl.crt
# cp /usr/local/src/server.key /usr/local/apache2/conf/ssl.key/
# cp /usr/local/src/server.crt /usr/local/apache2/conf/ssl.crt/
# chmod 400 /usr/local/apache2/conf/ssl.key/server.key

Edit
Apche2 の起動

Edit
最初にポートがあいているか念の為に確認

# fuser -n tcp 80
( -n を-kn に変更するとそのプロセスをKILLします。

Edit
アパッチの起動

# service httpd start
( start を stop に変更するとプロセスの停止 )

Edit
エラー対応

  1. 起動時にInvalid command 'AddType', perhaps misspelled or defined by a module not included in the server configurationというエラーが出た場合にはモジュールが正しく読み込まれていないという場合か、本当にスペルミスかになります。
    そこで、一度そのhttpd.confの命令を調べてみて、正しくモジュールがインストールされるように設定されているか確認します。
    # for i in /usr/local/apache2/modules/*; do strings $i | grep -q -i AddType && echo $i; done
    このコマンドで、soファイル内を検索して必要なモジュール名を確定します。httpd.confを確認してLoadModuleを行えばエラーは解消です。
    ちなみに、以下のコマンドでhttpdに食い込まれているモジュールを確認できます。
    # httpd -l

Edit
Apacheのプログラム状況をWEBから見る

mod_info と mod_status を利用します。

# emacs /usr/local/apache2/conf/extra/httpd-info.conf
  LoadModule      info_module     modules/mod_info.so
  LoadModule      status_module   modules/mod_status.so
  ExtendedStatus On
  <Location /status>
      SetHandler  server-status
      Order deny,allow
      Deny from all
      Allow from 192.168
  </Location>

  <Location /info>
      SetHandler server-info
      Order deny,allow
      Deny from all
      Allow from 192.168
  </Location>

これで、<URL>/status や <URL>/info でサーバーの稼動詳細を確認できます。

Edit
LYNX テストに使えるWEBブラウザ

# wget ftp://lynx.isc.org/lynx2.8.6/lynx2-8-6-tar.gz
# tar zxvf lynx2-8-6-tar.gz
# cd lynx2-8-6
# ./configure
# make
# make install

Edit
WebDAV

WebDAVの公式

Edit
apacheを使ったリバースプロキシー

リバースプロキシーとは、ひとつのサーバーアクセスに対して、複数の内部サーバーによるそれぞれのapacheがページを作成するような場合に有効である。

(例)
http://www.domain.com/         <- 内部で192.168.0.100のhttpdがページ作成担当
http://www.domain.com/test/    <- 内部で192.168.0.102のtomcatがページ作成担当
http://www.domain.com/list/    <- 内部で192.168.0.110のhttpdがページ作成担当

というような場合である。これによって、結果的に負荷分散機能となり、高価なロードバランサーを導入せずとも簡便にパフォーマンスを向上させられる。(但し、同じURLの場合にはやはりバランサが必要となる)

Edit
リバースプロキシーのインストール

インストールは非常に簡単であり、apacheのモジュールとして導入すればよい。

LoadModule proxy_module          modules/mod_proxy.so          <- 基本
LoadModule proxy_http_module     modules/mod_proxy_http.so     <- HTTP用
LoadModule proxy_ajp_module      modules/mod_proxy_ajp.so      <- TOMCAT用
LoadModule proxy_ftp_module      modules/mod_proxy_ftp.so      <- FTP用
LoadModule proxy_connect_module  modules/mod_proxy_connect.so  <- SSL用
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so <- バランサ用

Edit
リバースプロキシーの設定

基本的には httpd.conf の設定を行うのみの非常に簡単なものとなる。
例)

ProxyRequests Off
<Proxy *>
  Order deny,allow
  Allow from all
</Proxy>
ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar

Edit
mod_proxy_htmlの導入

mod_proxyでは、html内部のリンクを変更するわけではないため、内部サーバーが窓口サーバーに送るhtmlでは、内部サーバー独自のアドレス表記に戻っているような形になる。そのため、内部で作成し外部に公開されたページのリンクをクリックすると、proxy設定のアドレスから外れて起動しない、または意図したアドレスではないページを表示することになる。よってmod_proxy_htmlを導入する。公式ページ

Edit
Install

# wget http://apache.webthing.com/mod_proxy_html/mod_proxy_html.tar.bz2
# bzip2 -d mod_proxy_html.tar.bz2 | tar xvf
# cd mod_proxy_html
# cp mod_proxy_html.c ../httpd-2.2.11/modules/proxy/    <- 自分の環境に合わせて
# cp proxy_html.conf /usr/local/apache2/conf/extra      <- 自分の環境に合わせて
# cd /usr/local/src/httpd-2.2.11/modules/proxy/
# apxs -c -I/usr/include/libxml2 -i mod_proxy_html.c
# ldconfig                                              <- 念のため

※但し、すでにapache等がインストールされている状態であること。

Edit
mod_proxy_htmlの設定

基本的には「httpd.conf」に以下様にの追加または変更。

# emacs /usr/local/apache2/conf/httpd.conf
  LoadFile    /usr/lib/libxml2.so
  LoadModule  proxy_html_module    modules/mod_proxy_html.so

  <location /internal/>
     SetOutputFilter                proxy-html
     ProxyPass                      https://www.internal.com/
     ProxyPassReverse               https://www.internal.com/
     ProxyPassReverseCookieDomain   www.internal.com www.external.com
     ProxyPassReverseCookiePath     /              /internal/
     ProxyHTMLURLMap                /              /internal/
  </Location>

※libxml2 はversion 2.5.10 以上を利用すること。

mod_proxy_html専用のlog設定も存在する。場合によって設定する。

 ProxyHTMLLogVerbose On
 LogLevel Info                  <- or LogLevel Debug

但し、JavaScriptなどは変換されないようだ!

Edit
トラブルシューティング

Edit
httpdの起動時に発生するもの

Edit
apache2.4.4固有のバグ

Edit
必ず Password Mismatch になる。

恐ろしい事に、下記のパスワードを作成するコマンドがバグっており、正しくハッシュを作らない。

# htpasswd -c username

そのため下記の手順で、ユーザーを追加する必要がある。

# htpasswd -nb ユーザー名 パスワード > ./htpasswd

apache.orgでの当バグの報告

Edit
AuthFileでパーミッションエラー

なぜか、htpasswd などのパスワードファイルが設置されている、フォルダの権限も影響するため、フォルダも666 や、777 にしておく。

Edit
アクセスチェッカー

Edit
参照リンク