Docker Compose编排物联网平台后端:Nginx+PHP-FPM+EMQX+InfluxDB一键部署实战

发布时间:2026/10/19 6:27:30

Docker Compose编排物联网平台后端:Nginx+PHP-FPM+EMQX+InfluxDB一键部署实战 Docker Compose编排物联网平台后端NginxPHP-FPMEMQXInfluxDB一键部署实战物联网平台后端涉及的服务组件多手动部署一次就得折腾半天。Nginx做反向代理PHP-FPM跑业务APIEMQX处理MQTT设备连接InfluxDB存时序数据Redis做缓存。每个组件单独装、单独配环境一换全得重来。Docker Compose能把这套东西用一份YAML文件定义清楚一条命令拉起来。本文分享沧州虎王科技在物联网平台部署中使用的Docker Compose编排方案经过生产环境验证可以直接拿去改。### 整体架构平台后端的服务拓扑| 服务 | 镜像 | 端口 | 职责 || — | — | — | — || Nginx | nginx:1.25-alpine | 80, 443 | 反向代理静态资源SSL终结 || PHP-FPM | php:8.2-fpm-alpine | 9000 | 业务API设备管理数据查询 || EMQX | emqx/emqx:5.4 | 1883, 8083, 18083 | MQTT Broker设备接入 || InfluxDB | influxdb:2.7 | 8086 | 时序数据存储 || Redis | redis:7-alpine | 6379 | 会话缓存设备状态 |Nginx对外暴露80/443端口所有外部请求经过它。设备端MQTT连接走1883端口直达EMQXWeb端WebSocket走Nginx代理到EMQX的8083端口。PHP-FPM只对内部网络开放不直接暴露。docker-compose.yml完整配置yamlversion: 3.8services: nginx: image: nginx:1.25-alpine container_name: iot-nginx restart: unless-stopped ports: - 80:80 - 443:443 volumes: - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./src:/var/www/html:ro - ./logs/nginx:/var/log/nginx - ./ssl:/etc/nginx/ssl:ro depends_on: - php-fpm networks: - iot-net php-fpm: build: context: ./php dockerfile: Dockerfile container_name: iot-php restart: unless-stopped volumes: - ./src:/var/www/html - ./php/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro environment: - DB_HOSTinfluxdb - DB_PORT8086 - DB_TOKEN${INFLUX_TOKEN} - DB_ORG${INFLUX_ORG} - DB_BUCKET${INFLUX_BUCKET} - REDIS_HOSTredis - REDIS_PORT6379 - MQTT_HOSTemqx - MQTT_PORT1883 depends_on: - influxdb - redis - emqx networks: - iot-net emqx: image: emqx/emqx:5.4 container_name: iot-emqx restart: unless-stopped ports: - 1883:1883 - 8083:8083 - 18083:18083 environment: - EMQX_NAMEiot-emqx - EMQX_HOSTemqx - EMQX_DASHBOARD__DEFAULT_PASSWORD${EMQX_DASHBOARD_PASSWORD} volumes: - emqx-data:/opt/emqx/data - emqx-etc:/opt/emqx/etc networks: - iot-net influxdb: image: influxdb:2.7 container_name: iot-influxdb restart: unless-stopped ports: - 8086:8086 environment: - DOCKER_INFLUXDB_INIT_MODEsetup - DOCKER_INFLUXDB_INIT_USERNAME${INFLUX_USER} - DOCKER_INFLUXDB_INIT_PASSWORD${INFLUX_PASSWORD} - DOCKER_INFLUXDB_INIT_ORG${INFLUX_ORG} - DOCKER_INFLUXDB_INIT_BUCKET${INFLUX_BUCKET} - DOCKER_INFLUXDB_INIT_ADMIN_TOKEN${INFLUX_TOKEN} volumes: - influxdb-data:/var/lib/influxdb2 networks: - iot-net redis: image: redis:7-alpine container_name: iot-redis restart: unless-stopped command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru ports: - 6379:6379 volumes: - redis-data:/data networks: - iot-netvolumes: emqx-data: emqx-etc: influxdb-data: redis-data:networks: iot-net: driver: bridge配置里有几个设计决策值得说明。第一PHP-FPM用自定义Dockerfile构建因为官方镜像不带PDO、Redis等扩展需要额外安装。第二所有敏感信息通过环境变量注入变量值放在同目录的.env文件里不写进docker-compose.yml。第三Nginx和PHP-FPM共享同一个代码卷./src但Nginx以只读方式挂载:ro防止Nginx意外修改代码。PHP-FPM的DockerfiledockerfileFROM php:8.2-fpm-alpineRUN apk add --no-cache \ libzip-dev \ libxml2-dev \ oniguruma-dev \ docker-php-ext-install \ pdo_mysql \ pdo \ simplexml \ zip \ opcache \ pecl install redis influxdb \ docker-php-ext-enable redis influxdbCOPY php.ini /usr/local/etc/php/conf.d/custom.iniWORKDIR /var/www/html这个Dockerfile基于Alpine Linux最终镜像体积约120MB。opcache默认启用对PHP API性能提升明显。influxdb扩展是PHP的原生InfluxDB客户端比用cURL手写HTTP请求效率高。### Nginx反向代理配置Nginx需要处理三类请求PHP API请求、MQTT WebSocket连接、静态资源。nginxupstream php-fpm { server php-fpm:9000;}upstream emqx-ws { server emqx:8083;}server { listen 80; server_name iot.example.com; location /static/ { root /var/www/html; expires 30d; access_log off; } location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php-fpm; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_read_timeout 30s; } location /mqtt { proxy_pass http://emqx-ws; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_read_timeout 300s; }}MQTT over WebSocket的配置最容易出错。proxy_set_header Upgrade和Connection这两个头必须加否则WebSocket握手会失败。proxy_read_timeout设到300秒因为MQTT连接是长连接默认的60秒超时会导致设备频繁断开重连。### .env环境变量文件bashINFLUX_USERadminINFLUX_PASSWORDChangeMeInProduction2026INFLUX_ORGhuwangkejiINFLUX_BUCKETiot_dataINFLUX_TOKENyour-influxdb-token-hereEMQX_DASHBOARD_PASSWORDChangeMeAlso2026.env文件不要提交到Git仓库加到.gitignore里。生产环境的密码和Token应该通过CI/CD流水线注入而不是写在文件里。一键启动与验证bashdocker compose up -ddocker compose psdocker compose logs -f php-fpm启动后用curl验证各服务是否正常bashcurl http://localhost/healthcurl http://localhost:8086/healthcurl http://localhost:18083/api/v5/statusdocker exec iot-redis redis-cli ping### PHP连接各服务的代码示例php?phpfunction writeDeviceData($deviceId, $field, $value) { $client new InfluxDB\Client(getenv(DB_HOST), getenv(DB_PORT)); $database $client-selectDB(getenv(DB_BUCKET)); $point new InfluxDB\Point( device_metrics, null, [device_id $deviceId], [$field floatval($value)], time() ); $database-writePoints([$point], InfluxDB\Database::PRECISION_SECONDS);}function setDeviceOnline($deviceId) { $redis new Redis(); $redis-connect(getenv(REDIS_HOST), getenv(REDIS_PORT)); $redis-setex(device:online:$deviceId, 300, json_encode([ last_seen date(c), ip $_SERVER[REMOTE_ADDR] ?? unknown ]));}function sendMqttCommand($deviceId, $command) { $mqtt new PhpMqtt\Client\MqttClient( getenv(MQTT_HOST), intval(getenv(MQTT_PORT)), php-backend- . uniqid() ); $mqtt-connect(); $mqtt-publish(device/$deviceId/cmd, json_encode($command), 1); $mqtt-disconnect();}这段代码展示了三个后端服务的调用方式。InfluxDB写数据点Redis设带过期时间的在线状态MQTT发布控制指令。实际项目中MQTT连接应该用连接池复用不要每次请求都新建连接。### 生产环境优化建议第一给PHP-FPM配置合理的进程数。默认的dynamic模式下pm.max_children设为50对于中小规模物联网平台够用。如果设备连接数超过5000建议改用static模式并把pm.max_children提到100-200同时给容器分配2GB以上内存。第二EMQX的连接数上限需要调整。默认配置支持10万连接但内存只有2GB的话实际能撑3-5万。在emqx.conf里修改node.process_limit和listeners.tcp.default.max_connections。第三InfluxDB的存储空间规划。1000台设备每秒上报一个数据点一天8640万条约占5GB存储。用InfluxDB的连续查询做自动降采样把超过7天的原始数据降精度到1分钟聚合。第四日志收集用ELK或者Loki别让日志文件在容器里无限增长。在docker-compose.yml里给每个服务加logging配置限制日志大小yamllogging: driver: json-file options: max-size: 10m max-file: 3虎王科技的物联网平台开源项目和更多部署实战经验可以在GitHubgithub.com/huwangkeji找到博客heicat.com上有Docker和PHP相关的技术笔记。
延伸阅读

