nginx и php-fpm в Docker

Я нахожусь в процессе Dockerising мой веб-сервер / PHP рабочий процесс.

Но так как я на Windows, мне нужно использовать виртуальную машину. Я выбрал boot2docker, который представляет собой Tiny Core Linux, работающий в Virtualbox и адаптированный для Docker.

Я выбрал три контейнера:

  • Nginx: официальный контейнер nginx;
  • jprjr / PHP-FPMконтейнер php-fpm;
  • MySQL: для баз данных.

В boot2docker, /www/ содержит мои веб-проекты и conf/, который имеет следующее дерево:

conf
│
├───fig
│       fig.yml
│
└───nginx
nginx.conf
servers-global.conf
servers.conf

Так как docker-compose недоступен для boot2docker, я должен использовать fig автоматизировать все. Вот мой fig.xml:

mysql:
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- 3306:3306

php:
image: jprjr/php-fpm
links:
- mysql:mysql
volumes:
- /www:/srv/http:ro
ports:
- 9000:9000

nginx:
image: nginx
links:
- php:php
volumes:
- /www:/www:ro
ports:
- 80:80
command: nginx -c /www/conf/nginx/nginx.conf

Вот мой nginx.conf:

daemon off;

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;

events {
worker_connections  1024;
}

http {
include       /etc/nginx/mime.types;
default_type  application/octet-stream;

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

sendfile        off;

keepalive_timeout  65;

index    index.php index.html index.htm;

include /www/conf/nginx/servers.conf;

autoindex on;
}

И servers.conf:

server {
server_name lab.dev;
root /www/lab/;

include /www/conf/nginx/servers-global.conf;
}

# Some other servers (vhosts)

И servers-global.conf:

listen 80;

location ~* \.php$ {
fastcgi_index   index.php;
fastcgi_pass    php:9000;
include         /etc/nginx/fastcgi_params;
fastcgi_param   SCRIPT_FILENAME     /srv/http$fastcgi_script_name;
}

Итак, проблема сейчас (извините за всю эту конфигурацию, я считаю, что это было необходимо, чтобы четко объяснить проблему): Если я получу доступ lab.dev, нет проблем (что показывает, что хост создан в Windows), но если я пытаюсь получить доступ lab.dev/test_autoload/, У меня есть File not found., Я знаю, это исходит от php-fpm не имея доступа к файлам, и журналы nginx подтверждают это:

nginx_1 | 2015/05/28 14:56:02 [error] 5#5: *3 FastCGI sent in stderr:
"Primary script unknown" while reading response header from upstream,
client: 192.168.59.3, server: lab.dev, request: "GET /test_autoload/ HTTP/1.1",
upstream: "fastcgi://172.17.0.120:9000", host: "lab.dev", referrer: "http://lab.dev/"

Я знаю что есть index.php в lab/test_autoload/ в обоих контейнерах я проверил. В nginx, это находится в /www/lab/test_autoload/index.php а также /srv/http/lab/test_autoload/index.php в php,

Я считаю, что проблема исходит от root и / или fastcgi_param SCRIPT_FILENAME, но я не знаю, как это решить.

Я пробовал много вещей, таких как изменение roots, используя rewrite правило, добавление / удаление некоторых /и т. д., но ничего не изменило.

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

4

Решение

Я наконец нашел ответ.

Переменная $fastcgi_script_name не учел рут (логично, как бы включил www/ иначе. Это означает, что глобальный файл не может работать. Пример :

# "generated" vhost
server {
server_name lab.dev;
root /www/lab/;

listen 80;

location ~* \.php$ {
fastcgi_index   index.php;
fastcgi_pass    php:9000;
include         /etc/nginx/fastcgi_params;
fastcgi_param   SCRIPT_FILENAME     /srv/http$fastcgi_script_name;
# I need to add /lab after /srv/http because it requests PHP to look at the root of the web files, not in the lab/ folder
# fastcgi_param   SCRIPT_FILENAME     /srv/http/lab$fastcgi_script_name;
}
}

Это означало, что я не мог написать lab/ только в одном месте мне нужно было писать в двух разных местах (root и fastcgi_param), поэтому я решил написать себе небольшой скрипт PHP, который использовал .json и превратил его в servers.conf файл. Если кто-то хочет взглянуть на это, просто спросите, будет приятно поделиться этим.

2

Другие решения

Здесь есть ошибка:

fastcgi_param   SCRIPT_FILENAME     /srv/http/$fastcgi_script_name;

Хорошая линия:

fastcgi_param   SCRIPT_FILENAME     /srv/http$fastcgi_script_name;

Это не одно и то же.

1

Ваш nginx.conf полностью пуст, где демон отключен;
пользовательская строка nginx, worker_processes и т. д. nginx требуется некоторый файл конфигурации перед запуском http.

В http conf тоже самое, что отсутствует mime types, default_type, конфигурация логов sendfile в on для boot2docker.

Ваша проблема явно не в Docker, а в конфигурации nginx. Протестировали ли вы ваше приложение с запущенной Docker, прежде чем использовать рис? Это сработало?

0
По вопросам рекламы [email protected]