[php] phpでfsockopen関数を使うとPermission deniedでうまくいかない件

PHPでfsockopen関数を使うと「Permission Denied」というエラーが出てしまって、うまく動作してくれないという問題に出会いました。。

前置き:この問題に出会った理由

別記事「phpでActiveMQのQueueとstompを使ってやりとりする方法」を実施する際に、Stompがうまく動作しませんでした。

Stompの説明は別記事参照。

とにかく、Stomp内の以下のコードでエラーが出ていました。

最初はActiveMQ側に問題があると思って調べていたのですが、実際のところ、そうではなくて、php側(というか、phpの動作しているサーバ側)に問題がありました。
エラーの内容は「13:Permission Denied」というものです。これはActiveMQ側のサーバで権限が足りないわけではなくて、phpプログラムを実行しているユーザに、ソケット通信をする権限がありませんという話でした。

SELinuxという罠

本当は罠ではなくて、セキュリティ上の重要な役割を果たしてくれる存在であるSELinuxが今回は悪さをしていました。
SELinuxがphpの実行ユーザ(Apache?)にソケット通信を許可していなかったんです。

こういう思いもしないことって見つけるの難しいですね。。

解決方法は2つ

1.SELinuxの無効化

ちょっと乱暴だけど、そもそも外部からの侵入はないし、また別のところでトラブルを起こされたらかなわない!!という場合は、以下のようにして、SELinux自体を無効化してしまえます。
設定を反映させるにはサーバの再起動が必要みたいです。

一時的に無効化したいときは以下。
こちらは即時反映されます!

ちなみに、SELinuxの状態を確認したいときは以下のコマンド。

2.SELinuxの設定変更

今回の問題だけを解決したいときは、以下のコマンドでOK。

これで、phpでfsockopenを使ってもエラーは起きなくなります。
ちなみに、設定が有効になっているかを確認するには以下のコマンドです!

おしまい

思ってもみないところでハマることがあると勉強になりますね。ということで、SELinuxに関する勉強もしたいと思った次第です!

  • ■ システムの科学
    システム創成学科のシミュレーションコース的にはバイブル的存在であったと認識しております(笑)社会システムや人工物をどのように設計していくかについて俯瞰的に書かれているので、自分の思考のフレームができます。
PAGE TOP ↑