【问题标题】:docker + nginx + node.js + php-fpmdocker + nginx + node.js + php-fpm
【发布时间】:2020-09-12 06:43:30
【问题描述】:

每个人。

我在启动 Docker 容器时遇到了一些问题。 最后的任务是:

  • 带有 80 和 443 端口的 nginx 作为 localhost:3000 的反向代理(没关系);
  • 3000 端口的node.js 是前端(没关系);
  • 带有 9000 端口和 domain.con/api url 的 php-fpm(它不起作用);

所以,主要问题在于 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

【问题讨论】:

  • 为什么nginxapi 服务都有- ./api:/var/www 卷声明?这是一个错误,或者这背后的意图是什么?
  • 设置有四个不同的localhosts;当你说“去 localhost/api”时,你到底在打什么电话,从哪里来的?

标签: php node.js docker nginx


【解决方案1】:

我已经多次使用 apache 和 nginx 设置反向代理,我总是发现这个活动很耗时(不容易测试和调试)。

自从我开始使用 docker 和 docker-compose 以来,我找到了一种更简单的方法来设置反向代理服务,现在可以将时间花在应用程序上。这种简单的方法是在您的 docker compose 文件中使用 Traefik 服务:

version: "3"
services:

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

  backend:
    image: tutum/hello-world
    expose: 
      - 80
    labels:
      traefik.http.routers.back.rule: Path(`/api`)
      traefik.http.routers.back.middlewares: back-stripprefix
      traefik.http.middlewares.back-stripprefix.stripprefix.prefixes: /api

  frontend:
    image: nginx
    volumes: 
      - ./www:/usr/share/nginx/html/:ro
    expose:
      - 80
    labels:
      traefik.http.routers.front.rule: Path(`/`)



如您所见,所有反向代理规则都指定为目标容器上的标签。 Traefik 很好地完成了反向代理工作,正确处理了 HTTP/2、websockets、转发标头……这非常节省时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2022-09-26
    • 2018-07-17
    • 2020-12-15
    相关资源
    最近更新 更多