当前位置: 首页 > news >正文

fedora 安装php yaf,构建基于nginx-php-yaf的docker镜像

17270ce95af85a4a2d33846cd5831d99.png

需求 : php7.1 + nginx

php扩展: yaf、redis、ldap、pdo、mbstring、 mcrypt

阅读完本文后,你能解决以下常见问题:

如何写Dockerfile,并通过Dockerfile构建镜像。

如何通过supervisord管理进程,并将进程日志通过docker logs {container}输出

实现步骤

我们的镜像基于centos:7系统, Dockerfile代码如下:

FROM centos:7

MAINTAINER zhaowei@outlook.com

RUN rpm -Uvh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \

&& rpm -Uvh https://sp.repo.webtatic.com/yum/el7/webtatic-release.rpm \

&& yum update -y \

&& yum install -y wget \

sed \

gcc \

gcc-c++ \

gd \

gd-devel \

gmp-devel \

epel-release \

net-tools \

ntpdate \

ntp \

openssh-clients \

curl \

crontabs \

openssl \

openssl-devel \

nginx \

squid \

php71w \

php71w-fpm \

php71w-gd \

php71w-soap \

php71w-pdo_mysql \

php71w-pear \

php71w-devel \

php71w-mbstring \

php71w-mcrypt \

php71w-ldap \

&& yum update -y ntp ntpdate kernel-headers \

&& yum clean all \

&& sed -i 's/http_access deny all/#http_access deny all/g' /etc/squid/squid.conf \

&& cd /tmp \

&& wget -O get-pip.py https://bootstrap.pypa.io/get-pip.py \

&& python get-pip.py \

&& pip install supervisor \

