В моем проекте мне нужно создать несколько вариантов одного и того же приложения. Следовательно, у меня есть это docker-compose.yml:
version: '3.7'
services:
moodle_alpine_fpm_base:
build:
context: ../..
dockerfile: dockerfiles/fpm_alpine/Dockerfile_base
image: ellakcy/moodle:alpine_fpm_base
nginx:
image: nginx:alpine
ports:
- "7870:7870"
- "7871:7871"
- "7872:7872"
volumes:
- '../../conf/nginx/build/nginx_latest.conf:/etc/nginx/nginx.conf:ro'
- "mysql-www:/var/www/html/mysql"
- "mysql-data:/var/moodledata/mysql"
- "psql-www:/var/www/html/psql"
- "psql-data:/var/moodledata/psql"
- "psql-www:/var/www/html/mariadb"
- "psql-data:/var/moodledata/mariadb"
links:
- 'moodle_alpine_fpm_mysql'
- 'moodle_alpine_fpm_mariadb'
- 'moodle_alpine_fpm_psql'
#Mysql variant
moodle_mysql_alpine_db:
image: mysql:5.7
environment:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_ONETIME_PASSWORD: "yes"
MYSQL_DATABASE: "${MOODLE_DB_NAME}"
MYSQL_USER: '${MOODLE_MYSQL_USER}'
MYSQL_PASSWORD: '${MOODLE_MYSQL_PASSWORD}'
moodle_alpine_fpm_mysql:
build:
context: ../..
dockerfile: dockerfiles/fpm_alpine/Dockerfile_mysql
image: ellakcy/moodle:mysql_maria_fpm_alpine
links:
- "moodle_mysql_alpine_db:moodle_db"
- "moodle_alpine_fpm_base"
volumes:
- "mysql-www:/var/www/html"
- "mysql-data:/var/moodledata"
environment:
MOODLE_DB_HOST: "moodle_mysql_alpine_db"
MOODLE_DB_NAME: "${MOODLE_DB_NAME}"
MOODLE_DB_USER: '${MOODLE_MYSQL_USER}'
MOODLE_DB_PASSWORD: "${MOODLE_MYSQL_PASSWORD}"
MOODLE_ADMIN: "${MOODLE_ADMIN}"
MOODLE_ADMIN_PASSWORD: "${MOODLE_ADMIN_PASSWORD}"
MOODLE_URL: "http://0.0.0.0:7870"
#Mariadb for demοnstration
moodle_mariadb_alpine_db:
image: mariadb:10.2
environment:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MYSQL_ONETIME_PASSWORD: "yes"
MYSQL_DATABASE: "${MOODLE_DB_NAME}"
MYSQL_USER: '${MOODLE_MYSQL_USER}'
MYSQL_PASSWORD: '${MOODLE_MYSQL_PASSWORD}'
moodle_alpine_fpm_mariadb:
image: ellakcy/moodle:mysql_maria_fpm_alpine
links:
- "moodle_mariadb_alpine_db:moodle_db"
- "moodle_alpine_fpm_base"
volumes:
- "mariadb-www:/var/www/html"
- "mariadb-data:/var/moodledata"
environment:
MOODLE_DB_HOST: "moodle_mariadb_alpine_db"
MOODLE_DB_NAME: "${MOODLE_DB_NAME}"
MOODLE_DB_USER: '${MOODLE_MYSQL_USER}'
MOODLE_DB_PASSWORD: "${MOODLE_MYSQL_PASSWORD}"
MOODLE_ADMIN: "${MOODLE_ADMIN}"
MOODLE_ADMIN_PASSWORD: "${MOODLE_ADMIN_PASSWORD}"
MOODLE_URL: "http://0.0.0.0:7871"
#Postgresql
moodle_psql_alpine_db:
image: postgres
environment:
POSTGRES_DB: "${MOODLE_DB_NAME}"
POSTGRES_USER: '${MOODLE_MYSQL_USER}'
POSTGRES_PASSWORD: '${MOODLE_MYSQL_PASSWORD}'
moodle_alpine_fpm_psql:
build:
context: ../..
dockerfile: dockerfiles/fpm_alpine/Dockerfile_postgresql
image: ellakcy/moodle:postgresql_fpm_alpine
links:
- "moodle_psql_alpine_db:moodle_db"
- "moodle_alpine_fpm_base"
volumes:
- "psql-www:/var/www/html"
- "psql-data:/var/moodledata"
environment:
MOODLE_DB_HOST: "moodle_psql_alpine_db"
MOODLE_DB_NAME: "${MOODLE_DB_NAME}"
MOODLE_DB_USER: '${MOODLE_MYSQL_USER}'
MOODLE_DB_PASSWORD: "${MOODLE_MYSQL_PASSWORD}"
MOODLE_ADMIN: "${MOODLE_ADMIN}"
MOODLE_ADMIN_PASSWORD: "${MOODLE_ADMIN_PASSWORD}"
MOODLE_URL: "http://0.0.0.0:7072"
volumes:
mariadb-www:
mariadb-data:
mysql-www:
mysql-data:
psql-www:
psql-data:
В моем nginx.conf есть следующая настройка:
events {
worker_connections 768;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
charset utf-8;
gzip on;
gzip_disable "msie6";
client_max_body_size 10000M;
server {
listen 7870;
server_name _;
proxy_redirect off;
root /var/www/html/mysql;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /var/www/html;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass moodle_alpine_fpm_mysql:9000;
}
location /dataroot/ {
internal;
alias /var/moodledata/mysql/;
}
}
server {
listen 7871;
server_name _;
proxy_redirect off;
root /var/www/html/mariadb;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /var/www/html;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass moodle_alpine_fpm_mariadb:9000;
}
location /dataroot/ {
internal;
alias /var/moodledata/mariadb/; # ensure the path ends with /
}
}
server {
listen 7872;
server_name _;
proxy_redirect off;
root /var/www/html/psql;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /var/www/html;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass moodle_alpine_fpm_psql:9000;
}
location /dataroot/ {
internal;
alias /var/moodledata/psql/; # ensure the path ends with /
}
}
}
Как вы можете видеть на каждом контейнере, кроме баз данных и nginx, файлы php расположены в /var/www/data, а внутри nginx один находится в подпапке /var/www/html.
Причина, по которой я это делаю, заключается в том, что я создаю репозиторий сборки для moodle, как показано в https://hub.docker.com/r/ellakcy/moodle. Поскольку мой компьютер несколько медленнее по мощности процессора, поэтому я хотел иметь меньше изображений при сборке каждого варианта. Поэтому я подумал, что было бы проще, если бы у меня был один образ nginx для обслуживания всех вариантов php-fpm, чтобы публиковать их.
В моей попытке, хотя я получаю следующее сообщение об ошибке:
nginx_1 | 2019/07/21 19:55:46 [error] 6#6: *6 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.22.0.1, server: _, request: "GET / HTTP/1.1", upstream: "fastcgi://172.22.0.5:9000", host: "0.0.0.0:7870"
Поэтому я задался вопросом, как я могу сказать fastcgi не «сопоставлять» путь с другим?






