apt-get、dpkg、deb 和yum、rpm 区别和关系

 

linux主要两大派系:

RedHat 系列:Redhat、Centos、Fedora 等

  • 常见的安装包格式 rpm 包,安装rpm包的命令是“rpm -参数”
  • 包管理工具 yum

Debian系列:Debian、Ubuntu 等

  • 常见的安装包格式 deb 包,安装 deb 包的命令是“dpkg -参数”
  • 包管理工具 apt-get

两者的区别是dpkg绕过apt包管理数据库对软件包进行操作,所以你用dpkg安装过的软件包用apt可以再安装一遍,系统不知道之前安装过了,将会覆盖之前dpkg的安装。

1、dpkg是用来安装.deb文件,但不会解决模块的依赖关系,且不会关心ubuntu的软件仓库内的软件,可以用于安装本地的deb文件。
2、apt会解决和安装模块的依赖问题,并会咨询软件仓库, 但不会安装本地的deb文件, apt是建立在dpkg之上的软件管理工具。

这样也就解释了rpm和yum的关系。

发表在 服务器 | 标签为 , , | 留下评论

docker镜像php5.3-fpm安装redis、memcache、memcached扩展

一个踩坑学习过程,有个老系统必须运行在php5.3-fpm上,在阿里云上找了个镜像才40m很开心,启动容器就弄了半天。nginx是本地的,php是docker容器上的。

本地创建一个nginx放网站的目录/data/wwwroot/default,使用参数-v映射到容器上,这样本地配置nginx才不需要去指对应的目录。

没用-v映射nginx就必须如下:

fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;

做了映射就默认如下:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

启动容器:

root@netp.com.cn:/home/ken# docker run –name php5.3.29 -p 9000:9000 -v /data/wwwroot/default:/data/wwwroot/default -it registry.cn-hangzhou.aliyuncs.com/sjdskl/php5.3-fpm:latest

接着要登录容器操作,也是坑:

rpc error: code = 13 desc = invalid header field value “oci runtime error: exec failed:

最后登上去了,很开心,看看是什么系统先:

/var/www/html # uname -a
Linux 9eb38713fded 4.4.0-45-generic #66-Ubuntu SMP Wed Oct 19 14:12:37 UTC 2016 x86_64 Linux
/var/www/html # cat /proc/version
Linux version 4.4.0-45-generic (buildd@lgw01-34) 
(gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.2) )
 #66-Ubuntu SMP Wed Oct 19 14:12:37 UTC 2016

2个命令都看到Ubuntu,这就容易了,开心,接着就发现我靠,

/bin/sh: apt-get: not found

什么没有apt,搞什么精简的结果,继续往坑了跳,没有那就安装了

网上找了半天在官网下了个包

http://security.ubuntu.com/ubuntu/pool/main/a/apt/

再使用dpkg命令来安装deb包,执行 dpkg -i apt_1.6.3_amd64.deb

靠接着出错,

/usr/src # dpkg -i apt_1.6.3_amd64.deb
 dpkg: error: failed to open package info file '/var/lib/dpkg/status' for reading: No such file or directory

这是什么鬼,后来我从本地复制了一个status进去,还是无法安装。

经过痛苦的过程我发现

/usr/src # cat /etc/issue
 Welcome to Alpine Linux 3.4
 Kernel \r on an \m (\l)

我里个去,怎么跑出来个Alpine Linux,不是Ubuntu吗?经过一番搜索原来是docker推荐的系统,骂人千百遍,也知道它的包管理器apk命令。接着就真的好办了吗?

下载的时候因为没有wget,搞的我还学会了一个curl -O来下来。

说下apt-get、dpkg、deb 和yum、rpm 区别和关系

现在先安装redis扩展

/usr/src/php/ext # wget https://github.com/phpredis/phpredis/archive/3.1.3.tar.gz

tar xfz 3.1.3.tar.gz

mv phpredis-3.1.3/ redis

docker-php-ext-install redis

无论我用3.1.3.tar.gz还是2.2.8.tar.gz都会出现以下错误。

configure: error: /bin/sh ./config.sub x86_64-linux-musl failed

换个方式安装pecl:

pecl install redis
echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini

http://php.net/manual/zh/install.pecl.pear.php
卸载可以用pecl uninstall redis

这里还要说下php -i可以看到Scan this dir for additional .ini files 和Additional .ini files parsed 都指向了/usr/local/etc/php/conf.d/这个目录,所以配置要放那里去。

重启php后可以 php -m看下模块。

接着安装memcached你会发现提示需要libmemcached。就是需要这个支撑的意思。

