web-dev-qa-db-ja.com

Docker:Nginxとphp5-fpmドッカーは話していません

完全にドッキングされたDrupalインストールを作成したい。最初のステップは、DebianベースのNginxとphp5-fpmでコンテナーを実行することです。CoreOSアルファチャネルを使用しています(Digitalを使用)海洋。)

私のDockerfilesは次のとおりです。

Nginx:

FROM debian
MAINTAINER fvhemert
RUN apt-get update && apt-get install -y nginx && echo "\ndaemon off;" >> /etc/nginx/nginx.conf
CMD ["nginx"]
EXPOSE 80

このコンテナは正常に構築および実行されます。サーバーのIPにデフォルトのNginxページが表示されます。

PHP5-fpm:

FROM debian
MAINTAINER fvhemert
RUN apt-get update && apt-get install -y \
            php5-fpm \
            && sed 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf
CMD ["php5-fpm"]
EXPOSE 9000

このコンテナも問題なくビルドされ、起動しても実行を続けます。

私は最初にphp5-fpmコンテナを次のように開始します。

docker run -d --name php5-fpm freek/php5-fpm:1

広告、次にphp5-fpmにリンクされたNginxを起動します。

docker run -d -p 80:80 --link php5-fpm:phpserver --name nginx freek/nginx-php:1

リンクは機能しているようです。/etc/hostsにphpserverという名前のエントリがあります。両方のドッカーが実行されます:

core@dockertest ~ $ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
fd1a9ae0f1dd        freek/nginx-php:4   "nginx"             38 minutes ago      Up 38 minutes       0.0.0.0:80->80/tcp   nginx
3bd12b3761b9        freek/php5-fpm:2    "php5-fpm"          38 minutes ago      Up 38 minutes       9000/tcp             php5-fpm

いくつかの設定ファイルを調整しました。 Nginxコンテナの場合、/ etc/nginx/sites-enabled/defaultを編集して、以下を変更しました。

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /usr/share/nginx/www;
        index index.html index.htm index.php;

(index.phpを追加しました)

そしてさらに:

location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
                fastcgi_pass phpserver:9000;
        #       # With php5-fpm:
        #       fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

Php5-fpm dockerで、/ etc/php5/fpm /php.iniを変更しました。

cgi.fix_pathinfo=0

php5-fpmの実行:

[21-Nov-2014 06:15:29] NOTICE: fpm is running, pid 1
[21-Nov-2014 06:15:29] NOTICE: ready to handle connections

また、index.htmlをindex.phpに変更しました。次のようになります(/usr/share/nginx/www/index.php):

<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>

<?php
phpinfo();
?>

</body>
</html>

Nginx Dockerから9000ポートをスキャンしましたが、閉じているように見えます。もちろん良い兆候ではありません:

root@fd1a9ae0f1dd:/# nmap -p 9000 phpserver