Ваш конфиг должен быть:
events {
worker_connections 768;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
charset utf-8;
gzip on;
gzip_disable "msie6";
client_max_body_size 10000M;
server {
listen 7870;
server_name _;
proxy_redirect off;
root /var/www/html/mysql;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /var/www/html;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
fastcgi_pass moodle_alpine_fpm_mysql:9000;
}
location /dataroot/ {
internal;
alias /var/moodledata/mysql/;
}
}
server {
listen 7871;
server_name _;
proxy_redirect off;
root /var/www/html/mariadb;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /var/www/html/;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
fastcgi_pass moodle_alpine_fpm_mariadb:9000;
}
location /dataroot/ {
internal;
alias /var/moodledata/mariadb/; # ensure the path ends with /
}
}
server {
listen 7872;
server_name _;
proxy_redirect off;
root /var/www/html/psql;
index index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /var/www/html/;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
fastcgi_pass moodle_alpine_fpm_psql:9000;
}
location /dataroot/ {
internal;
alias /var/moodledata/psql/; # ensure the path ends with /
}
}
}
Как видите, мы не используем переменную $dataroot, вместо этого мы указываем путь напрямую. Имейте в виду, что путь на сервере репостов должен заканчиваться на / Итак, следующий конфиг — НЕВЕРНЫЙ:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /var/www/html/;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_pass moodle_alpine_fpm_psql:9000;
}
Вместо этого вы должны использовать:
Д*:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_index index.php;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param DOCUMENT_ROOT /var/www/html/;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
fastcgi_pass moodle_alpine_fpm_psql:9000;
}
Обратите внимание на разницу между:
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;