Apache HTTP Server

提供: ArchWiki
2014年11月22日 (土) 18:22時点におけるKusakata (トーク | 投稿記録)による版
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

Apache HTTP Server、略して Apache は Apache Software Foundation によって開発されている、人気のウェブサーバーです。

Apache は PHP などのスクリプト言語や MySQL などのデータベースと一緒に使われることがほとんどです。この組み合わせは LAMP (Linux, Apache, MySQL, PHP) と呼ばれています。この記事では Apache を設定する方法と PHPMySQL と統合する方法を説明しています。

インストール

公式リポジトリから apacheインストールしてください。

設定

Apache の設定ファイルは /etc/httpd/conf にあります。メインの設定ファイルは /etc/httpd/conf/httpd.conf で、他の様々な設定ファイルも含まれています。シンプルなセットアップであればデフォルトの設定で問題ありません。デフォルトでは、/srv/http ディレクトリがウェブサイトに訪れた人に見れるようになっています。

Apache を起動するには、systemd を使って httpd.service を起動してください。

それで Apache が実行されます。ウェブブラウザで http://localhost/ を開いて確認できます。シンプルなインデックスページが表示されるはずです。

任意の設定については次のセクションを見て下さい。

高度なオプション

以下のオプションは /etc/httpd/conf/httpd.conf で設定できます:

User http
セキュリティ上の理由で、root ユーザーによって Apache が (直接またはスタートアップスクリプトによって) 起動されるとすぐに指定された UID/GID に切り替わるようになっています。デフォルトはユーザー http で、インストール中に自動で作成されます。
Listen 80
Apache が使用するポートです。ルーターを使ってインターネットにアクセスする場合は、このポートを開いておく必要があります。
Apache をローカルでの開発のためにセットアップする場合はあなたのコンピュータからしかアクセスできないようにすると良いでしょう。その場合はこの行を Listen 127.0.0.1:80 に変更してください。
ServerAdmin you@example.com
エラーページなどで表示される管理者のメールアドレスです。
DocumentRoot "/srv/http"
ウェブページを置くディレクトリです。
必要に応じて変更してかまいませんが、<Directory "/srv/http">DocumentRoot と同じように忘れずに変更しないと、新しいドキュメントルートにアクセスしたときに 403 Error (権限不足) が表示されることになります。Require all denied 行を変更するのも忘れないで下さい、そうしないと 403 Error になります。
AllowOverride None
<Directory> セクションにこのディレクティブを記述すると Apache は .htaccess ファイルを完全に無視するようになります。mod_rewrite などの設定を .htaccess ファイルで用いる場合は、ファイルのどのディレクティブがサーバー設定を上書きできるようにするか許可できます。詳しくは Apache のドキュメント を参照。
ヒント: 設定に問題がある場合は、Apache で設定をチェックすることが可能です: apachectl configtest

/etc/httpd/conf/extra/httpd-default.conf では以下の設定が使えます:

サーバーの署名を表示しないようにするには:

ServerSignature Off

Apache や PHP のバージョンなどのサーバー情報を表示しないようにするには:

ServerTokens Prod

ユーザーディレクトリ

デフォルトではユーザーディレクトリは http://localhost/~yourusername/ から見れるようになっており ~/public_html の中身が表示されます (これは /etc/httpd/conf/extra/httpd-userdir.conf で変更可能です)。

ウェブ上でユーザーディレクトリが見れないようにしたい場合は、/etc/httpd/conf/httpd.conf の以下の行をコメントアウトしてください:

Include conf/extra/httpd-userdir.conf

Apache が取得できるようにホームディレクトリのパーミッションが正しく設定されているか確認する必要があります。ホームディレクトリと ~/public_html/ は他者 ("rest of the world") にも実行可能でなければなりません。以下のコマンドでパーミッションを変更できます:

$ chmod o+x ~
$ chmod o+x ~/public_html

変更を適用するために httpd.service を再起動して下さい。

TLS/SSL

TLS/SSL を使うには、openssl をインストールする必要があります。

自己署名証明書を作成 (キーのサイズや効力の日数は変更できます):

# cd /etc/httpd/conf
# openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out server.key
# chmod 600 server.key
# openssl req -new -key server.key -out server.csr
# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

そして /etc/httpd/conf/httpd.conf の、以下の3行をアンコメント:

LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf

httpd.service を再起動して変更を適用してください。

バーチャルホスト

ノート: バーチャルホストの SSL サポートのために別に <VirtualHost dommainame:443> セクションを追加する必要があります。#多数のバーチャルホストの管理 のサンプルファイルを見て下さい。

複数のホストを使いたい場合は、/etc/httpd/conf/httpd.conf の次の行をアンコメントしてください:

