Apache
Apache HTTP サーバは、効率的で拡張可能な web サーバで、インターネット上で最も人気のある web サーバのひとつです。
インストール
Apache のバージョンアップをする時は、アップグレードガイドを参照してください。
USE フラグ
USE flags for www-servers/apache The Apache Web Server
+suexec-caps
|
Install suexec with capabilities instead of SUID |
debug
|
Enable extra debug codepaths, like asserts and extra output. If you want to get meaningful backtraces see https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Backtraces |
doc
|
Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally |
gdbm
|
Add support for sys-libs/gdbm (GNU database libraries) |
ldap
|
Add LDAP support (Lightweight Directory Access Protocol) |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
static
|
Link in apache2 modules statically rather then plugins |
suexec
|
Install suexec with apache |
suexec-syslog
|
Log suexec to syslog instead of to a separate file |
systemd
|
Enable use of systemd-specific libraries and features like socket activation or session tracking |
threads
|
Add threads support for various packages. Usually pthreads |
Emerge
マルチプロセッシングモジュール
Apache の event または worker MPM を使用するには Apache の threads USE フラグを有効にしてください:
www-servers/apache threads
Apache event MPM を使用するには、以下を make.conf に追加してください:
APACHE2_MPMS="event"
Apache worker MPM を使用するには、以下を make.conf に追加してください:
APACHE2_MPMS="worker"
マルチプロセッシングモジュール(MPM)が何も選択されていない場合はデフォルトのMPMが使用されます。デフォルトのMPMはプラットフォームの機能(threadsサポートなど)によります。詳細についてはApache の公式ドキュメントを参照してください。
そして www-servers/apache を emerge してください:
root #
emerge --ask www-servers/apache
グローバルなサポート
apache2
グローバル USE フラグを有効化することで、他のパッケージの Apache サポートの提供を受けられます。これにより、Apache に依存するパッケージが emerge された場合に www-servers/apache が自動的にインストールされます。
USE="apache2"
USEフラグを設定した後には、システムをアップデートして変更を適用させます:
root #
emerge --ask --changed-use --deep @world
設定
ファイル
システム上のApache2の動作を設定する、2つの主要なファイルがあります:
- Gentoo の Apache2 用 init スクリプトの設定ファイル /etc/conf.d/apache2
- Apache2 サーバーで一般的に用いられている設定ファイル /etc/apache2/httpd.conf
/etc/conf.d/apache2
/etc/conf.d に配置されている apache2 ファイルは Gentoo の init スクリプトの設定ファイルです。このファイルで唯一有効な行は APACHE2_OPTS 変数の行です:
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D SSL -D SSL_DEFAULT_VHOST -D LANGUAGE"
この行のオプションは、全体の設定において特定の部分を有効にしたり無効にしたりするために様々な設定ファイルが利用する記述 <IfDefine option-name>
を解釈するための定義です。これについては後ほど触れます。
/etc/apache2/httpd.conf
httpd.conf ファイルは Apache サーバーの伝統的な設定ファイルです。実際には、このファイルは設定の入り口に過ぎません。設定全体は /etc/apache2/ にある多くのファイルに分割されており、それらは Include
ディレクティブを使って統合されます。たとえば、httpd.conf 内の Include /etc/apache2/modules.d/*.conf
という文は、/etc/apache2/modules.d/ にあるファイルのうち名前が .conf で終わるものをすべて取り込みます。
上記で見たように、またモジュールの設定ファイル(/etc/apache2/modules.d内のファイル)のほとんどが<IfDefine module-name>
から開始することから、対応する-D module-name
というフラグが/etc/conf.d/apache2のAPACHE2_OPTS変数に設定されていなければ、/ect/apache2/modules.d内のファイルの内容は有効にはなりません。00_default_settings.confという設定ファイルは例外でIfDefine
から開始しておらず、そのため常に有効になります。
デフォルト
Apache サーバの新規インストール後には、以下のような、異なる設定ファイル類を集約した設定ができあがっています。その入口である /etc/apache2/httpd.conf から始めましょう。
これはクイックリファレンスであり、概観を記載したものでしかありません。設定における追加や削除を理解するには、様々なファイル群を含めコメント類を熟読することが強く期待されます。また、Apacheの設定のより深い理解のために Apache マニュアルも参照してください。
ServerRoot "/usr/lib64/apache2"
#Module loaded unconditionally, assuming the USE flag is no unset in
# /etc/portage/make.conf or in /etc/portage/package.use
LoadModule actions_modulemodules/mod_actions.so
...
#other modules loaded that way : alias_module, auth_basic_module, authn_alias_module,
# authn_anon_module, authn_dbm_module, authn_default_module, authn_file_module,
# authz_dbm_module, authz_default_module, authz_groupfile_module, authz_host_module,
# authz_owner_module, authz_user_module, autoindex_module, cgi_module, cgid_module,
# deflate_module, dir_module, env_module, expires_module, ext_filter_module, filter_module,
# headers_module, include_module, log_config_module, logio_module, mime_module,
# mime_magic_module, negotiation_module, rewrite_module, setenvif_module,
# speling_module,ssl_module, status_module, unique_id_module, usertrack_module, host_alias_module
#Modules loaded conditionally, assuming matching USE flag is not unset in
# /etc/portage/make.conf or in /etc/portage/package.use (flag to be set in )
<IfDefine AUTHNZ_LDAP>
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
</IfDefine>
#other modules loaded that way : cache_module, dav_module, dav_fs_module,
# dav_lock_module,disk_cache_module, file_cache_module, info_module, ldap_module,
# mem_cache_module, userdir_module
User apache
Group apache
# Supplemental configuration
#**************************************************************************************vvv
#this part is included via Include /etc/apache2/modules.d/*.conf
#included from /etc/apache2/modules.d/00_default_settings.conf-------------v
#this is always included as there is not option to deactivate it.
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
UseCanonicalName Off
AccessFileName .htaccess
ServerTokens Prod
TraceEnable off
ServerSignature On
HostnameLookups Off
EnableMMAP On
EnableSendfile On
FileEtag INode MTime Size
ContentDigest Off
ErrorLog /var/log/apache2/error_log
LogLevel warn
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.html.var
</IfModule>
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
#--------------------------------------------------------------------------^
#included from 00_mod_info.conf--------------------------------------------v
<IfDefine INFO>
<Location /server-info>
SetHandler server-info
Require host 127.0.0.1
</Location>
</IfDefine>
#--------------------------------------------------------------------------^
#--------------------------------------------------------------------------v
#included from 00_languages.conf
# Settings for hosting different languages.
<IfDefine LANGUAGE>
AddLanguage ca .ca
...
AddLanguage zh-TW .zh-tw
LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
ForceLanguagePriority Prefer Fallback
AddCharset us-ascii.ascii .us-ascii
AddCharset ISO-8859-1 .iso8859-1 .latin1
...
AddCharset shift_jis .shift_jis .sjis
</IfDefine>
#---------------------------------------------------------------------------^
#**************************************************************************************^^^
#***************************************************************************************vvv
#this part is included via Include /etc/apache2/vhosts.d/*.conf
#from 00_default_ssl_vhost.conf-----------------------------------------------------vv
<IfDefine SSL>
<IfDefine SSL_DEFAULT_VHOST>
<IfModule ssl_module>
Listen 443
<VirtualHost _default_:443>
ServerName localhost
#------------------------------------------v
# this part is included via Include /etc/apache2/vhosts.d/default_vhost.include
ServerAdmin root@localhost
DocumentRoot "/var/www/localhost/htdocs"
<Directory "/var/www/localhost/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/localhost/cgi-bin/"
</IfModule>
<Directory "/var/www/localhost/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
#end of Include ---------------------------^
ErrorLog /var/log/apache2/ssl_error_log
<IfModule log_config_module>
TransferLog /var/log/apache2/ssl_access_log
</IfModule>
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /etc/ssl/apache2/server.crt
SSLCertificateKeyFile /etc/ssl/apache2/server.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/localhost/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
<IfModule setenvif_module>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</IfModule>
<IfModule log_config_module>
CustomLog /var/log/apache2/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</IfModule>
</VirtualHost>
</IfModule>
</IfDefine>
</IfDefine>
#---------------------------------------------------------------------------------^^
#from 00_default_vhost.conf-------------------------------------------------------vv
<IfDefine DEFAULT_VHOST>
Listen 80
NameVirtualHost *:80
<VirtualHost *:80>
ServerName localhost
#---------------------------------------------------------------v
# this part is included via Include /etc/apache2/vhosts.d/default_vhost.include
ServerAdmin root@localhost
DocumentRoot "/var/www/localhost/htdocs"
<Directory "/var/www/localhost/htdocs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/localhost/cgi-bin/"
</IfModule>
<Directory "/var/www/localhost/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
#end of Include -----------------------------------------------^
<IfModule mpm_peruser_module>
ServerEnvironment apache apache
</IfModule>
</VirtualHost>
</IfDefine>
#-----------------------------------------------------------------------------------^^
# end of include ****************************************************************************************^^^
稼働の第一歩
使い方の節の説明に従って、サーバを開始してください。
上記初期設定にあるように、インストール済みのバーチャルホストの DocumentRoot
ディレクトリが /var/www/localhost/htdocs にあり、サーバ名は「localhost」です。 DocumentRoot
にはさらに、index.html ファイルがひとつ生成されていますので、正常にインストールができたかどうかを確認するためには https://localhost/ にブラウザでアクセスしましょう。
そのウェブページには「It works!」のメッセージが表示されているはずです。
Firefox には、ブラウザの URL バーでミスタイプした場合に役に立つ機能があります。もし入力した URL が解決できなかった場合、Firefox は URL のホスト名の部分に
.com
を追加したり、www.
を先頭に追加したりして、自動的にユーザが意図していたであろうURLを解決しようとします。
この機能はFirefoxの初期からありますが、開発者にとっては面倒なものでした。つまり、localhostで動いているサーバが応答しなかった場合、Firefoxはlocalhost.com
やwww.localhost.com
に接続を試みたあげく、結局"not found"のページを見るということになってしまうのです。
この「機能」を無効にするために:
about:config
とブラウザのURLバーに入力- 「細心の注意を払って使用する」のボタンをクリックして特別な設定ページに入ります
- 検索ボックスに
browser.fixup.alternate.enabled
と入力 - 下にフィルタされたリストが出てくるので、
browser.fixup.alternate.enabled
を右クリックし、toggleを選んで値をfalseにする
mod_securityを有効にする
ModSecurity は、既知の脆弱性を悪用した攻撃を防ぐために web サービストラフィックを監視する、ルールベースの web サービスアプリケーションファイアウォールです。
www-apache/mod_securityのインストール:
root #
emerge --ask www-apache/mod_security
apache2ファイルのAPACHE2_OPTS変数でSECURITY
モジュールを有効にする:
APACHE2_OPTS="... -D SECURITY"
このモジュールを制御するには、/etc/apache2/modules.d/79_modsecurity.conf と /etc/apache2/modules.d/80_modsecurity-crs.conf ファイルを編集します。/usr/share/doc/mod_security-*-r1/modsecurity.conf-recommended.bz2 ファイルにおすすめの設定が含まれています( https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#A_Recommended_Base_Configuration )。ベースとなる設定を /etc/apache2/modules.d/79_modsecurity.conf にコピーし、必要に応じて設定を微調整します。/usr/share/doc/modsecurity-crs-*/crs-setup.conf.example.bz2 ファイルを適当な場所、たとえば /etc/conf.d/crs-setup.conf に解凍して微調整し、解凍したファイルを /etc/apache2/modules.d/80_modsecurity-crs.conf で読み込みます。最後に Apache を再起動します。サイトの Apache ログファイルでエラーをチェックし、状況に応じて対処してください。
PHP サポートを有効にする
apache2
の USE フラグを付けて PHP をインストールし、モジュールを有効にします:
APACHE2_OPTS="... -D PHP"
PHP モジュールが動作しているかテストする前に、/etc/apache2/modules.d/70_mod_php.conf ファイルが存在し、以下の定義が記載されているか、確認しましょう。
<IfDefine PHP>
# The mod_php.so symlink is controlled by
# eselect-php. However, the module name changed from
# php5_module to php7_module so we can't blindly load whatever
# is there. Instead we let eselect-php manage a small
# configuration file that loads the appropriate module.
#
# This is relative to ServerRoot (see httpd.conf).
Include ../../../var/lib/eselect-php/mod_php.conf
# Tell apache that mod_php should handle PHP files.
#
# NOTE: Avoiding AddHandler/AddType for security (bug
# #538822). Please read the related news item!
<FilesMatch "\.(php|php[57]|phtml)$">
SetHandler application/x-httpd-php
</FilesMatch>
# PHP source files which are meant to be displayed as
# syntax-highlighted source code.
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
DirectoryIndex index.php index.phtml
</IfDefine>
もしこのファイルがないようなら、作りましょう。
PHPモジュールが動作しているか確認するために、テストページを作成:
<html>
<body>
<?php phpinfo(); ?>
</body>
</html>
そして、/var/www/localhost/htdocs/index.htmlを削除するかリネームして、テストページを開きましょう: https://localhost/
PHPの設定が記述された表が見られるでしょう。
PHP のバージョンを変更する
Apache によって処理される PHP のバージョンを変えるには、まず apache2
Server Application Programming Interface (SAPI) で利用可能なバージョンをリストアップします:
root #
eselect php list apache2
[1] php5.3 [2] php5.4 * [3] php5.5
選択したバージョンに変更するには:
root #
eselect php set apache2 N
上の例の N
は、先ほど表示したような eselect php list apache2 の出力の中から選択した番号で置き換えてください。
バーチャルホスト
それぞれのバーチャルホストごとに、 DocumentRoot
ディレクトリを用意し Apacheデーモンが見つけられアクセス可能なようにしましょう。/etc/apache2/vhosts.d ディレクトリ内にバーチャルホスト設定ファイル(VirtualHost.conf)を追加し、その中には この DocumentRoot
とホストサーバ名を指定します。また、このホストサーバ名の項目を /etc/hosts に追記することも忘れないでください。
apache ユーザ/グループ の所有者権限を、バーチャルホストのファイル群に割り当てます。以下の例のように chown コマンドで:
root #
chown apache:apache /var/www/sitename
以下に、2つのバーチャルホスト定義例があります。1つは domainname1.com で、もう1つは domainname2.com です。本来のホスト自体(*:80
)は同じでも、DocumentRoot
と ServerName
のディレクティブがそれぞれ異なります。
<VirtualHost *:80>
ServerAdmin email@site.com
DocumentRoot /var/www/website1
ServerName domainname1.com
</VirtualHost>
<VirtualHost *:80>
ServerAdmin email@site.com
DocumentRoot /var/www/website2
ServerName domainname2.com
</VirtualHost>
IPアドレスベースのバーチャルホスト定義を行うこともまた推奨されています。管理者はユーザに対して、IPアドレスを通じてサイトへアクセスさせメッセージを掲げられます。
<VirtualHost *:80>
ServerAdmin email@site.com
DocumentRoot /var/www/html
ServerName xxx.xxx.xxx.xxx
</VirtualHost>
>
バーチャルホストを挿入したあとには、新たなウェブサイトを有効にするために、ウェブサーバを(完全に)再起動する必要があります。
fcgid を利用して PHP を有効化する
www-apache/mod_fcgid と dev-lang/php をインストール。PHP パッケージには、cgi
USE フラグの設定が必要:
root #
emerge --ask www-apache/mod_fcgid dev-lang/php
mod_fcgid.conf ファイルを編集:
<IfDefine FCGID>
LoadModule fcgid_module modules/mod_fcgid.so
SocketPath /var/run/fcgidsock
SharememPath /var/run/fcgid_shm
AddHandler php-fcgid .php
AddType application/x-httpd-php .php
Action php-fcgid /fcgid-bin/php-fcgid-wrapper
# max request 128mb
FcgidMaxRequestLen 134217728
<Location /fcgid-bin/>
SetHandler fcgid-script
Options +ExecCGI
</Location>
</IfDefine>
必要なディレクトリの作成:
root #
mkdir /var/www/localhost/htdocs/fcgid-bin
PHP ラッパーへのシンボリックリンクを張る:
root #
ln -s /usr/bin/php-cgi /var/www/localhost/htdocs/fcgid-bin/php-fcgid-wrapper
FCGID
モジュールの有効化:
APACHE2_OPTS="... -D FCGID"
最後に、Apache を再起動して、すでに作成されたphpinfo()
サイトを確認します。Server API
の値は CGI/FastCGI になるはずです。
Apache 2.4 で mod_proxy_fcgi を利用して PHP-FPM を有効化する
PHP-FPM をmod_proxy_fcgi を通じて有効にするには以下の要件を満たす必要があります:
- >= PHP 5.3
- >= Apache 2.4
さらに、Apache 2.4 での機能の利用にはいくつかの制限があります:
- UNIX ソケット経由で PHP-FPM と通信する には >= Apache 2.4.9 が必要です。
- ProxyPassMatch ではなく SetHandler を使用するには >= Apache 2.4.10 が必要です。
以下の設定は Apache 2.4.10 以降でのみ動作します。この手法は、FilesMatch
ディレクティブに基づいており、メインのサーバー設定か VirtualHost
の設定の中に記載します。UNIX ソケットの場所は、php-fpm.conf という設定ファイル内の listen
ディレクティブによって決まり、サイトや機能ごとに別々に定めることが可能です。
以下の例では、FilesMatch
を Apache の PHP モジュールの設定ファイルに記述しています:
<IfDefine PHP>
<FilesMatch "\.php$">
SetHandler "proxy:unix:/var/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
# Set it to handle the files
<IfModule mod_mime.c>
AddHandler application/x-httpd-php .php .php5 .phtml
AddHandler application/x-httpd-php-source .phps
</IfModule>
DirectoryIndex index.php index.phtml
</IfDefine>
また、ProxPassMatch を使用することもできます -- Apache のバージョンが 2.4.0 から 2.4.8 (これらを含む) の場合はこれが唯一の選択肢です。
<IfDefine PHP>
# Send all requested PHP files to PHP-FPM via fcgi://PHP_FPM_LISTEN_ADDRESS:PHP_FPM_LISTEN_PORT/DOCUMENT_ROOT/$1
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/localhost/htdocs/$1
# Set it to handle the files
<IfModule mod_mime.c>
AddHandler application/x-httpd-php .php .php5 .phtml
AddHandler application/x-httpd-php-source .phps
</IfModule>
DirectoryIndex index.php index.phtml
</IfDefine>
デフォルトでは listen
ディレクティブはソケットに設定されていません。まずソケットファイル用のディレクトリーを作成します:
root #
mkdir /var/run/php-fpm
次に php-fpm.conf ファイルを以下のように変更します:
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server. Many
; BSD-derived systems allow connections regardless of permissions.
; Default Values: user and group are set as the running user
; mode is set to 0666
listen.owner = apache
listen.group = apache
;listen.mode = 0666
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses on a
; specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/www.sock
そして、PHP
および PROXY
のモジュールを有効にします:
APACHE2_OPTS="... -D PHP -D PROXY"
Web フレームワークと Apache
Apache で動作するいくつかの web フレームワークがこの wiki でカバーされています:
Let’s Encrypt から TLS 証明書を取得して HTTPS 化
パブリックなウェブサーバはすべて、"セキュア" な HTTPS アクセスを提供することが重要です。HTTPS を提供するサイトは、HTTP リクエストを HTTPS での同等な URL にリダイレクトするように設定されていることが多いです。
Let’s Encrypt は無償で TLS 証明書を発行する、非営利の認証局です。certbot は TLS 証明書の要求とインストールを簡単に行うことができるユーティリティで、Gentoo リポジトリから取得することができます。これにより、Apache の HTTPS アクセスを自動的に構成することができます。
certbot の使い方については、Let's Encrypt の記事を確認してください。EFF もまた、Gentoo 上で certbot を使って Apache を構成することに特化した説明を提供しています。
使い方
サービス
OpenRC
Apache サーバを起動:
root #
/etc/init.d/apache2 start
Apache を default ランレベルに追加:
root #
rc-update add apache2 default
Apache サービスを再起動:
root #
/etc/init.d/apache2 restart
Apache の設定ファイルの再読込:
root #
/etc/init.d/apache2 reload
systemd
Apache サーバを起動:
root #
systemctl start apache2
Apache を default ランレベルに追加:
root #
systemctl enable apache2
Apache サービスを再起動:
root #
systemctl restart apache2
トラブルシューティング
資料
Apache サーバーを適切に設定するのは難しいこともあります。以下の資料は問題が起こったときに役に立つかもしれません:
テスト
Apache2 が動作し listen している IP インターフェースとポートの確認:
root #
ss -tlpn | grep apache
LISTEN 0 0 0.0.0.0:80 0.0.0.0:* users:(("apache2",pid=1401,fd=3),("apache2",pid=1399,fd=3),("apache2",pid=1396,fd=3)) LISTEN 0 0 0.0.0.0:443 0.0.0.0:* users:(("apache2",pid=1401,fd=3),("apache2",pid=1399,fd=3),("apache2",pid=1396,fd=3))
localhost で Apache サーバに接続できるかテスト:
user $
telnet localhost 80
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
接続テストを中断するには Ctrl+c と Enter を入力します。
apr_sockaddr_info_get() failed for <System_Hostname>
エラー:
apache2: apr_sockaddr_info_get() failed for System_Hostname
対処法:
これが発生したら、/etc/hosts ファイルにホスト名を追加してください:
127.0.0.1 localhost System_Hostname
関連項目
- Lighttpd — 高速で軽量な web サーバです。
- Nginx — 強固で小さく高性能な web サーバ / リバースプロキシサーバです。
- Category:Web application - Apache で実行するように構成することのできる、いくつかのプロジェクトを含むカテゴリ。