質問編集履歴

3 本質問が解決した際に使用したバージョン情報を追記しました。

ID_7UGzV8hCHGs5

ID_7UGzV8hCHGs5 score 22

2018/01/15 00:32  投稿

自宅サーバーcentOSにphp拡張モジュールPtreadsを入れたところ、apacheのstatusが「httpd は停止していますがサブシステムがロックされています」となってしまいます。
自宅サーバーcentOSにphp拡張モジュールPtheradsを入れたところ、apacheのstatusが「httpd は停止していますがサブシステムがロックされています」となってしまいます。
# はじめに
私のインフラに関する知識レベルが低く、
ITの業務経験が無く、見よう見まねでサーバー構築後、大好きなphpで遊ぶといったレベルです。
そのため、
具体的な解決案を頂きたいのはもちろんですが、
その前に「**それがしたいなら、まず~を勉強しろ**」といった一言だけでも頂けると幸いです。
# 実現したいこと 
(追記: 20180111)
1. ブラウザにて「処理開始」のボタンを押す
2. 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
以上、報告いたします。
  • PHP

    31259 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Apache

    2630 questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • CentOS

    4121 questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

2 回答いただいた内容を元に、「httpd.confのmodule読み込みパスを相対パスに変更した」作業内容を追記しました。

ID_7UGzV8hCHGs5

ID_7UGzV8hCHGs5 score 22

2018/01/11 09:07  投稿

自宅サーバーcentOSにphp拡張モジュールPtreadsを入れたところ、apacheのstatusが「httpd は停止していますがサブシステムがロックされています」となってしまいます。
# はじめに
私のインフラに関する知識レベルが低く、
ITの業務経験が無く、見よう見まねでサーバー構築後、大好きなphpで遊ぶといったレベルです。
そのため、
具体的な解決案を頂きたいのはもちろんですが、
その前に「**それがしたいなら、まず~を勉強しろ**」といった一言だけでも頂けると幸いです。
# 実現したいこと 
(追記: 20180111)
1. ブラウザにて「処理開始」のボタンを押す
2. 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                        //ちゃんと相対パスのままでした
```
  • PHP

    31259 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Apache

    2630 questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • CentOS

    4121 questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

1 実現したい要件を追記しました。

ID_7UGzV8hCHGs5

ID_7UGzV8hCHGs5 score 22

2018/01/11 07:53  投稿

自宅サーバーcentOSにphp拡張モジュールPtreadsを入れたところ、apacheのstatusが「httpd は停止していますがサブシステムがロックされています」となってしまいます。
# はじめに
私のインフラに関する知識レベルが低く、
ITの業務経験が無く、見よう見まねでサーバー構築後、大好きなphpで遊ぶといったレベルです。
そのため、
具体的な解決案を頂きたいのはもちろんですが、
その前に「**それがしたいなら、まず~を勉強しろ**」といった一言だけでも頂けると幸いです。
 
# 実現したいこと   
(追記: 20180111)  
1. ブラウザにて「処理開始」のボタンを押す  
2. 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を再起動しました。
# まとめ(お願い)
私は、次何に対してアプローチしていけばよいでしょうか。
  • PHP

    31259 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Apache

    2630 questions

    Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

  • CentOS

    4121 questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る