Starting Nmap 6.00 ( http://nmap.org ) at 2014-11-21 06:49 UTC
Nmap scan report for phpserver (172.17.0.94)
Host is up (0.00022s latency).
PORT     STATE  SERVICE
9000/tcp closed cslistener
MAC Address: 02:42:AC:11:00:5E (Unknown)

Nmap done: 1 IP address (1 Host up) scanned in 0.13 seconds

Nginxログ:

root@fd1a9ae0f1dd:/# vim /var/log/nginx/error.log
2014/11/20 14:43:46 [error] 13#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 194.171.252.110, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", Host: "128.199.60.95"
2014/11/21 06:15:51 [error] 9#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 145.15.244.119, server: localhost, request: "GET / HTTP/1.0", upstream: "fastcgi://172.17.0.94:9000", Host: "128.199.60.95"

はい、それはうまくいきません。Nginxインスタンスを参照すると、502の不正なゲートウェイエラーが発生し続けます。

私の質問は:何が正確にうまくいかないのですか?私の推測では、php設定ファイルにいくつかの設定がありません。

詳細を編集する:これは結果です(apt-get install net-toolsの後、php5-fpmコンテナー内から):

root @ 3bd12b3761b9:/#netstat -tapen
アクティブなインターネット接続
(サーバーおよび確立済み)Proto Recv-QSend-Qローカルアドレス
外部アドレス状態ユーザーiノードPID /プログラム名

Nginxコンテナの内部から:

root @ fd1a9ae0f1dd:/#netstat -tapen
アクティブなインターネット接続
(サーバーおよび確立済み)Proto Recv-QSend-Qローカルアドレス外部アドレス状態ユーザーiノードPID /プログラム名tcp0 0 0.0.0.0:80 0.0.0.0:*
聞く01875387-

EDIT2:プログレッション!

Php5-fpmコンテナのファイル:

/etc/php5/fpm/pool.d/www.conf

Listen引数をソケット名から次のように変更しました。

listen = 9000

Webページにアクセスすると、「入力ファイルが指定されていません」というエラーが表示されます。

おそらくどこかにトレーリング/間違っている。もっと詳しく調べてみます!

EDIT3:

だから私は上記の変更でドッカーを再構築しました、そして彼らは話しているようです。しかし、私のウェブページには「ファイルが見つかりません」と書かれています。 nginxがphp-fpmに送信するドキュメントに関係していると確信していますが、どのように表示されるかわかりません。常に機能するソケット方式を使用する場合は、デフォルトを使用しました。今ではもう動作しません。/etc/nginx/sites-enabled/defaultの場所〜.php $ {?

14
Freek

それが機能しない理由は、あなたがあなた自身を発見したように、nginxはファイル自体ではなくPHPファイルのパスをPHP-FPMに送信するだけです(これは非常に非効率的です)解決策は、3番目のデータのみのVOLUMEコンテナーを使用してファイルをホストし、それを両方のDockerインスタンスにマウントすることです。

FROM debian
VOLUME /var/www
CMD ['true']

上記のDockerfileをビルドし、インスタンスを作成し(たとえば、storage-wwwと呼びます)、オプションを指定してnginxコンテナーとPHP-FPMコンテナーの両方を実行します。

--volumes-from storage-www

これは、同じ物理サーバーで両方のコンテナーを実行する場合に機能します。ただし、GlusterFSなどのネットワーク化されたファイルシステムにデータ専用コンテナを配置すると、さまざまなサーバーを使用できます。これは非常に効率的で、大規模なネットワークに分散できます。

お役に立てば幸いです。

更新

2015年の時点で、コンテナー間に永続的なリンクを作成する最良の方法は、 docker-compose を使用することです。

15
niieani

したがって、私はすべての設定をテストしましたが、1つのサーバー(またはおそらく1つのDocker)で同じ設定で機能している間、Docker間で機能するものはありませんでした。次に、php-fpmがnginxからphpファイルを取得しておらず、パスを受信して​​いることがわかりました。独自のコンテナで同じファイルが見つからない場合は、「filenotfound」が生成されます。詳細については、こちらを参照してください: https://code.google.com/p/sna/wiki/NginxWithPHPFPM 残念ながら、これで問題は解決しますが、問題は解決しません。これは、複数のphp-fpmサーバーで負荷分散を行いたい人にとっては非常に厄介です。すべてをrsyncする必要があります。いつかもっと良い解決策が見つかることを願っています。返信ありがとうございます。

編集:おそらく、両方のコンテナーに同じボリュームをマウントして、そのように機能させることができます。ただし、複数のサーバーを使用する場合、これは解決策にはなりません。

2
Freek

あなたがあなたのコンテナにいるとき

root @ fd1a9ae0f1dd:/#、で使用されるポートを確認してください

netstat -tapen | grep ":9000"

または

netstat -lntpu | grep ":9000"

またはgrepなしの同じコマンド

1
user2915097