Include conf/extra/httpd-vhosts.conf

/etc/httpd/conf/extra/httpd-vhosts.conf でバーチャルホストを設定します。デフォルトのファイルには初めて設定するときに役立つ詳細な説明の入ったサンプルが含まれています。

ローカルマシンでバーチャルホストをテストするには、バーチャルネームを /etc/hosts ファイルに追加します:

127.0.0.1 domainname1.dom 
127.0.0.1 domainname2.dom

httpd.service を再起動して変更を適用してください。

多数のバーチャルホストの管理

莫大なバーチャルホストを使う場合、簡単に有効化・無効化できるようにすると便利です。バーチャルホストごとに設定ファイルを作成してそれら全てを一つのフォルダに保存するのが推奨されています、例: /etc/httpd/conf/vhosts

まずフォルダを作成:

# mkdir /etc/httpd/conf/vhosts

次にフォルダに個々の設定ファイルを配置:

# nano /etc/httpd/conf/vhosts/domainname1.dom
# nano /etc/httpd/conf/vhosts/domainname2.dom
...

最後に、/etc/httpd/conf/httpd.conf で設定を Include:

#Enabled Vhosts:
Include conf/vhosts/domainname1.dom
Include conf/vhosts/domainname2.dom

行をコメント・アンコメントすることでバーチャルホストを有効化・無効化することができます。

基本的な vhost ファイルは以下のようになります:

/etc/httpd/conf/vhosts/domainname1.dom
<VirtualHost domainname1.dom:80>
    ServerAdmin webmaster@domainname1.dom
    DocumentRoot "/home/user/http/domainname1.dom"
    ServerName domainname1.dom
    ServerAlias domainname1.dom
    ErrorLog "/var/log/httpd/domainname1.dom-error_log"
    CustomLog "/var/log/httpd/domainname1.dom-access_log" common

    <Directory "/home/user/http/domainname1.dom">
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost domainname1.dom:443>
    ServerAdmin webmaster@domainname1.dom
    DocumentRoot "/home/user/http/domainname1.dom"
    ServerName domainname1.dom:443
    ServerAlias domainname1.dom:443
    ErrorLog "/var/log/httpd/domainname1.dom-error_log"
    CustomLog "/var/log/httpd/domainname1.dom-access_log" common

    <Directory "/home/user/http/domainname1.dom">
        Require all granted
    </Directory>
    
    SSLEngine on
    SSLCertificateFile "/etc/httpd/conf/server.crt"
    SSLCertificateKeyFile "/etc/httpd/conf/server.key"
</VirtualHost>

拡張

PHP

PHP をインストールするには、公式リポジトリから phpphp-apacheインストールしてください。

