【问题标题】:How to route my php server through nginx using docker-compose?如何使用 docker-compose 通过 nginx 路由我的 php 服务器?
【发布时间】:2018-11-25 07:30:08
【问题描述】:

这是我第一次从头开始开发 docker 应用程序表单。当我从本地机器编辑代码时,我希望我的所有服务都从容器运行。

所以我有一个名为 test/ 的根文件夹,我想学习本教程 https://auth0.com/blog/developing-restful-apis-with-lumen/。所以我需要作曲家、一个网络服务器(nginx)和一个数据库(mysql)。

我在根文件夹中有一个 docker-compose 文件,如下所示:

version: '2'

services:

  composer:
    image: composer
    container_name: composer
    volumes:
      - ./authors:/app
    restart: always
    tty: true
    command: bash

  php:
    image: php:fpm
    container_name: php
    restart: always
    tty: true
    working_dir: /var/www
    volumes:
      - ./authors:/var/www
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=mysql"

  nginx:
    image: nginx
    container_name: nginx
    restart: always
    tty: true
    working_dir: /var/www
    volumes_from:
      - php
    volumes:
      - ./vhost.conf:/etc/nginx/conf.d/default.conf
    ports:
      - 8080:80

  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: hmh
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - dbdata:/var/lib/mysql

#Volumes
volumes:
  dbdata:

这里是用于nginx的配置文件:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:8000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

composer 容器在那里,因此我可以在需要时随时跳入并运行一些命令,同时还可以通过运行php -S localhost:8000 -t public 将项目从中提取出来,这实际上会登录到服务器正在运行的控制台,但是当我进入 localhost:8080 它只显示 nginx 欢迎屏幕。

所以我知道 nginx 正在工作,composer 让我做我需要的所有工作,但是我如何通过 nginx 路由 php 服务器?我可以进入 php 的容器,然后启动服务器,但是当转到 URL 时它不起作用。如果问的不多,我想要一些解释,而不仅仅是解决方案。谢谢。

【问题讨论】:

    标签: php docker docker-compose composer-php


    【解决方案1】:

    由于我无法按照我想要的方式配置 nginx,因此我使用 Apache2 服务器。这是我的撰写文件。

    version: '3'
    services:
      composer:
        build:
          context: .
          dockerfile: .docker/composer.dockerfile
        container_name: composer-php
        user: "${UID}:${GID}"
        volumes:
          - .:/app
        restart: always
        tty: true
        working_dir: /app
        command: bash
        environment:
          DB_CONNECTION: mysql
          DB_HOST: db
          DB_DATABASE: lumen
          DB_USERNAME: lumen
          DB_PASSWORD: lumen
    
      php:
        build:
          context: .
          dockerfile: .docker/php.dockerfile
        container_name: apache-php
        user: "${UID}:${GID}"
        depends_on:
          - db
        ports:
          - 8080:8080
        volumes:
          - .:/app
        restart: always
        tty: true
        working_dir: /app
        command: bash
        environment:
          DB_CONNECTION: mysql
          DB_HOST: db
          DB_DATABASE: lumen
          DB_USERNAME: lumen
          DB_PASSWORD: lumen
    
      db:
        image: mysql:5
        container_name: mysql-php
        restart: always
        tty: true
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: lumen
          MYSQL_USER: lumen
          MYSQL_PASSWORD: lumen
        ports:
          - "3306:3306"
        volumes:
          - dbdata:/var/lib/mysql
    
    volumes:
      dbdata:
    

    通过此设置,我可以按照本教程 https://auth0.com/blog/developing-restful-apis-with-lumen/ 毫无问题地测试我的设置。我修改官方图像只是为了安装 pdo pdo_mysql,这就是我的 dockerfiles 中用于此设置的所有内容。

    有了它,我可以进入 composer 容器,创建项目,然后离开该容器并移动到 php 容器,cd 进入项目,然后为项目提供服务。

    【讨论】:

      【解决方案2】:

      这里的问题是您的服务器在端口8000 上运行,但您的docker 仅支持端口80 通过 ports: - 8080:80

      nginx 也是如此: listen 80;

      【讨论】:

      • nginx 监听端口 80,ports 指令将主机的端口 8080 映射到 docker-container 的端口 80(nginx 监听的地方)。那部分完全没问题。 nginx 将请求传递到端口 8000 上的 php 容器(更快的是套接字)。由于我不知道容器的内部结构,我只能假设这是正确的,并且 fpm 实际上正在侦听端口 8000。但是 composer 容器中的内部服务器 php -S ... 从未映射到 nginx。这需要在 nginx 的配置中进行配置。
      • 是nginx的conf文件做的吗?
      猜你喜欢
      • 2018-05-09
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      相关资源
      最近更新 更多