質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • PHP

    18596questions

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

  • CentOS

    2477questions

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

  • Apache

    1652questions

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

自宅サーバーcentOSにphp拡張モジュールPtheradsを入れたところ、apacheのstatusが「httpd は停止していますがサブシステムがロックされています」となってしまいます。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 333

 はじめに

私のインフラに関する知識レベルが低く、
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  111 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

以上、報告いたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2018/01/11 09:02

    configure や make を実行した際には、error や warning は、出ていませんでしたか?

    キャンセル

  • ID_7UGzV8hCHGs5

    2018/01/11 09:28

    大変申し訳ございません。 率直に、出ていたか分かりまん。全体の作業を通して数か所warningが出て、それに対する必要な物をyumでインストールしました。しかし、「おまじない」的な感じでどの作業でどのwarningだったか記録を残しておりません。ソースが残っているため、再度makeだけして確認してみようと思います。回答ありがとうございました。

    キャンセル

回答 3

+1

yumでphpをインストールし直して下さい。

追記
Apache用のphpは元に戻して、コマンドラインで使用するphpは、phpenvかphpbrewでインストールしましょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 06:03

    hichonさん、回答ありがとうございます。
    じつは、phpをスレッドセーフでインストールするには、
    yumでは出来ないんです。
    回答ありがとうございました。

    キャンセル

  • 2018/01/11 06:19

    追記しました。

    キャンセル

  • 2018/01/11 07:43

    hichonさん、さっそくありがとうございます。
    phpenvについて、(本質問とは別に)ぜひ試させて頂きます。

    ただ、今回はコマンドライン(別プロセス)でphpを立ち上げはせず、ぜひとも別スレッドにて並列処理を行いたいと考えております。
    別スレッドで走らせたい理由は、並列処理を行った結果をメインスレッドで"気軽に"受け取りたいと考えている為です。

    ※この質問を行う前に、並列処理を行うためにexec関数にて「コマンドラインから子プロセスを立ち上げてphpファイルを実行」する方法を取っていました。
    しかし、親プロセスから子プロセスに引数を渡したり、
    子プロセスの結果を親プロセスで受け取るのが容易に出来なく、一旦データをDBを通してデータの受け渡しをしておりました。
    上記でもとりえあず目的の動きは実現できたのですが、どうも車輪の再開発をしているようで少し嫌でした。
    そこで、ぜひとも次は別スレッドを簡単に実装できるPtreadを使用してみたいという考えです。

    質問がまとまっておらず、大変申し訳ございませんでした。

    キャンセル

  • 2018/01/11 09:06

    Apacheとモジュール連携ができるのはスレッドセーフ版のみだった記憶が。。

    Apache+php-5.3-ntsで起動しなかった記憶がある(うろ覚え

    キャンセル

  • 2018/01/11 09:54

    asahina1979さん 回答ありがとうございます。
    回答いただいた通りです。(すみません、おそらくベストアンサーと同じ回答です。日時的に早く回答いただいているのに、目を通す順番を誤りました。)
    「Apacheとモジュール連携」という意味をしっかりと分かっていないため、
    このあたりの用語についても勉強したい思います。
    (「コマンドでphpを実行するか、apacheがphpを実行するか」くらいの認識しかありませんでした。)
    取り急ぎお礼申し上げます。

    キャンセル

checkベストアンサー

0

気になったので、ソースコードをみてみようと GitHub をみたところ、readme に書かれていました。

pthreads README.md に

SAPI Support
pthreads v3 is restricted to operating in CLI only: I have spent many years trying to explain that threads in a web server just don't make sense, after 1,111 commits to pthreads I have realised that, my advice is going unheeded.
So I'm promoting the advice to hard and fast fact: you can't use pthreads safely and sensibly anywhere but CLI.
Thanks for listening ;)

とあります。

pthreads v3 is restricted to operating in CLI only: 

つまり、「pthreads v3はCLIでのみ動作します」と書かれているので、Apache のモジュールとして、モジュール版PHPに組み込むとうまく動かないのでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 09:42

    CHERRRYさん、回答いただきありがとうございます。
    そういう事でしたか!助かりました。
    次回より、readmeは英語でも目を通す事を行っていこうと思いました。
    回答いただいた内容が直撃すぎて、物凄く恥ずかしいです。
    以上、お礼申し上げます。

    キャンセル

  • 2018/01/15 00:34

    追記:
    頂いた回答を元に、pthreadsをCLI(非Apacheのモジュール)のPHPにインストールしたところ、問題無く動作しました。
    以上、報告いたします。

    キャンセル

0

httpd.confのLoadModuleディレクティブのパスの指定が怪しい気がします。
現在は絶対パスで記載している様ですが、
ServerRootディレクティブに指定しているパスからの相対パスで記述してみて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 09:11

    Tiraさん 回答いただきありがとうございます。
    httpd.confのLoadModuleディレクティブのパスを相対パスに変更して試させて頂きました。
    結果は下記の同じエラーが表示されました。
    「httpd は停止していますがサブシステムがロックされています 」

    尚、確かに他の全てのLoadmoduleディレクティブは相対パスで記述されていたため、
    本回答を機会に相対パスのままにしております。

    回答いただきありがとうございました。

    キャンセル

  • 2018/01/11 10:52

    作業内容の追記ありがとうございます。
    パス指定を変えてもダメだった旨、承知しました。
    パス指定自体は相対パスが正しいと思います。

    また、原因判明して解決されて良かったですね。
    一つお願いがあります。
    個人的にエラーログに何も吐かれずに起動失敗してるのがかなり気に食わないので、もし可能でしたら、httpd.confのLogLevelディレクティブをdebugに変更した上で再度Apacheを再起動した際にエラーログに何か出ないかご確認頂けないでしょうか。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18596questions

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

  • CentOS

    2477questions

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

  • Apache

    1652questions

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

  • トップ
  • PHPに関する質問
  • 自宅サーバーcentOSにphp拡張モジュールPtheradsを入れたところ、apacheのstatusが「httpd は停止していますがサブシステムがロックされています」となってしまいます。