Contents
- 1 Apache HTTPDについて
- 2 サーバー構築
- 3 設定
- 4 ツール
- 5 運用
- 6 チューニング
Apache HTTPDについて
用語
スロット
HTTPリクエストを処理するユニットのこと。
マルチプロセスモデルではプロセスがスロットとなり、マルチスレッドモデルではスレッドがスロットとなる。
サーバー構築
構築環境
- OS
CentOS release 7.4 (64bit)
- Apache Version
2.4.34
OS設定
ネットワーク
固定IPアドレス割り当て
次のファイルを編集する
# ifcfg-loはループバックインタフェースであるため、触らない vi /etc/sysconfig/network-scripts/ifcfg-<インタフェース名>
以下では例として192.168.0.51/24を割り当てた
BOOTPROTO=static ONBOOT=yes IPADDR=192.168.0.51 NETMASK=255.255.255.0 NETWORK=192.168.0.0 GATEWAY=192.168.0.1
ネットワークを再起動する
systemctl restart network
ip addressコマンドにより、インタフェースが有効になっていることを確認する
これによりホストマシンなどからSSHでログイン可能となる
firewalld
HTTPを開ける
- 現在ルールが定義されていることを確認
firewall-cmd --permanent --info-service=http
- 現在ルールが適用されていないことを確認する
firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep http
- ルールを適用する
firewall-cmd --add-service=http --zone=public --permanent
- ルールが適用されていることを確認する
firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep http
- 設定を再読み込みして反映させる
firewall-cmd --reload
HTTPSも開ける場合
- 現在ルールが定義されていることを確認
firewall-cmd --permanent --info-service=https
- 現在ルールが適用されていないことを確認する
firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep https
- ルールを適用する
firewall-cmd --add-service=https --zone=public --permanent
- ルールが適用されていることを確認する
firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep https
- 設定を再読み込みして反映させる
firewall-cmd --reload
TCP/10080を開ける場合
標準のHTTP/HTTPSポートではないポートを使用する場合は次のように行う。
- 現在ルールが定義されていないか確認
firewall-cmd --permanent --info-service=http_10080
- 新しいルールを定義
firewall-cmd --new-service=http_10080 --permanent firewall-cmd --service=http_10080 --add-port=10080/tcp --permanent
- ルールが定義されていることを確認
firewall-cmd --permanent --info-service=http_10080
- 現在ルールが適用されていないことを確認する
firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep http_10080
- ルールを適用する
firewall-cmd --add-service=http_10080 --zone=public --permanent
- ルールが適用されていることを確認する
firewall-cmd --list-services --zone=public --permanent | sed -e "s/ /\n/g" | grep http_10080
- 設定を再読み込みして反映させる
firewall-cmd --reload
ホスト名
ホスト名としてapacheを設定する
hostname apache.corp # 再起動しても有効にする echo apache.corp > /etc/hostname
再ログインすることで有効になる。
ユーザ作成
Apache用のユーザを作成する
useradd --user-group --no-create-home --shell /sbin/false apache
Apacheインストール
ソースコードからインストール
関連ソフトウェアのインストール
OpenSSL
HTTPS(SSL)を使用する場合、opensslが必要となる。
デフォルトでもインストールされているが、古いバージョンなので、新しくインストールする。
最新のバージョンを確認する場合はこちら
- ソースコードからインストール
yum install make gcc -y curl -s -O https://www.openssl.org/source/openssl-1.0.2q.tar.gz tar xzvf openssl-1.0.2q.tar.gz cd openssl-* export CFLAGS="-O3 -m64" ./config --prefix=/usr/local/`pwd | sed "s/.*\///"` --openssldir=/usr/local/`pwd | sed "s/.*\///"` -fPIC make make install ln -s /usr/local/openssl-* /usr/local/openssl cd ../
- パッケージからインストール
yum update openssl -y yum install openssl openssl-devel -y
zlib
mod_deflate(圧縮)を使用する場合必要となる。
最新バージョンを確認する
curl -s -O https://zlib.net/zlib-1.2.11.tar.gz tar xfvz zlib-*.tar.gz cd zlib-* ./configure --prefix=/usr/local/`pwd | sed "s/.*\///"` make make install ln -s /usr/local/zlib-* /usr/local/zlib cd ../ rm -rf zlib*
その他
以下のパッケージをまとめてインストールする
yum install gcc pcre-devel lynx expat-devel -y
Apacheのインストール
不特定多数から直接アクセスを受けるWebサーバであるApacheは常に最新のバージョンを
導入できるようにソースコードからのインストールを推奨。
(パッケージは用意されるまでに時間がかかる)
- ダウンロードサイトからアーカイブのURLを取得し、ダウンロードする
curl -s -O http://ftp.riken.jp/net/apache//httpd/httpd-2.4.34.tar.gz
- アーカイブファイルを展開する
tar zfxv httpd-*.tar.gz
- アーカイブは削除する
rm -f httpd-*.tar.gz
- Apache Portable Runtime(APR)をインストールする
※Apache Portable Runtimeとはクロスプラットフォームサポート用のライブラリ
- ダウンロードサイトからアーカイブのURLを取得し、ダウンロードする
curl -s -O http://ftp.riken.jp/net/apache//apr/apr-1.6.3.tar.gz curl -s -O http://ftp.riken.jp/net/apache//apr/apr-util-1.6.1.tar.gz
- アーカイブファイルを展開する
tar zfxv apr-1*.tar.gz tar zfxv apr-util-*.tar.gz
- アーカイブは削除する
rm -f apr-*.tar.gz
- Apacheディレクトリへ移動
mv apr-util-* `ls -d httpd-*`/srclib/apr-util mv apr-* `ls -d httpd-*`/srclib/apr
- ダウンロードサイトからアーカイブのURLを取得し、ダウンロードする
- Apacheのディレクトリに移動する
cd httpd-*
- コンパイル、インストールを行う
- コンパイル最適化設定を行う
export CFLAGS="-O3 -m64"
- Makefileを生成する
- インストール先(prefix)
/usr/local/apache-httpd-<APACHE_VERSION> - ファイル配置(enable-layout)
標準(Apache)。配置内容はconfig.layoutに記載。 - 静的モジュール(enable-modules)
全て使用 - 動的モジュール(enable-mods-shared)
基本的なものは全て使用(後から個別に無効にできる) - 圧縮モジュール(enable-deflate / –with-z)
有効 - SSL使用(enable-ssl)
./configure --prefix=/usr/local/apache-`pwd | sed "s/.*-//"` \ --enable-layout=Apache --enable-modules=all --enable-mods-shared=all \ --enable-deflate --with-z=/usr/local/zlib --enable-ssl --with-ssl=/usr/local/openssl \ 2>&1 | tee configure.log.`date +"%Y%m%d"`
※event以外のMPMを使用する可能性がある場合は次のオプションを加える。--enable-mpms-shared=all
- SSL未使用
./configure --prefix=/usr/local/apache-`pwd | sed "s/.*-//"` \ --enable-layout=Apache --enable-modules=all --enable-mods-shared=all \ --enable-deflate --with-z=/usr/local/zlib \ 2>&1 | tee configure.log.`date +"%Y%m%d"`
※event以外のMPMを使用する可能性がある場合は次のオプションを加える。--enable-mpms-shared=all
使用できる設定内容は以下のとおり
- オプション一覧
[root@apache httpd-2.4.34]# ./configure --help `configure' configures this package to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print `checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for `--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or `..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [/usr/local/apache2] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, `make install' will install all the files in `/usr/local/apache2/bin', `/usr/local/apache2/lib' etc. You can specify an installation prefix other than `/usr/local/apache2' using `--prefix', for instance `--prefix=$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-layout=LAYOUT --enable-dtrace Enable DTrace probes --enable-hook-probes Enable APR hook probes --enable-exception-hook Enable fatal exception hook --enable-load-all-modules Load all modules --enable-maintainer-mode Turn on debugging and compile time warnings and load all compiled modules --enable-debugger-mode Turn on debugging and compile time warnings and turn off optimization --enable-pie Build httpd as a Position Independent Executable --enable-modules=MODULE-LIST Space-separated list of modules to enable | "all" | "most" | "few" | "none" | "reallyall" --enable-mods-shared=MODULE-LIST Space-separated list of shared modules to enable | "all" | "most" | "few" | "reallyall" --enable-mods-static=MODULE-LIST Space-separated list of static modules to enable | "all" | "most" | "few" | "reallyall" --disable-authn-file file-based authentication control --enable-authn-dbm DBM-based authentication control --enable-authn-anon anonymous user authentication control --enable-authn-dbd SQL-based authentication control --enable-authn-socache Cached authentication control --disable-authn-core core authentication module --disable-authz-host host-based authorization control --disable-authz-groupfile 'require group' authorization control --disable-authz-user 'require user' authorization control --enable-authz-dbm DBM-based authorization control --enable-authz-owner 'require file-owner' authorization control --enable-authz-dbd SQL based authorization and Login/Session support --disable-authz-core core authorization provider vector module --enable-authnz-ldap LDAP based authentication --enable-authnz-fcgi FastCGI authorizer-based authentication and authorization --disable-access-compat mod_access compatibility --disable-auth-basic basic authentication --enable-auth-form form authentication --enable-auth-digest RFC2617 Digest authentication --enable-allowmethods restrict allowed HTTP methods --enable-isapi isapi extension support --enable-file-cache File cache --enable-cache dynamic file caching. At least one storage management module (e.g. mod_cache_disk) is also necessary. --enable-cache-disk disk caching module --enable-cache-socache shared object caching module --enable-socache-shmcb shmcb small object cache provider --enable-socache-dbm dbm small object cache provider --enable-socache-memcache memcache small object cache provider --enable-socache-dc distcache small object cache provider --enable-so DSO capability. This module will be automatically enabled unless you build all modules statically. --enable-watchdog Watchdog module --enable-macro Define and use macros in configuration files --enable-dbd Apache DBD Framework --enable-bucketeer buckets manipulation filter. Useful only for developers and testing purposes. --enable-dumpio I/O dump filter --enable-echo ECHO server --enable-example-hooks Example hook callback handler module --enable-case-filter Example uppercase conversion filter --enable-case-filter-in Example uppercase conversion input filter --enable-example-ipc Example of shared memory and mutex usage --enable-buffer Filter Buffering --enable-data RFC2397 data encoder --enable-ratelimit Output Bandwidth Limiting --disable-reqtimeout Limit time waiting for request from client --enable-ext-filter external filter module --enable-request Request Body Filtering --enable-include Server Side Includes --disable-filter Smart Filtering --enable-reflector Reflect request through the output filter stack --enable-substitute response content rewrite-like filtering --enable-sed filter request and/or response bodies through sed --disable-charset-lite character set translation. Enabled by default only on EBCDIC systems. --enable-charset-lite character set translation. Enabled by default only on EBCDIC systems. --enable-deflate Deflate transfer encoding support --enable-xml2enc i18n support for markup filters --enable-proxy-html Fix HTML Links in a Reverse Proxy --enable-brotli Brotli compression support --enable-http HTTP protocol handling. The http module is a basic one that enables the server to function as an HTTP server. It is only useful to disable it if you want to use another protocol module instead. Don't disable this module unless you are really sure what you are doing. Note: This module will always be linked statically. --disable-mime mapping of file-extension to MIME. Disabling this module is normally not recommended. --enable-ldap LDAP caching and connection pooling services --disable-log-config logging configuration. You won't be able to log requests to the server without this module. --enable-log-debug configurable debug logging --enable-log-forensic forensic logging --enable-logio input and output logging --enable-lua Apache Lua Framework --enable-luajit Enable LuaJit Support --disable-env clearing/setting of ENV vars --enable-mime-magic automagically determining MIME type --enable-cern-meta CERN-type meta files --enable-expires Expires header control --disable-headers HTTP header control --enable-ident RFC 1413 identity check --enable-usertrack user-session tracking --enable-unique-id per-request unique ids --disable-setenvif basing ENV vars on headers --disable-version determining httpd version in config files --enable-remoteip translate header contents to an apparent client remote_ip --enable-proxy Apache proxy module --enable-proxy-connect Apache proxy CONNECT module. Requires --enable-proxy. --enable-proxy-ftp Apache proxy FTP module. Requires --enable-proxy. --enable-proxy-http Apache proxy HTTP module. Requires --enable-proxy. --enable-proxy-fcgi Apache proxy FastCGI module. Requires --enable-proxy. --enable-proxy-scgi Apache proxy SCGI module. Requires --enable-proxy. --enable-proxy-uwsgi Apache proxy UWSGI module. Requires --enable-proxy. --enable-proxy-fdpass Apache proxy to Unix Daemon Socket module. Requires --enable-proxy. --enable-proxy-wstunnel Apache proxy Websocket Tunnel module. Requires --enable-proxy. --enable-proxy-ajp Apache proxy AJP module. Requires --enable-proxy. --enable-proxy-balancer Apache proxy BALANCER module. Requires --enable-proxy. --enable-proxy-express mass reverse-proxy module. Requires --enable-proxy. --enable-proxy-hcheck reverse-proxy health-check module. Requires --enable-proxy and --enable-watchdog. --enable-session session module --enable-session-cookie session cookie module --enable-session-crypto session crypto module --enable-session-dbd session dbd module --enable-slotmem-shm slotmem provider that uses shared memory --enable-slotmem-plain slotmem provider that uses plain memory --enable-ssl SSL/TLS support (mod_ssl) --enable-ssl-staticlib-deps link mod_ssl with dependencies of OpenSSL's static libraries (as indicated by "pkg-config --static"). Must be specified in addition to --enable-ssl. --enable-optional-hook-export example optional hook exporter --enable-optional-hook-import example optional hook importer --enable-optional-fn-import example optional function importer --enable-optional-fn-export example optional function exporter --enable-dialup rate limits static files to dialup modem speeds --enable-static-support Build a statically linked version of the support binaries --enable-static-htpasswd Build a statically linked version of htpasswd --enable-static-htdigest Build a statically linked version of htdigest --enable-static-rotatelogs Build a statically linked version of rotatelogs --enable-static-logresolve Build a statically linked version of logresolve --enable-static-htdbm Build a statically linked version of htdbm --enable-static-ab Build a statically linked version of ab --enable-static-checkgid Build a statically linked version of checkgid --enable-static-htcacheclean Build a statically linked version of htcacheclean --enable-static-httxt2dbm Build a statically linked version of httxt2dbm --enable-static-fcgistarter Build a statically linked version of fcgistarter --enable-http2 HTTP/2 protocol handling in addition to HTTP protocol handling. Implemented by mod_http2. This module requires a libnghttp2 installation. See --with-nghttp2 on how to manage non-standard locations. This module is usually linked shared and requires loading. --enable-nghttp2-staticlib-deps link mod_http2 with dependencies of libnghttp2's static libraries (as indicated by "pkg-config --static"). Must be specified in addition to --enable-http2. --enable-proxy-http2 HTTP/2 proxy module. This module requires a libnghttp2 installation. See --with-nghttp2 on how to manage non-standard locations. Also requires --enable-proxy. --enable-md Managed Domain handling --enable-jansson-staticlib-deps link mod_md with dependencies of libjansson's static libraries (as indicated by "pkg-config --static"). Must be specified in addition to --enable-md. --enable-curl-staticlib-deps link mod_md with dependencies of libcurl's static libraries (as indicated by "pkg-config --static"). Must be specified in addition to --enable-md. --enable-lbmethod-byrequests Apache proxy Load balancing by request counting --enable-lbmethod-bytraffic Apache proxy Load balancing by traffic counting --enable-lbmethod-bybusyness Apache proxy Load balancing by busyness --enable-lbmethod-heartbeat Apache proxy Load balancing from Heartbeats --enable-mpms-shared=MPM-LIST Space-separated list of MPM modules to enable for dynamic loading. MPM-LIST=list | "all" --enable-unixd unix specific support --enable-privileges Per-virtualhost Unix UserIDs and enhanced security for Solaris --enable-heartbeat Generates Heartbeats --enable-heartmonitor Collects Heartbeats --enable-dav WebDAV protocol handling. --enable-dav also enables mod_dav_fs --disable-status process/thread monitoring --disable-autoindex directory listing --enable-asis as-is filetypes --enable-info server information --enable-suexec set uid and gid for spawned processes --enable-cgid CGI scripts. Enabled by default with threaded MPMs --enable-cgi CGI scripts. Enabled by default with non-threaded MPMs --enable-dav-fs DAV provider for the filesystem. --enable-dav also enables mod_dav_fs. --enable-dav-lock DAV provider for generic locking --enable-vhost-alias mass virtual hosting module --enable-negotiation content negotiation --disable-dir directory request handling --enable-imagemap server-side imagemaps --enable-actions Action triggering on requests --enable-speling correct common URL misspellings --enable-userdir mapping of requests to user-specific directories --disable-alias mapping of requests to different filesystem parts --enable-rewrite rule based URL manipulation --enable-suexec-capabilities Use Linux capability bits not setuid root suexec --enable-v4-mapped Allow IPv6 sockets to handle IPv4 connections Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-included-apr Use bundled copies of APR/APR-Util --with-apr=PATH prefix for installed APR or the full path to apr-config --with-apr-util=PATH prefix for installed APU or the full path to apu-config --with-pcre=PATH Use external PCRE library --with-port=PORT Port on which to listen (default is 80) --with-sslport=SSLPORT Port on which to securelisten (default is 443) --with-distcache=PATH Distcache installation directory --with-z=PATH use a specific zlib library --with-libxml2=PATH location for libxml2 --with-brotli=PATH Brotli installation directory --with-lua=PATH Path to the Lua 5.3/5.2/5.1 prefix --with-ssl=PATH OpenSSL installation directory --with-nghttp2=PATH nghttp2 installation directory --with-jansson=PATH jansson installation directory --with-curl=PATH curl installation directory --with-mpm=MPM Choose the process model for Apache to use by default. MPM={event|worker|prefork|winnt} This will be statically linked as the only available MPM unless --enable-mpms-shared is also specified. --with-module=module-type:module-file Enable module-file in the modules/<module-type> directory. --with-program-name alternate executable name --with-suexec-bin Path to suexec binary --with-suexec-caller User allowed to call SuExec --with-suexec-userdir User subdirectory --with-suexec-docroot SuExec root directory --with-suexec-uidmin Minimal allowed UID --with-suexec-gidmin Minimal allowed GID --with-suexec-logfile Set the logfile --with-suexec-syslog Use syslog for suexec logging --with-suexec-safepath Set the safepath --with-suexec-umask umask for suexec'd process Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a nonstandard directory <lib dir> LIBS libraries to pass to the linker, e.g. -l<library> CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir> CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider.
- インストール先(prefix)
- コンパイルする
make 2>&1 | tee make.log.`date +"%Y%m%d"`
- インストールを行う。
make install 2>&1 | tee make_install.log.`date +"%Y%m%d"`
- コンパイル最適化設定を行う
- リンク作成、環境変数設定などを行う
- インストールディレクトリへのシンボリックリンクを作成する。
これによって、複数のバージョンを同居させ、リンクを切り替えることで、バージョン変更が可能となる。
各バージョンの実行ファイルはデフォルトでは各バージョンの設定ファイルを読み込むこととなる。
rm -f /usr/local/apache ln -s /usr/local/apache-`pwd | sed "s/.*-//"` /usr/local/apache
- 簡単にアクセスできるように環境変数を設定する
export APACHE_HOME=/usr/local/apache
- ツール類にパスを通す
export PATH=$APACHE_HOME/bin:$APACHE_HOME/sbin:$PATH
- 環境変数を再起動後も有効にする
echo "" >> /etc/bashrc echo "# APACHE ENVIRONMENT VARIABLE" >> /etc/bashrc echo "export APACHE_HOME=$APACHE_HOME" >> /etc/bashrc echo "export PATH=\$APACHE_HOME/bin:\$APACHE_HOME/sbin:\$PATH" >> /etc/bashrc
- 実行できることを確認する
httpd -V # バージョン情報が出力される
- インストールディレクトリへのシンボリックリンクを作成する。
- systemdの設定する
- サーバーのサービスファイルを作成する
cat > /etc/systemd/system/apache.service << EOT [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target Documentation=man:httpd(8) Documentation=man:apachectl(8) [Service] Type=forking ExecStart=$APACHE_HOME/bin/apachectl start ExecReload=$APACHE_HOME/bin/apachectl graceful ExecStop=$APACHE_HOME/bin/apachectl stop # We want systemd to give httpd some time to finish gracefully, but still want # it to kill httpd after TimeoutStopSec if something went wrong during the # graceful stop. Normally, Systemd sends SIGTERM signal right after the # ExecStop, which would kill httpd. We are sending useless SIGCONT here to give # httpd time to finish. KillSignal=SIGCONT PrivateTmp=true [Install] WantedBy=multi-user.target EOT
- サービスを有効化する
systemctl enable apache
- サービスが有効化されていることを確認する
systemctl list-unit-files --type service --no-pager | grep apache
- サーバーのサービスファイルを作成する
- インストールしたディレクトリに移動する
cd $APACHE_HOME
- ファイル所有者を変更する
chown -R apache:apache /usr/local/apache*
- 基本設定を行う
sed "s/^#ServerName.*/ServerName 127.0.0.1:80/g" -i conf/httpd.conf sed "s/User daemon/User apache/g" -i conf/httpd.conf sed "s/Group daemon/Group apache/g" -i conf/httpd.conf
- Apacheを起動する
systemctl start apache
- 稼働確認
systemctl status apache
正常に起動していない場合、ログを確認する。
journalctl -u apache cat /var/log/messages
- 接続確認
curl http://localhost/ # <html><body><h1>It works!</h1></body></html>
- 停止
systemctl stop apache
- シェルなどからlynxを実行できるよう修正する
vi `which apachectl`
以下の部分を
status) $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } ' ;; fullstatus) $LYNX $STATUSURL
以下のように変更
status) export HOME=/tmp $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } ' ;; fullstatus) export HOME=/tmp $LYNX $STATUSURL
初期設定
cat > $APACHE_HOME/conf/httpd.conf << EOT LoadModule access_compat_module modules/mod_access_compat.so LoadModule authz_core_module modules/mod_authz_core.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule alias_module modules/mod_alias.so ServerRoot "/usr/local/apache" Listen 80 LoadModule unixd_module modules/mod_unixd.so <IfModule unixd_module> User apache Group apache </IfModule> <Directory /> AllowOverride none Require all denied </Directory> DocumentRoot "/usr/local/apache/htdocs" <Directory "/usr/local/apache/htdocs"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> LoadModule dir_module modules/mod_dir.so <IfModule dir_module> DirectoryIndex index.html </IfModule> LoadModule mime_module modules/mod_mime.so <IfModule mime_module> TypesConfig conf/mime.types </IfModule> ErrorLog "logs/error_log" LogLevel warn LoadModule log_config_module modules/mod_log_config.so <IfModule log_config_module> LogFormat "%{%Y/%m/%d(%a) %T}t %>s:\"%r\" \"Ref:%{Referer}i\" \"UA:%{User-Agent}i\" %a (%T sec (%D usec))" original CustomLog "| /usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log.%Y-%m-%d 86400" original BufferedLogs On </IfModule> EOT
パッケージからインストール
次のコマンドでインストールできる
yum install httpd -y
モジュール
モジュールの確認
- 静的モジュールの表示
httpd -l
- 全てのモジュールの表示
httpd -M
モジュールの追加
パッケージからインストールした場合
パッケージとしてモジュールが提供されているので追加インストールする。
例:mod_sslをインストールする場合
yum -y install mod_ssl
ソースコードからインストールした場合
- DSOとして追加
find httpd*/modules -name "mod*XXXXX*.c" cd <モジュールのソースコードがある階層> ※modulesディレクトリにある $APACHE_HOME/bin/apxs -c -i -a mod_XXX.c
マニュアルの配置
ダウンロードしたソースコード中にHTML形式のマニュアルがあるので、それをApacheから参照できるように設定することで、マニュアルを閲覧できる。
これはサンプルなので、通常は実施する必要は無い。
- マニュアルの設置
cp -R docs $APACHE_HOME/
- タイプマップファイルが拡張子htmlとなっているのでリネーム
find /usr/local/apache-httpd/docs/manual -name "*.html" | xargs rename .html .var
- 公開設定
LoadModule negotiation_module modules/mod_negotiation.so <Directory "/usr/local/apache-httpd/docs"> Require all granted AddHandler type-map var RedirectMatch permanent ^/([^\?]*)\.html$ $1.var </Directory>
ソースコードの削除
不要なソースコードを削除する
cd <ソースコードの配置パス> rm -rf httpd*
設定
設定ファイルの書き方
設定ファイルは次のパスにある。
$APACHE_HOME/conf/httpd.conf
こちらを編集し、Apacheを再起動することで、設定を反映できる。
基本的には初期状態で使用可能で、使用目的によって異なる設定変更を行う。
なお、同じ設定項目を複数書いた場合、よりファイルの後のほうで書いた方が採用される。
設定項目はディレクティブと呼ばれ、
項目名 項目内容
のように単行で設定を行うもの、
<項目名> 項目内容1 項目内容2 </項目名>
のように構造化され、複数行で設定を行うものが存在する。
設定は別ファイルに記述したものを明示的に読み込むことも出来る。
Include <パス>
と書くことで、読み込むことが出来る。
インストール場所以外のインストールオプションを指定していない場合の
初期状態の設定内容は以下のとおりである。
# # This is the main Apache HTTP server configuration file. It contains the # configuration directives that give the server its instructions. # See <URL:http://httpd.apache.org/docs/2.4/> for detailed information. # In particular, see # <URL:http://httpd.apache.org/docs/2.4/mod/directives.html> # for a discussion of each configuration directive. # # Do NOT simply read the instructions in here without understanding # what they do. They're here only as hints or reminders. If you are unsure # consult the online docs. You have been warned. # # Configuration and logfile names: If the filenames you specify for many # of the server's control files begin with "/" (or "drive:/" for Win32), the # server will use that explicit path. If the filenames do *not* begin # with "/", the value of ServerRoot is prepended -- so "logs/access_log" # with ServerRoot set to "/usr/local/apache2" will be interpreted by the # server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" # will be interpreted as '/logs/access_log'. # # ServerRoot: The top of the directory tree under which the server's # configuration, error, and log files are kept. # # Do not add a slash at the end of the directory path. If you point # ServerRoot at a non-local disk, be sure to specify a local disk on the # Mutex directive, if file-based mutexes are used. If you wish to share the # same ServerRoot for multiple httpd daemons, you will need to change at # least PidFile. # ServerRoot "/usr/local/apache-httpd-2.4.7" # # Mutex: Allows you to set the mutex mechanism and mutex file directory # for individual mutexes, or change the global defaults # # Uncomment and change the directory if mutexes are file-based and the default # mutex file directory is not on a local disk or is not appropriate for some # other reason. # # Mutex default:logs # # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the <VirtualHost> # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # #Listen 12.34.56.78:80 Listen 80 # # Dynamic Shared Object (DSO) Support # # To be able to use the functionality of a module which was built as a DSO you # have to place corresponding `LoadModule' lines at this location so the # directives contained in it are actually available _before_ they are used. # Statically compiled modules (those listed by `httpd -l') do not need # to be loaded here. # # Example: # LoadModule foo_module modules/mod_foo.so # LoadModule authn_file_module modules/mod_authn_file.so #LoadModule authn_dbm_module modules/mod_authn_dbm.so #LoadModule authn_anon_module modules/mod_authn_anon.so #LoadModule authn_dbd_module modules/mod_authn_dbd.so #LoadModule authn_socache_module modules/mod_authn_socache.so LoadModule authn_core_module modules/mod_authn_core.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so LoadModule authz_user_module modules/mod_authz_user.so #LoadModule authz_dbm_module modules/mod_authz_dbm.so #LoadModule authz_owner_module modules/mod_authz_owner.so #LoadModule authz_dbd_module modules/mod_authz_dbd.so LoadModule authz_core_module modules/mod_authz_core.so LoadModule access_compat_module modules/mod_access_compat.so LoadModule auth_basic_module modules/mod_auth_basic.so #LoadModule auth_form_module modules/mod_auth_form.so #LoadModule auth_digest_module modules/mod_auth_digest.so #LoadModule allowmethods_module modules/mod_allowmethods.so #LoadModule file_cache_module modules/mod_file_cache.so #LoadModule cache_module modules/mod_cache.so #LoadModule cache_disk_module modules/mod_cache_disk.so #LoadModule cache_socache_module modules/mod_cache_socache.so #LoadModule socache_shmcb_module modules/mod_socache_shmcb.so #LoadModule socache_dbm_module modules/mod_socache_dbm.so #LoadModule socache_memcache_module modules/mod_socache_memcache.so #LoadModule watchdog_module modules/mod_watchdog.so #LoadModule macro_module modules/mod_macro.so #LoadModule dbd_module modules/mod_dbd.so #LoadModule dumpio_module modules/mod_dumpio.so #LoadModule echo_module modules/mod_echo.so #LoadModule buffer_module modules/mod_buffer.so #LoadModule data_module modules/mod_data.so #LoadModule ratelimit_module modules/mod_ratelimit.so LoadModule reqtimeout_module modules/mod_reqtimeout.so #LoadModule ext_filter_module modules/mod_ext_filter.so #LoadModule request_module modules/mod_request.so #LoadModule include_module modules/mod_include.so LoadModule filter_module modules/mod_filter.so #LoadModule reflector_module modules/mod_reflector.so #LoadModule substitute_module modules/mod_substitute.so #LoadModule sed_module modules/mod_sed.so #LoadModule charset_lite_module modules/mod_charset_lite.so LoadModule mime_module modules/mod_mime.so LoadModule log_config_module modules/mod_log_config.so #LoadModule log_debug_module modules/mod_log_debug.so #LoadModule log_forensic_module modules/mod_log_forensic.so #LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so #LoadModule mime_magic_module modules/mod_mime_magic.so #LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so #LoadModule usertrack_module modules/mod_usertrack.so #LoadModule unique_id_module modules/mod_unique_id.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule version_module modules/mod_version.so #LoadModule remoteip_module modules/mod_remoteip.so #LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_connect_module modules/mod_proxy_connect.so #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so #LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so #LoadModule proxy_scgi_module modules/mod_proxy_scgi.so #LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so #LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #LoadModule proxy_express_module modules/mod_proxy_express.so #LoadModule session_module modules/mod_session.so #LoadModule session_cookie_module modules/mod_session_cookie.so #LoadModule session_dbd_module modules/mod_session_dbd.so #LoadModule slotmem_shm_module modules/mod_slotmem_shm.so #LoadModule slotmem_plain_module modules/mod_slotmem_plain.so #LoadModule dialup_module modules/mod_dialup.so #LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so #LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so #LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so #LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so LoadModule unixd_module modules/mod_unixd.so #LoadModule heartbeat_module modules/mod_heartbeat.so #LoadModule heartmonitor_module modules/mod_heartmonitor.so #LoadModule dav_module modules/mod_dav.so LoadModule status_module modules/mod_status.so LoadModule autoindex_module modules/mod_autoindex.so #LoadModule asis_module modules/mod_asis.so #LoadModule info_module modules/mod_info.so #LoadModule cgid_module modules/mod_cgid.so #LoadModule dav_fs_module modules/mod_dav_fs.so #LoadModule dav_lock_module modules/mod_dav_lock.so #LoadModule vhost_alias_module modules/mod_vhost_alias.so #LoadModule negotiation_module modules/mod_negotiation.so LoadModule dir_module modules/mod_dir.so #LoadModule actions_module modules/mod_actions.so #LoadModule speling_module modules/mod_speling.so #LoadModule userdir_module modules/mod_userdir.so LoadModule alias_module modules/mod_alias.so #LoadModule rewrite_module modules/mod_rewrite.so <IfModule unixd_module> # # If you wish httpd to run as a different user or group, you must run # httpd as root initially and it will switch. # # User/Group: The name (or #number) of the user/group to run httpd as. # It is usually good practice to create a dedicated user and group for # running httpd, as with most system services. # User daemon Group daemon </IfModule> # 'Main' server configuration # # The directives in this section set up the values used by the 'main' # server, which responds to any requests that aren't handled by a # <VirtualHost> definition. These values also provide defaults for # any <VirtualHost> containers you may define later in the file. # # All of these directives may appear inside <VirtualHost> containers, # in which case these default settings will be overridden for the # virtual host being defined. # # # ServerAdmin: Your address, where problems with the server should be # e-mailed. This address appears on some server-generated pages, such # as error documents. e.g. admin@your-domain.com # ServerAdmin you@example.com # # ServerName gives the name and port that the server uses to identify itself. # This can often be determined automatically, but we recommend you specify # it explicitly to prevent problems during startup. # # If your host doesn't have a registered DNS name, enter its IP address here. # #ServerName www.example.com:80 # # Deny access to the entirety of your server's filesystem. You must # explicitly permit access to web content directories in other # <Directory> blocks below. # <Directory /> AllowOverride none Require all denied </Directory> # # Note that from this point forward you must specifically allow # particular features to be enabled - so if something's not working as # you might expect, make sure that you have specifically enabled it # below. # # # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "/usr/local/apache-httpd-2.4.7/htdocs" <Directory "/usr/local/apache-httpd-2.4.7/htdocs"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Require all granted </Directory> # # DirectoryIndex: sets the file that Apache will serve if a directory # is requested. # <IfModule dir_module> DirectoryIndex index.html </IfModule> # # The following lines prevent .htaccess and .htpasswd files from being # viewed by Web clients. # <Files ".ht*"> Require all denied </Files> # # ErrorLog: The location of the error log file. # If you do not specify an ErrorLog directive within a <VirtualHost> # container, error messages relating to that virtual host will be # logged here. If you *do* define an error logfile for a <VirtualHost> # container, that host's errors will be logged there and not here. # ErrorLog "logs/error_log" # # LogLevel: Control the number of messages logged to the error_log. # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. # LogLevel warn <IfModule log_config_module> # # The following directives define some format nicknames for use with # a CustomLog directive (see below). # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common <IfModule logio_module> # You need to enable mod_logio.c to use %I and %O LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> # # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a <VirtualHost> # container, they will be logged here. Contrariwise, if you *do* # define per-<VirtualHost> access logfiles, transactions will be # logged therein and *not* in this file. # CustomLog "logs/access_log" common # # If you prefer a logfile with access, agent, and referer information # (Combined Logfile Format) you can use the following directive. # #CustomLog "logs/access_log" combined </IfModule> <IfModule alias_module> # # Redirect: Allows you to tell clients about documents that used to # exist in your server's namespace, but do not anymore. The client # will make a new request for the document at its new location. # Example: # Redirect permanent /foo http://www.example.com/bar # # Alias: Maps web paths into filesystem paths and is used to # access content that does not live under the DocumentRoot. # Example: # Alias /webpath /full/filesystem/path # # If you include a trailing / on /webpath then the server will # require it to be present in the URL. You will also likely # need to provide a <Directory> section to allow access to # the filesystem path. # # ScriptAlias: This controls which directories contain server scripts. # ScriptAliases are essentially the same as Aliases, except that # documents in the target directory are treated as applications and # run by the server when requested rather than as documents sent to the # client. The same rules about trailing "/" apply to ScriptAlias # directives as to Alias. # ScriptAlias /cgi-bin/ "/usr/local/apache-httpd-2.4.7/cgi-bin/" </IfModule> <IfModule cgid_module> # # ScriptSock: On threaded servers, designate the path to the UNIX # socket used to communicate with the CGI daemon of mod_cgid. # #Scriptsock cgisock </IfModule> # # "/usr/local/apache-httpd-2.4.7/cgi-bin" should be changed to whatever your ScriptAliased # CGI directory exists, if you have that configured. # <Directory "/usr/local/apache-httpd-2.4.7/cgi-bin"> AllowOverride None Options None Require all granted </Directory> <IfModule mime_module> # # TypesConfig points to the file containing the list of mappings from # filename extension to MIME-type. # TypesConfig conf/mime.types # # AddType allows you to add to or override the MIME configuration # file specified in TypesConfig for specific file types. # #AddType application/x-gzip .tgz # # AddEncoding allows you to have certain browsers uncompress # information on the fly. Note: Not all browsers support this. # #AddEncoding x-compress .Z #AddEncoding x-gzip .gz .tgz # # If the AddEncoding directives above are commented-out, then you # probably should define those extensions to indicate media types: # AddType application/x-compress .Z AddType application/x-gzip .gz .tgz # # AddHandler allows you to map certain file extensions to "handlers": # actions unrelated to filetype. These can be either built into the server # or added with the Action directive (see below) # # To use CGI scripts outside of ScriptAliased directories: # (You will also need to add "ExecCGI" to the "Options" directive.) # #AddHandler cgi-script .cgi # For type maps (negotiated resources): #AddHandler type-map var # # Filters allow you to process content before it is sent to the client. # # To parse .shtml files for server-side includes (SSI): # (You will also need to add "Includes" to the "Options" directive.) # #AddType text/html .shtml #AddOutputFilter INCLUDES .shtml </IfModule> # # The mod_mime_magic module allows the server to use various hints from the # contents of the file itself to determine its type. The MIMEMagicFile # directive tells the module where the hint definitions are located. # #MIMEMagicFile conf/magic # # Customizable error responses come in three flavors: # 1) plain text 2) local redirects 3) external redirects # # Some examples: #ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /missing.html #ErrorDocument 404 "/cgi-bin/missing_handler.pl" #ErrorDocument 402 http://www.example.com/subscription_info.html # # # MaxRanges: Maximum number of Ranges in a request before # returning the entire resource, or one of the special # values 'default', 'none' or 'unlimited'. # Default setting is to accept 200 Ranges. #MaxRanges unlimited # # EnableMMAP and EnableSendfile: On systems that support it, # memory-mapping or the sendfile syscall may be used to deliver # files. This usually improves server performance, but must # be turned off when serving from networked-mounted # filesystems or if support for these functions is otherwise # broken on your system. # Defaults: EnableMMAP On, EnableSendfile Off # #EnableMMAP off #EnableSendfile on # Supplemental configuration # # The configuration files in the conf/extra/ directory can be # included to add extra features or to modify the default configuration of # the server, or you may simply copy their contents here and change as # necessary. # Server-pool management (MPM specific) #Include conf/extra/httpd-mpm.conf # Multi-language error messages #Include conf/extra/httpd-multilang-errordoc.conf # Fancy directory listings #Include conf/extra/httpd-autoindex.conf # Language settings #Include conf/extra/httpd-languages.conf # User home directories #Include conf/extra/httpd-userdir.conf # Real-time info on requests and configuration #Include conf/extra/httpd-info.conf # Virtual hosts #Include conf/extra/httpd-vhosts.conf # Local access to the Apache HTTP Server Manual #Include conf/extra/httpd-manual.conf # Distributed authoring and versioning (WebDAV) #Include conf/extra/httpd-dav.conf # Various default settings #Include conf/extra/httpd-default.conf # Configure mod_proxy_html to understand HTML4/XHTML1 <IfModule proxy_html_module> Include conf/extra/proxy-html.conf </IfModule> # Secure (SSL/TLS) connections #Include conf/extra/httpd-ssl.conf # # Note: The following must must be present to support # starting without SSL on platforms with no /dev/random equivalent # but a statically compiled-in mod_ssl. # <IfModule ssl_module> SSLRandomSeed startup builtin SSLRandomSeed connect builtin </IfModule> # # uncomment out the below to deal with user agents that deliberately # violate open standards by misusing DNT (DNT *must* be a specific # end-user choice) # #<IfModule setenvif_module> #BrowserMatch "MSIE 10.0;" bad_DNT #</IfModule> #<IfModule headers_module> #RequestHeader unset DNT env=bad_DNT #</IfModule>
基本設定
一般的な設定
以下はインストール時にデフォルトで設定されるので、特に変更の必要は無い。
- ServerRoot
apacheが使用するディレクトリのパスを記述する
- 書式
ServerRoot <パス>
- 書式
- DocumentRoot
apacheが公開ディレクトリとして使用するパスを絶対パスで記述する。
apacheを実行するユーザの読み取り権限が必要。
- 書式
DocumentRoot <パス>
- 書式
- Listen
apacheデーモンがHTTPを待ち受けるIPアドレス、ポートを記述する - 書式
Listen <IPアドレス>:<ポート番号>
or
Listen <ポート番号>
ホスト名設定
ホスト名を設定しないと起動時にエラーが出る。
ServerName行を探し、以下のように編集する。( 行頭# コメントアウトは削除する)
ServerName <自ホスト名 or 127.0.0.1>:80
この設定後、最低限の状態で起動できるので、http://127.0.0.1/にアクセス可能となる。
- 初期状態
#ServerName www.example.com:80
- 設定内容
ServerName 127.0.0.1:80
実行ユーザ設定
Apacheは起動したユーザでなく、設定したユーザで起動される。
デフォルトではdaemonとなっているが、分かりにくいので、apacheユーザ・グループに変更する。
実際にそのユーザ・グループが存在する必要があるので、作成する。
不要であれば、デフォルトのdaemonは削除する。
- 初期状態
User daemon Group daemon
- 設定内容
User apache Group apache
- ユーザ作成
useradd --user-group --no-create-home --shell /sbin/nologin apache
- ユーザ削除
userdel daemon groupdel daemon
管理者連絡先
サーバがエラーページを表示する際に埋め込むサーバ管理者の連絡先。
この設定は未記載でもエラーにならないので、消してしまっても良い。
- 書式
ServerAdmin <メールアドレス or URL>
分散設定ファイルの使用
設定はhttpd.confに通常まとめて書くが、公開対象の各ディレクトリに個別にアクセス権などを記述した
設定ファイルを設置して設定を行うことが出来る。
ここで記述した内容はhttpd.confで記述した内容を上書きできる。
各ユーザのホームディレクトリで各ユーザのWEBサービスを公開させるなどで複数の管理者で管理するような場合を除き、
設定が散らばってしまうことや、分散設定ファイルの読み込みオーバーヘッドが発生するので、通常は利用すべきではない。
- 書式
AccessFileName <分散設定ファイル名>
通常は .htaccess を使用する場合が多い。
なお、AllowOverrideディレクティブによって上書き可能なディレクティブや、対象ディレクトリを指定できる。
ディレクトリ内設定
指定したディレクトリに対してディレクティブを設定する。
指定するディレクトリパスは前方部分一致である。
- 書式
<Directory <パス>> 任意のディレクティブ </Directory>
パスは絶対パスを指定する。
パスにはワイルドカードを利用でき * で/を除く任意の文字列、 ? で任意の1文字にヒットする。
更に、 ~ “<正規表現>” の形式で記述することで正規表現を利用可能となる。
<Directory ~ "<正規表現>"> 任意のディレクティブ </Directory>
特定のディレクトリをApacheが参照する際、複数のDirectoryディレクティブにヒットした場合は、
指定パスの短い順から全て適用される。つまり、 / と /var/ の2つでヒットした場合は、前者が先に適用される。
正規表現による指定はこの後に、記述した順番で適用される。
- Directoryディレクティブ内で使用するディレクティブ
- 「分散設定ファイル(.htaccess)」による設定の上書きを許可するか
- 書式
AllowOverride <上書き対象>
上書き対象には次が指定できる - All
全ての上書きを許可する - None
全ての上書きを許可しない - FileInfo
拡張子とファイルタイプの対応の指定やファイル名置換など設定可能になる - AuthConfig
ユーザ認証に関する指定を設定可能になる - Limit
アクセス制限に関する指定を設定可能になる
- 書式
- 特殊機能の有効化
- 書式
options <機能>
<機能>の前に + をつけると現在の設定に加えられ、 – をつけることで無効化できる。
何もつけないと現在の設定に上書きされる。
使用できる機能は以下。 - All
MultiViewsを除いた以下の全ての機能を有効にする。
なお、デフォルトではAllとなっている。 - ExecCGI
CGIを有効にする。(要mod_cgi) - FollowSymLinks
シンボリックリンクをたどれるようにする - Includes
SSIを有効にする。(要mod_include) - IncludesNOEXEC
SSIは有効になるが、#exec コマンドと #exec CGI は無効になる。
ただし、#include virtual により、ScriptAlias されたディレクトリで CGI を実行することは可能である。 - Indexes
ディレクトリに対するHTTPアクセスで、かつDirectoryIndexに記述されたファイル(index.htmlなど)が存在しない場合、
ファイルのリストを生成して返す。 - MultiViews
コンテントネゴシエーションされた “MultiViews” を許可する。(言語を自動選択してファイルを返す機能)(要mod_negotiation) - SymLinksIfOwnerMatch
- 書式
- その他のディレクティブ
こちら
- 「分散設定ファイル(.htaccess)」による設定の上書きを許可するか
公開対象ファイルの付加設定
ApacheがHTTPクエリによってファイルを公開参照する際に個別にそのファイルに対する振る舞いを定義できる。
指定するファイルパスは前方部分一致である。つまりJPEGファイルに適用する場合は”.jpg”ではなく、”*.jpg”とする必要がある。
- 書式
<Files "<ファイル名>"> 任意のディレクティブ </Files>
ファイル名にはワイルドカードを利用でき * で/を除く任意の文字列、 ? で任意の1文字にヒットする。
更に、 ~ “<正規表現>” の形式で記述することで正規表現を利用可能となる。
<Files ~ "<正規表現>"> 任意のディレクティブ </Files>
また、これは以下と同じである。
<FilesMatch "<ファイル名>"> 任意のディレクティブ </FilesMatch>
特定URLへのアクセスの制御設定
特定のURLにアクセスがあった際のアクセス制御などの挙動を設定する。
通常ファイルシステム内のファイルに対する制御はDirectoryやFilesディレクティブを使用することが推奨されているので、
Apacheによって生成されるページに対する制御を行う際にのみ利用する。
指定するURLパスは完全一致である。
- 書式
<Location <URLパス>> 任意のディレクティブ </Location>
Directory / Files / Locationディレクティブ内の設定
- アクセス元制御(Order/Allow/Deny)
- 書式
Order Deny,Allow
もしくは
Order Allow,Deny
加えて
(Allow or Deny) from <IPアドレス or ネットワークアドレス(CIDR形式) or ホスト名>
Orderで許可・拒否の評価の順序を決める。次に許可・拒否対象を記述する。
Allow・Denyディレクティブは複数列挙することができる。
いずれのAllow・Denyディレクティブにもヒットしない場合は、Orderディレクティブで最後に指定した方が適用される。
両方にヒットした場合も、Orderディレクティブで最後に指定した方が適用される。
- 書式
- アクセス元制御(Require)
複数記述した場合は1つでも条件を満たしていればアクセス可能となる。
- 書式
Require <制御内容>
使用できる制御内容は以下
- all granted
全体に許可する - all denied
全体を拒否する - method <HTTPメソッド> …
指定したHTTPメソッドのみ許可する
GET、POST、HEADなど使用可能。 - user <ユーザID> …
BASIC認証やDIGEST認証をパスした、指定したユーザのみ許可する - group <グループ名> …
BASIC認証やDIGEST認証をパスしたユーザの所属するグループが指定したグループであれば許可する - valid-user
BASIC認証やDIGEST認証をパスした、パスワードファイルに書かれている全てのユーザを許可する - ip <IPアドレス or ネットワークアドレス>
指定したIPアドレス/ネットワークアドレスからのアクセスのみ許可する。
スペース区切りで複数列挙することができる。
また、記述したアドレスは先頭から比較される。
つまり、プライベートアドレスのみから許可したい場合は、次の2通りの書き方ができる。
Require ip 10 172.16 172.17、、、172.31 192.168. Require ip 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
- env <env変数名>
SetEnvIfディレクティブで作成した条件に一致していれば許可する。 - expr <条件>
時間などを評価し、指定した条件を満たせば許可する。
- all granted
- 書式
DNS逆引きを有効化する
アクセス制御でホスト名を使用する際やログにホスト名を記録する際にアクセスのあったIPアドレスから
ホスト名を逆引きして取得する必要がある。
デフォルトでは無効化されているので、有効化する必要がある。
ただし、DNS解決のオーバーヘッドが発生するので、通常は無効化したままの方が良い。
- 書式
HostnameLookups (On|Off|Double)
Doubleを指定すると、逆引きで得たホスト名を再度正引きしてIPアドレスを取得し、元のIPアドレスと比較するようにする
- デフォルト
HostnameLookups Off
エイリアスの設定
エイリアスを設定することで、URLのパスと実際のディレクトリの階層の対応を手動で定義できる。
- 書式
Alias <URLパス> "<ディレクトリ絶対パス>"
インデックスファイルの指定
- DirectoryIndex
フォルダへのアクセスの際に返すファイルの優先順位を定義する。
優先順位の高い順からそのフォルダ内を探し、見つかればそのファイルを返す。
- 書式
DirectoryIndex <ファイル名1> <ファイル名2> ...
- 例
DirectoryIndex index.html index.htm index.php
- 書式
送信元IPの置換
ロードバランサーを経由する場合、送信元IPアドレスはたいていの場合、ロードバランサーのIPアドレスになる。
ログ出力であれば単にX-Forwarded-Forヘッダーを出力すればよいが、アクセス制御を行う際は正常に制御できない。
mod_remoteipを使用することで、Apacheでの処理上の送信元IPアドレスを任意のアドレスに書き換えられる。IP通信のルーティングを変えるわけではない。
以下の設定では、X-Forwarded-ForヘッダーのIPアドレスを送信元IPアドレスとする。ただし、127.0.0.1からのアクセスの場合は、送信元IPアドレスの置換を行わない。
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy 127.0.0.1
ファイル一覧
ディレクトリにアクセスした際にそのディレクトリのファイル一覧を表示できる
- 設定例
- モジュール
LoadModule autoindex_module modules/mod_autoindex.so
- Directoryディレクティブ内
IndexOptions <オプション> [...]
- モジュール
- オプション
- FancyIndexing
ディレクトリを先に表示する。
デフォルトの場合はファイル・ディレクトリ関係なく名前順になる。 - NameWidth
表示する文字の最大長を指定する
無限の場合は”*”を記述する
- 無限
NameWidth=*
- 無限
- Charset
文字コードを指定する
- UTF-8
Charset=UTF-8
- UTF-8
- FancyIndexing
リクエストの転送
HTTP30Xを使用したリダイレクト
特定のURLパスにアクセスがあった際に、指定したURLに転送させる(リダイレクト)ことができる。
サーバはリダイレクトのレスポンスコードとリダイレクト先を返し、
実際にリダイレクト先に再アクセスするのはクライアント側である。
- 書式
Redirect [<HTTPステータス>] <URLパス> <転送先URL>
HTTPステータスを指定するとそのステータスを返すことができる。デフォルトは302。
通常使用するステータスは以下。 - 301 or permanent
リソースが永久に移動した - 302 or temp
一時的なリダイレクト(デフォルト)
リライト
指定したURLでアクセスがあった際、
リライトは単純なリダイレクトと異なり正規表現を使用した一括したルールの記述など
柔軟な設定を行うことができる。
リライトは分散設定ファイル(.htaccess)内か、Directoryディレクティブ内に記述する必要がある。
- 書式
- RewriteEngine (on|off)
リライトを有効/無効にする。 - RewriteBase <URLパス>
URL書き換えを行うURLのプレフィックスパスを指定する - RewriteCond ( <アクセスURL> | <変数> ) <一致条件> [フラグ]
リライトを行うかどうかの条件を記述する。 - RewriteRule <リライト前正規表現> <リライト後URL> [フラグ]
- RewriteEngine (on|off)
- デフォルト
なし - 設定例
LoadModule rewrite_module modules/mod_rewrite.so
リライトルールの書き方
RewriteRule
リライトの実行内容を記述する。
書式は次である。
RewriteRule <リライト前正規表現> <リライト後URL> [フラグ]
- フラグ
R[=<HTTPステータスコード>] 指定したURLにリダイレクトする。ステータスコードを指定しない場合は302が使用される。
F 403エラーを返す。(アクセス禁止) G 410エラーを返す。(このURLは存在しなくなった) P 強制的に置換対象部を内部的にプロキシリクエストとみなし、その場でプロキシモジュールを通して出力する。 L ここでURL書き換え処理を中止し、それ以降の書き換えはしないようにする。 N リライト処理を、最初の書き換えルールから再度実行する。ただし、リライト対象URLは現在途中までリライトされたものである。 C 正規表現に一致した場合は現在のルールを適用しつつ、次のルールも適用する。
正規表現に一致しなければ、そのまま次のルールを適用する。T=<MIMEタイプ> ターゲットファイルのMIMEタイプを強制的にMIME-typeにする。 NS 現在のリクエストが内部のサブリクエストである場合に、書き換えエンジンが書き換えルールをスキップするようにする。 NC 大文字小文字の区別をしない。
QSA 置換文字列の中でマッチしたものを書き換えるのではなく、そこにクエリー文字列部分を追加するようにする。
書き換えルールを通してクエリー文字列に何かデータを追加したい場合に使用する。NE mod_rewriteが書き換え結果に対して通常行うURLエスケープルールを適用しないようにする。
通常、特殊文字(%、$、;など)は16進数の文字列にエスケープ処理される()が、このフラグを使用することでエスケープ処理を抑制することができる。
これにより、出力の中にパーセント文字を使うことができる。PT 内部のrequest_rec構造体のURIフィールドにfilenameフィールドの値をセットする。
その後、URIからファイル名への変換処理を行なうAlias、ScriptAlias、Redirectといったディレクティブを設定する。
PTフラグをつけた場合、Lフラグも指定したと見なされる。※「.htaccess」や「<Directory>セクション」での設定では、デフォルトで有効になっている
S=<スキップルール数> 現在のルールがマッチしたら、指定した数のルールをスキップする。 E=VAR:VAL VARという名前の環境変数の値をVALにする。
VALには、正規表現の後方参照として展開される$Nと%Nを書くことができる。
このフラグを複数使って、複数の変数を定義することもできる。
この変数は多くの場合、通常後からXSSI( を通して)またはCGI(たとえば $ENV{‘VAR’})のように参照される。
さらに、RewriteCondパターン %{ENV:VAR}を通して参照することもできる。
これを使ってURLからの情報を切り取って記憶する。
RewriteCond
RewriteRuleを実行する条件式を記述する。
複数記述した場合は、AND条件となる。
大文字小文字は識別される。
書式は次である。
RewriteCond ( <アクセスURL> | <変数> ) <一致条件> [フラグ]
参考:https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
- 変数
変数としては以下が使用可能である。
実際の使用時には ${HTTP_ACCEPT} のように、$と{}で囲う必要がある。
グループ 変数名 値・意味 HTTP ヘッダ HTTP_USER_AGENT ユーザーエージェント HTTP_REFERER 参照元URL HTTP_COOKIE クッキー情報 HTTP_FORWARDED プロキシ情報 HTTP_HOST サーバーのホスト名 HTTP_PROXY_CONNECTION プロキシを経由しているか否か HTTP_ACCEPT ブラウザの言語タイプ コネクション & リクエスト REMOTE_ADDR リモートアドレス REMOTE_HOST リモートホスト名 REMOTE_USER リモートユーザー名 (基本認証利用時) REMOTE_IDENT リモートユーザーのID REQUEST_METHOD リクエストメソッド SCRIPT_FILENAME スクリプトファイル名 PATH_INFO パス情報 QUERY_STRING クエリ文字列 AUTH_TYPE 認証タイプ サーバ内部変数 DOCUMENT_ROOT ドキュメントルートのパス SERVER_ADMIN サーバー管理者情報 SERVER_NAME サーバー名 SERVER_ADDR サーバーのアドレス SERVER_PORT サーバーのポート番号 SERVER_PROTOCOL プロトコルバージョン SERVER_SOFTWARE サーバーソフトウェア システム関連 TIME_YEAR 年 TIME_MON 月 TIME_DAY 日 TIME_HOUR 時 TIME_MIN 分 TIME_SEC 秒 TIME_WDAY 曜日 (0:日 ~ 6:土) TIME 年月日時分秒 (例:20130123123456) 特別なもの API_VERSION APIバージョン THE_REQUEST リクエスト文字列 REQUEST_URI リクエストURI REQUEST_FILENAME リクエストされたファイル名 IS_SUBREQ サブリクエストか否か HTTPS HTTPSでのアクセスか否か - 一致条件
URLや変数の一致条件を定義する。
文字列に対しては正規表現で定義することができ、数値の場合は一致のほか、大なり、小なりを定義できる。アクセスするファイルに対し、ファイルかディレクトリか、実行パーミッションがあるかなどの検査を定義することもできる。
- フラグ
- OR
記載した条件をOR条件とする - NC
記載した条件を大文字小文字無視で判定する
- OR
DSO
読み込みDSO設定
DSO(Dynamic Shared Object)と呼ばれる、実行時に動的に読み込まれるモジュールを指定する設定
インストールされているモジュール一覧は次のコマンドで得られる。
ls $APACHE_HOME/modules/
- 書式
LoadModule <モジュール識別子(任意)> <モジュールファイルのパス>
DSO使用設定
読み込むDSOによって使用できないディレクティブがある。
DSOが読み込まれていないのにそのディレクティブを使用するのを避けるため、”指定したDSOが読み込まれていた場合”という記述ができる。
- 書式
<IfModule <モジュール識別子>> 任意のディレクティブ </IfModule>
上記のように、IfModuleディレクティブ内のディレクティブは指定したDSOが読み込まれていない場合は無効となる。
VirtualHost
VirtualHostとは、HTTPサーバにアクセスされる際に、どのようなホスト名指定でアクセスされたかによって異なるWEBサーバとして振舞うことができる機能である。
例えば、aaa.example.comとbbb.example.comでは同じパスでも異なるファイルを返すことができる。
- 書式
下記のように<VirtualHost>ディレクティブ内の記述がそれぞれのVirtualHost内でのみ有効になる設定である。
<VirtualHost <IPアドレス>[:<ポート>]> ServerName <ホスト名(FQDN)> DocumentRoot <パス> </VirtualHost> <Directory "<パス>"> # 全て許可する場合 Require all granted </Directory>
IPアドレス部分は”*”とすることで、ワイルドカード指定ができる。
ServerNameとDocumentRootが最低限必要だが、アクセスログも分けた方が良い。
また、DocumentRootで指定したパスはDirectoryディレクティブ内でRequireディレクティブなどで、アクセス許可を別途設定する必要がある。
キープアライブ
1回のTCPコネクションで複数のHTTPリクエストを行えるようにできる。
デフォルトではキープアライブは有効であり、無効の場合は通常は有効にしたほうが性能が上がる。
- デフォルト
KeepAlive On KeepAliveTimeout 5 MaxKeepAliveRequests 100
- 書式
KeepAlive (On or Off) KeepAliveTimeout <タイムアウト秒> MaxKeepAliveRequests <リクエスト数>
- KeepAliveTimeout
キープアライブのタイムアウトまでの時間(秒)
デフォルト秒で大抵の場合問題ない。 - MaxKeepAliveRequests
1回のコネクションでダウンロードできるコンテンツの数。
0にすると無制限となる。
- KeepAliveTimeout
MPM
マルチプロセッシングモジュール(MPM)とはHTTPクエリーの処理を行う際の
マルチプロセス・スレッドの扱いに関する動作方法のことである。
prefork、worker、eventの3種類があり、eventがデフォルトである。
configure時にMPMを選択できるよう設定した場合はどのMPMを使用するかを記述する必要がある。
prefork
preforkは事前に複数の子プロセスを生成しておき、HTTPクエリーに対して1プロセスを割り当てる方法。
プロセスの独立性が高いが、メモリやCPUリソースを多く消費する。
- 書式
- StartServers <プロセス数>
起動時のプロセス数 - ServerLimit <プロセス数>
MaxRequestWorkersディレクティブに設定可能な最大の値 - MinSpareServers <プロセス数>
待機プロセスの最小数を指定する - MaxSpareServers <プロセス数>
待機プロセスの最大数を指定する - MaxRequestWorkers <プロセス数>
同時に生成し得るプロセス数 - MaxConnectionsPerChild <コネクション数>
各子プロセスで応答可能なコネクション数。この数を超えるとプロセスが破棄される。
0に設定した場合はプロセスが破棄されることはない。
- StartServers <プロセス数>
- デフォルト
StartServers 5 ServerLimit 256 MaxRequestWorkers 256 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 256 MaxConnectionsPerChild 0
- 設定例
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so StartServers 5 MaxRequestWorkers 256 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 256 MaxConnectionsPerChild 0
worker
workerは複数の子プロセス内に更にマルチスレッドを展開し、HTTPクエリーに対して1スレッドを割り当てる方法。
preforkと比較して、プロセスの独立性が高くないが、メモリ消費を抑えられる。
- 書式
- StartServers <プロセス数>
起動時のプロセス数。
起動後のプロセス数はMaxClients / ThreadsPerChildの値により規定される。 - ThreadsPerChild <スレッド数>
プロセスあたりの初期スレッド数、かつ生成可能なスレッドの最大数。
ただし、ThreadLimitを超える値はThreadLimitの値まで下げられる。 - MinSpareServers <プロセス数>
待機プロセスの最小数を指定する - MaxSpareServers <プロセス数>
待機プロセスの最大数を指定する - MaxRequestWorkers / MaxClients <接続数>
同時に処理できるスレッドの数。
全プロセスでの合計数である。
MaxRequestWorkers / ThreadsPerChildの値が現在稼働できるプロセス数となる。
ただしプロセス数はServerLimitの値を超えることができない。
MaxRequestWorkersはバージョン2.3以降でMaxClientsから変更された。
ただし、MaxClientsもサポートしているので、いずれも使用可能である。 - ServerLimit <プロセス数>
生成可能なプロセスの最大数。
MaxRequestWorkers / ThreadsPerChildの値により活動スレッドの最大数が規定されるので、この値以上でないとプロセス数が抑制される。
このディレクティブは再起動しないと反映されない。 - ThreadLimit <スレッド数>
生成可能なスレッドの最大数。
ThreadsPerChild値の上限はこの値に規定されるので、通常はThreadsPerChild値以上に設定する必要がある。
このディレクティブは再起動しないと反映されない。 - MaxConnectionsPerChild <コネクション数>
各子プロセスで応答可能なコネクション数。この数を超えるとプロセスが破棄される。
0に設定した場合はプロセスが破棄されることはない。
- StartServers <プロセス数>
- デフォルト
StartServers 3 ThreadsPerChild 64 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers ServerLimit*ThreadsPerChildの値 ServerLimit 16 ThreadLimit 64 MaxConnectionsPerChild 0
- 設定例
LoadModule mpm_worker_module modules/mod_mpm_worker.so
event
eventはworkerと似た動作をおこうが、workerやpreforkと異なり、
Keep-Aliveの維持処理を独立したスレッドで行うことで、
Keep-Aliveのために継続するか分からないHTTPクエリーを待つことなく
応答の完了したスレッドの破棄を瞬時に行えるようにしている。
- 書式
- StartServers <プロセス数>
Apache起動時の初期プロセス数。
起動後にプロセス数は動的に変更されるので、通常は変更不要。 - ServerLimit <プロセス数>
MaxRequestWorkersディレクティブに設定可能な上限を決定する。
指定可能な上限は ServerLimit * ThreadsPerChild の値となる。
16の倍数で指定する必要がある。 - ThreadsPerChild <スレッド数>
子プロセス起動後に、プロセス内に生成されるスレッドの数を指定する - ThreadLimit <スレッド数>
子プロセス内に生成され得るスレッドの最大数を指定する - MaxRequestWorkers <スレッド数>
※MaxClientsと同じ
同時に稼動しうる全スレッドの最大数を指定する。(つまり同時コネクション数)
ServerLimitの値以下で無ければならない。
MaxRequestWorkersはバージョン2.3以降でMaxClientsから変更された。
ただし、MaxClientsもサポートしているので、いずれも使用可能である。 - MinSpareThreads <スレッド数>
全プロセス合計での待機スレッドの最小数を指定する - MaxSpareThreads <スレッド数>
全プロセス合計での待機スレッドの最大数を指定する - AsyncRequestWorkerFactor <接続可能コネクション倍数>
MPMがeventの時のみ使用可能なディレクティブ。
event MPMは各コネクションに対して必要な時にスレッドが割り当てられる非同期処理のため、
必ずしもスレッド数の上限がコネクション数の上限とならない。
AsyncRequestWorkerFactorディレクティブによってコネクション数を制限することができる。
具体的には次の値だけ新たに接続可能となる。
ThreadsPerChild値 + 現在のアイドル状態のスレッド数 × AsyncRequestWorkerFactor値
つまり、プロセスあたりの最大コネクション数は以下の式となる。
(AsyncRequestWorkerFactor値 + 1) × MaxRequestWorkers
なお、全てのスレッドが使用状態である場合には新規の接続はできないが、
既存の接続の処理に対してスレッドが割り当てられない場合はkeep-alive中の接続があれば、
そのスレッドをkeep-aliveを中断して再利用しようとする。
AsyncRequestWorkerFactorには小数を指定することが可能である。
- StartServers <プロセス数>
- デフォルト
StartServers 3 ServerLimit 16 ThreadsPerChild 25 ThreadLimit 64 MaxRequestWorkers 400 MinSpareThreads 75 MaxSpareThreads 250 AsyncRequestWorkerFactor 2
- 設定例
LoadModule mpm_event_module modules/mod_mpm_event.so StartServers 3 ServerLimit 16 ThreadsPerChild 25 ThreadLimit 64 MaxRequestWorkers 400 MinSpareThreads 75 MaxSpareThreads 250 AsyncRequestWorkerFactor 2
プロセスの再生成
一定回数のコネクションを処理したプロセスを破棄して再生成させることができる。
例えば、PHP等を使用している場合、メモリリークが発生する場合があるが
子プロセスが応答できるリクエスト数を設定し、その制限を越えるとリクエストを一旦破棄することで、メモリリークを開放することができる。
ただし、子プロセスの再生成はオーバーヘッドとなるので、調整が必要である。
- 書式
MaxRequestsPerChild <リクエスト数>
0にすることで、無制限となる。
- デフォルト
MaxRequestsPerChild 10000
情報出力
サーバ情報
サーバ情報(特にモジュール情報)を出力することができる。
参考:http://httpd.apache.org/docs/current/ja/mod/mod_info.html
SetHandlerによりserver-infoを特定のLocationに関連付けることで出力する。
- 設定例
# Apache Information LoadModule info_module modules/mod_info.so <IfModule info_module> <Location /server-info> SetHandler server-info </Location> </IfModule>
アクセス元制御
アクセス元制御を行う場合はAllow,Denyディレクティブで行う。
例えば、192.168.0.0/16からのみ許可したい場合は、Locationディレクティブ内に次のように書く。
Require ip 192.168.0.0/16
RewriteRuleで .* を使用している場合、ヒットしてしまうので、
LocationMatch /.*/server-info
として一応回避できる。
なお、ロードバランサ―経由でアクセスする際にアクセス元IPアドレスがロードバランサ―に変換されている環境では制御できないので注意が必要である。
ユーザー認証
ユーザー認証を行う場合はLocationディレクティブに次を記載する。
※Digest認証を使用し、Digest認証の有効化が行われている場合
AuthType Digest AuthName server-info AuthUserFile conf/users.digest Require valid-user
サーバ情報に任意の出力追加(特定モジュール箇所)
- 書式
- AddModuleInfo <モジュール名> ‘<HTML文>’
指定したモジュールの表示箇所に指定したHTMLを出力する。
HTML文の ” 内では \ を行末に記載することで改行することができる。
- AddModuleInfo <モジュール名> ‘<HTML文>’
ステータス情報の取得
HTTPデーモンの現在のステータスを出力する
参考:http://httpd.apache.org/docs/current/ja/mod/mod_status.html
SetHandlerによりserver-statusを特定のLocationに関連付けることで出力する。
ExtendedStatusディレクティブを使用することで、より詳細情報を出力できる。
- 設定例
# Apache Status LoadModule status_module modules/mod_status.so <IfModule status_module> ExtendedStatus On <Location /server-status> SetHandler server-status </Location> </IfModule>
以下を設定することで、アクセス制限ができる。
アクセス元制御とユーザー認証を行った場合は、いずれかをクリアすればアクセスできる。
外部からはユーザー認証、ローカルからはアクセス元制御をすると良い。
アクセス元制御
アクセス元制御を行う場合はAllow,Denyディレクティブで行う。
例えば、192.168.0.0/16からのみ許可したい場合は、Locationディレクティブ内に次のように書く。
Require ip 192.168.0.0/16
ローカルホストからのみアクセスを許可する場合は次である。
Require ip 127.0.0.1
RewriteRuleで .* を使用している場合、ヒットしてしまうので、
LocationMatch /.*/server-status
として一応回避できる。
なお、ロードバランサ―経由でアクセスする際にアクセス元IPアドレスがロードバランサ―に変換されている環境では制御できないので注意が必要である。
ユーザー認証
ユーザー認証を行う場合はLocationディレクティブに次を記載する。
※Digest認証を使用し、Digest認証の有効化が行われている場合
AuthType Digest AuthName server-info AuthUserFile conf/users.digest Require valid-user
ページのオプション
Webブラウザでアクセスする際に下記のオプションを付けることができる。
両方を指定することも可能。
- テキスト形式
/server-status?auto
- 更新時間
/server-status?refresh=5
- テキスト形式の出力例
eldorado-of.info ServerVersion: Apache/2.4.37 (Unix) PHP/7.3.0 OpenSSL/1.0.2q ServerMPM: event Server Built: Dec 24 2018 11:53:52 CurrentTime: Saturday, 12-Jan-2019 22:15:01 JST RestartTime: Saturday, 12-Jan-2019 22:10:34 JST ParentServerConfigGeneration: 1 ParentServerMPMGeneration: 0 ServerUptimeSeconds: 266 ServerUptime: 4 minutes 26 seconds Load1: 0.06 Load5: 0.09 Load15: 0.09 Total Accesses: 58 Total kBytes: 370 Total Duration: 636 CPUUser: .02 CPUSystem: .03 CPUChildrenUser: .03 CPUChildrenSystem: .12 CPULoad: .075188 Uptime: 266 ReqPerSec: .218045 BytesPerSec: 1424.36 BytesPerReq: 6532.41 DurationPerReq: 10.9655 BusyWorkers: 0 IdleWorkers: 12 Processes: 7 Stopping: 1 BusyWorkers: 0 IdleWorkers: 12 ConnsTotal: 2 ConnsAsyncWriting: 0 ConnsAsyncKeepAlive: 0 ConnsAsyncClosing: 0 Scoreboard: __..______.W____
クライアントキャッシュ
クライアントにダウンロードされたコンテンツの有効期限の設定を行う。
ただし、サーバ側で有効期限の設定を行ってもクライアント側でキャッシュが無効になっている場合は毎回ダウンロードされることになる。
また、有効期限内であってもクライアントによってはIf-Modified-Sinceリクエストヘッダによって
更新がある場合はダウンロードするという挙動を行う場合もある。
なお、クエリストリングも含めて完全一致の場合のみキャッシュが利用される。
参考
- 書式
- ExpiresActive (On | Off)
有効期限の設定を有効・無効にする。
有効期限の値はExpiresByType、もしくはExpiresDefaultディレクティブで設定される。 - ExpiresByType <MIMEタイプ> <有効期限式>
MIMEタイプを指定し、そのタイプの有効期限を指定する。
なお、ExpiresDefaultと同時に指定された場合は、こちらが優先される。 - ExpiresDefault <有効期限式>
指定の式に従って有効期限を設定する。
- ExpiresActive (On | Off)
- 有効期限式
有効期限の式は次のような書式で記述する。
"<base> [plus] <times>*"
例えば、一ヶ月間有効な場合、以下のように記述する(plusは省略可能)
"access plus 1 months"
- base
基準の時刻。この時刻にtimesで指定した時刻を加えたものが有効期限となる。
- access / now
アクセス時刻 - modification
最終更新時刻
- access / now
- times
数値 単位
で表す。
- 単位
years months weeks days hours minutes seconds
- 単位
- 省略形
式は省略して次のように書ける。 ” は不要
(A | M)<秒>
baseにaccessを指定するときはA、modificationの場合はMを指定する。
続けて有効な秒数を指定する。
例えば、アクセス時刻から1ヶ月有効な場合は以下のように記述する。
A2592000
- base
- 設定例
LoadModule expires_module modules/mod_expires.so ExpiresActive On ExpiresDefault "access plus 1 years"
タイムアウト
全般的なタイムアウト時間の設定
以下のタイムアウト値を設定できる。
- クライアントからのデータを読み込む時。受信バッファが空になっていて、TCP パケットが届くまで 待つ時間の長さ
- クライアントに対してデータを送り出す時。送信バッファがいっぱいで、パケットの受信完了(ACK)が届くまで待つ時間の長さ
- mod_cgi内で、CGI スクリプトが出力を 返すまでの待ち時間の長さ
- mod_ext_filter内で、フィルタ処理で出力を待つ時間の長さ
- mod_proxy内で、ProxyTimeoutが設定されていない場合のデフォルトの待ち時間
- 書式
- Timeout <タイムアウト秒>
- デフォルト
TimeOut 60
詳細なタイムアウト時間の設定
header部、body部を受信する際のタイムアウトを定義できる。
デフォルトでは
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
という設定であるが、これは
「ヘッダのタイムアウトまで20秒、データを500byte/s以上送信している間は
タイムアウト時間が1秒ずつ増え、最大40秒まで増える。
データ部は20秒以内に送信する必要がある。」と言う意味である。
- 書式
- RequestReadTimeout [header=<初期タイムアウト秒>[-<最大タイムアウト秒>]][,MinRate=<ヘッダー部転送レート>] [body=<初期タイムアウト秒>[-<最大タイムアウト秒>],MinRate=<ボディ部転送レート>]
headerのみbodyのみ初期タイムアウト秒のみ設定など出来る。
- RequestReadTimeout [header=<初期タイムアウト秒>[-<最大タイムアウト秒>]][,MinRate=<ヘッダー部転送レート>] [body=<初期タイムアウト秒>[-<最大タイムアウト秒>],MinRate=<ボディ部転送レート>]
- デフォルト
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
- 設定例
LoadModule reqtimeout_module modules/mod_reqtimeout.so
サーバキャッシュ
コンテンツをサーバ内でキャッシュする設定を行う。
メモリ上にファイルをキャッシュしたり、プロキシとして利用されるときにローカルにキャッシュする際に利用できる。
参考:http://httpd.apache.org/docs/current/mod/mod_cache.html
- モジュール読み込み書式
LoadModule cache_module modules/mod_cache.so LoadModule cache_disk_module modules/mod_cache_disk.so LoadModule cache_socache_module modules/mod_cache_socache.so mod_mem_cache <IfModule expires_module> </IfModule>
キャッシュ期限
- 書式
- CacheDefaultExpire <キャッシュ時間(秒)>
キャッシュ時間のデフォルト値 - CacheLastModifiedFactor <有効期限計算の重み>
Last-Modified の日付から有効期限の値を次の計算式によって設定する。
有効期限 = current-date + Last-Modifiedの時刻からの経過時間 * CacheDefaultExpire値
例えば、10時間前に更新されたコンテンツの場合、有効期限が1時間後に設定される。 - CacheMaxExpire <キャッシュ時間(秒)>
- CacheDefaultExpire <キャッシュ時間(秒)>
圧縮
クライアントへのコンテンツ応答送信を圧縮することができる
参考:http://httpd.apache.org/docs/current/ja/mod/mod_deflate.html
- 書式
- DeflateBufferSize <バッファサイズ(byte)>
圧縮したデータを格納するバッファ。
バッファを使用しきるとバッファを送出、クリアする。
- DeflateBufferSize <バッファサイズ(byte)>
- DeflateCompressionLevel <圧縮レベル>
圧縮レベルを指定する。
値は 1 (低圧縮) から 9 (高圧縮)である。
レベルが高いほどCPU負荷が高まる
- DeflateMemLevel <メモリ使用レベル>
圧縮時に使用するメモリのレベルを指定する。
1~9で指定し、大きいほどより多くメモリを消費する。
- DeflateWindowSize <ウインドウサイズ>
圧縮処理を行うデータのサイズ(ウインドウサイズ)。
1~15で指定し、大きいほど圧縮効率が向上する。
最近のzlibでは8以上を指定するべきである。
- DeflateFilterNote [<記録値>] <変数名>
圧縮率を記録する(変数に格納する)。
記録した値はアクセスログに出力することができる。
例えば以下のように設定する。
DeflateFilterNote ratio LogFormat '%{ratio}n' customelogtype
記録値は以下が使用可能。
記録値を省略した場合はRatioが記録される。
- Input
圧縮前byte数 - Output
圧縮後byte数 - Ratio
圧縮率
- Input
- 圧縮対象の設定
- SetOutputFilter DEFLATE
全ての応答で圧縮を有効にする
- SetOutputFilter DEFLATE
- AddOutputFilterByType DEFLATE <MIMEタイプ> [<MIMEタイプ>]
特定のMIMEタイプで圧縮を有効にする
HTMLで有効にする場合は以下である。
AddOutputFilterByType DEFLATE text/html
PHPで有効にする場合は以下である。
AddOutputFilterByType DEFLATE application/x-httpd-php
- BrowserMatch <ブラウザ名> gzip-only-text/html
指定のブラウザでhtmlファイル以外の圧縮を無効にする
- BrowserMatch <ブラウザ名> no-gzip
指定のブラウザで圧縮を無効にする
- デフォルト
DeflateBufferSize 8096 DeflateCompressionLevel <zlibのデフォルト> DeflateMemLevel 9 DeflateWindowSize 15
- 設定例
- PHPを圧縮する
LoadModule deflate_module modules/mod_deflate.so DeflateBufferSize 8096 DeflateCompressionLevel 8 DeflateMemLevel 8 DeflateWindowSize 15 AddOutputFilterByType DEFLATE text/html application/x-httpd-php
- PHPを圧縮する
CGI
CGIファイルの保存場所の設定
CGIはサーバ再度で実行するので、通常プログラムそのものは公開ディレクトリに設定する必要はない。
そのため、エイリアスを設定してURLとCGI実行場所を関連付ける。
- 書式
ScriptAlias <URLパス> "<ディレクトリ絶対パス>"
SSLの利用
SSLを利用してHTTPSアクセスできるようにする。
SSLモジュールはデフォルトではインストールされないのでApacheインストール時にインストールしていない場合は再度コンパイルする必要がある。
証明書の用意
SSLを使用する場合、公開鍵証明書が必要となる。
外部で発行された証明書がない場合はローカルで証明書を生成する。
- 手順
- RSA秘密鍵を生成する
openssl genrsa -out server.key 2048
- 生成した鍵ファイルから証明書を作成する
openssl req -new -key server.key -out server.csr
- 証明書に署名を行う
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
- 配置する
mkdir $APACHE_HOME/ssl mv server.* $APACHE_HOME/ssl/
- RSA秘密鍵を生成する
設定
- 書式
LoadModule ssl_module modules/mod_ssl.so
<IfModule ssl_module>
Listen 443
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on
SSLProtocol TLSv1.2
SSLCertificateFile "ssl/server.crt"
SSLCertificateKeyFile "ssl/server.key"
<VirtualHost *:443>
SSLEngine on
</VirtualHost>
</IfModule>
認証
Basic認証
Basic認証を用いてアクセス制限を行う。
- モジュール
LoadModule auth_basic_module modules/mod_auth_basic.so
- ディレクティブ
- AuthType
BASIC認証であることを指定する。
AuthType Basic
- AuthName
認証画面に表示させるメッセージを指定する - AuthUserFile
作成したパスワードファイルを指定する - AuthGroupFile
作成したグループファイルを指定する - Require
認証対象とするユーザまたはグループを指定する
Require user <ユーザ名1> <ユーザ名2> ...
or
Require group <グループ名1> <グループ名2> ...
もしくは認証が通った全てのユーザのアクセスを許可する
Require valid-user
- AuthType
- 書式
Digest認証
Digest認証では認証領域(レルム)というパラメータを利用し、パスワードファイルとApacheに同じ値を設定しておく必要がある。
- モジュール
LoadModule auth_digest_module modules/mod_auth_digest.so
- ディレクティブ
下記の各設定は特定のパスにおいてのみ有効にしたい場合は、対象のDirectoryディレクティブやLocationディレクティブ内で行う。
- AuthType
Digest認証であることを指定する。
AuthType Digest
- AuthName
認証領域を設定する。
AuthName <認証領域名>
- AuthUserFile
作成したパスワードファイルを指定する
パスはApacheのインストールディレクトリからの相対パスでも記述可能
AuthUserFile <パスワードファイルパス>
- AuthGroupFile
作成したグループファイルを指定する
パスはApacheのインストールディレクトリからの相対パスでも記述可能
AuthGroupFile <パスワードファイルパス>
- Require
認証対象とするユーザまたはグループを指定する
Require user <ユーザ名1> <ユーザ名2> ...
or
Require group <グループ名1> <グループ名2> ...
もしくは全てのユーザを認証対象とする
Require valid-user
- AuthType
- パスワードファイルの管理
認証に使用するパスワードファイルはhtdigestコマンドにより管理する。
- 書式
- パスワードファイルを新規に作成する場合
htdigest -c <パスワードファイル> <認証領域名> <ユーザ名>
- パスワードファイルが既に作成されている場合
htdigest <パスワードファイル> <認証領域名> <ユーザ名>
- パスワードファイルを新規に作成する場合
- 設定例
/server-infoに認証をかけるとする
ユーザはadmin/passwordとする
htdigest -c $APACHE_HOME/conf/users.digest server-info admin # パスワードを入力する sed "s/#LoadModule auth_digest_module/LoadModule auth_digest_module/" -i $APACHE_HOME/conf/httpd.conf vi $APACHE_HOME/conf/httpd.conf
下記を追記する
# Digest Auth LoadModule auth_digest_module modules/mod_auth_digest.so <IfModule auth_digest_module> LoadModule authz_user_module modules/mod_authz_user.so LoadModule authn_file_module modules/mod_authn_file.so LoadModule authn_core_module modules/mod_authn_core.so </IfModule> <IfModule info_module> <Location /server-info> SetHandler server-info AuthType Digest AuthName server-info AuthUserFile conf/users.digest Require valid-user </Location> </IfModule>
再起動して反映する
apachectl configtest apachectl graceful
ログ
Apacheには2種類のログが存在する。
1つはHTTP(S)リクエストに関する情報を記録するアクセスログで、
もう一つはWebサーバ自体の挙動に関する情報を記録するエラーログである。
なお、VirtualHostディレクティブ内とグローバル両方にアクセスログの設定を行った場合は、
VirtualHostに関するログはVirtualHost内に設定したログファイルのみに記録され、グローバルで設定したほうには記録されない。
エラーログ
Webサーバ自体の挙動に関する情報を記録する。
エラーログはログ記録対象となるイベントが発生したタイミングで記録される。
エラーログとして出力される情報は設定した重要度以上のものが出力される。
ただし、noticeレベルのログは設定にかかわらず、必ず出力される。
なお、エラーログ中にログレベルは出力される。
- 書式
- LogLevel <ログレベル名>
出力するログレベルを指定する - ErrorLog “<ログファイル>”
ログの保存先を指定する。
syslogに記録する場合は次のようにする。
ErrorLog syslog:<ファシリティ>
- LogLevel <ログレベル名>
- ログレベル
レベルの数値が大きいほど重要度は高い。
レベル レベル名 説明 7 emerg 緊急 – システムが利用できない 6 alert 直ちに対処が必要 5 crit 致命的な状態 4 error エラー 3 warn 警告 2 notice 普通だが、重要な情報 1 info 追加情報 0 debug デバッグメッセージ
アクセスログの使用
HTTP(S)リクエストに関する情報を記録する。
アクセスログはリクエストの応答が完了した時点で記録される。
つまり、リクエスト開始から終了まで時間がかかった場合は終了時間は把握できるが、開始時間が把握しづらくなる。
- 書式
- LogFormat “<フォーマット>” <フォーマット名>
アクセスログを記録する際に任意に指定したフォーマットで記録できる。
- フォーマット特殊変数
フォーマット文字列 説明 %% パーセント記号 %a リモート IP アドレス %A ローカル IP アドレス %B レスポンスのバイト数。HTTPヘッダは除く。 %b レスポンスのバイト数。HTTPヘッダは除く。CLF 書式。 すなわち、1バイトも送られなかったときは0ではなく、’-‘ になる %{Foobar}C サーバに送られたリクエスト中のクッキー Foobar の値 %D リクエストを処理するのにかかった時間、マイクロ秒単位 %{FOOBAR}e 環境変数 FOOBAR の内容 %f ファイル名 %h リモートホスト %H リクエストプロトコル %{Foobar}i サーバに送られたリクエストの Foobar: ヘッダの内容。例%{Referer}i、%{User-Agent}i %l (identd からもし提供されていれば) リモートログ名。 これは mod_ident がサーバに存在して、 IdentityCheck ディレクティブが On に設定されていない限り、-になります。 %m リクエストメソッド %{Foobar}n 他のモジュールからのメモ Foobar の内容 %{Foobar}o 応答の Foobar: ヘッダの内容 %p リクエストを扱っているサーバの正式なポート %{format}p サーバがリクエストを処理しているポートの公式のポート番号(canonical)か、サーバの実際のポート番号(local)か、クライアント側の実際のポート番号(remote)かです。 %P リクエストを扱った子プロセスのプロセス ID %{format}P リクエストを扱ったワーカーのプロセス ID かスレッド ID。 format として有効な値は pid, tid, hextid です。hextid を使うには APR 1.2.0 以降が必要です。 %q 問い合せ文字列 (存在する場合は前に ? が追加される。 そうでない場合は空文字列) %r リクエストの最初の行 %s ステータス。内部でリダイレクトされたリクエストは、元々の リクエストのステータス — 最後のステータスは %>s %t リクエストを受付けた時刻。 CLF の時刻の書式 (標準の英語の書式) %{format}t format で与えられた書式による時刻。format は strftime (3) の 書式である必要がある。(地域化されている可能性がある) %T リクエストを扱うのにかかった時間、秒単位 %u リモートユーザ (認証によるもの。ステータス (%s) が 401 のときは意味がないものである可能性がある) %U リクエストされた URL パス。クエリ文字列は含まない %v リクエストを扱っているサーバの正式な ServerName %V UseCanonicalName の設定によるサーバ名 %X 応答完了時の接続ステータス:X=応答完了前に接続が異常終了、+=応答送信後に接続を持続することが可能、-=応答送信後に接続が切られる %I リクエストとヘッダを含む、受け取ったバイト数。 0 にはならない。 これを使用するためには mod_logio が必要 %O ヘッダを含む、送信したバイト数。0 にはならない。 これを使用するためには mod_logio が必要 - ユーザーエージェント
%{User-Agent}i
- リファラー
%{Referer}i
- 転送元(バランサやプロキシを使用時)
%{X-Forwarded-For}i
- Cookie
%{Cookie}i
- フォーマット特殊変数
- CustomLog “<ログファイル>” <ログフォーマット>
ログの保存先を指定する。
ログファイルの指定で、 | を先頭に指定することで、外部プログラムに渡すことができる。
自動ログローテーションを行うツールが付属しているので、そこのログ出力を渡すことでローテーションを行うことができる。
24時間ごとにローテーションを行う例
CustomLog "| /usr/local/apache-httpd/bin/rotatelogs /usr/local/apache/logs/access_log.%Y-%m-%d 86400" <ログフォーマット>
- BufferedLogs (On|Off)
バッファを有効にするかどうかを指定する。
バッファを有効にすると、アクセスログの書き出し時にメモリバッファに一旦格納し、複数のログを一度に書き出すようになる。
これによって通常パフォーマンスが向上する。
ただし、各プロセス、またはスレッドはアクセス直後にログを書き出さなくなるので、ログが時系列順に出力されなくなる。
- LogFormat “<フォーマット>” <フォーマット名>
- 設定例
LogFormat "%{%Y/%m/%d(%a) %T}t %>s:\"%r\" \"Ref:%{Referer}i\" \"UA:%{User-Agent}i\" %a (%T sec (%D usec))" original CustomLog "| /usr/local/apache-httpd/bin/rotatelogs /usr/local/apache/logs/access_log.%Y-%m-%d 86400" original BufferedLogs On
パフォーマンス
排他制御の設定
- デフォルト
なし ※Mutex default
- 書式
Mutex <排他方式> [default|<適用箇所>] ... [OmitPID]
- 排他方式
排他方式の後に続けて :<パス> を書くことで、ロックファイルを書き出す場所を指定できる。
- default
- none
- 適用箇所
- OmitPIDフラグ
OmitPIDを付記することによってロックファイルの名前の末尾に .プロセスID が付く。
- 排他方式
セキュリティ
レスポンスヘッダ
レスポンスヘッダにはデフォルトでApacheのバージョンとOS名が含まれる。
この情報は既知のセキュリティホールに対して攻撃を誘発させるので、隠蔽したほうがよい。
この環境でのデフォルトのレスポンスは次のとおり。
Server: Apache/2.4.6 (Unix)
これを変更することで、次のようになる。
Server: Apache
- デフォルト
ServerTokens OS
- 設定内容
ServerTokens Prod
もし反対に、更にPHPなどアプリケーションの情報も付加したい場合は以下のように設定する。
ServerTokens Full
フッター
存在しないページにアクセスした時に表示されるエラーページに表示されるApacheのバージョンなどの情報がフッターとして出力される。
この情報は既知のセキュリティホールに対して攻撃を誘発させるので、隠蔽したほうがよい。
ただしデフォルトでOffであるので、特に変更する必要はない。
- 書式
ServerSignature (On | Off | EMail)
- デフォルト
ServerSignature Off
Traceメソッドの無効化
HTTPのTraceメソッド(リクエスト内容をそのまま応答する)は過去に攻撃に用いられており、
現在では危険性はそれほどではないが、特に必要ではないので、無効化する。
- デフォルト
TraceEnable on
- 設定内容
TraceEnable off
シンボリックリンクの利用禁止
プロキシ
HTTP(S)リバースプロキシ
- 書式
ProxyPass <転送パス> http://<転送先ホスト>:<転送先ポート>/<転送パス> ProxyPassReverse <転送パス> http://<転送先ホスト>:<転送先ポート>/<転送パス>
- 設定例
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so <IfModule proxy_module> <IfModule proxy_http_module> ProxyRequests Off ProxyPass /foo http://foo.example.com/bar ProxyPassReverse /foo http://foo.example.com/bar </IfModule> </IfModule>
AJP
AJPを利用して特定のサーバにリクエストを転送する場合、次の設定を行う。
- 書式
ProxyPass <転送パス> ajp://<転送先ホスト>:<転送先ポート>/
OR
<Location <転送パス>> ProxyPass ajp://<転送先ホスト>:<転送先ポート>/[<パス>] </Location>
- 例
「/webapp/*」のパスのリクエストを127.0.0.1:8009に転送する場合
ProxyPass /webapp/ ajp://127.0.0.1:8009/
OR
<Location /webapp/> ProxyPass ajp://127.0.0.1:8009/webapp/ </Location>
ヘッダー制御
mod_headersを使用すると受信時、送信時にヘッダーの置換や挿入、削除などを行える。
WebDav
Webサーバをファイルサーバとして扱うことができる。
Windowsエクスプローラーで”http://<サーバー名>/<パス>”と入力することでアクセス可能となる
Digest認証などの認証を付けると、Windowsエクスプローラーで開こうとするとWebブラウザが開き、ブラウザで閲覧をすることになる
- 設定例
書き込み権限を与える場合は下記のように行う。chown apache:apache /var/www/webdav
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
Alias /webdav "/var/www/webdav"
<Directory "/var/www/webdav">
Dav On
Options Indexes
Order allow,deny
Allow from all
</Directory>
ツール
httpd
デーモンプログラムの本体であるが、モジュール確認など行える。
- オプション一覧
[root@apache1 ~]# httpd -h Usage: httpd [-D name] [-d directory] [-f file] [-C "directive"] [-c "directive"] [-k start|restart|graceful|graceful-stop|stop] [-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X] Options: -D name : define a name for use in <IfDefine name> directives -d directory : specify an alternate initial ServerRoot -f file : specify an alternate ServerConfigFile -C "directive" : process directive before reading config files -c "directive" : process directive after reading config files -e level : show startup errors of level (see LogLevel) -E file : log startup errors to file -v : show version number -V : show compile settings -h : list available command line options (this page) -l : list compiled in modules -L : list available configuration directives -t -D DUMP_VHOSTS : show parsed vhost settings -t -D DUMP_RUN_CFG : show parsed run settings -S : a synonym for -t -D DUMP_VHOSTS -D DUMP_RUN_CFG -t -D DUMP_MODULES : show all loaded modules -M : a synonym for -t -D DUMP_MODULES -t : run syntax check for config files -T : start without DocumentRoot(s) check -X : debug mode (only one worker, do not detach)
バージョン確認
- 書式
httpd -v
- 出力例
[root@apache1 ~]# httpd -v Server version: Apache/2.4.7 (Unix) Server built: Mar 11 2014 07:41:34
コンパイル情報確認
- 書式
httpd -V
- 出力例
[root@apache1 ~]# httpd -V Server version: Apache/2.4.7 (Unix) Server built: Mar 11 2014 07:41:34 Server's Module Magic Number: 20120211:27 Server loaded: APR 1.5.0, APR-UTIL 1.5.3 Compiled using: APR 1.5.0, APR-UTIL 1.5.3 Architecture: 64-bit Server MPM: event threaded: yes (fixed thread count) forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/usr/local/apache-2.4.7" -D SUEXEC_BIN="/usr/local/apache-2.4.7/bin/suexec" -D DEFAULT_PIDLOG="logs/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf"
staticモジュールの確認
- 書式
httpd -l
- 出力例
[root@apache1 ~]# httpd -l Compiled in modules: core.c mod_so.c http_core.c
使用可能ディレクティブ一覧の確認
- 書式
httpd -L
- 出力例
[root@apache1 ~]# httpd -L <Directory (core.c) Container for directives affecting resources located in the specified directories Allowed in *.conf only outside <Directory>, <Files>, <Location>, or <If> <Location (core.c) Container for directives affecting resources accessed through the specified URL paths Allowed in *.conf only outside <Directory>, <Files>, <Location>, or <If> <VirtualHost (core.c) Container to map directives to a particular virtual host, takes one or more host addresses Allowed in *.conf only outside <Directory>, <Files>, <Location>, or <If> <Files (core.c) Container for directives affecting files matching specified patterns Allowed in *.conf anywhere and in .htaccess when AllowOverride isn't None ... .. .
基本情報の確認
実行ユーザやディレクトリといった基本的な情報を確認できる
- 書式
httpd -t -D DUMP_RUN_CFG
- 出力例
[root@apache1 ~]# httpd -t -D DUMP_RUN_CFG ServerRoot: "/usr/local/apache-2.4.7" Main DocumentRoot: "/usr/local/apache-2.4.7/htdocs" Main ErrorLog: "/usr/local/apache-2.4.7/logs/error_log" Mutex proxy: using_defaults Mutex authn-socache: using_defaults Mutex default: dir="/usr/local/apache-2.4.7/logs/" mechanism=default Mutex authdigest-opaque: using_defaults Mutex authdigest-client: using_defaults PidFile: "/usr/local/apache-2.4.7/logs/httpd.pid" Define: DUMP_RUN_CFG User: name="apache" id=501 Group: name="apache" id=501
読み込みモジュールの一覧確認
- 書式
httpd -M
- 出力例
[root@apache1 ~]# httpd -M Loaded Modules: core_module (static) so_module (static) http_module (static) authn_file_module (shared) authn_dbm_module (shared) authn_anon_module (shared) authn_dbd_module (shared) authn_socache_module (shared) authn_core_module (shared) authz_host_module (shared) authz_groupfile_module (shared) authz_user_module (shared) authz_dbm_module (shared) authz_owner_module (shared) authz_dbd_module (shared) authz_core_module (shared) access_compat_module (shared) auth_basic_module (shared) auth_form_module (shared) auth_digest_module (shared) reqtimeout_module (shared) filter_module (shared) mime_module (shared) log_config_module (shared) log_debug_module (shared) log_forensic_module (shared) logio_module (shared) env_module (shared) headers_module (shared) setenvif_module (shared) version_module (shared) proxy_module (shared) proxy_http_module (shared) mpm_event_module (shared) unixd_module (shared) dav_module (shared) autoindex_module (shared) dav_fs_module (shared) dav_lock_module (shared) dir_module (shared) alias_module (shared) info_module (shared) status_module (shared) php5_module (shared) wsgi_module (shared)
設定ファイルのチェック
- 書式
httpd -t
- 出力例
[root@apache1 ~]# httpd -t Syntax OK
apachectl
起動スクリプトとほぼ同様の動作の制御に加えて、各種モジュールの導入確認も行える。
また、ステータス確認系はテキストブラウザと呼ばれるツールが必要になるので、インストールしていない場合は、インストールしておく。
yum install lynx
- 起動
apachectl start
- 終了
apachectl stop
- 再起動
apachectl restart
- 現在のコネクションを終了するまで待って再起動
apachectl graceful
- 現在のコネクションを終了するまで待って停止
apachectl graceful-stop
- 設定ファイルの検査
apachectl configtest
ステータス確認
mod_statusモジュールをロードし、/server-statusのURLでローカルからアクセスな場合、ステータスの表示を行える。
- 簡易ステータス確認
apachectl status
- 詳細ステータス確認
apachectl fullstatus
- 出力例
- 簡易ステータス確認
[root@main2 httpd-2.4.7]# apachectl status Apache Server Status for localhost (via ::1) Server Version: Apache/2.4.7 (Unix) Server MPM: event Server Built: Dec 19 2013 11:31:18 __________________________________________________________________ Current Time: Thursday, 19-Dec-2013 12:50:59 JST Restart Time: Thursday, 19-Dec-2013 12:03:08 JST Parent Server Config. Generation: 2 Parent Server MPM Generation: 1 Server uptime: 47 minutes 51 seconds Server load: 0.00 0.00 0.00 Total accesses: 1 - Total Traffic: 3 kB CPU Usage: u0 s.03 cu0 cs0 - .00104% CPU load .000348 requests/sec - 1 B/second - 3072 B/request 1 requests currently being processed, 74 idle workers PID Connections Threads Async connections total accepting busy idle writing keep-alive closing 10849 0 yes 1 24 0 0 0 10850 0 yes 0 25 0 0 0 10851 0 yes 0 25 0 0 0 Sum 0 1 74 0 0 0 ___W____________________________________________________________ ___________..................................................... ................................................................ ................................................................ ................................................................ ................................................................ ................ Scoreboard Key: "_" Waiting for Connection, "S" Starting up, "R" Reading Request, "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup, "C" Closing connection, "L" Logging, "G" Gracefully finishing, "I" Idle cleanup of worker, "." Open slot with no current process
- 簡易ステータス確認
- 詳細ステータス確認
[root@main2 httpd-2.4.7]# apachectl fullstatus Apache Server Status for localhost (via ::1) Server Version: Apache/2.4.7 (Unix) Server MPM: event Server Built: Dec 19 2013 11:31:18 __________________________________________________________________ Current Time: Thursday, 19-Dec-2013 12:51:45 JST Restart Time: Thursday, 19-Dec-2013 12:03:08 JST Parent Server Config. Generation: 2 Parent Server MPM Generation: 1 Server uptime: 48 minutes 36 seconds Server load: 0.00 0.00 0.00 Total accesses: 2 - Total Traffic: 7 kB CPU Usage: u.27 s.6 cu0 cs0 - .0298% CPU load .000686 requests/sec - 2 B/second - 3584 B/request 1 requests currently being processed, 74 idle workers PID Connections Threads Async connections total accepting busy idle writing keep-alive closing 10849 0 yes 1 24 0 0 0 10850 0 yes 0 25 0 0 0 10851 0 yes 0 25 0 0 0 Sum 0 1 74 0 0 0 _W______________________________________________________________ ___________..................................................... ................................................................ ................................................................ ................................................................ ................................................................ ................ Scoreboard Key: "_" Waiting for Connection, "S" Starting up, "R" Reading Request, "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup, "C" Closing connection, "L" Logging, "G" Gracefully finishing, "I" Idle cleanup of worker, "." Open slot with no current process Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request 0-1 10849 0/1/1 _ 0.03 2636 0 0.0 0.00 0.00 ::1 127.0.0.1:80 GET /server-status HTTP/1.0 0-1 10849 0/0/0 W 0.00 0 0 0.0 0.00 0.00 ::1 127.0.0.1:80 GET /server-status HTTP/1.0 0-1 10849 0/1/1 _ 0.87 45 0 0.0 0.00 0.00 ::1 127.0.0.1:80 GET /server-status HTTP/1.0 __________________________________________________________________ Srv Child Server number - generation PID OS process ID Acc Number of accesses this connection / this child / this slot M Mode of operation CPU CPU usage, number of seconds SS Seconds since beginning of most recent request Req Milliseconds required to process most recent request Conn Kilobytes transferred this connection Child Megabytes transferred this child Slot Total megabytes transferred this slot
起動時のログを確認する
apacheを起動した際に発生するログを表示する。
起動していない場合は実際に起動される。
起動時に多量のエラーが発生している場合に、問題解決のため表示の抑制をするのに使用する。
- 書式
apachectl -e <ログレベル>
- ログレベル
レベル 説明 emerg 緊急 – システムが利用できない alert 直ちに対処が必要 crit 致命的な状態 error エラー warn 警告 notice 普通だが、重要な情報 info 追加情報 debug デバッグメッセージ
ab (Apache HTTP server benchmarking tool)
特定の単一のページにHTTPアクセスによる負荷をかけ、そのベンチマークを計測するツール。
SSL/TLSには対応していない。httpsを使用すると次のようなエラーが出る。
SSL not compiled in; no https support
- 書式
ab [オプション] <URL>
オプション
- -A <auth-username>:<password>
BASIC認証が必要なページで認証情報を設定する - -c <同時接続数>
同時接続数を指定する - -f <SSL/TLSプロトコル>
SSL/TLSプロトコルを指定する - -k
KeepAliveを有効にする。デフォルトでは無効である。 - -n <リクエスト数>
接続試行回数を指定する - -s <タイムアウト秒>
タイムアウト時間を指定する。デフォルトでは30秒である。 - -v <詳細レベル>
4まで指定可能。 - -H “<ヘッダ>”
任意のヘッダを指定する
圧縮を有効にする場合は以下
-H "Accept-Encoding: gzip,deflate"
- -X <プロキシサーバ>[:<ポート番号>]
htdigest
HTTP Digest認証で使用できる認証情報ファイルを作成できる。
- 書式
htdigest [-c] <ファイルパス> <レルム> <ユーザ名>
実行後、パスワード入力が求められるので、指定したユーザに設定するパスワードを入力する。
新規にファイルを作成する場合は-cオプションを付ける。
既存のファイルが存在する場合は削除されてしまうので注意。
なお、レルムとは認証領域とも言われ、認証を求める場合にレルムを指定して、そのレルム内に設定されたユーザ情報で認証を行う。
apr-1-config
apu-1-config
apxs
checkgid
dbmmanage
fcgistarter
htcacheclean
htdbm
htpasswd
httxt2dbm
logresolve
rotatelogs
運用
Apacheの起動・停止
Apacheを起動する
apachectl start
or
systemctl start apache
Apacheを停止する
apachectl stop
or
systemctl stop apache
Apacheの起動状況を確認する
apachectl
or
systemctl status apache
コンテンツ配置
静的コンテンツを配置する
初期状態の設定ファイルでは「htdocs」配下が静的コンテンツの公開ディレクトリになっている。
この場所にファイルを配置することで公開可能。
ただし、apacheユーザに読み取り権限が必要。
チューニング
セッション数
keepalive timeout
CPU負荷が高い
Preforkを使用していてマイナーページフォルトが多発している
プロセスの有効期限を短くする
シンボリックリンクの利用許可
Options FollowSymLinks
分散設定ファイルの利用停止
コンテンツネゴシエーションの利用停止
多言語の同じコンテンツを用意することで、自動でブラウザの要求言語に従ってファイルを選択して返す。
特定言語しか対応していない場合は、この機能を無効にすることで、ネゴシエーションのオーバーヘッドがなくなる。
参考:https://httpd.apache.org/docs/2.4/mod/mod_negotiation.html
Options -MultiViews
メモリの使用量が多い
PHPを使用している
プロセスあたりのメモリの使用量を変更する。
下記設定はプロセス単位でのメモリ使用量の上限なので、プロセス数×下記の値が上限になるようにする。
php_value memory_limit <メモリ上限>M
プロセス数/スレッド数を制限する
コネクション数不足
コネクション数の追加
コネクション数自体の上限はLinuxでは存在しない。
ただし、コネクション作成時にソケットファイルが作成されるため、ファイルディスクリプタの上限によりコネクション数が規定される。ファイルディスクリプタはソケットファイル以外でも消費されるので、その点は考慮する必要がある。
-
現状の値の確認
sudo -u apache /bin/bash -c 'ulimit -n'
Apacheがリクエスト処理時に別のサーバに接続する場合、エフェメラルポートを消費する。クライアントとして接続する際は、1コネクションで1ポート消費するので、ポートが枯渇する可能性がある。使用可能なポート範囲を拡張することで対応可能。
-
現状の値の確認
cat /proc/sys/net/ipv4/ip_local_port_range
TCPタイムアウトの高速化
コネクションが不足しており接続しても応答が返らない場合、通常はコネクションの上限を増やす。
しかし、メモリ不足によりコネクション数を増やせない場合、CLOSE_WAIT状態のコネクションが多ければTCPタイムアウトを早めることで解決できる。
なお、正常にコネクションが終了されればCLOSE_WAIT状態にはならないが、何らかの原因でコネクションが正常に終了しなかった場合にのみCLOSE_WAIT状態になるので、必ずしもこの方法が使用できるわけではない。
CLOSE_WAIT状態のコネクションはssコマンドで確認する
ss -anpo | egrep ":80 |:443 "
デフォルトでは二時間で、結果の右端の数値がタイムアウトまでの時間である。
tcp TIME-WAIT 0 0 133.18.48.26:443 XXX.XXX.XXX.XXX:49940 timer:(timewait,52sec,0) tcp TIME-WAIT 0 0 133.18.48.26:443 XXX.XXX.XXX.XXX:49914 timer:(timewait,13sec,0) tcp TIME-WAIT 0 0 133.18.48.26:443 XXX.XXX.XXX.XXX:49917 timer:(timewait,13sec,0) tcp TIME-WAIT 0 0 133.18.48.26:443 XXX.XXX.XXX.XXX:49939 timer:(timewait,52sec,0) tcp TIME-WAIT 0 0 133.18.48.26:443 XXX.XXX.XXX.XXX:49929 timer:(timewait,31sec,0) tcp TIME-WAIT 0 0 133.18.48.26:443 XXX.XXX.XXX.XXX:49943 timer:(timewait,52sec,0) tcp TIME-WAIT 0 0 133.18.48.26:443 XXX.XXX.XXX.XXX:49913 timer:(timewait,13sec,0) tcp TIME-WAIT 0 0 133.18.48.26:443 XXX.XXX.XXX.XXX:49942 timer:(timewait,52sec,0)
このタイムアウト時間はカーネルパラメータにより変更可能。
[root@apache conf]# sysctl -a | grep tcp_keepalive_ net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75
- tcp_keepalive_time
TCPコネクション確立後に検査を行うまでの時間 - tcp_keepalive_intvl
初回検査後、次回検査までの待ち時間 - tcp_keepalive_probes
応答がないコネクションを強制切断するまでの検査の回数
これらのパラメータを変更することで、TCPコネクションの最小生存時間は「tcp_keepalive_time+tcp_keepalive_intvl*tcp_keepalive_probes」に抑えることができる。
この方法は全てのTCP接続に影響を与えるが、通信中のコネクションは強制切断されるわけではない。