ノート: php-apache に含まれている libphp5.somod_mpm_event で動作しません (FS#39218)。代わりに mod_mpm_prefork を使って下さい。そうしないと以下のエラーが表示されます:
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
AH00013: Pre-configuration failed
httpd.service: control process exited, code=exited status=1

mod_mpm_prefork を使うには、/etc/httpd/conf/httpd.conf を開いて次の行を:

LoadModule mpm_event_module modules/mod_mpm_event.so

以下のように置き換えてください:

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
他の方法として、mod_proxy_fcgi を使うこともできます (下の #php-fpm と mod_proxy_fcgi で php5 を使う を参照)。

PHP を有効にするには、以下の行を /etc/httpd/conf/httpd.conf に追加してください:

  • 次の行を LoadModule リストの LoadModule dir_module modules/mod_dir.so の後のどこかに記述:
LoadModule php5_module modules/libphp5.so
  • 次の行を Include リストの最後に記述:
Include conf/extra/php5_module.conf

DocumentRoot/srv/http ではない場合、次のように /etc/php/php.iniopen_basedir に追加してください:

open_basedir=/srv/http/:/home/:/tmp/:/usr/share/pear/:/path/to/documentroot

systemd を使って httpd.service を再起動して下さい。

PHP が正しく設定されたかどうかテストするには: Apache の DocumentRoot ディレクトリ (例: /srv/http/ または ~/public_html) に以下の内容で test.php という名前のファイルを作成します:

<?php phpinfo(); ?>

動作するか確かめるために次のページを見て下さい: http://localhost/test.php or http://localhost/~myname/test.php

高度な設定や拡張については、PHP を読んで下さい。

php-fpm と mod_proxy_fcgi で php5 を使う

ノート: Unlike the widespread setup with ProxyPass, the proxy configuration with SetHandler respects other Apache directives like DirectoryIndex. This ensures a better compatibility with software designed for libphp5, mod_fastcgi and mod_fcgid. If you still want to try ProxyPass, experiment with a line like this:
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/srv/http/$1
  • /etc/php/php-fpm.conflisten を以下のように設定:
;listen = 127.0.0.1:9000
listen = /run/php-fpm/php-fpm.sock
listen.owner = http
listen.group = http
  • 以下を /etc/httpd/conf/httpd.conf に追記:
<FilesMatch \.php$>
    SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
</FilesMatch>
<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>
  • 前に php モジュールを追加していた場合は、必要なくなるので削除:
LoadModule php5_module modules/libphp5.so
# systemctl restart httpd.service php-fpm.service

apache2-mpm-worker, mod_fcgid で php5 を使う

  • /etc/conf.d/apache の次の行をアンコメント:
HTTPD=/usr/bin/httpd.worker
  • /etc/httpd/conf/httpd.conf の次の行をアンコメント:
Include conf/extra/httpd-mpm.conf
  • /etc/httpd/conf/extra/php5_fcgid.conf を以下の内容で作成:
/etc/httpd/conf/extra/php5_fcgid.conf
# Required modules: fcgid_module

<IfModule fcgid_module>
    AddHandler php-fcgid .php
    AddType application/x-httpd-php .php
    Action php-fcgid /fcgid-bin/php-fcgid-wrapper
    ScriptAlias /fcgid-bin/ /srv/http/fcgid-bin/
    SocketPath /var/run/httpd/fcgidsock
    SharememPath /var/run/httpd/fcgid_shm
        # If you don't allow bigger requests many applications may fail (such as WordPress login)
        FcgidMaxRequestLen 536870912
        # Path to php.ini – defaults to /etc/phpX/cgi
        DefaultInitEnv PHPRC=/etc/php/
        # Number of PHP childs that will be launched. Leave undefined to let PHP decide.
        #DefaultInitEnv PHP_FCGI_CHILDREN 3
        # Maximum requests before a process is stopped and a new one is launched
        #DefaultInitEnv PHP_FCGI_MAX_REQUESTS 5000
        <Location /fcgid-bin/>
        SetHandler fcgid-script
        Options +ExecCGI
    </Location>
</IfModule>
  • 必要なディレクトリを作成し PHP ラッパーにシンボリックリンクを作成:
# mkdir /srv/http/fcgid-bin
# ln -s /usr/bin/php-cgi /srv/http/fcgid-bin/php-fcgid-wrapper
  • /etc/httpd/conf/httpd.conf を編集:
#LoadModule php5_module modules/libphp5.so
LoadModule fcgid_module modules/mod_fcgid.so
Include conf/extra/php5_fcgid.conf

そして httpd再起動

ノート: As of Apache 2.4 you can now use mod_proxy_fcgi (part of the official distribution) with PHP-FPM (and the new event MPM). See this configuration example.

MySQL/MariaDB

MariaDB で説明されているように MySQL/MariaDB を設定してください。

/etc/php/php.ini の以下の行の 少なくともどちらか一行 をアンコメント:

extension=pdo_mysql.so
extension=mysqli.so
警告: PHP 5.5 から、mysql.so非推奨 になり、ログにエラーが出力されるようになっています。

ウェブスクリプトのために権限を抑えた MySQL ユーザーを追加できます。また、/etc/mysql/my.cnf を編集して skip-networking 行をアンコメントすることで MySQL サーバーがローカルホストからしかアクセスできないようにすることも可能です。変更を適用するには MySQL を再起動する必要があります。

systemd を使って httpd.service を再起動します。

ヒント: データベースを利用するために phpMyAdmin, Adminer, mysql-workbenchAUR などのツールをインストールしても良いでしょう。

トラブルシューティング

Apache の状態とログ

Apache デーモンの状態を表示: systemctl status httpd

Apache のログがある場所は: /var/log/httpd/

Error: PID file /run/httpd/httpd.pid not readable (yet?) after start

unique_id_module をコメントアウトしてください: #LoadModule unique_id_module modules/mod_unique_id.so

Apache を 2.2 から 2.4 にアップグレード

php-apache を使っている場合、PHP の最初のノートを見て下さい。

Access Control は変更されました。Order, Allow, Deny, Satisfy ディレクティブは全て新しい Require シンタックスに変換してください。mod_access_compat を使うことで移行期間の古いフォーマットを使用することができます。

詳細: Upgrading to 2.4 from 2.2

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe

php5_module をロードする際に httpd.service が失敗して、journal で以下のようなエラーが表示される場合:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.

mpm_event_modulempm_prefork_module で置き換える必要があります:

/etc/httpd/conf/httpd.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

そして httpd.service を再起動してください。

参照