web-dev-qa-db-ja.com

CentOS 7でのHaproxyによるsystemctlとの奇妙な相互作用

systemctlによるhaproxyの実行は、手動で実行する場合とは異なります

  • 手動で開始すると、すべてが機能します。
  • systemctlを介して開始すると、haproxyはプロキシするサービスを見つけることができず、503で応答します。

Systemctlを介して開始したときの出力は次のとおりです。

> Sudo systemctl status  -l haproxy.service
haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled)
                Active: active (running) since Wed 2014-12-24 08:08:49 EST; 4min 59s ago
                Main PID: 20307 (haproxy)
                CGroup: /system.slice/haproxy.service
                └─20307 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid

                Dec 24 08:08:49 localhost.localdomain systemd[1]: Starting HAProxy Load Balancer...
                Dec 24 08:08:49 localhost.localdomain systemd[1]: Started HAProxy Load Balancer.

このように、haproxyは私のバックエンドに対して503とだけ言っています。

ここでhaproxyサービスを停止し、代わりに次のようにコマンドラインで手動で実行するとします。

Sudo /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid

それは私のサーバーにうまくプロキシします。

Yumを使用してhaproxyをインストールし、非常にシンプルな構成を使用しています。

# defaults above

frontend  main *:80
    default_backend app

backend app
    option httpclose
    option forwardfor
    server web1 127.0.0.1:8001

どんな違いがあるのでしょうか?私はデーモン化されたものとされていないものの両方を実行しようとしました。

これは、systemctlで実行した場合のログです。

Proxy app started.
127.0.0.1:44391 [24/Dec/2014:09:01:42.403] main app/web1 0/0/-1/-1/0 503 212 - - SC-- 0/0/0/0/3 0/0 "GET / HTTP/1.1"

これは手動で実行したときのログです:

Proxy app started.
127.0.0.1:44393 [24/Dec/2014:09:02:11.758] main app/web1 0/0/0/2/2 200 5699 - - ---- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

明確にするために、Sudoとhaproxyユーザーを使用して、デプロイユーザーとして127.0.0.1:8001を正常にカールできます。

詳細で編集

代わりにnginxをプロキシとして使用しようとしましたが、役に立ちませんでした。だから、ここで間違っているのは偶然ではありません。 nginxは502 Bad Gateway、およびログは言う:

2014/12/24 16:57:04 [crit] 23214#0: *1 connect() to 127.0.0.1:8001 failed (13: Permission denied) while connecting to upstream, client: 192.168.34.1, server: www.zombieclj.local, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8001/", Host: "www.zombieclj.local"

ええ、そうです、セキュリティに関する問題が発生しています。まだ127.0.0.1:8001に丸めることができます。ファイアウォールを停止しても何も変わりません。

6
Magnar

問題は、SELinuxがWebサーバーに限定されたポートのセットへのアウトバウンド接続を許可することだけでした。

次のようにして修正:

semanage port --add --type http_port_t --proto tcp 8001

semanageをインストールした後

yum install policycoreutils-python

Nodejs Nginxエラー:(13:権限が拒否されました)アップストリームへの接続中

6
Magnar

centos wiki にあるAudit2Allow関数を使用しました

ルールを確認します。

grep haproxy /var/log/audit/audit.log | audit2allow -m haproxy

ポリシーファイル(*.pp)を作成します。

grep haproxy /var/log/audit/audit.log | audit2allow -M haproxy

ここで、パッケージをインストールするときに、haproxy.ppファイルも含めて、selinuxにロードします。

semodule -i haproxy.pp

2
Jacob Evans