更多相关文章

2026/10/19 6:52:46

网络小说改编短视频剧本:从文字到视觉的工程化转换指南

在实际内容创作领域,尤其是短视频和短剧赛道,将网络小说改编为剧本是一个高频且极具挑战性的需求。很多创作者面临的困境是:直接照搬原著,导致剧情节奏拖沓、信息冗余、语言风格不符,最终视频完播率低下。这背后涉及的…

2026/10/19 2:56:21

医院数字食堂系统演进:从单机版到3.0数据中台的技术路线

从技术视角看,医院数字食堂的三次迭代,本质上是一次系统架构的演进:从单机工具,到多系统并存的烟囱式架构,再到以数据中台为核心的一体化平台。理解这条技术路线,对信息科做选型评估很有参考价值。1.0阶段&…

2026/10/14 13:57:57

Slopsmith-Desktop 信号链快速上手:5步把吉他音色排列出来

Slopsmith-Desktop 信号链快速上手:5步把吉他音色排列出来 【免费下载链接】slopsmith-desktop Cross-platform desktop app for interactive full-band music notation — built-in VST hosting, amp modeling (NAM), and low-latency audio I/O 项目地址: https…

2026/10/19 13:59:18

open-code-review:基于CLI与LLM Agent的自动化代码评审新范式

