PHP Web サーバー

Fedora14 で Web サーバー(Apache)の設定は実は殆どする事がない。と言うのもインストールするだけで大抵は解決するからだ。

※ もちろん既にインストールされている場合は、インストール自体は必要ない。
※ Fedora 15 以降でも同様である。

インストール

「ソフトウェアの追加/削除」でApacheをインストール(パッケージ名:httpd)

※ Fedora22 からは DNF を用いてインストールを行います。詳しくはコチラをご覧下さい。

※ Fedora26 では「mod_ssl」が自動でインストールされなくなりました。合わせてインストールしておく事を推奨します。(パッケージ名:mod_ssl)

Apache のインストール

「ソフトウェアの追加/削除」でPHPをインストール(パッケージ名:php)

PHP のインストール

「ソフトウェアの追加/削除」でApacheのGUIをインストール

Apache GUI のインストール

MariaDB(MySQL)を使用する場合は、「ソフトウェアの追加/削除」で php-mysqlnd をインストール

※ php-mysql はサポート用に存在しますが、は現在非推奨になっています。代わりに php-mysqlnd を利用して下さい。

PHP MySQL モジュールのインストール

※ PHPでデータベースを利用する場合は、MariaDB がお勧めだ。各モジュールがネイティブ化されているため、高速に動作する。(MariaDB / MySQL へのアクセスは、php-mysqlnd を利用します。)
※ 現在では、php-mysqlnd ( MySQL ネイティブドライバ)の方が高速に動作します。

設定

『/etc/httpd/conf/httpd.conf』 を vi (コマンド) か gedit (GUIエディタ)で編集する。

※ gedit の場合、パーミッションの関係で直接編集できないので、一旦ホームディレクトリにコピーするか、ターミナルから『sudo gedit』と入力し、スーパーユーザー権限で実行する必要がある(もっとも、デフォルトでは sudo コマンドは使用できない)。そこで、(スーパーユーザーとしてGUIでフォルダにアクセス)を利用するのが簡単だ。
※ ターミナルの起動は、 『アップリケーション』>『システムツール』>『端末』(起動後、 su コマンドで、スーパーユーザーになっておく)

『Options Indexes FollowSymLinks』や『Options FollowSymLinks Indexes』と記述されている箇所がある場合、
『Options FollowSymLinks』と変更する。(要するに、『Indexes』を消せば良い)

※この作業はディレクトリ内に index.html などが無い場合、エラーを返すようにするため。コレはファームウェアなどを大量にインストールした場合、全てのディレクトリ内に index.html を設置する事が困難になるための対応だと思って下さい。実は、これ以外の設定は必要なかったりする。

ここで、『/etc/httpd/conf.d』 のディレクトリを開いてみて欲しい。

httpd の conf.d 一覧

『php.conf』ファイルが存在するハズだ。

このファイル内で、PHPの設定が行われているため、設定ファイルの変更は不要なのだ。

※ 最近のLinuxでは、追加でインストールしたモジュールの設定ファイルは『XXXX.d』といったフォルダの配下にインストールされる。このため、直接設定ファイルの変更を行う必要が少なくなってきている。Apache に独自に設定を追加する場合は、追加部分のみを記述した設定ファイルをフォルダ配下に置くのがベストである。

次に、 『アップリケーション』>『システムツール』>『HTTP』を起動する。

※ Wayland 上では、このアプリケーションは起動しません。 Wayland で起動させるには Xorg モードにする必要があります。

Apache のGUIによる設定

ここで、関係してくるのは、2項目
  • 『サーバー名』 … DNS などでマシンに名前付けが行われている場合は、設定不要
  • 『管理者のメール・アドレス』 … エラーが起こった場合等に自動的に送られて来るアドレス。メールシステムなどの設定が行われている場合は良いのだが、通常はログ確認で問題無いので設定不要。
※ もちろんMTAの設定が行われている場合、PCや携帯のメール受信で、すぐに対応できるのだろうが、そちらの設定はかなりのスキルが必要とされる。

ここまでくれば、あとは設定を読み込ませるだけだ。

サービスの確認もしくは再起動

『システム』>『管理』>『サービス』でサービスの確認

Apache の再起動

  • 一覧の中に『httpd』があることを確認する。
  • 『無効』(赤色)になっている場合は『有効』(緑色)にする。
  • コンセントが刺さっていない場合は、『開始』をクリックしてサービスを開始しよう。
  • すでにコンセントが刺さっている場合は、『再開始』をクリックして設定ファイルを読み込ませよう。

※ Fedora15 以降ではサービスの設定方法が変更されています。詳しくはココを参照して下さい。
※ 外部からのアクセスでは、ポート開放の必要があるかも知れません。
※ FirewallD を利用している場合は、コチラをご覧下さい。

確認

さてここで、実際に確認してみよう。
『/var/www/html』(ドキュメントルート)直下に『test』フォルダを作成し、Webブラウザで『http:://localhost/test/』にアクセス。

