能否在本地开发中混合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
相关产品推荐
相关产品推荐