wget https://launchpadlibrarian.net/165454254/libmemcached-1.0.18.tar.gz 
cd libmemcached-1.0.18 
tar -xvzf libmemcached-1.0.18.tar.gz 
./configure --with-memcached --disable-memcached-sasl
make 

下载、解压后配置、编译就以下错误。

CXX libtest/libtest_libtest_la-cmdline.lo
libtest/cmdline.cc:65:15: error: 'environ' was declared 'extern' and later 'static' [-fpermissive]
 static char **environ= NULL;
 ^
In file included from ./libtest/common.h:77:0,
 from libtest/cmdline.cc:39:
/usr/include/unistd.h:182:15: note: previous declaration of 'environ'
 extern char **environ;
 ^
libtest/cmdline.cc: In member function 'libtest::Application::error_t libtest::Application::run(const char**)':
libtest/cmdline.cc:206:12: error: 'POSIX_SPAWN_USEVFORK' was not declared in this scope
 flags |= POSIX_SPAWN_USEVFORK;
 ^
Makefile:7305: recipe for target 'libtest/libtest_libtest_la-cmdline.lo' failed
make[1]: *** [libtest/libtest_libtest_la-cmdline.lo] Error 1
make[1]: Leaving directory '/usr/src/php/ext/libmemcached-1.0.18'
Makefile:3700: recipe for target 'all' failed
make: *** [all] Error 2
/usr/src/php/ext/libmemcached-1.0.18 #

一直没解决,认为是gcc导致的,系统gcc版本5.30。

最后发现Alpine Linux竟然有自带的,马上试试看。

/usr/src/php/ext# apk search libmemcached
libmemcached-doc-1.0.18-r1
libmemcached-libs-1.0.18-r1
libmemcached-1.0.18-r1
libmemcached-dev-1.0.18-r1

搜索下有包,马上add添加。

/usr/src/php/ext# apk add libmemcached
(1/4) Installing db (5.3.28-r0)
(2/4) Installing libsasl (2.1.26-r7)
(3/4) Installing libmemcached-libs (1.0.18-r1)
(4/4) Installing libmemcached (1.0.18-r1)
Executing busybox-1.24.2-r14.trigger
OK: 228 MiB in 68 packages

完成后运行安装memcached,3.0以上需要php7,所以我们安装2.2

/usr/src/php/ext # pecl install memcached-2.2.0

提示错误:

