Подтвердить что ты не робот

Докер: Nginx и php5-fpm докеры не говорят

Мне нравится делать полностью доклерную установку Drupal. Мой первый шаг - получить контейнеры, работающие с Nginx и php5-fpm, и на основе Debian. Im на альфа-канале CoreOS (с использованием Digital Ocean.)

Мои файлы 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

Этот контейнер строит и работает красиво. Я вижу страницу Nginx по умолчанию на моем сервере ip.

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

Ad, тогда я запускаю Nginx, связанный с php5-fpm:

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

Кажется, что ссылка работает, есть запись в /etc/hosts с именем phpserver. Обе докеры запускаются:

[email protected] ~ $ 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 я изменил /etc/php 5/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>

Я сканировал порт 9000 с докеры Nginx, он выглядит закрытым. Разумеется, это хороший знак:

[email protected]:/# 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:

[email protected]:/# 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"

Да, это происходит не так, и я продолжаю получать ошибку 502 плохого шлюза при просмотре моего экземпляра Nginx.

Мой вопрос: что именно происходит не так? Я предполагаю, что Im пропустил некоторые настройки в конфигурационных файлах php.

ИЗМЕНИТЬ БОЛЬШЕ ДЕТАЛЕЙ: Это результат (изнутри контейнера php5-fpm, после установки сетевых инструментов apt-get):

root @3bd12b3761b9:/# netstat -tapen
Активные интернет-соединения
(серверы и установлены) Прото-Recv-Q Отправить-Q локальный адрес
Идентификатор PID/Название программы пользователя InDate для иностранных адресов

Изнутри контейнера Nginx:

root @fd1a9ae0f1dd:/# netstat -tapen
Активные интернет-соединения
(серверы и установлены) Proto Recv-Q Отправить-Q Локальный адрес Иностранный адрес Состояние пользователя Inode PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:*
LISTEN 0 1875387 -

EDIT2: Прогрессирование!

В контейнере php5-fpm в файле:

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

Я изменил аргумент listen от имени сокета до:

listen = 9000

Теперь, когда я иду на свою веб-страницу, я получаю сообщение об ошибке: Msgstr "Нет указанного файла ввода."

Наверное, у меня где-то есть. Я рассмотрю его более внимательно!

EDIT3:

Итак, я перестроил докеров с вышеупомянутыми изменениями, и кажется, что они говорят. Однако моя веб-страница говорит мне: "файл не найден". Я очень уверен, что это связано с документом, который nginx передает на php-fpm, но я не знаю, как это должно выглядеть. Я использовал значения по умолчанию при использовании метода сокета, который всегда работал. Теперь это больше не работает. Что должно быть в /etc/nginx/sites -enabled/default по адресу ~.php ${?

4b9b3361

Ответ 1

Причина, по которой она не работает, заключается в том, что, как вы обнаружили, nginx отправляет путь PHP файла в PHP-FPM, а не сам файл (что было бы весьма неэффективно). Решение состоит в том, чтобы использовать третий, только для данных контейнер VOLUME для размещения файлов, а затем монтировать его на обоих экземплярах докеров.

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

Создайте вышеуказанный файл Docker и создайте экземпляр (вызовите его, например: storage-www), затем запустите оба контейнера nginx и PHP-FPM с помощью опции:

--volumes-from storage-www

Это будет работать, если вы запустите оба контейнера на одном физическом сервере. Но вы все равно можете использовать разные серверы, если вы поместите этот контейнер только для данных в сетевую файловую систему, такую ​​как GlusterFS, которая достаточно эффективна и может быть распределена по крупномасштабной сети.

Надеюсь, что это поможет.

Обновление

По состоянию на 2015 год наилучшим способом создания постоянных связей между контейнерами является использование docker-compose.

Ответ 2

Итак, я протестировал все настройки, и никто не работал между докеры, пока они работали с теми же настройками на 1 сервере (или, возможно, в одной докере). Затем я узнал, что php-fpm не принимает php файлы из nginx, он получает путь, если он не может найти тот же файл в своем собственном контейнере, он генерирует "файл не найден". См. Здесь для получения дополнительной информации: https://code.google.com/p/sna/wiki/NginxWithPHPFPM Так что, к сожалению, проблема решается, но не проблема. Это довольно неприятно для людей, которые хотят выполнять балансировку нагрузки с несколькими серверами php-fpm, им нужно было бы rsync все или что-то в этом роде. Надеюсь, когда-нибудь я найду лучшее решение. Thanx для ответов.

EDIT: Возможно, я смогу установить один и тот же объем в обоих контейнерах и заставить его работать таким образом. Это не будет решением при использовании нескольких серверов.

Ответ 3

Когда вы находитесь в контейнере как

корень @fd1a9ae0f1dd:/# , проверьте порты, используемые с

netstat -tapen | grep ": 9000"

или

netstat -lntpu | grep ": 9000"

или те же команды без grep