現在、apacheの主流は、2.2系ではあるが、2.4系バージョンより、速度向上+メモリ節約+スレッドの改善がされ、nginx に比べて同時接続数が100以上あたりから極端にレスポンスが低下する問題などが改善されている。しかし、未だ nginx に速度面では及ばない部分はあるが、多くの mod モジュールなどの資産もあり、まだまだ主力のwebサーバーといえる。
Apache 2.4.xからはAPR(Apache Portable Runtime)と、APR-utilが同梱されていないため、APR とAPR-util のライブラリをダウンロードし、この手順に従いインストールしておく。
# 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-apr | srclibにダウンロードし展開したソースを利用する |
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
※注意、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
apacheサーバー(httpd)を、Linuxのサービスとして登録することで、OSが起動時に自動的に起動されるようになる。
# 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 を書き直す。
下記のように修正します。
# 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指定のオプションを削除)
# emacs /etc/profile pathmunge /usr/local/apache2/bin <- パス設定の上に追加
通常はhttpdを最初にyumでインストールしない場合にはこのファイルは存在しない。
# rm /usr/sbin/httpd
# groupadd apache (すでにグループapacheがあれば必要ありません) # useradd -g apache apache (すでにユーザーapacheがあれば必要ありません)
# emacs /etc/ld.so.conf.d/httpd.conf /usr/local/apache2/lib /usr/local/apache2/modules # ldconfig
Yumでインストールすると、/etc/httpd 以下のフォルダに設定ファイルが存在しますが、先ほど、起動ファイルを変更したので、今後の設定ファイルの位置は変更されます。
# emacs /usr/local/apache2/conf/httpd.conf # # Include Extention Module # Include conf/extra/*.conf
これで、conf/extra/以下のファイルが自動読み込みされます。
# 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>
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以上を利用するとすることで利用できるようになるブラウザも存在する
XST対策として、httpd.confに、「TraceEnable Off」の文を先頭あたりに1行追加する。 また、SSLの暗号に対する脆弱性の指定に対して以下の設定を確認する。
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXP:+eNULL SSLProtocol all -SSLv2
# 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
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
# 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
# yum install mailcap lua-devel libxml2-devel pcre-devel
# 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
# 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
# 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
# fuser -n tcp 80 ( -n を-kn に変更するとそのプロセスをKILLします。
# service httpd start ( start を stop に変更するとプロセスの停止 )
# for i in /usr/local/apache2/modules/*; do strings $i | grep -q -i AddType && echo $i; doneこのコマンドで、soファイル内を検索して必要なモジュール名を確定します。httpd.confを確認してLoadModuleを行えばエラーは解消です。
# httpd -l
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 でサーバーの稼動詳細を確認できます。
# 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
リバースプロキシーとは、ひとつのサーバーアクセスに対して、複数の内部サーバーによるそれぞれの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の場合にはやはりバランサが必要となる)
インストールは非常に簡単であり、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 <- バランサ用
基本的には 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
mod_proxyでは、html内部のリンクを変更するわけではないため、内部サーバーが窓口サーバーに送るhtmlでは、内部サーバー独自のアドレス表記に戻っているような形になる。そのため、内部で作成し外部に公開されたページのリンクをクリックすると、proxy設定のアドレスから外れて起動しない、または意図したアドレスではないページを表示することになる。よってmod_proxy_htmlを導入する。公式ページ
# 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等がインストールされている状態であること。
基本的には「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などは変換されないようだ!
恐ろしい事に、下記のパスワードを作成するコマンドがバグっており、正しくハッシュを作らない。
# htpasswd -c username
そのため下記の手順で、ユーザーを追加する必要がある。
# htpasswd -nb ユーザー名 パスワード > ./htpasswd
なぜか、htpasswd などのパスワードファイルが設置されている、フォルダの権限も影響するため、フォルダも666 や、777 にしておく。