ERROR: `/tmp/pear/temp/memcached/configure --with-libmemcached-dir=no' failed

接着我搜索整个盘

/usr/src/php/ext # find / -name libmemcached

没有发现相关libmemcached目录。

竟然n次痛苦个各种尝试失败,最后我发现apk search libmemcached搜索出来的几个包不是全部都安全进去,我就一个个安装,终于在

apk add libmemcached-dev

这个安装后多了目录:

/usr/include/libmemcached

重新安装输入

libmemcached directory [no] : /usr/include/libmemcached

编译接着还是错,折磨死人啊。

直接下载源码编译安装:

wget https://pecl.php.net/get/memcached-2.2.0.tgz
tar xfz memcached-2.2.0.tgz
cd memcached-2.2.0/
/usr/local/bin/phpize

./configure –with-php-config=/usr/local/bin/php-config –enable-memcached –with-libmemcached-dir=/usr/include/libmemcached –disable-memcached-sasl

配置出现以下错误

checking for libmemcached location… configure: error: Unable to find memcached.h under /usr/include/libmemcached

根据查找,因为源码的原因需要做个软链接。

/var/www/html # mkdir -p /usr/lib/x86_64-linux-gnu/include/libmemcached
/var/www/html # ln -s /usr/include/libmemcached/memcached.h /usr/lib/x86_64-linux-gnu/include/libmemcached/memcached.h

再重新配置。

./configure –with-php-config=/usr/local/bin/php-config –enable-memcached –with-libmemcached-dir=/usr/lib/x86_64-linux-gnu –disable-memcached-sasl

错误需要zlib

checking for zlib location… configure: error: memcached support requires ZLIB. Use –with-zlib-dir=<DIR> to specify the prefix where ZLIB headers and library are locate

安装 apk add zlib-dev包,配置通过了。

接着make编译出现不同的提示?

/usr/include/libmemcached-1.0/struct/sasl.h:39:23: fatal error: sasl/sasl.h: No such file or directory

再次安装apk add cyrus-sasl-dev包

make再编译终于通过了,我的天啊。

Build complete.
Don't forget to run 'make test'.

make install安装

/usr/src/php/ext/memcached-2.2.0 # make install
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20090626/

到这里你应该懂了吧。修改ini配置

vi /usr/local/etc/php/php.ini

extension=memcache.so
extension=memcached.so

重启php即可。php -m看了下 都有了

https://pecl.php.net/官方地址 php各种扩展

到这里终于大功告成,我想安装过这次扩展应该什么版本都会装了吧。

有问题留言。这里基本都是netpc.com.cn原创。

发表在 服务器 | 标签为 , | 留下评论

在Docker容器里面重启Php-Fpm

像我的登陆php容器后

/usr/local/etc/php/conf.d # ps aux|grep php
1 root 0:00 php-fpm: master process (/usr/local/etc/php-fpm.conf)
7 www-data 0:00 php-fpm: pool www
8 www-data 0:00 php-fpm: pool www

发现id 1就是php了,给它个信号让它重启即可,执行命令如下:
kill -USR2 1

如果是在外面也可以:
docker exec -it 容器id或名称 kill -USR2 1

或者你干脆重启容器 哈
docker restart 容器id或名称

发表在 服务器 | 标签为 | 留下评论

查看linux内核系统版本信息

linux下通常使用4个命令查询,命令行下输入:

  1. lsb_release -a (适用于所有的linux,包括Redhat、SuSE、Debian等发行版,但是在debian下要安装lsb)
  2. 输入”cat /etc/issue”, 显示的是发行版本信息
  3. 输入”cat /proc/version”,说明正在运行的内核版本。
  4. 输入”uname -a “,显示电脑以及操作系统的相关信息。
发表在 服务器 | 标签为 | 留下评论

rpc error: code = 13 desc = invalid header field value “oci runtime error: exec failed:

今天测试docker下了个php5.3-fpm镜像,生成容器后,尝试一下登陆命令

root@netp.com.cn:ken# docker exec -it 9eb38713fded /bin/bash

却出现了错误:

rpc error: code = 13 desc = invalid header field value “oci runtime error: exec failed: container_linux.go:247: starting container process caused \”exec: \\\”/bin/bash\\\”: stat /bin/bash: no such file or directory\”\n”

弄了半天后来知道我下载的镜像使用了Alpine Linux 3.4这种linux系统精简到没有/bin/bash只有/bin/sh

最后root@netp.com.cn:ken# docker exec -it 9eb38713fded /bin/sh

这样就可以了

发表在 服务器 | 标签为 , | 留下评论

Yii2.0给GridView增加关联字段排序和搜索功能

yii2.0在使用了with关联了留言表(Comment)和会员表(Member),并且在留言列表中显示会员昵称。

在Comment留言表模型添加如下方法

public function getMember() {
   return $this->hasOne(Member::className(), ['id' => 'member_id']);
}

在CommentSearch模型添加一个属性

public $nickname;

并且在该模型中rules方法设置nickname为safe

public function rules()
{
    return [
        [['nickname', 'safe'],
    ];
}

修改Commentearch模型的search方法

$query = Comment::find();
if (is_array($this->relations)) {
    $query->joinWith(['member']);//关联会员表
}

然后添加排序,在

$dataProvider = new ActiveDataProvider([
    'query' => $query,
]);

后面添加如下代码

$sort = $dataProvider->getSort(); // 获取yii自动生成的排序规则
$sort->attributes['nickname'] = [ // 添加用户名的排序规则
    'asc' => ['member.nickname' => SORT_ASC],
    'desc' => ['member.nickname' => SORT_DESC],
    'label' => '昵称'
];
$dataProvider->setSort($sort); // 设置排序规则

接下来在return上面添加搜索功能

$query->andFilterWhere(['like', 'member.nickname', $this->nickname]);
return $dataProvider;

修改视图模板 Comment/index 内的 GridView::widget()参数,给 columns 数组添加以下成员:

[
    'attribute' => 'nickname',
    'label' => '昵称',
    'value' => 'member.nickname',
    'headerOptions' => ['width' => '100'],
    //'filter'=>Html::activeTextInput($searchModel, 'nickname', ['class'=>'form-control']), // 生成一个搜索框
],

全部都保存,然后刷新浏览器看看。

发表在 服务器 | 标签为 | 留下评论

在CentOS release 6.5(Final) X64下安装docker

首先查看内核
[root@netpc.com.cn~]# uname -r
2.6.32-431.23.3.el6.x86_64

据说是要3.1以上的

试试看

安装docker-io
yum -y install docker-io

查看状态
[root@netpc.com.cn ~]# service docker status
docker is stopped

启动docker进程
[root@netpc.com.cn ~]# service docker start
Starting cgconfig service: [ OK ]
Starting docker:[ OK ]

搜索php镜像
[root@netpc.com.cn ~]# docker search php
Cannot connect to the Docker daemon. Is ‘docker -d’ running on this host?

根据提示执行
[root@netpc.com.cn ~]# docker -d
WARN[0000] You are running linux kernel version 2.6.32-431.23.3.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0.
docker: relocation error: docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference

忽略警告,再次查看状态,docker死了,可是pid还在。
[root@netpc.com.cn ~]# service docker status
docker dead but pid file exists

网上搜索要安装对应的包
[root@netpc.com.cn ~]# yum upgrade device-mapper-libs

再次查看状态,已经变了。
[root@netpc.com.cn ~]# service docker status
docker dead but subsys locked

原来是要重启下。
[root@netpc.com.cn ~]# service docker restart
Stopping docker: [FAILED]
Starting docker:[ OK ]

再次查看状态,已经运行中了。
[root@netpc.com.cn ~]# service docker status
docker (pid 29178) is running…

发表在 服务器 | 标签为 | 留下评论

docker pull很慢的解决方法

今天线上服务器测试docker

在拉php5.3.29的时候发现竟然掉线了

[root@netp.com.cn~]# docker pull php:5.3.29-fpm
Pulling repository php
php:5.3.29-fpmGet https://registry-1.docker.io/v1/repositories/library/php/tags: read tcp 34.205.207.96:443: i/o timeout

有没有发现超时了,尝试了很多次都行。

最后找了个镜像一下次就搞定了,用pull上直接指定daocloud.io即可,当然还有其它镜像例如阿里云之类的。

[root@netpc.com.cn~]# docker pull daocloud.io/library/php:5.3.29
5.3.29: Pulling from daocloud.io/library/php

3690474eb5b4: Pull complete 
000e626f3e24: Pull complete 
93b7a6fbb8ca: Pull complete 
b0deb4620cac: Pull complete 
0bc0ebd7adce: Pull complete 
f5cb651f164e: Pull complete 
d07b2849cf17: Pull complete 
3cc31e514678: Pull complete 
35f5af617e67: Pull complete 
666274caa93c: Pull complete 
Digest: sha256:94fae2c176641bb06d95da333bb8e21079a3e5dfc8de404f6bf39708a072ae70
Status: Downloaded newer image for daocloud.io/library/php:5.3.29
[root@netpc.com.cn~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
daocloud.io/library/php 5.3.29 666274caa93c 3 years ago 728.5 MB

上面的728.5MB版本 不知道怎么用

上阿里云https://dev.aliyun.com/搜索php 5.3有人分享了个fpm的可以用。

docker pull registry.cn-hangzhou.aliyuncs.com/sjdskl/php5.3-fpm

发表在 服务器 | 标签为 | 留下评论

修改docker存储设置移动目录Device or resource busy

今天为了修改Docker本地镜像与容器的存储位置

首先停掉Docker服务:

systemctl restart docker
或者
service docker stop

然后移动整个/var/lib/docker目录到目的路径:

mv /var/lib/docker /root/data/docker
ln -s /root/data/docker /var/lib/docker

过程出现在mv命令后有个/var/lib/docker/devicemapper一直无法移动和删除

提示rm: cannot remove `/var/lib/docker/devicemapper’: Device or resource busy