1. 什么是 open-code-review:一个被严重低估的工程实践新范式“open-code-review”这个词最近在开发者社区里频繁出现,但它不是某个具体工具的名字,也不是某家公司的私有产品,而是一种正在快速成型的、以开放性、自动化和可追溯性…

2026/10/19 13:59:18

人工智能读书报告资源:从文献综述到知识图谱的实践指南

简介:这份人工智能读书报告以docx文档形式呈现,面向人工智能初学者、高校学生及希望系统梳理AI知识脉络的读者,帮助其在较短时间内建立对人工智能发展史、基本方法与典型应用的完整认知。压缩包内共1个docx文件,整体约19KB&#x…

2026/10/19 13:59:18

Toonflow GPU推理优化:显存压降40%与1080P视频卡通化提速

Toonflow 跑通 demo 很容易,难的是让它稳定地跑在 24GB 显存的卡上,还能保证 1080P 视频不爆显存。过去两个月,我把精力几乎全压在它的 GPU 推理与显存管理上,目标说得很朴素:1080P 视频卡通化吞吐提升 50% 以上&#…

2026/10/19 13:59:18

开放式代码审查实践:流程搭建、分支保护与自动化门禁

1. 为什么"开放式"代码审查值得认真对待1.1 审查的核心收益:知识复制,而不只是拦截缺陷我在两个文化完全不同的团队待过,对code review这件事的认知差点被带到沟里。第一个团队把code review当成"合代码前的最后一道关卡"…

2026/10/19 13:59:18

VDA 6.3第四版过程审核知识地图:从P1到P7的复习笔记

简介:VDA 6.3-2023红皮中文版(扫描)过程审核第四版,是德国汽车工业协会发布的汽车供应链质量控制与过程审核标准文件,面向汽车制造商、零部件供应商的质量工程师、审核员及体系管理人员,用于指导过程审核的…

2026/10/19 13:54:17

open-code-review 实战:打造高效自动化代码评审工作流

## 1. 项目概述:为什么团队需要一套“开放”的代码评审方案代码评审这件事,说起来简单,做起来全是坑。我在一线写过代码、带过团队,也见过太多次这样的场景:一个功能分支开发了两周,提了 Merge Request&…

2026/10/18 0:01:50

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/19 0:04:56

悟空开源无代码平台实战:从实体建模到应用设计避坑指南

简介:基于悟空开源无代码平台的多种应用设计源码,面向希望在不编写代码的情况下快速搭建CRM、HRM、财务系统、ERP、SRM等业务应用的企业与技术人员,通过拖放式界面和内置模板即可完成应用定制与部署。压缩包共697个文件,约10.74MB…

2026/10/19 0:04:56

基于.NET9的多租户权限系统:数据权限与动态API落地实践

简介:这份资源是一套面向 .NET 与 Vue 全栈开发者的中台权限管理系统,后端基于 .Net9,前端采用 Vue3 Element Plus,并配套 uniapp uviewui 移动端方案,实现前后端分离。系统覆盖多租户隔离、数据权限、动态 Api、任务…

2026/10/19 0:04:56

场地预约小程序毕设实战:SSM+微信小程序+MySQL数据库设计到避坑

简介:面向毕业设计场景的场地预约小程序完整项目,基于微信小程序SSMMySql技术栈开发,适合计算机相关专业学生作为选题参考、功能扩展或二次开发起点。系统实现场地类型管理、场地管理、预约管理、取消申请与押金退回等功能,分为管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