Я нахожусь в процессе Dockerising мой веб-сервер / PHP рабочий процесс.
Но так как я на Windows, мне нужно использовать виртуальную машину. Я выбрал boot2docker, который представляет собой Tiny Core Linux, работающий в Virtualbox и адаптированный для Docker.
Я выбрал три контейнера:
В 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
, но я не знаю, как это решить.
Я пробовал много вещей, таких как изменение root
s, используя rewrite
правило, добавление / удаление некоторых /
и т. д., но ничего не изменило.
Опять же, извините за весь этот конфиг, но я думаю, что это было необходимо для описания среды, в которой я нахожусь.
Я наконец нашел ответ.
Переменная $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
файл. Если кто-то хочет взглянуть на это, просто спросите, будет приятно поделиться этим.
Здесь есть ошибка:
fastcgi_param SCRIPT_FILENAME /srv/http/$fastcgi_script_name;
Хорошая линия:
fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name;
Это не одно и то же.
Ваш nginx.conf полностью пуст, где демон отключен;
пользовательская строка nginx, worker_processes и т. д. nginx требуется некоторый файл конфигурации перед запуском http.
В http conf тоже самое, что отсутствует mime types, default_type, конфигурация логов sendfile в on для boot2docker.
Ваша проблема явно не в Docker, а в конфигурации nginx. Протестировали ли вы ваше приложение с запущенной Docker, прежде чем использовать рис? Это сработало?