You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在本地开发中混合Traefik、NGINX与PHP-FPM并保留FastCGI支持?

如何混合使用Traefik、NGINX与PHP-FPM并保留FastCGI

我用docker-compose.yaml管理本地开发服务,新增了Traefik来处理域名解析,现有NGINX服务通过FastCGI关联PHP-FPM。想知道能否同时使用这三者,既利用Traefik的特性,又保留FastCGI的使用。


完全可以实现这种组合,且不存在矛盾。Traefik作为入口反向代理负责域名路由和外部请求转发,NGINX专注于静态文件处理和FastCGI转发给PHP-FPM,三者各司其职,是本地开发或生产环境中常见的架构。

1. 修正Traefik的基础配置

你的Traefik配置存在重复定义和端口映射错误,以下是修正后的完整配置:

version: '3'

networks:
  coolstuff-solutions:
    external: false  # 确保网络存在,若不存在会自动创建

services:
  traefik:
    image: "traefik:v2.6.0"
    container_name: coolstuff_solutions_traefik
    command:
      - "--log.level=DEBUG"
      - "--providers.docker"
      - "--api.dashboard=true"
      - "--entrypoints.web.address=:80"
      - "--accesslog.filepath=/data/access.log"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=coolstuff-solutions"
    ports:
      - "80:80"       # 外部请求入口
      - "8080:8080"   # Traefik Dashboard端口(原配置错误映射到80,改为8080)
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro  # 让Traefik能发现Docker服务
      - ./traefik-data:/data  # 挂载日志目录(需提前创建)
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik-dashboard.entrypoints=web"
      - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.coolstuff.localhost`)"
      - "traefik.http.routers.traefik-dashboard.service=api@internal"  # 关联内置的Dashboard服务
    networks:
      coolstuff-solutions:
        aliases:
          - traefik

2. 配置Traefik路由到NGINX

给NGINX服务添加Traefik路由标签,让Traefik将指定域名的请求转发到NGINX的80端口(NGINX已配置好FastCGI转发到PHP-FPM):

nginx:
  image: nginx:alpine
  container_name: coolstuff_solutions_nginx
  volumes:
    - ./app:/var/www
    - ./sys/nginx:/etc/nginx/conf.d/
  labels:
    - "traefik.enable=true"
    - "traefik.http.routers.nginx-web.entrypoints=web"
    - "traefik.http.routers.nginx-web.rule=Host(`coolstuff.localhost`)"
    - "traefik.http.services.nginx-web.loadbalancer.server.port=80"
  networks:
    coolstuff-solutions:
      aliases:
        - nginx

3. 调整PHP-FPM(App)服务配置

你的App服务是PHP-FPM,仅暴露9000端口处理FastCGI请求,无需配置Traefik路由(除非你需要直接通过域名访问FPM,这通常不需要)。简化后的App配置如下:

app:
  build:
    context: .
    dockerfile: sys/php/Dockerfile
  image: coolstuff_solutions:app
  container_name: coolstuff_solutions_app
  env_file:
    - app/.env
  environment:
    APP_NAME: "CoolStuff Solutions"
  working_dir: /var/www
  depends_on:
    - nginx
  volumes:
    - ./app:/var/www
    - ./app/var/:/var/www/var:rw
    - ./sys/php/default.ini:/usr/local/etc/php/conf.d/local.ini
  networks:
    coolstuff-solutions:
      aliases:
        - app

4. 保留NGINX的FastCGI配置

你的NGINX default.conf 配置已经正确,无需修改,它会将.php请求转发到PHP-FPM的9000端口:

server {
    listen 80;
    index index.php index.html;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/public;
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app: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 / {
        try_files $uri $uri/ /index.php?$query_string;
        gzip_static on;
    }
}

架构说明

  • Traefik:作为外部请求的唯一入口,根据域名规则将请求转发到对应的服务(这里主要是NGINX),同时提供Dashboard方便管理路由。
  • NGINX:接收Traefik转发的请求,处理静态文件,将PHP请求通过FastCGI转发给PHP-FPM。
  • PHP-FPM:专注执行PHP代码,无需暴露给外部,仅在Docker内部与NGINX通信。

这种架构既利用了Traefik强大的自动发现、域名路由能力,又保留了NGINX处理静态文件和FastCGI的成熟方案,完全没有冲突。

内容的提问来源于stack exchange,提问作者scruffycoder86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:23:09