Apache HTTP Server (日本語) - ArchWiki

# Apache HTTP Server (日本語)

関連記事

- PHP
- MySQL
- PhpMyAdmin
- Adminer
- Xampp
- mod_perl

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

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

## インストール

公式リポジトリから 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 のドキュメント を参照。

Tip: 設定に問題がある場合は、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` を再起動して変更を適用してください。

### バーチャルホスト

Note: バーチャルホストの 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 をインストールするには、公式リポジトリから php と php-apache をインストールしてください。

Note: php-apache に含まれている `libphp5.so` は `mod_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.ini` の `open_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 を使う

Note: 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

- php-fpm をインストール

- `/etc/php/php-fpm.conf` で `listen` を以下のように設定:

    ;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

- `httpd` と `php-fpm` デーモンを再起動:

    # 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

- 公式リポジトリから mod_fcgid と php-cgi パッケージをインストール。

- `/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` を再起動。

Note: 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

Warning: PHP 5.5 から、`mysql.so` は 非推奨 になり、ログにエラーが出力されるようになっています。

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

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

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

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

### 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_module` を `mpm_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` を再起動してください。

## 参照

- Apache 公式ウェブサイト
- PHP 公式ウェブサイト
- MariaDB 公式ウェブサイト
- 自己署名証明書の作成チュートリアル
- Apache Wiki トラブルシューティング

Category:

- Web Server (日本語)