Apache HTTP Server
Apache HTTP Server、略して Apache は Apache Software Foundation によって開発されている、人気のウェブサーバーです。
Apache は PHP などのスクリプト言語や MySQL などのデータベースと一緒に使われることがほとんどです。この組み合わせは LAMP (Linux, Apache, MySQL, PHP) と呼ばれています。この記事では Apache を設定する方法と PHP や MySQL と統合する方法を説明しています。
目次
- 1 インストール
- 2 設定
- 3 拡張
- 4 トラブルシューティング
- 4.1 Apache の状態とログ
- 4.2 Error: PID file /run/httpd/httpd.pid not readable (yet?) after start
- 4.3 Apache を 2.2 から 2.4 にアップグレード
- 4.4 Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe
- 4.5 AH00534: httpd: Configuration error: No MPM loaded.
- 4.6 php.ini の max_execution_time を変更しても反映されない
- 5 参照
インストール
公式リポジトリから 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
行をRequire all granted
に変更するのも忘れないで下さい、そうしないと 403 Error になります。また、DocumentRoot ディレクトリとその親ディレクトリには実行権限を与える必要があります (chmod o+x /path/to/DocumentRoot
で設定できます)。それを設定してない場合も 403 Error になります。
AllowOverride None
<Directory>
セクションにこのディレクティブを記述すると Apache は.htaccess
ファイルを完全に無視するようになります。mod_rewrite
などの設定を.htaccess
ファイルで用いる場合は、ファイルのどのディレクティブがサーバー設定を上書きできるようにするか許可できます。詳しくは Apache のドキュメント を参照。
/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 $ chmod -R o+r ~/public_html
変更を適用するために httpd.service
を再起動して下さい。Umask#マスクの値を設定も参照。
TLS/SSL
TLS/SSL を使うには、openssl をインストールする必要があります。
/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
自己署名証明書を作成:
# cd /etc/httpd/conf # openssl req -new -x509 -nodes -newkey rsa:4096 -keyout server.key -out server.crt -days 1095 # chmod 400 server.key # chmod 444 server.crt
/etc/httpd/conf/extra/httpd-ssl.conf
の SSLCertificateFile
と SSLCertificateKeyFile
行で作成した鍵と証明書を指定してください。
CSR を作成する必要がある場合、上記のコマンドを以下のように変えてください:
# openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 -out server.key # chmod 400 server.key # openssl req -new -sha256 -key server.key -out server.csr # openssl x509 -req -days 1095 -in server.csr -signkey server.key -out server.crt
httpd.service
を再起動して変更を適用してください。
バーチャルホスト
複数のホストを使いたい場合は、/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 をインストールしてください。
/etc/httpd/conf/httpd.conf
の以下の行をコメントアウトしてください:
#LoadModule mpm_event_module modules/mod_mpm_event.so
そして次の行をアンコメントしてください:
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
PHP を有効にするには、以下の行を /etc/httpd/conf/httpd.conf
に追加してください:
- 次の行を
LoadModule
リストのLoadModule dir_module modules/mod_dir.so
の後のどこかに記述:
LoadModule php7_module modules/libphp7.so
- 次の行を
Include
リストの最後に記述:
Include conf/extra/php7_module.conf
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 を使う
php-fpm をインストールしてください。
以下の内容で /etc/httpd/conf/extra/php-fpm.conf
を作成:
/etc/httpd/conf/extra/php-fpm.conf
<FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/" </FilesMatch> <Proxy "fcgi://localhost/" enablereuse=on max=10> </Proxy> <IfModule dir_module> DirectoryIndex index.php index.html </IfModule>
/etc/httpd/conf/httpd.conf
の最後に作成したファイルを追加してください:
Include conf/extra/php-fpm.conf
PHP-FPM の設定は /etc/php/php-fpm.d/www.conf
で行えます。特に変えなくても問題なく動作するはずです。
httpd.service
と php-fpm.service
を再起動してください。
apache2-mpm-worker と mod_fcgid を使う
mod_fcgid と php-cgi パッケージをインストールしてください。
必要なディレクトリと PHP ラッパーのシンボリックリンクを作成:
# mkdir /srv/http/fcgid-bin # ln -s /usr/bin/php-cgi /srv/http/fcgid-bin/php-fcgid-wrapper
/etc/conf.d/apache
の以下の行をアンコメント:
HTTPD=/usr/bin/httpd.worker
以下の内容で /etc/httpd/conf/extra/php-fcgid.conf
を作成:
/etc/httpd/conf/extra/php-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>
/etc/httpd/conf/httpd.conf
を編集して以下の行を追加:
LoadModule fcgid_module modules/mod_fcgid.so Include conf/extra/httpd-mpm.conf Include conf/extra/php-fcgid.conf
httpd.service
を再起動してください。
MySQL/MariaDB
MariaDB で説明されているように MySQL/MariaDB を設定してください。
/etc/php/php.ini
の以下の行の 少なくともどちらか一行 をアンコメント:
extension=pdo_mysql.so extension=mysqli.so
ウェブスクリプトのために権限を抑えた MySQL ユーザーを追加できます。また、/etc/mysql/my.cnf
を編集して skip-networking
行をアンコメントすることで MySQL サーバーがローカルホストからしかアクセスできないようにすることも可能です。変更を適用するには MySQL を再起動する必要があります。
systemd を使って httpd.service
を再起動します。
HTTP2
HTTP/2 のサポートを有効にするには、nghttp2 パッケージをインストールして httpd.conf
の以下の行をアンコメント:
LoadModule http2_module modules/mod_http2.so
そして以下の行を追加:
Protocols h2 http/1.1
詳しくは mod_http2 のドキュメントを参照してください。
トラブルシューティング
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 を使うことで移行期間の古いフォーマットを使用することができます。
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe
php7_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.soLoadModule mpm_prefork_module modules/mod_mpm_prefork.so
そして httpd.service
を再起動してください。
AH00534: httpd: Configuration error: No MPM loaded.
アップグレードによってこのエラーが発生することがあります。httpd.conf
の変化に対応してないのが原因です。修正するには、以下の行をアンコメントしてください:
/etc/httpd/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
また、他にもエラーが発生する場合は上記のセクションも参照。
php.ini の max_execution_time を変更しても反映されない
php.ini
の max_execution_time
を 30 (秒) 以上の値に設定しても、30秒後に Apache から 503 Service Unavailable
が返ってくることがあります。この問題を解決するには、http 設定の <FilesMatch \.php$>
ブロックの直前に ProxyTimeout
ディレクティブを追加してください:
/etc/httpd/conf/httpd.conf
ProxyTimeout 300
そして httpd.service
を再起動してください。