&& mkdir -p /etc/supervisor.d/*.conf \

&& pecl install mongodb \

&& pecl install yaf \

&& wget -c https://github.com/phpredis/phpredis/archive/3.1.4.tar.gz \

&& tar zxvf 3.1.4.tar.gz \

&& cd phpredis-3.1.4 \

&& phpize \

&& ./configure \

&& make \

&& make install \

&& cd .. \

&& rm -rf phpredis* \

&& rm 3.1.4.tar.gz \

&& echo "" >> /etc/php.ini \

&& echo "extension=redis.so" >> /etc/php.ini \

&& echo "extension=yaf.so" >> /etc/php.ini \

&& echo "extension=mongodb.so" >> /etc/php.ini \

&& echo "[yaf]" >> /etc/php.ini \

&& echo "yaf.use_namespace = 1" >> /etc/php.ini

COPY ./supervisord.conf /etc/

COPY ./default.conf /etc/nginx/conf.d/

COPY ./nginx.conf /etc/supervisor.d/

COPY ./php.conf /etc/supervisor.d/

COPY ./ntpdate.conf /etc/supervisor.d/

COPY ./nginx.conf.def /etc/nginx/nginx.conf

COPY ./index.php /data/work/code/

EXPOSE 80 443 3128

WORKDIR /data/work/code

CMD ["supervisord","-c","/etc/supervisord.conf"]

问题

子进程stdout如何重定向到supervisord

Supervisor的监督进程supervisord可以捕获所管理子进程的stdout及stderr,并可以配置为写入日志文件

镜像初步构建成功时,运行容器,并通过 docker logs -f {container} 查看容器日志,总是提示错误, 如下:

2017-11-09 07:41:41,256 CRIT uncaptured python exception, closing channel (stderr)> (:[Errno 29] Illegal seek [/usr/lib/python2.7/site-packages/supervisor/supervisord.py|runforever|227] [/usr/lib/python2.7/site-packages/supervisor/dispatchers.py|handle_read_event|232] [/usr/lib/python2.7/site-packages/supervisor/dispatchers.py|record_output|166] [/usr/lib/python2.7/site-packages/supervisor/dispatchers.py|_log|142] [/usr/lib/python2.7/site-packages/supervisor/loggers.py|info|275] [/usr/lib/python2.7/site-packages/supervisor/loggers.py|log|293] [/usr/lib/python2.7/site-packages/supervisor/loggers.py|emit|186] [/usr/lib/python2.7/site-packages/supervisor/loggers.py|doRollover|211])

经过了N多次查询,N多次尝试,终于找到原因,原来是在配置supervisord管理的子进程文件时,如果配置了stdout_logfile=/dev/stdout, 则必须一块配置stdout_logfile_maxbytes=0

查找的资料说明如下:

If anyone stumbles upon this error like me, be aware that the mentioned options apply to the [supervisord] section, within [program:x] sections, you need to use stdout_logfile_maxbytes = 0and/or stderr_logfile_maxbytes = 0 respectively.

using stdout_logfile=/dev/stdout along with stdout_logfile_maxbytes=0

对于需要将supervisord管理的子进程的日志输出到stdout的program, 配置如下:

[program:php7-fpm]

command=/usr/local/sbin/php-fpm

autostart = true

stderr_logfile = /dev/stdout

stdout_logfile = /dev/stdout

stdout_logfile_maxbytes = 0

stderr_logfile_maxbytes = 0

参见: http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html

php-fpm 的错误日志如何定向到docker logs

看到 https://github.com/docker-library/php/issues/63 解释,将error_log及access.log的配置改成如下error_log=/proc/self/fd/2 和 access.log=/proc/self/fd2即可,一直不明白,/proc/self/fd/2和/dev/stdout /dev/stderr有什么联系,经过ls -al /dev 才明白:

lrwxrwxrwx 1 root root 15 Nov 9 07:44 stderr -> /proc/self/fd/2

lrwxrwxrwx 1 root root 15 Nov 9 07:44 stdin -> /proc/self/fd/0

lrwxrwxrwx 1 root root 15 Nov 9 07:44 stdout -> /proc/self/fd/1

对于我们的需求,是将错误及access信息都在docker logs 中显示,所以,我们配置php-fpm.conf如下:

[global]

error_log=/proc/self/fd/1

文件/etc/php-fpm.d/www.conf配置如下:

php_admin_value[error_log] = /proc/self/fd/1

slowlog = /proc/self/fd/1

catch_workers_output = yes

clear_env=no

相关文章:

  • php写统计投票数,php画投票统计图 - huolong的个人空间 - OSCHINA - 中文开源技术交流社区...
  • php会话类,php简单的会话类代码
  • php设置超时等待时间,php设置超时时间的方法
  • oracle零基础可以学么,零基础学Oracle
  • oracle数据库异机备份脚本,服务器A制定计划任务,BAT脚本自动备份oracle数据文件,拷贝至服务器B的共享目录。...
  • 百度sms php,php 调用百度sms来发送短信的实现示例
  • oracle索引的storage,Oracle全文索引的STORAGE属性有什么特点?
  • php 字符串向前截取,php字符串截取函数
  • oracle 查询本年12月,ORACLE 写一条Sql语句查出年份,1月,2月,3月....12月的订单总数列表...
  • sqlserver新建oracle发布是咋回事,SQLServer创建链接服务器对象链接oracle
  • linux桌面环境占用内存对比,最新精简型Linux桌面环境大比拼:LXDE Vs Xfce Vs MATE
  • dnw linux 内核,神器DNW2 FOR LINUX!
  • linux 单独装ftp服务,linux下安装FTP服务
  • linux日志服务重开,linux重新編譯內核
  • linux arm中断进程,ARM Linux对中断的处理
  • [译]CSS 居中(Center)方法大合集
  • ES6语法详解(一)
  • Fabric架构演变之路
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java 内存分配及垃圾回收机制初探
  • JAVA多线程机制解析-volatilesynchronized
  • leetcode-27. Remove Element
  • orm2 中文文档 3.1 模型属性
  • Python利用正则抓取网页内容保存到本地
  • springMvc学习笔记(2)
  • Webpack 4 学习01(基础配置)
  • windows下mongoDB的环境配置
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 浮现式设计
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 每天10道Java面试题,跟我走,offer有!
  • 微服务核心架构梳理
  • 用简单代码看卷积组块发展
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​VRRP 虚拟路由冗余协议(华为)
  • #{}和${}的区别?
  • (4)STL算法之比较
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (十八)三元表达式和列表解析
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .net core使用ef 6
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 事件模型教程(二)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .net6Api后台+uniapp导出Excel
  • .NET中的Exception处理(C#)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • ::前边啥也没有
  • ?
  • [2544]最短路 (两种算法)(HDU)
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C/C++] C/C++中数字与字符串之间的转换