2018年03月30日

ネットブックにUbuntu Server入れる その9 Apache2とPHP(モジュール版とCGI版)

ネットブックのHP mini 1000にUbuntu Serverを入れて
色々やる流れです。

ネットブックにUbuntu Server入れる

の記事になります。

今回はPHPをインストールしてApache2を入れて
モジュール版でのPHPの動作を確認した後にそれを消して
CGI版でのPHPの動作環境を構築したいと思います。

インストールするPHPのバージョンは
私が借りてるさくらインターネットのサービスに合わせて
PHP7.1をインストールしようと思います。
レポジトリ追加の必要はあるのかな?と考えつつ

~$ apt-cache pkgnames | grep php7.1

ずらっと出てきてリポジトリ追加の必要はなさそう。
今(2018/03/30)は普通に入れると7.1が入る?
大体この辺があれば良いかな?と言う所を選んで…

~$ sudo apt install php7.1 php7.1-mcrypt php7.1-gd php7.1-common php7.1-cli php7.1-mysql php7.1-mbstring php7.1-xml php7.1-zip

意識してlibapache2-mod-php7.1を入れなかったのですが
セットでlibapache2-mod-php7.1もApache2もインストールされました。

aptを使ったインストールが便利すぎて
LAMPのMysqlを除くLinux+Apache2+PHP環境の構築って
OS入れてIPアドレス設定してphpを入れれば
Apacheも入り自動で設定されて終わりなのでは…
Mysqlも簡単に入るだろうしコマンドを10個打ち込まないで終わりそう。

まずはPHPとApacheがきちんと入ってるか動いているかを確認。

~$ php -v
PHP 7.1.15-0ubuntu0.17.10.1 (cli) (built: Mar 14 2018 22:30:42) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.1.15-0ubuntu0.17.10.1, Copyright (c) 1999-2018, by Zend Technologies

phpは問題ない、Apacheは…

~$ apache2 -v
Server version: Apache/2.4.27 (Ubuntu)
Server built: 2017-09-18T15:05:48

~$ ps -ef | grep www
www-data 13832 13827 0 18:43 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 13834 13827 0 18:43 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 13835 13827 0 18:43 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 13836 13827 0 18:43 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 13837 13827 0 18:43 ? 00:00:00 /usr/sbin/apache2 -k start

インストールしただけなのにもう動いてる…

20180330-001-apache2.jpg

余りにも楽な世の中になってることに困惑しつつ
初期設定のDocumentRootである/ver/www/htmlに
phpinfoを表示するスクリプトを置いて確認。

20180330-002-phpinfo.jpg

Server API Apache 2.0 Handler
モジュール版PHP7.1の動作を確認しました。

どこまで楽になってるんだろう…
何か問題があってPHPが動かない人は関係アプリを一通り
removeではなくpurgeして
新規でPHPを入れればそれだけで動くような気がする。

予定通りlibapache2-mod-php7.1を消してphp7.1-cgiを入れます。

~$ sudo apt purge libapache2-mod-php7.1

変にファイルが残ってて困ると嫌なので完全に消しておきます。
Apache2がもういらないからautoremoveで掃除するように言われる。
それとlibapache2-mod-phpを消すと自動でphp-fpmが入る模様
※FPM = FastCGI Process Manager

Apacheはこの後使うのでautoremoveせず続行。

~$ sudo systemctl restart apache2

Apacheを再起動してモジュール版PHPを動かなくして
先ほどのurlにアクセスしDefault Pageは表示されるけど
phpinfoは真っ白であることを確認する。

Apache2の設定を行います。
UbuntuのApacheは少し癖があって知らないと混乱します。
設定ファイルの位置に関してはここを参考にしました。

https://qiita.com/kummn/items/f6bd0f3e643595ed077a

何も変更してないので今のDocumentRootは/var/www/html/です。
その下にcgi-binを掘ってCGIを動作させます。
~$ sudo mkdir /var/www/html/cgi-bin

