docker + nginx + node.js + php-fpm - PullRequest
       0

docker + nginx + node.js + php-fpm

0 голосов
/ 03 марта 2019

каждый.

У меня проблемы с запуском контейнеров Docker.Последнее задание:

  • nginx с 80 и 443 портами в качестве обратного прокси для localhost: 3000 (это нормально);
  • node.js с портом 3000 является внешним (это нормально));
  • php-fpm с портом 9000 и доменом.con / api url (он не работает);

Итак, основная проблема связана с nginx.conf:

upstream app {
    server app:3000;
}

server {
    listen 80;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    location / {
        try_files $uri @app;
    }

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

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

    location @app {
        proxy_pass http://app;
    }
}

Когда я пытаюсь добраться до localhost - все нормально, node.js работает нормально;Но когда я пытаюсь добраться до localhost / api - выдает ошибку, что файл не найден.

docker-compose выглядит так:

version: '3'
services:
    api:
        container_name: api
        build:
            context: ./api
            dockerfile: Dockerfile
        restart: unless-stopped
        volumes:
            - ./api:/var/www
            - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
        ports:
            - '9000:9000'
        networks:
            - app-network
    app:
        container_name: app
        build:
            context: ./app
            dockerfile: Dockerfile
        restart: always
        ports:
            - '3000'
        volumes:
            - ./app:/app
        networks:
            - app-network
    nginx:
        container_name: nginx
        image: nginx:alpine
        restart: unless-stopped
        volumes:
            - ./api:/var/www
            - ./nginx/:/etc/nginx/conf.d
        ports:
            - '80:80'
        depends_on:
            - app
            - api
        networks:
            - app-network
networks:
    app-network:
        driver: bridge

1 Ответ

0 голосов
/ 03 марта 2019

Я неоднократно настраивал обратные прокси-серверы с apache и nginx и всегда находил это занятие трудоемким (нелегко тестировать и отлаживать).

С тех пор, как я начал работать с докером и докером-создать, я нашел гораздо более простой способ настроить службу обратного прокси и теперь могу тратить свое время на приложения.Этот простой способ заключается в использовании службы Traefik в вашем файле компоновки Docker:

version: "3"
services:

  reverseproxy:  # see https://docs.traefik.io/#the-traefik-quickstart-using-docker
    image: traefik
    command: --docker
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

  backend:
    image: someapp
    expose: 
      - 8080
    labels:
      traefik.frontend.rule: PathPrefixStrip:/api
      traefik.port: 8080

  frontend:
    image: nginx
    volumes: 
      - ./www:/usr/share/nginx/html/:ro
    expose:
      - 80
    labels:
      traefik.frontend.rule: PathPrefixStrip:/
      traefik.port: 80

Как видите, все правила обратного прокси указаны как метки на целевых контейнерах.Traefik довольно хорошо выполняет работу с обратным прокси-сервером, правильно обрабатывая HTTP / 2, веб-сокеты, переадресацию заголовков, ... Это довольно экономит время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...