プロフィール

髭山髭人(ひげひと)

自分の書いた記事が、一人でも誰かの役に立てば...
活動信条の一つとして「貴方のメモは、誰かのヒント」というのがあります。

このサイトについて

本家HP packetroom.net から切り離した いわゆる技術メモ用のブログで、無料レンタルサーバーにて運用しています。広告表示はその義務なのでご容赦。
XREA さんには長年お世話になっています

Apaceにてphpのコードが出力されたりダウンロードされたりする

概要と環境

  • RaspberryPi 3B+ (RaspbianOS)
  • Apache2 と php (v7.3) は導入されている
  • .php をサーバー上で動かすと、むき出しのソースコードが表示されたり、phpファイルがダウンロードされたりする
  • 原因を色々調べた時の知見を記しています

(自環境における)原因と突破口

単純に php ソース 表示される とか Apache php ダウンロードされる とかで調べると

AddType application/x-httpd-php .php
とか
LoadModule php7_module "/[なんちゃらかんちゃら]/modules/libphp7.so"
とか記載しておくといいぜ!

...みたいな解決策が多く目に入ったのですが、 自分のケースは、完全にそれ以前の問題 であったようです。

結論から言えば、「Apache2 で使うモジュールに、php用の物が組み込まれていなかった」 ことが大きな原因であり、
sudo apt install libapache2-mod-php
が、本ケースの問題解決・大きな突破口となりました

自分用コマンドメモ

apachectl -M Apache2で読み込むモジュール一覧確認
ls /usr/lib/apache2/modules/ 同上
ls /etc/apache2/mods-enabled 同上(有効中)
vim /etc/apache2/apache2.conf Apache設定ファイル
vim /etc/php/7.3/apache2/php.ini Apacheを対象とした、PHP側の設定ファイル

確認した項目など

Apacheにphp用モジュールがロードされているか疑う

  • apachectl -M の実行ログ

    ( apachetl -M | grep php とかで抽出すれば分かりやすいかも )

Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_event_module (shared)
 negotiation_module (shared)
 reqtimeout_module (shared)
 setenvif_module (shared)
 status_module (shared)

一覧に php っぽいモジュールの記載が無かった。

Apacheでphpを使わせるためのモジュールis何処?

/usr/lib/apache2/modules/
の中に、 ~.so で終わるファイルが わさんさかあって、これかなーと思ったんだけど
php っぽい名前の物が1つもなかった。

有効化するだけでOKだったりしないかな?

ググった情報をもとに、モジュールの有効コマンドである
sudo a2enmod php7 したら

ERROR: Module php7 does not exist!

の応答...(゚ω゚)

「(一覧に)存在してなければ、有効のしようが無いです」 ← ド正論

突破口

Qiita - apache2+phpでソースが表示される

これや!!!

libapache2-mod-php ってのを突っ込む

https://packages.debian.org/ja/sid/libapache2-mod-php

  • sudo apt install libapache2-mod-php の実行ログ
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libapache2-mod-php7.3
Suggested packages:
  php-pear
The following NEW packages will be installed:
  libapache2-mod-php libapache2-mod-php7.3
0 upgraded, 2 newly installed, 0 to remove and 7 not upgraded.
Need to get 1,089 kB of archives.
After this operation, 3,500 kB of additional disk space will be used.
Do you want to continue? [Y/n]

あとは Y 押しときゃ進む

ls /etc/apache2/mods-enabled | grep php で、
apache2 が読み込むモジュールに php を含むそれっぽい名前の物があるか再び確認

php7.3.conf
php7.3.load

の応答...

「勝ったな」「ああ」

インストール後、以下を再び確認

  • ls /usr/lib/apache2/modules/ | grep php

    libphp7.3.so

  • apachectl -M | grep php

    php7_module (shared)

それぞれこのような応答結果になった。
インストール前はどちらも無かったので、これはイイ感じに事が運んでいますね

動いた

sudo service apache2 reload で設定を再読み込み
sudo service apache2 restarc 心配ならApache再起動

試しに sudo vim /var/www/html/index.php とかで動作確認用の.phpファイルなんぞ作成。

<?php
phpinfo();

あとはブラウザからアクセスして phpinfo が表示されれば成功👍

必要かと思ったけどそうではなかった工程

Qiita- Apacheのhttpd.confにPHPを設定する方法 を参考に、

Include /usr/local/etc/httpd/extra/php73.conf

とか

AddType application/x-httpd-php .php
LoadModule php7_module "/usr/local/Cellar/php/7.3.1/lib/httpd/modules/libphp7.so"
<IfModule dir_module>
    DirectoryIndex index.php
</IfModule>
PHPIniDir "/usr/local/etc/php/7.3/php.ini"

とか、こんな感じの設定を(自環境様に改造して)記載するものかと思っていたけど、自環境では追記しなくても動作した。

既に記載済み?

どうやら先程インストールした libapache2-mod-php の影響か、
生成された /etc/apache2/mods-available/php7.3.conf に以下が記載されており、
自前でphpを動作させる様な記述をせずとも済んでいた模様。

  • /etc/apache2/mods-available/php7.3.conf の中身
    <FilesMatch ".+\.ph(ar|p|tml)$">
    SetHandler application/x-httpd-php
    </FilesMatch>
    <FilesMatch ".+\.phps$">
    SetHandler application/x-httpd-php-source
    # Deny access to raw php sources by default
    # To re-enable it's recommended to enable access to the files
    # only in specific virtual host or directory
    Require all denied
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
    Require all denied
    </FilesMatch>
    # 
    # Running PHP scripts in user directories is disabled by default
    # 
    # To re-enable PHP in user directories comment the following lines
    # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
    # prevents .htaccess files from disabling it.
    <IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_flag engine Off
    </Directory>
    </IfModule>

これと同様、/etc/apache2/mods-available/php7.3.load には以下が記載

  • /etc/apache2/mods-available/php7.3.load の中身
    # Conflicts: php5
    # Depends: mpm_prefork
    LoadModule php7_module /usr/lib/apache2/modules/libphp7.3.so

application/x-httpd-php だの LoadModule だの、
色々調べていた時に見かけた「phpが正常に実行されない?これ記載しときなよ!」という諸々のアドバイスと見事なまでに合致した内容ですね...w

( まぁ自分の場合、記載したところで参照先がそもそも存在していなかったという躓きが先にあった訳なんですが )

こういう流れっぽい

  1. /usr/lib/apache2/modules/libphp7.3.so が存在する
  2. /etc/apache2/mods-available/php7.3.load に、1. を参照する内容が記載されている
  3. /etc/apache2/mods-available/php7.3.conf に、Apacheでphpを動作させる設定が記載されている
    中身は SetHandler application/x-httpd-php とか FilesMatch に関するものとか
  4. ↑ この2.3. はある意味セットであり、特に 2. はApache にとってモジュール読み出し用設定ファイル(?)の扱いである
  5. a2enmod系を扱えば個々のモジュールを有効、逆にa2dismodなら無効にできる
    ( 多分有効になってる )
  6. 前述 3. のファイルに、.php ファイルにアクセスされたときの挙動やらアクセス制限とかの基本的な設定が記載されていた。
    モジュールが正常に導入・動作していても、ここの記述がしっかりしていないと 冒頭の「phpファイルが実行されず、ブラウザ上でソースがまんま表示されてしまう」という状況になるのだと思う

足掛かり・参考となったリンク

Qiita - apache2+phpでソースが表示される
teratail - PHPのソースコードがそのまま表示されてしまう
りなっくすとらずぱい! - Raspberry PiにPHPをインストールする