Докер: докеры Nginx и php5-fpm не разговаривают
я хотел бы сделать полностью докеризованную установку Drupal. Мой первый шаг - запустить контейнеры с Nginx и php5-fpm на основе Debian. Я на альфа-канале CoreOS (используя цифровой океан.)
мои 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-ФПМ:
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. Оба докера бегут:
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;
(я добавил индекс.в 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;
}
в рнр5-бутадиен настройки я изменил файл /etc/php5 с/ФПМ/РНР.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
я также изменил индекс.html для индексирования.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, он кажется закрытым. Не очень хороший знак, конечно:
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"
Да, это идет не так, и я продолжаю получать 502 плохую ошибку шлюза при просмотре моего экземпляра Nginx.
мой вопрос: что именно идет не так? Я предполагаю, что мне не хватает некоторых настроек в файлах конфигурации php.
EDIT ДЛЯ ПОЛУЧЕНИЯ БОЛЕЕ ПОДРОБНОЙ ИНФОРМАЦИИ: Это результат (изнутри контейнера php5-fpm, после apt-get install net-tools):
root@3bd12b3761b9: / # netstat-tapen
Активный Интернет соединения
(серверы и установленные) Proto Recv-Q отправить-Q локальный адрес
Внешний адрес состояние пользователя индекс PID / имя программы
изнутри контейнера Nginx:
root@fd1a9ae0f1dd: / # netstat-tapen
Активные подключения к интернету
(серверы и установленные) Proto Recv-Q Send-Q локальный адрес внешний адрес состояние пользователя индекс PID / программа имя tcp 0 0 0.0.0.0:80 0.0.0.0:*
Слушайте 0 1875387 -
EDIT2: Прогрессия!
в контейнере php5-fpm, в файле:
/etc/php5/fpm/pool.d/www.conf
я изменил аргумент listen с некоторого имени сокета на:
listen = 9000
теперь, когда я иду на свою веб-страницу, Я получаю ошибку: - Входной файл не указан."
вероятно, у меня есть трейлинг / неправильно где-то. Я разберусь с этим подробнее. близко!
EDIT3:
поэтому я перестроил докеров с вышеупомянутыми изменениями, и кажется, что они говорят. Однако моя веб-страница говорит мне: "файл не найден." Я очень уверен, что это связано с документом, который nginx sents для php-fpm, но я понятия не имею, как он должен выглядеть. Я использовал по умолчанию при использовании метода сокета, который всегда работал. Теперь это больше не работает. Что должно быть в /etc/nginx/sites-enabled / default в разделе местоположение ~ .РНР$ { ?
3 ответов
причина, по которой он не работает, заключается в том, что, как вы обнаружили, nginx отправляет только путь PHP-файла PHP-FPM, а не сам файл (что было бы довольно неэффективно). Решение состоит в том, чтобы использовать третий контейнер томов только для данных для размещения файлов, а затем подключить его к обоим экземплярам docker.
FROM debian
VOLUME /var/www
CMD ['true']
создайте вышеупомянутый файл Dockerfile и создайте экземпляр (назовите его, например: storage-www), затем запустите контейнеры nginx и PHP-FPM с помощью вариант:
--volumes-from storage-www
это будет работать, если вы запустите обоих контейнеров на одном физическом сервере. Но вы все еще можете использовать разные серверы, если вы поместите этот контейнер только для данных в сетевую файловую систему, такую как GlusterFS, которая довольно эффективна и может быть распространена по крупномасштабной сети.
надеюсь, что это поможет.
обновление:
С 2015 года лучший способ сделать постоянные ссылки между контейнерами-использовать docker-compose.
Итак, я проверил все настройки, и никто не работал между докерами, пока они работали с теми же настройками на 1 сервере (или, возможно, в одном докере). Затем я узнал, что php-fpm не берет php-файлы из nginx, он получает путь, если он не может найти тот же файл в своем собственном контейнере, он генерирует "файл не найден". См. здесь для получения дополнительной информации:https://code.google.com/p/sna/wiki/NginxWithPHPFPM так что решает вопрос, но не проблему, к сожалению. Этот это довольно раздражает людей, которые хотят сделать балансировку нагрузки с несколькими серверами php-fpm, им придется rsync все или что-то в этом роде. Надеюсь, когда-нибудь я найду лучшее решение. Спасибо за ответы.
EDIT: возможно, я могу установить один и тот же Том в обоих контейнерах и заставить его работать таким образом. Однако это не будет решением при использовании нескольких серверов.
когда вы находитесь в контейнер
корень@fd1a9ae0f1dd:/# проверьте порты, используемые с
netstat-tapen / grep": 9000"
или
netstat-lntpu / grep": 9000"
или те же команды без grep