原因在建立容器的时候做了相应目录的挂载,没有卸载,所以Device or resource busy

根据网上的

lsof |grep docker

cat /proc/mounts | grep “mapper/docker” | awk ‘{print $2}’

都没打印出什么

最后直接打印docker就出来了

[root@netpc.com.cn~]# cat /proc/mounts | grep “docker”
/dev/vda1 /var/lib/docker/devicemapper ext4 rw,relatime,barrier=0,data=ordered 0 0
[root@netpc.com.cn~]# umount /var/lib/docker/devicemapper/

可以删除目录了,搞定!

 

发表在 服务器 | 标签为 , | 留下评论

yii2.0.15中文rules验证规则大全

这里展示常用的yii2常用的rules验证规则:

file : 文件

['imageFiles', 'file',  'extensions' => ['png','jpg'],'wrongExtension'=>'只能上传{extensions}类型文件',
   'maxFiles' => 4,'tooMany'=>'文件上传太多',
   'maxSize'=>1024*1024*5,'tooBig'=>'文件上传过大'
],
#说明:imageFiles就是模型里面保存有个图片变量,不一定是表单的名称。

image :是否为有效的图片文件

['primaryImage', 'image', 'extensions' => 'png, jpg',
 'minWidth' => 100, 'maxWidth' => 1000,
 'minHeight' => 100, 'maxHeight' => 1000,
 ]

