CRMEB PHP多商户版DOCKER部署实战
#首先,制作docker 镜像#
官方有一个镜像,但是拉不来下,也不知道是没是没有维护,嘎了。只能自己动手做一个。
这里选择ubuntu 24 为基础,制作crmeb-mer的镜像,Dockerfile内容如下:
# 使用官方的Ubuntu 24.04镜像作为基础镜像
FROM ubuntu:24.04# 设置环境变量以避免交互式配置工具
ENV DEBIAN_FRONTEND=noninteractive# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \echo "Asia/Shanghai" > /etc/timezone# 更新包列表并安装必要的软件包
RUN apt-get update && \apt-get install -y software-properties-common ca-certificates nginx supervisor && \add-apt-repository ppa:ondrej/php && \apt-get update && \apt-get install -y \php7.4 \php7.4-cli \php7.4-fpm \php7.4-dev \php7.4-bcmath \php7.4-soap \php7.4-intl \php7.4-readline \php7.4-ldap \php7.4-msgpack \ php7.4-igbinary \php7.4-mysql \php7.4-pgsql \php7.4-gd \php7.4-imagick \php7.4-curl \php7.4-mbstring \php7.4-xml \php7.4-zip \php7.4-redis \php7.4-memcached \php7.4-amqp \git \unzip \curl \&& pecl install swoole-4.8.13 \&& echo "extension=swoole.so" > /etc/php/7.4/mods-available/swoole.ini \&& phpenmod swoole \&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \&& apt-get -y autoremove \&& apt-get clean \&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*COPY swoole_loader74.so /usr/lib/php/20190902
RUN echo "extension=swoole_loader74.so" > /etc/php/7.4/mods-available/swoole_loader.ini \&& phpenmod swoole_loader # 确保目录存在
RUN mkdir -p /run/php \&& chown -R www-data:www-data /run/php# 设置工作目录
WORKDIR /var/www/html# 设置权限
RUN chown -R www-data:www-data /var/www/html# 配置 Nginx
COPY nginx.conf /etc/nginx/nginx.conf
COPY default /etc/nginx/sites-available/default# 配置 Supervisor
COPY supervisord.conf /etc/supervisord.conf
COPY crmeb_swoole.conf /etc/supervisor/conf.d
COPY crmeb_queue.conf /etc/supervisor/conf.d# 暴露默认的PHP-FPM端口
EXPOSE 80# 启动 Supervisor
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
执行编译命令:
docker build -t my-crmeb:7.4 .
#下面来配置nginx#
nginx 配置文件nginx.conf如下:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;events {worker_connections 768;# multi_accept on;
}http {### Basic Settings##sendfile on;tcp_nopush on;types_hash_max_size 2048;server_tokens off;# server_names_hash_bucket_size 64;# server_name_in_redirect off;include /etc/nginx/mime.types;default_type application/octet-stream;### SSL Settings##ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLEssl_prefer_server_ciphers on;### Logging Settings##access_log /var/log/nginx/access.log;### Gzip Settings##gzip on;gzip_vary on;gzip_proxied any;gzip_comp_level 6;gzip_buffers 16 8k;gzip_http_version 1.1;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;### Virtual Host Configs##include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
主要是打开了gzip设置。里面没用的注释直接删了吧。
配置默认站点, 文件default内容如下 :
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
### Default server configuration
#
server {listen 80;listen [::]:80;root /var/www/html/public;# Add index.php to the list if you are using PHPindex index.php;server_name localhost;add_header X-Frame-Options "SAMEORIGIN";add_header X-Content-Type-Options "nosniff";#location / {# # First attempt to serve request as file, then# # as directory, then fall back to displaying a 404.# try_files $uri $uri/ /index.php?$query_string;#}#PROXY-START/location ^~ /
{proxy_pass http://127.0.0.1:8324;proxy_http_version 1.1;proxy_read_timeout 360s; proxy_redirect off; proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";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 REMOTE-HOST $remote_addr;add_header X-Cache $upstream_cache_status;#Set Nginx Cacheset $static_fileLzXnun8E 0;if ( $uri ~* "\.(gif|png|jpg|css|js|woff|woff2)$" ){set $static_fileLzXnun8E 1;expires 12h;}if ( $static_fileLzXnun8E = 0 ){add_header Cache-Control no-cache;}
}#PROXY-END/charset utf-8;location = /favicon.ico { access_log off; log_not_found off; }location = /robots.txt { access_log off; log_not_found off; }error_page 404 /index.php;# pass PHP scripts to FastCGI server##location ~ \.php$ {# fastcgi_pass unix:/run/php/php7.4-fpm.sock;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;# include fastcgi_params;# fastcgi_hide_header X-Powered-By;#}#location ~ /\.(?!well-known).* {# deny all;#}access_log /var/log/nginx/app_access.log;error_log /var/log/nginx/app_error.log;}
这里注意location ~ \.php$ 的设置,普通的php-fpm配置在这里是不需要的,所有的PHP程序都通过swoole来解析。
#接着是supervisord服务#
supervisord.conf 内容如下:
[supervisord]
nodaemon=true
logfile=/var/log/nginx/supervisord.log
pidfile=/run/supervisord.pid#[program:php-fpm]
#command=/usr/sbin/php-fpm7.4 --nodaemonize --fpm-config /etc/php/7.4/fpm/php-#fpm.conf
#autostart=true
#autorestart=true
#stdout_logfile=/var/log/nginx/php-fpm.stdout.log
#stderr_logfile=/var/log/nginx/php-fpm.stderr.log[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
stdout_logfile=/var/log/nginx/nginx.stdout.log
stderr_logfile=/var/log/nginx/nginx.stderr.log[include]
files = /etc/supervisor/conf.d/*.conf
这里php-fpm服务被禁用了。因为用不着,所有代码都通过swoole解析。
crmeb需要建两个守护进程,按道理可以跟nginx一样,放到supervisord.conf文件,这里只是为了测试docker里supervisord能不能加载配置文件,所以多加了两个文件。
crmeb系统的启动,crmeb_swoole.conf配置如下:
[program:crmeb-swoole]
command=/usr/bin/php7.4 /var/www/html/think swoole restart
autostart=true
autorestart=true
stdout_logfile=/var/log/nginx/crmeb-swoole.stdout.log
stderr_logfile=/var/log/nginx/crmeb-swoole.stderr.log
crmeb的队列启动,crmeb_queue.conf配置如下:
[program:crmeb-queue]
command=/usr/bin/php7.4 /var/www/html/think queue:listen --tries=2
autostart=true
autorestart=true
stdout_logfile=/var/log/nginx/crmeb-queue.stdout.log
stderr_logfile=/var/log/nginx/crmeb-queue.stderr.log
这两个配置都放supervisord.conf文件里好了,反正supervisorctl也用不了。
#swoole#
制作镜像时还用到swoole_loader74.so文件,这个文件在crmeb程序的安装包里,位置:
crmeb_mer/install/swoole-loader/
找到对应自己PHP版本的swool-loader.so文件放到Dockerfile同级目录下。
#部署#
执行如下命令:
docker run -itd --name=crmeb-mer \
-v /data/etc/b2b/crmeb_supervisord:/etc/supervisor/conf.d \
-v /var/www/b2b/crmeb_mer:/var/www/html \
-v /data/log/crmeb:/var/log/nginx \
-p 83:80 \
my-crmeb:7.4
这里多挂载了一个/etc/supervisor/conf.d目录,因为前面说的,为了测试supervisord是否能加载多个配置文件。
所有的日志全部都重定向到了/var/log/nginx目录。
按上述操作,应该会得到一个正常运行的crmeb容器。
为了能让外网能访问,还需要在主机上做个反向代理。
这里只是让crmeb程序在docker里跑,mysql,redis还是在主机上安装配置的,并且主机上还安装了一套nginx,用来反向代理多个容器中的系统。
crmeb的nginx反向代理配置如下:
server {listen 80;server_name mer.mysite.com;charset utf-8;#access_log /var/log/nginx/host.access.log main;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000#location / {proxy_pass http://127.0.0.1:83;proxy_set_header Host $http_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;}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one#location ~ /\.(?!well-know).* {deny all;}}
域名绑定之后,外网即可正常访问crmeb系统。
-完-
相关文章:
CRMEB PHP多商户版DOCKER部署实战
#首先,制作docker 镜像# 官方有一个镜像,但是拉不来下,也不知道是没是没有维护,嘎了。只能自己动手做一个。 这里选择ubuntu 24 为基础,制作crmeb-mer的镜像,Dockerfile内容如下: # 使用官方…...
Node.js基础入门
1.Node.js 简介 Node 是一个让 JavaScript (独立)运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。 简单的说 Node.js 就是运行在服务端的…...
Hive——HQL数据定义语言
文章目录 Hive HQL数据查询语言更多大数据资源持续更新中。。。学习目标一、HQL数据定义语言(DDL)概述1、DDL语法的作用2、Hive中DDL使用☆ 创建数据库☆ 查询数据库☆ 切换数据库☆ 修改数据库☆ 删除数据库 二、Hive DDL建表基础1、完整建表语法树2、H…...
vLLM 教程上新!覆盖从入门到进阶 4 种应用方式;中文文档同步上线,0 帧起手加速大模型推理
如今,大语言模型 (LLM) 的发展正在从规模参数迭代升级拓展至应用场景的适配与创新,在这个过程中,其也暴露出一系列问题。例如,在推理环节的效率较低,处理复杂任务时耗时较长,难以满足对实时性要求较高的场景…...
Kubernetes# RBAC访问控制
目录 定义 配置对象 Role ClusterRole ServiceAccount RoleBinding ClusterRoleBinding 配置示例 定义 Kubernetes的运行是由多种类型的资源组合起来,每种资源各司其职完成整个集群的功能。那么自然也需要一套机制控制资源的访问权限,保证安全性…...
如何实现后端返回excel文件,在前端下载功能
前言 简单记录一下,excel文件导出下载功能 一、后端接口返回excel文件 把自己生成的workbook 以文件流的方式,返回前台 Workbook workbook employeeConfirmationDefectService.exportPoorPolishExcel(budatBegin, budatEnd, queryWrapper);//传输到…...
编程:一场不设防的智慧江湖
在数字的汪洋中,有一片从未设置年龄禁区的领地——编程世界。许多人会问:35岁了,还能学编程吗?答案是:不仅能学,还能学得很精彩。 时光荏苒,科技浪潮汹涌澎湃。曾经,人们以为编程是…...
电脑游戏运行时常见问题解析:穿越火线提示“unityplayer.dll丢失”的修复指南
电脑游戏运行时常见问题解析:穿越火线提示“unityplayer.dll丢失”的修复指南 在探索电脑游戏的无限乐趣时,我们时常会遇到一些不期而遇的挑战。今天,我们将聚焦于一个常见的游戏运行错误——穿越火线(或其他使用Unity引擎的游戏…...
【C++】CUDA线程在全局索引中的计算方式
文章目录 1. 一维网格一维线程块2. 二维网格二维线程块3. 三维网格三维线程块4. 不同组合形式4.1 一维网格一维线程块4.2 一维网格二维线程块4.3 一维网格三维线程块4.4 二维网格一维线程块4.5 二维网格二维线程块4.6 二维网格三维线程块4.7 三维网格一维线程块4.8 三维网格二维…...
【笔记】C语言转C++
网课链接:【C语言 转 C 简单教程】 https://www.bilibili.com/video/BV1UE411j7Ti/?p27&share_sourcecopy_web&vd_source4abe1433c2a7ef632aeed6a3d5c0b22a 网课老师B站id:别喷我id 视频总时长:01:55:27 以下笔记是我通过此网课整理 建议先…...
锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集
锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集 目录 锂电池SOH预测 | 基于BiGRU双向门控循环单元的锂电池SOH预测,附锂电池最新文章汇集预测效果基本描述程序设计参考资料 预测效果 基本描述 锂电池SOH预测 | 基于Bi…...
半导体器件与物理篇5 1~4章课后习题
热平衡时的能带和载流子浓度 例 一硅晶掺入每立方厘米10^{16}个砷原子,求室温下(300K)的载流子浓度与费米能级。 需要用到的公式包括1.本征载流子浓度公式 2.从导带底算起的本征费米能级 2.从本征费米能级算起的费米能级 载流子输运现象 例1:计算在300K下&#x…...
Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告Gherkin格式命令行报告
Pytest-Bdd-Playwright 系列教程(16):标准化JSON报告&Gherkin格式命令行报告 前言一、创建Feature文件二、创建步骤定义文件三、生成Cucumber格式的JSON报告四、使用Gherkin格式的命令行报告五、将BDD报告集成到Jenkins中总结 前言 在自动…...
机器学习之学习范式
机器学习的四种主要范式分别是:监督学习、非监督学习、强化学习和半监督学习。以下是每种范式的详细介绍: 1. 监督学习(Supervised Learning) 定义: 通过已标注的数据训练模型,以预测或分类未知数据。 目…...
PHPstudy中的数据库启动不了
法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql...
鸿蒙开发-ArkTS 创建自定义组件
在 ArkTS 中创建自定义组件是一个相对简单但功能强大的过程。以下是如何在 ArkTS 中创建和使用自定义组件的详细步骤: 一、定义自定义组件 使用Component注解:为了注册一个组件,使其能够在其他文件中被引用,你需要使用Component…...
记录学习《手动学习深度学习》这本书的笔记(五)
这一章是循环神经网络,太难了太难了,有很多卡壳的地方理解了好久,比如隐藏层和隐状态的区别、代码的含义(为此专门另写了一篇【笔记】记录对自主实现一个神经网络的步骤的理解)、梯度计算相关(【笔记】记录…...
【Qt】Qt+Visual Studio 2022环境开发
在使用Qt Creator的过程中,项目一大就会卡,所以我一般都是用VS开发Cmake开发, 在上一篇文章中,我已经安装了CMake,如果你没有安装就自己按一下。 记得配置Qt环境变量,不然CMake无法生成VS项目:…...
云计算HCIP-OpenStack04
书接上回: 云计算HCIP-OpenStack03-CSDN博客 12.Nova计算管理 Nova作为OpenStack的核心服务,最重要的功能就是提供对于计算资源的管理。 计算资源的管理就包含了已封装的资源和未封装的资源。已封装的资源就包含了虚拟机、容器。未封装的资源就是物理机提…...
HCIA-Access V2.5_3_2_VLAN数据转发
802.1Q的转发原则--Access-Link 首先看一下Access,对于Access端口来说, 它只属于一个VLAN,它的VLANID等于PVID。 首先看一下接收方向,前面说过交换机内部一定要带标签转发,所以当交换机接收到一个不带tag的数据帧时,会给它打上端…...
【论文速递】BubbleRAG:为“黑盒”知识图谱打造高召回、高精度的证据检索引擎
黑盒知识图谱检索中的三个挑战:语义实例化不确定性、结构路径不确定性、证据比较不确定性 01 研究背景 在复杂问答(如多跳推理、专家识别)任务中,基于知识图谱(KG)的检索增强生成(RAG&#x…...
坚定信心,顺势而为 ——中国企业出海与人工智能时代语言服务行业的新机遇
坚定信心,顺势而为——中国企业出海与人工智能时代语言服务行业的新机遇前言人工智能技术的逐步成熟以及智能体的普遍应用是最近两三年的热点和趋势,很多人说,2026年是智能体爆发的元年。春节期间,豆包、千问、元宝等50亿元的红包…...
新手入门服务器:用快马生成你的第一个xshell等效连接程序
作为一个刚接触服务器运维的新手,第一次使用xshell这类工具时,面对各种专业术语和复杂操作确实容易一头雾水。最近我发现用InsCode(快马)平台生成学习项目特别适合入门,今天就分享一下如何通过可运行的代码实例来理解SSH连接的核心概念。 理解…...
AI艺术创作大赛:Shadow Sound Hunter生成作品展示
AI艺术创作大赛:Shadow & Sound Hunter生成作品展示 1. 引言 最近参加了一场AI艺术创作大赛,用Shadow & Sound Hunter模型生成了不少有意思的作品。这个模型在数字绘画、诗歌创作和音乐编曲方面都表现出色,让我看到了AI在艺术创作领…...
EasyAnimateV5-7b-zh-InP在AI艺术创作中的算法优化实践
EasyAnimateV5-7b-zh-InP在AI艺术创作中的算法优化实践 1. 引言 作为一名数字艺术创作者,我一直在寻找能够提升创作效率和质量的技术工具。最近在尝试使用EasyAnimateV5-7b-zh-InP进行艺术创作时,发现这个模型在图像到视频的转换方面表现出色ÿ…...
经典35kW V型磁钢永磁同步电机设计:基于Maxwell的成熟方案解析
基于Maxwell设计的 经典35kW,外径290 轴向长度88 3000RPM,111.5Nm, 6极36槽永磁同步电机(PMSM)设计案例(V型磁钢),该案例已制作样机,方案成熟,运行稳定,可直接用于生产,…...
Klipper温度曲线优化终极指南:三步解决95%打印质量问题
Klipper温度曲线优化终极指南:三步解决95%打印质量问题 【免费下载链接】klipper Klipper is a 3d-printer firmware 项目地址: https://gitcode.com/GitHub_Trending/kl/klipper 你是否曾为PLA打印翘边、ABS层间开裂或PETG拉丝问题而烦恼?这些问…...
【SOC锁死SPORT、ECO不生效?10年VCU老兵:模式管理不是切个开关那么简单!】
SOC锁死SPORT、ECO不生效?10年VCU老兵:模式管理不是切个开关那么简单! 副标题:10年老兵深度拆解 | 标定测试故障产品定义 作者 新能源汽车研发测试 10 年高级工程师 关键词 #VCU车辆模式管理#驾驶模式切换逻辑#SOC阈值标定#扭矩Map#VCU测试标定#新能源三电测试#整车能…...
【实战】CodeBuddy使用技巧:5个Skills让编程效率翻倍的隐藏操作
目录摘要一、CodeBuddy不只是代码补全1.1 三种形态,覆盖全开发场景1.2 核心差异化二、Craft模式:一句话从0到上线2.1 实测案例:20分钟出一个完整MVP2.2 多模型切换策略2.3 Figma设计稿一键转代码三、5个效率翻倍的独有技巧3.1 技巧1ÿ…...
决策树剪枝实战:用C++和Python分别实现,我踩过的坑你别再踩了
决策树剪枝实战:用C和Python分别实现,我踩过的坑你别再踩了 第一次在C里实现决策树剪枝时,内存泄漏让我调试到凌晨三点;而用Python重写时,又因为没注意NumPy的广播机制导致准确率计算全错。这篇文章记录了我从零实现两…...