※ フォルダの作り方が分からない場合はコチラを参照。

Firefox でアクセス

大体こんなカンジの内容が表示されればOKだ。ファイル一覧が表示されるようなら失敗。

次に『/var/www/html/test/』に『index.php』という名前で、以下の内容のファイルを作成。

<?php
phpinfo();
?>

そしてWebブラウザで『http:://localhost/test/』にもう一度アクセス。

phpinfo で確認

これでPHPも使えるようになった。

※ この phpinfo の画面は現在の PHP の状態を知るために、非常に重要です。一般に公開するのはセキュリティ上に問題がありますが、PHP開発者には必需品です。アクセス制限などを設定したフォルダなどに置いておくと良いでしょう。

アクセス解析を導入しよう

Fedoraを含む RedHat 系であれば、Webalizer というアクセス解析ツールがデフォルトで組み込まれている。

Webalizer インストール

※ インストールされていない場合は、『webalizer』で検索し、インストールしよう。

このツールは一日一回、アクセスログを解析し、グラフ化されたページを作成してくれる。ページを公開している者であれば、閲覧情報などは気になるところでもあるので、動作させておいても損は無いだろう。

しかし、デフォルトでは動作しない様になっているので、変更を加えよう。とは言っても「/etc/sysconfig/webalizer」をスーパーユーザーで開き、対象行のコメントを消すだけだ。

# uncomment if you want webalizer to be run each day by
# /etc/cron.daily/00webalizer
#WEBALIZER_CRON=yes

「#WEBALIZER_CRON=yes」の先頭の「#」を消せば良い

これで作業終了だ。

すぐに実行したい場合は、スーパーユーザーで「bash /etc/cron.daily/00webalizer」 として実行すれば良い。

さて、今度は結果を見てみよう。

http://localhost/usage/」にアクセス(localhost以外からはアクセス出来ません

Webalizer トップページ

Webalizer 詳細ページ

※ localhost 以外からのアクセスを許可する場合は、「/etc/httpd/conf.d/webalizer.conf」 を変更すれば良い。「Allow from xx.xx.xx.xx」といったアドレスを追加するだけだ。

#
# This configuration file maps the webalizer log analysis
# results (generated daily) into the URL space. By default
# these results are only accessible from the local host.
#
Alias /usage /var/www/usage
<Location /usage>
    Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from ::1

    # Allow from .example.com
</Location>

調査開発用に使用しているマシンなので非常にみすぼらしい結果だが、本来であれば結構カラフルなページである。

1日や1時間の平均、上位のアクセス者や使用されているブラウザ(User Agent)、前のページがgoogleなどの検索ページであれば、検索に使用した文字列さえ分かる。

1日に一回動くだけのツールなので、マシンの負担にもならないだろう。

試してみてはどうだろうか?

プロキシが勝手に有効になっている?

実は先日、プロキシが設定していないにも関わらず有効になっている事が判明した。
早い話、踏み台として利用されていたのだ。

※ 確認したのは Fedora15  及び Fedora16 の Apache/2.2.21 である。

$ export http_proxy=’http://localhost/’
$ wget http://www.google.com/
–20XX-XX-XX XX:XX:XX– http://www.google.com/
localhost をDNSに問いあわせています… ::1, 127.0.0.1
localhost|::1|:80 に接続しています… 接続しました。
Proxy による接続要求を送信しました、応答を待っています… 200 OK
長さ: 9184 (9.0K) [text/html]
`index.html’ に保存中

100%[==============================>] 9,184 –.-K/s 時間 0s

20XX-XX-XX XX:XX:XX (135 MB/s) – `index.html’ へ保存完了 [9184/9184]

※ このテストは、ローカルホストの Apache に対してプロキシを指定し、 Google にアクセスしている。

そこで設定ファイルを検索してみたのだが、プロキシの指定は無効になっていた。

# grep -iR proxy /etc/httpd/*
/etc/httpd/conf/httpd.conf:LoadModule proxy_module modules/mod_proxy.so
/etc/httpd/conf/httpd.conf:LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
/etc/httpd/conf/httpd.conf:LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
/etc/httpd/conf/httpd.conf:LoadModule proxy_http_module modules/mod_proxy_http.so
/etc/httpd/conf/httpd.conf:LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
/etc/httpd/conf/httpd.conf:LoadModule proxy_connect_module modules/mod_proxy_connect.so
/etc/httpd/conf/httpd.conf:# Proxy Server directives. Uncomment the following lines to
/etc/httpd/conf/httpd.conf:# enable the proxy server:
/etc/httpd/conf/httpd.conf:#<IfModule mod_proxy.c>
/etc/httpd/conf/httpd.conf:#ProxyRequests On
/etc/httpd/conf/httpd.conf:#<Proxy *>
/etc/httpd/conf/httpd.conf:#</Proxy>
/etc/httpd/conf/httpd.conf:#ProxyVia On
/etc/httpd/conf/httpd.conf:# CacheRoot “/var/cache/mod_proxy”
/etc/httpd/conf/httpd.conf:# End of proxy directives.