httpアクセスはIPアドレスのみでヴァーチャルホストを設定するほどではないですが
設定ファイルは000-default.confを使わずhost名のpine.confを作ってそこに書きます。

~$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/pine.conf

読み込む設定ファイルの無効化と有効化
~$ sudo a2dissite 000-default.conf
~$ sudo a2ensite pine.conf

Apacheを一端再起動して動作の確認
~$ sudo systemctl restart apache2

問題ないのでpine.confの編集

~$ sudo vi /etc/apache2/sites-available/pine.conf

最初からあるScriptAliasをコメントアウトして13行目位にこれを追記

ScriptAlias /cgi-bin/ /var/www/html/cgi-bin/
<Directory "/var/www/html/cgi-bin/">
AllowOverride All
Options ExecCGI
AddHandler cgi-script .php .cgi
Order allow,deny
Allow from all
</Directory>

confのテストを行う。
~$ apachectl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name,
using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

こちらを参考に対応
http://mk-55.hatenablog.com/entry/2014/07/07/004510

~$ sudo vi /etc/apache2/conf-available/fqdn.conf
中にはこれを書く。
ServerName pine

設定を有効化してテスト。
~$ sudo a2enconf fqdn
~$ apachectl configtest
Syntax OK

今度は大丈夫。
.phpと.cgiをcgiで動作させるように設定してみた。
そしてcgiのモジュールをオンにします。
~$ sudo a2enmod cgid

そしてApache2再起動。
~$ sudo systemctl restart apache2


今回は入力の必要がありませんがCGIの動作を止める時は
~$ sudo a2dismod cgid
になります。

cgi-binの中にphpinfoを表示するPHPスクリプトを配置。
~$ sudo vi /var/www/html/cgi-bin/phpinfo.php
<?php
phpinfo();
?>

これをcgiで動く動かないのチェックのためにファイル名だけ違うのもの起きてみます。
sudo cp /var/www/html/cgi-bin/phpinfo.php /var/www/html/cgi-bin/phpinfo.cgi

そしてCGIだと忘れてはいけない実行許可。

~$ sudo chmod 755 /var/www/html/cgi-bin/phpinfo.php
~$ sudo chmod 755 /var/www/html/cgi-bin/phpinfo.cgi

そしてhttpでアクセス

20180330-003-error.jpg

やったー!!動かない!!!
InternalServerErrorで凄くCGIと言うものでハマってる気がする!!

アクセスしたurlが合っているかエラーの内容がどんなかをチェックします。
~$ tail /var/log/apache2/access.log
~$ tail /var/log/apache2/error.log

[cgid:error] [pid 17605] (8)Exec format error: AH01241: exec of '/var/www/html/cgi-bin/phpinfo.php' failed
[cgid:error] [pid 17584] [client 192.168.1.101:52538] End of script output before headers: phpinfo.php

さてさて…

しばらく上手く行かず悩んだ後にperlのCGIってどんなだったかな?と
実際にファイルを作って試してみる。
perlのcgiを動かすのは何年ぶりだろうと思いつつ

sudo vi /var/www/html/cgi-bin/perl-cgi-test.cgi

中身は
#!/usr/bin/perl

print "Content-Type: text/html\n\n";
print "working!! perl cgi test!!!";

後は実行の許可を出して…
~$ sudo chmod 755 /var/www/html/cgi-bin/perl-cgi-test.cgi

20180330-004-perl-cgi.jpg

動いた。

そう言えば先頭行にperlの実行ファイルへのpathを書いたっけ、すっかり忘れてた。
phpもそうなのかな?とphpinfo.phpの先頭行にphpを書いてみる。
~$ sudo vi /var/www/html/cgi-bin/phpinfo.php

#!/usr/bin/php

<?php
phpinfo();
?>