required : 必须值验证属性

[['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredValidator 的别名, 确保了特性不为空. 

email : 邮箱验证

['email','email','message'=>'邮箱格式错误'],

match : 正则验证

[['字段名'],match,'pattern'=>'正则表达式','message'=>'提示信息'];      
[['字段名'],match,'not'=>ture,'pattern'=>'正则表达式','message'=>'提示信息']; /*正则取反*/

url : 网址

['website', 'url', 'defaultScheme' => 'http']; #说明:CUrlValidator 的别名, 确保了特性是一个有效的路径. 

captcha : 验证码

['verificationCode', 'captcha']; #说明:CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来的验证码. 

safe : 安全

['description', 'safe'];

compare : 比较

['age', 'compare', 'compareValue' => 30, 'operator' => '>=']; #说明:compareValue(比较常量值) - operator(比较操作符)  #说明:CCompareValidator 的别名,确保了特性的值等于另一个特性或常量.
['verifyPassword', 'compare', 'compareAttribute'=>'password', 'message'=>'请再输入确认密码'],

default : 默认值

['age', 'default', 'value' => null]; #说明:CDefaultValueValidator 的别名, 为特性指派了一个默认值. 

exist : 存在

['username', 'exist']; #说明:CExistValidator 的别名,确保属性值存在于指定的数据表字段中. 

filter : 滤镜

[['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true]; #说明:CFilterValidator 的别名, 使用一个filter转换属性. 

in : 范围

['level', 'in', 'range' => [1, 2, 3]]; #说明:CRangeValidator 的别名,确保了特性出现在一个预订的值列表里. 

unique : 唯一性

['username', 'unique'] #说明:CUniqueValidator 的别名,确保了特性在数据表字段中是唯一的. 

类型验证 integer,float,string,array,date,time,datetime

['created', 'type', 'datetime'],

integer : 整数

['age', 'integer'];

number : 数字

['salary', 'number'];

double : 双精度浮点型

['salary', 'double'];

date : 日期

[['from', 'to'], 'date', 'format'=>'yyyy/MM/dd/ HH:mm:ss'],

length 限制最小长度和最大长度

['username', 'length', 'max'=>7, 'min'=>2, 'tooLong'=>'用户名请输入长度为4-14个字符', 'tooShort'=>'用户名请输入长度为2-7个字'],
['password', 'length', 'max'=>22, 'min'=>6, 'tooLong'=>'密码请输入长度为6-22位字符', 'tooShort'=>'密码请输入长度为6-22位字符'],

string : 字符串

['username', 'string', 'length' => [4, 24]];

boolean : 是否为一个布尔值

['字段名', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true]; #说明:CBooleanValidator 的别名 

新版yii2文件夹目录下\vendor\yiisoft\yii2\validators\Validator.php的各种最新验证规则源码,可以到该路径下去一个个去分析。

public static $builtInValidators = [
    'boolean' => 'yii\validators\BooleanValidator',
    'captcha' => 'yii\captcha\CaptchaValidator',
    'compare' => 'yii\validators\CompareValidator',
    'date' => 'yii\validators\DateValidator',
    'datetime' => [
        'class' => 'yii\validators\DateValidator',
        'type' => DateValidator::TYPE_DATETIME,
    ],
    'time' => [
        'class' => 'yii\validators\DateValidator',
        'type' => DateValidator::TYPE_TIME,
    ],
    'default' => 'yii\validators\DefaultValueValidator',
    'double' => 'yii\validators\NumberValidator',
    'each' => 'yii\validators\EachValidator',
    'email' => 'yii\validators\EmailValidator',
    'exist' => 'yii\validators\ExistValidator',
    'file' => 'yii\validators\FileValidator',
    'filter' => 'yii\validators\FilterValidator',
    'image' => 'yii\validators\ImageValidator',
    'in' => 'yii\validators\RangeValidator',
    'integer' => [
        'class' => 'yii\validators\NumberValidator',
        'integerOnly' => true,
    ],
    'match' => 'yii\validators\RegularExpressionValidator',
    'number' => 'yii\validators\NumberValidator',
    'required' => 'yii\validators\RequiredValidator',
    'safe' => 'yii\validators\SafeValidator',
    'string' => 'yii\validators\StringValidator',
    'trim' => [
        'class' => 'yii\validators\FilterValidator',
        'filter' => 'trim',
        'skipOnArray' => true,
    ],
    'unique' => 'yii\validators\UniqueValidator',
    'url' => 'yii\validators\UrlValidator',
    'ip' => 'yii\validators\IpValidator',
];
发表在 服务器 | 标签为 , | 留下评论