※ 実際にはバックアップファイルなども含まれるのだが、編集してある。

『ProxyRequests Off』などを指定しても改善しなかったため、『/etc/httpd/conf.d』に『proxy.conf』と言う名前のファイルを作成し、以下の内容で保存した。

<IfModule mod_proxy.c>
    ProxyRequests On
    <Proxy *>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
        Allow from ::1
    </Proxy>
</IfModule>

※ 内容はローカルホストからのアクセスを許可している。
※ 外部からのアクセスで踏み台(プロキシとしてアクセス)にされない事は確認してある。

mod_proxy が原因らしいのだが、詳しい理由は判明しなかった。

Fedora15 や Fedora16 で外部からアクセスできる Apache を運用している場合は、確認してみてはどうだろうか?

Apache 2.4

Fedora18 からは Apache が 2.4 になった。単純なアップデートならば良かったのだがディレクティブなどに変更があり、設定ファイルが 2.2 系のままでは、起動しなかったり、思いがけない動作をすることがある。

以下の作業は、端末から全てルート権限で行って下さい。

1.起動確認

# systemctl start httpd.service

問題なく起動するかどうかの確認を行って下さい。

2.状態確認

# systemctl status httpd.service

「Active: active (running)」と表示されているのであれば問題ありません。

3.起動が失敗していた場合

端末を2つ開きます。

1つ目の端末で次のように入力します。

# # syslog を利用している場合
# tail -f /var/log/messages
# # journalctl を利用している場合
# journalctl -f -k

2つ目の端末で次のように入力します。

# systemctl start httpd.service

この時、1つ目の端末で「httpd[13007]: AH00526: Syntax error on line 144 of /etc/httpd/conf/httpd.conf:」などの文法エラーが発生している場合は、Apache 2.2 の設定ファイルで起動しようとしている可能性があります。

4.設定ファイルを確認する

# cd /etc/httpd/conf
# ls
httpd.conf httpd.conf.rpmnew
# more httpd.conf httpd.conf.rpmnew

「See <URL:http://httpd.apache.org/docs/2.2>」などの文字がある場合は、Apache 2.2 の文法で掛かれた設定ファイルです。

通常、拡張子が「.rpmnew」のファイルが新しい設定ファイルですので、「cp httpd.conf.rpmnew httpd.conf」としてコピーして下さい。

また、その他の設定ファイルでもエラーが発生している場合は、同様の作業を行って下さい。

5.設定ファイルでアクセス制限を行っている場合

「Order」、「Allow」、「Deny」などでアクセス制限を行っている場合は、Apache 2.4 の文法で書き直す必要があります。正確な情報はコチラで確認して下さい。

ますは 「Allow」、「Deny」に該当するディレクティブを見てみよう。

Apache 2.4 の Allow / Deny ディレクティブ
ディレクティブ 説明
Require all granted 全てを許可する
Require all denied 全てを拒否する
Require local localhost である(IPv4 127.0.0.1 と IPv6 ::1)
Require ip Address Address は 127.0.01 の様な単一のモノか 192.168.0.0/16 などのマスク形式(IPv6 形式も可能)
スペースで区切れば複数指定も可能
Require method http-method http-method は GET POST HEAD OPTIONS など
スペースで区切れば複数指定も可能
Require env env-var env-var は SetEnvIf で宣言された変数

# Android を要求する例
SetEnvIf User-Agent “Android” isAndroid

<RequireAny>
Require env isAndroid
</RequireAny>

※ 実際にはこれ以外も条件は存在します。正確な情報はコチラで確認して下さい。
※ Require の後には「not」を付ける事ができ、その場合は否定文になります。しかし、「RequireNone」との併用は構造上お勧めできません。

「Order」や条件構造を表すディレクティブを見てみよう。

Apache 2.4 の条件構造ディレクティブ
ディレクティブ 説明
RequireAll 全てが真である事(つまり AND結合)

# 全てがローカル接続であり、なおかつ GET メゾッドである例

<RequireAll>
Require local
Require method GET
</RequireAll>

RequireAny いずれかが真である事(つまり OR結合)

# 全てがローカル接続か、またはスマートフォンである例

SetEnvIf User-Agent “Android|iPhone” isSmartPhone

<RequireAny>
Require local
Require env isSmartPhone
</RequireAny>

RequireNone いずれかが真である(つまり OR結合)の結果を反転させる

SetEnvIf User-Agent “Android|iPhone” isSmartPhone

<RequireAll>
Require local
<RequireNone>
Require env isSmartPhone
</RequireNone>
</RequireAll>

※ 正確な情報はコチラで確認して下さい。

Apache 2.4 では、その他の変更もありますので、詳しく知りたい場合は、コチラで確認して下さい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です