原部署方案在容器中包含了nginx,这个是不必须的,可以拿掉。现优化如下:
Dockerfile内容:
去掉了nginx内容。
# 使用官方的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/timezoneRUN mkdir -p /usr/src/swoole
COPY swoole-src/swoole-src-4.8.13 /usr/src/swoole# 更新包列表并安装必要的软件包
RUN apt-get update && \apt-get install -y software-properties-common ca-certificates 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 \openssl \libssl-dev \libcurl4-openssl-dev \&& cd /usr/src/swoole \&& phpize \&& ./configure --enable-openssl --enable-sockets --enable-http2 --enable-swoole-json --enable-swoole-curl \&& make -j$(nproc) \&& make install \&& 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/* /usr/src/swooleCOPY 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# 配置 Supervisor
COPY supervisord.conf /etc/supervisord.conf# 暴露CRMEB的端口
EXPOSE 20699# 启动 Supervisor
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]
supervisord.conf内容:
同样去掉了nginx的内容。
[supervisord]
nodaemon=true
logfile=/var/log/nginx/supervisord.log
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [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[program:crmeb-swoole]
command=/usr/bin/php7.4 /var/www/html/think swoole
autostart=true
autorestart=true
stdout_logfile=/var/log/nginx/crmeb-swoole.stdout.log
stderr_logfile=/var/log/nginx/crmeb-swoole.stderr.log
swoole的源代码需要准备好,解压到同级目录,注意调整目录结构。
swoole_loader74.so同样放在同级目录下。
编译镜像:
docker build -t crmeb_multi/PHP74:latest .
创建容器:
docker run -itd --name=crmeb-multi -v /var/www/CRMEB_MULTI_v3.1.1:/var/www/html -v /data/log/crmeb_multi:/var/log/nginx -p 20699:20699 crmeb_multi/PHP74:latest
下面配置宿主机的nginx,创建一个站点。
server {listen 80;server_name test.myweb.net;root /data/www/crmeb_multi/public;index index.php;charset utf-8;add_header X-Frame-Options "SAMEORIGIN";add_header X-Content-Type-Options "nosniff";#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;}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##PROXY-START/
location ~* \.(php|jsp|cgi|asp|aspx)$
{proxy_pass http://127.0.0.1:20699;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;
}
location /
{if (!-e $request_filename) {proxy_pass http://127.0.0.1:20699;}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 Cacheadd_header Cache-Control no-cache;expires 12h;
}
#PROXY-END/# deny access to .htaccess files, if Apache's document root# concurs with nginx's one#location ~ /\.(?!well-know).* {deny all;}#HTTPS的默认访问端口443。#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。#listen 443 ssl;#填写证书文件绝对路径#ssl_certificate cert/test.myweb.net.pem;#填写证书私钥文件绝对路径#ssl_certificate_key cert/test.myweb.net.key;#ssl_session_cache shared:SSL:1m;#ssl_session_timeout 5m;#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;#表示优先使用服务端加密套件。默认开启#ssl_prefer_server_ciphers on;}
最后讲两点:
1、容器中crmeb启动了两个服务,一个是swoole,一个是queue.
这里主要是用到了swoole的服务,端口是20699,crmeb版本不同端口号也不一样,需要注意看部署的文档。
容器端口暴露出来后就可以在nginx中做反向代理。
2、crmeb项目目录要挂载到容器中,那么nginx的主目录就应当是项目目录中的public目录,这一点不要搞错了。不然容器是找不到你传进来的文件路径的。
-结束-