はじめに
私のインフラに関する知識レベルが低く、
ITの業務経験が無く、見よう見まねでサーバー構築後、大好きなphpで遊ぶといったレベルです。
そのため、
具体的な解決案を頂きたいのはもちろんですが、
その前に「それがしたいなら、まず~を勉強しろ」といった一言だけでも頂けると幸いです。
実現したいこと
(追記: 20180111)
- ブラウザにて「処理開始」のボタンを押す
- 2つのAPIを叩き、それぞれの結果を加工してブラウザに返す。
という事を行いたいと考えております。
尚、出来るだけ早く結果を返したいため、2つのAPIを叩く処理を非同期で行いたいと考えております。
備考:
初めは非同期を行うためにexec関数で子プロセスを立ち上げる方法を使用しておりましたが、
結果を親プロセスに返すのが少々手間がかかっておりました。
そこで、これらを気軽に実現できそうな「PHPで別スレッド扱えるPtreads」というphpモジュールを見つけた為、
ぜひとも使ってみたいという考えです。
作業前の自宅サーバーの内容
コンピュータ本体: hp
内容: centOS6.9、Apache2.2、php7.2 (全てyumでインストール)
状況: メインPCからブラウザでアクセスし、サーバー内に作ったシンプルなphpinfo()ファイルを閲覧できる状態でした。
目的&作業概要
PHPでマルチスレッドを扱うモジュールPtreadをどうしても使ってみたい!
Pthreadの要件に、「phpをスレッドセーフでコンパイルする必要がある」とあったので、下記の作業を行いました。
手順1. php7.2をアンインストールしました。
手順2. PHP7.0.29をソースコードからmakeしてインストールしました。
(./configureにてスレッドセーフのオプションを付けました。)
手順3. PHPの拡張モジュールpthreads-3.1.6をソースコードからmakeしてインストールしました。
※手順3の後に、表題の問題が発生しました。
作業内容確認その1
手順1と手順2の後にサーバーを再起動(reboot)し、以下のコマンドにてインストール状況を確認しました。
phpのバージョン確認と、パスが通っていることを確認 [root@localhost src]# php -v PHP 7.0.27 (cli) (built: Jan 10 2018 20:28:29) ( ZTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies メインPCのブラウザでphpinfo()ファイルにアクセス //1. <?php phpinfo();?>ファイルをサーバーに作り、メインPCのブラウザでアクセスする //2. バージョンが 7.0.27になっていることを確認しました
作業内容確認その2
手順3の後にサーバーを再起動(reboot)し、以下のコマンドにてインストール状況を確認しました。
その際に、apacheに問題が起きていることを認識しました。
▼拡張モジュールPthreadsが入った事を確認 [root@localhost src]# php -m [PHP Modules] pthreads //入っていることを確認しました ▼apacheを再起動 [root@localhost src]# service httpd restart httpd を停止中: [ OK ] httpd を起動中: [ OK ] ▼ステータスを確認 問題発生! [root@localhost src]# service httpd status httpd は停止していますがサブシステムがロックされています //上記の再起動コマンドでは、自信満々に「OK」と出ているのに、statusのコメントが矛盾している問題が発生。 ▼phpinfo()にブラウザからアクセス 下記の表示がされ、apacheにアクセスが出来ていないようでした。 このサイトにアクセスできません ***.***.***.*** で接続が拒否されました。 //*は私のグローバルIPです
手あたり次第に試したこと
キーワード「httpd は停止していますがサブシステムがロックされています」を頼りに、
ググり、下記について確認しました。
▼httpd.pidというファイルが作成されているか確認 [root@localhost httpd]# ls -l /var/run/httpd 合計 0 //作成されていない
▼apacheの設定ファイルに「php7モジュール読み込み」の記述があるか確認 [root@localhost src]# less /etc/httpd/conf/httpd.conf LoadModule php7_module /usr/lib64/httpd/modules/libphp7.so //記述がある ▼php7モジュールが存在するか確認 [root@localhost src]# ls -l /usr/lib64/httpd/modules/ | grep libphp7 -rwxr-xr-x. 1 root root 35049900 1月 10 20:29 2018 libphp7.so //存在しました
▼apacheのエラーログを確認 [root@localhost httpd]# tail -f /var/log/httpd/error_log //SELinuxが有効になりました。という表記らしいが、エラーではないため、見て見ぬふりをします。 [Thu Jan 11 02:05:04 2018] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0 //「suEXECが正常に動いているよ」という表記らしいので、とりあえず見て見ぬふりをしています。 [Thu Jan 11 02:05:04 2018] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) ▼SELINUXの設定ファイルを見てみる [root@localhost httpd]# less /etc/selinux/config SELINUX=disables //無効「無効なのにapacheが有効にしたから、ログが出た」という事実は分かりました。 ▼SELinuxの状態を確認 [root@localhost httpd]# getenforce Permissive //SElinuxは警告を出力するがアクセス制限は無効。 SElinuxが自動で有効になるという事実は分かりました。 しかし、現在この内部の動きを私が全く分からないため、一旦保留とし、他に試せそうな事を試します。 #### apacheのアクセスログを確認 本インストール作業後のアクセスログは一切出力されていない事を確認した。
▼apacheの設定ファイルの「php7モジュール読み込み」をコメントアウトしてみる [root@localhost src]# vi /etc/httpd/conf/httpd.conf # LoadModule php7_module /usr/lib64/httpd/modules/libphp7.so //#でコメントアウトしました ▼apache再起動 [root@localhost ~]# service httpd restart httpd を停止中: [ OK ] httpd を起動中: [ OK ] [root@localhost ~]# service httpd status httpd (pid 2941) を実行中... //問題無く起動しました ▼メインPCのブラウザでphpinfo()ファイルにアクセス アクセスは出来るが、下記のようにphpの生のコードが表示される。php7モジュール読み込んでいないため、phpが動いていないと判断。 <?php phpinfo(); ?> ▼apacheのエラーログを確認 [root@localhost httpd]# tail -f /var/log/httpd/error_log [Thu Jan 11 03:33:13 2018] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0 //「php7モジュール読み込み」のコメントアウト前の起動時と同じ [Thu Jan 11 03:33:13 2018] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)// 「php7モジュール読み込み」のコメントアウト前の起動時と同じ [Thu Jan 11 03:33:13 2018] [notice] Apache/2.2.15 (Unix) DAV/2 configured -- resuming normal operations //正常起動時のメッセージらしいので問題無しと判断 ▼apacheのアクセスログを確認 //アクセスログが記録される事を確認しました (GIPです) - - [11/Jan/2018:03:27:12 +0900] "GET /phpinfo.php HTTP/1.1" 304 - "http://(GIPです)/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" ▼httpd.pidというファイルが作成されているか確認 [root@localhost httpd]# ls -l /var/run/httpd 合計 4 -rw-r--r--. 1 root root 5 1月 11 03:48 2018 httpd.pid //作成されている [root@localhost httpd]# cat /var/run/httpd/httpd.pid 3679 //PIDが入っている
※この時点で、「php7モジュール読み込みのコード」がapacheにアクセス出来ない直接原因ということは分かりましたが、
phpコードが実行されないとなると、今後の生きがいが無くなる為、
とりあえずモジュール読み込みのコメントアウトを外して、php7のモジュールを読み込むようにして、apacheを再起動しました。
まとめ(お願い)
私は、次何に対してアプローチしていけばよいでしょうか。
確認内容を追記 (2018/01/11 08:53)
httpd.confのmodule読み込みパスを絶対パスから相対パスに変更を試しました。
結果は変わりませんでしたが、作業内容を確認して頂きたいため、メモさせて頂きます。
▼httpd.confのServerRootを確認 ServerRoot "/etc/httpd" //確認しました ▼ついでに、そのほかのmoduleがどのように記載されているか確認 /*前後省略*/ LoadModule proxy_connect_module modules/mod_proxy_connect.so //全て相対パスで記載されていました LoadModule cache_module modules/mod_cache.so LoadModule suexec_module modules/mod_suexec.so /*前後省略*/ ▼絶対パスから相対パスに変更 #LoadModule php7_module /usr/lib64/httpd/modules/libphp7.so //元のパス LoadModule php7_module modules/libphp7.so //相対パスに変更しました ▼なんとなくシンボリックリンクを確認 [root@localhost ~]# ls -l /etc/httpd | grep module lrwxrwxrwx. 1 root root 29 1月 10 03:04 2018 modules -> ../../usr/lib64/httpd/modules //ServerRootと合わせると、正しいと判断しました ▼httpd.confの文法確認 [root@localhost conf]# apachectl configtest Syntax OK ▼apache再起動 [root@localhost conf]# service httpd restart httpd を停止中: [ OK ] httpd を起動中: [ OK ] ▼ステータス確認 [root@localhost conf]# service httpd status httpd は停止していますがサブシステムがロックされています //同じエラーが出ました ▼とりあえずサーバー再起動 # reboot ▼apache再起動 [root@localhost ~]# service httpd restart httpd を停止中: [ OK ] httpd を起動中: [ OK ] [root@localhost ~]# service httpd status httpd は停止していますがサブシステムがロックされています //エラーが出ました ▼エラーログ確認 [root@localhost ~]# tail -f /var/log/httpd/error_log [Thu Jan 11 08:42:06 2018] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0 //httpd.conf変更前と相違はありませんでした [Thu Jan 11 08:42:06 2018] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec) //httpd.conf変更前と相違はありませんでした ▼ブラウザでphpinfo.phpにアクセス このサイトにアクセスできません **.***.***.**(私のGIP) で接続が拒否されました。 //httpd.conf変更前と相違はありませんでした ▼pidファイルが作成されたか確認 [root@localhost ~]# ls -l /var/run/httpd 合計 0 //作成されませんでした ▼(サーバー再起動により)httpd.confが元に戻っていないか 念のために確認しました [root@localhost ~]# cat /etc/httpd/conf/httpd.conf | grep php7 #LoadModule php7_module /usr/lib64/httpd/modules/libphp7.so LoadModule php7_module modules/libphp7.so //ちゃんと相対パスのままでした
本質問のベストアンサー結果を元に行った作業結果を報告
追記:2018/01/15 00:13
PHP拡張モジュールPtheradsを導入し、HelloWorldする事が出来ました。
使用したバージョン情報を残しておきます。
バージョン情報
■centOS6.8
■PHP7.2.0
→スレッドセーフ版(./configureオプションに--enable-maintainer-ztsをつける)
→非apacheのモジュール(./configureオプションの--with-apx2を外す)
■Pthreads拡張モジュール (Gitの最新版)
→https://github.com/SirSnyder/pthreads/archive/master.zip
以上、報告いたします。
回答3件
あなたの回答
tips
プレビュー