nginx 上的不同路径映射 php-fpm 用于构建同一应用程序的多个变体

迪米特里奥斯·德西拉斯

在我的项目中,我需要构建同一应用程序的多个变体。因此我有这个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

我这样做的原因是我为https://hub.docker.com/r/ellakcy/moodle 中moodle所见创建了一个构建存储库因为我的计算机在 CPU 上的运行速度有些慢,因此我希望在构建每个变体时拥有更少的图像。所以我认为如果我有一个单一的 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变量而是直接指定路径。请记住,转发服务器中的路径应以/以下配置为INVALID结尾

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;
    }

相反,您应该使用:

D*:

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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章