先頭行と<?phpの間に一行空白入れないとエラーが出る謎不具合。
(その後、空白行を無くしてもエラーは出なくなりました)

20180330-005-phpinfo.jpg

動いた!!!…けど、なにか違いますよ?

Server API => Command Line Interface

これ、CGIでCLIのPHPを呼び出してるから
厳密にはCGIでCGI版PHPバイナリが動作してる訳じゃないんだ、面倒くさいな…
少し悩んだ後に指定すべき実行ファイルはphp-cgiだった事に気づく。

~$ which php-cgi
入ってない、自動でfpmが入ったから忘れてた。

CGI版PHPをインストール
~$ sudo apt install php7.1-cgi

~$ which php-cgi
/usr/bin/php-cgi

OK、準備できた。
php-cgiを呼び出すから.cgiの方でcgi動作させることにする。
sudo vi /var/www/html/cgi-bin/phpinfo.cgi

#!/usr/bin/php-cgi

<?php
phpinfo();
?>

動かない…

[cgid:error] [pid 17584] [client 192.168.1.101:52607] End of script output before headers: phpinfo.html
[cgid:error] [pid 17585] [client 192.168.1.101:52608] malformed header from script 'phpinfo.cgi': Bad header: <b>Security Alert!</b> The PHP

エラーログを読むとセキュリティーアラート?

検索するとphp.iniに
cgi.force_redirect = 0
を指定しろと言う情報が多く見つけられる。

セキュリティーアラート対策で強制的なリダイレクトを止めるのは
嫌な感じしかしないので別の方法を探すが見つからなかった。

シェルからphpinfo.cgiを実行すると実行できることから
エラーでは無くPHPもしくはApache2の制限であることと思われる。
今回は動作が目的なので諦めてiniに上記設定を記載することにする。

~$ sudo find / -name php.ini
/etc/php/7.1/fpm/php.ini
/etc/php/7.1/cli/php.ini
/etc/php/7.1/cgi/php.ini

phpとphp-cgiとfpmでphp.iniが三つあった。cgi版の方を変更

~$ sudo vi /etc/php/7.1/cgi/php.ini

755行目あたりの
#cgi.force_redirect = 1
の所を
cgi.force_redirect = 0
に変更する。

該当場所の付近に警告文があるので後で読もうと思いつつApache2を再起動して動作確認へ。

~$ sudo systemctl restart apache2

20180330-006-php-cgi.jpg

Server API CGI/FastCGI
CGI版PHPでの動作を確認。


ユーザーディレクトリの公開はまた後で確認するとして
不安要素のcgi.force_redirectで検索するとこんなページが発見できた。

2008-08-02
■[PHP] cgi.force_redirect って何?
http://d.hatena.ne.jp/msakamoto-sf/20080802/1217662203

この情報だと公開サーバーで運用するにはCGI版は怖い。
モジュール版の方がパフォーマンスは良いと検索すると出てくるけれど
なぜCGI版のレンタルサーバーが多いのかと疑問が残る


そこで更に検索した所
http://www.koikikukan.com/archives/2007/01/29-015501.php
https://teratail.com/questions/81703

この辺を読んで実行するユーザー権限や負荷計測の問題等、
レンタルサーバー運用上の理由できちんとすればCGI版を避けるほどではないと理解した。


備考、この後libapache2-mod-php7.1を再度インストールしたら
特に設定しないでモジュール版とCGI版のPHPが同居できた。

ただ.phpファイルはモジュール版が優先して呼び出されるためか
#!/usr/bin/phpのパス指定文字列がブラウザに表示されてしまっていた。
.cgiはPHPファイルと判断されないためCGIとして実行されていた。


備考2、作業中aptがApache2はもう必要とされてないと
何度もautoremoveを勧めてきたので
最初にPHPを入れる所でApache2も明示して入れた方が良い。



タグ:uBuntu
posted by えくれあ at 21:59| Comment(0) | TrackBack(0) | 技術
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/182846913
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック