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

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

新規登録して質問してみよう
ただいま回答率
85.49%
CentOS

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

Apache

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

PHP

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

Q&A

解決済

3回答

3807閲覧

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

ID_7UGzV8hCHGs5

総合スコア58

CentOS

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

Apache

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

PHP

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

0グッド

1クリップ

投稿2018/01/10 18:53

編集2018/01/14 15:32

はじめに

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

以上、報告いたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2018/01/11 00:02

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

2018/01/11 00:28

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

回答3

0

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

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

投稿2018/01/10 21:01

編集2018/01/10 21:18
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ID_7UGzV8hCHGs5

2018/01/10 21:03

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

2018/01/10 21:19

追記しました。
ID_7UGzV8hCHGs5

2018/01/10 22:43

hichonさん、さっそくありがとうございます。 phpenvについて、(本質問とは別に)ぜひ試させて頂きます。 ただ、今回はコマンドライン(別プロセス)でphpを立ち上げはせず、ぜひとも別スレッドにて並列処理を行いたいと考えております。 別スレッドで走らせたい理由は、並列処理を行った結果をメインスレッドで"気軽に"受け取りたいと考えている為です。 ※この質問を行う前に、並列処理を行うためにexec関数にて「コマンドラインから子プロセスを立ち上げてphpファイルを実行」する方法を取っていました。 しかし、親プロセスから子プロセスに引数を渡したり、 子プロセスの結果を親プロセスで受け取るのが容易に出来なく、一旦データをDBを通してデータの受け渡しをしておりました。 上記でもとりえあず目的の動きは実現できたのですが、どうも車輪の再開発をしているようで少し嫌でした。 そこで、ぜひとも次は別スレッドを簡単に実装できるPtreadを使用してみたいという考えです。 質問がまとまっておらず、大変申し訳ございませんでした。
退会済みユーザー

退会済みユーザー

2018/01/11 00:06

Apacheとモジュール連携ができるのはスレッドセーフ版のみだった記憶が。。 Apache+php-5.3-ntsで起動しなかった記憶がある(うろ覚え
ID_7UGzV8hCHGs5

2018/01/11 00:54

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

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 00:23

編集2018/01/11 00:24
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ID_7UGzV8hCHGs5

2018/01/11 00:42

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

2018/01/14 15:34

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

0

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

投稿2018/01/10 23:15

Tira

総合スコア91

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ID_7UGzV8hCHGs5

2018/01/11 00:11

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

2018/01/11 01:52

作業内容の追記ありがとうございます。 パス指定を変えてもダメだった旨、承知しました。 パス指定自体は相対パスが正しいと思います。 また、原因判明して解決されて良かったですね。 一つお願いがあります。 個人的にエラーログに何も吐かれずに起動失敗してるのがかなり気に食わないので、もし可能でしたら、httpd.confのLogLevelディレクティブをdebugに変更した上で再度Apacheを再起動した際にエラーログに何か出ないかご確認頂けないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問