mb_substr 编码问题

PHP 中 mb_* 系列函数用于处理多字节字符串,平时比较常用就是字符串截取 mb_substr,可以有效规避中文字符串截取的乱码问题。

mb_substr 的格式为:

mb_substr( string $str, int $start[, int $length = NULL[, string $encoding = mb_internal_encoding()]] ) : string

第4个参数 encoding 为字符编码。如果省略,则使用内部字符编码。

那么,这个“内部字符编码”是什么呢?我们可以通过函数 mb_internal_encoding 设置和获取...

分类至 PHP
0条评论

Docker 以指定用户身份进入容器

平时习惯这样进入 php-fpm 容器:

$ docker exec -it php-fpm bash

进去以后,默认是 root 帐号。

现在有些指令想用 www-data 帐号来执行,切换 www-data 帐号时却提示该帐号未启用:

$ su www-data
This account is currently not available.

 

分类至 Docker
0条评论

Docker 容器挂载数据卷出现 Permission denied 权限问题的解决办法

问题原因及解决办法
原因是CentOS7中的安全模块SELinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题:

1.在运行容器的时候,给容器加特权,及加上 --privileged=true 参数。使用该参数,容器内的root拥有真正的root权限。否则,容器内的root只是外部的一个普通用户权限

  $ docker run --name study_mysql --privileged=true -p 3306:3306  -v /data/mysql/datadir:/var/lib/mysql -v /data/mysql/conf.d:/etc/mysql/conf.d -e  MYSQL_ROOT_PASSWORD=123456 -d  mysql:latest

2.临时关闭SELinux:
setenforce 0

3.添加SELinux规则,改变要挂载的目录的安全性文本
可参考:http://www.bubuko.com/infodetail-2075102.html

分类至 Docker
0条评论

certbot-auto 一直卡在“Installing Python packages…”解决方法

使用 certbot-auto 自动部署 ssl 时,常常遇到一直卡在“Installing Python packages…”的情况,最简单有效的解决方法是:

1、下载文件

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

2、编辑 certbot-auto 中的下载链接

vim certbot-auto
输入 :/DEFAULT_INDEX_BASE 查询,或则直接往后翻到1607行,可以看到一行信息:DEFAULT_INDEX_BASE = 'https://pypi.python.org

分类至 杂项
1条评论

你了解 Redis 的三种集群模式吗?

最近在面试过程中被面试官问到 Redis 集群数据是如何复制的,由于之前没有准备直接懵了。
事后查了查这个问题其实也挺简单,如果你之前也不知道,没问题,赶紧浅尝辄止,速度3遍即可入门。

阅读本文,你可能会有哪些收获呢?

  • 首先,你会知道有三种集群模式
  • 然后对每种集群模式的原理有个大概了解
  • 当然还能看到集群演变的影子
  • 最后还会有手把手的实操

Redis 支持三种集群方案

  • 主从复制模式
  • Sentinel(哨兵)模式
  • Cluster 模式
分类至 杂项
0条评论

Redis 集群添加节点和删除节点

上一篇我们讲述了《Docker 快速搭建 Redis 集群》,本篇我们将继续讲述 Redis 集群添加节点和删除节点。

之前搭建集群的时候,已经创建了6个 Redis 实例,在原基础上再加2个实例,配置文件 docker-compose.yml 如下...

分类至 杂项
0条评论

Docker 快速搭建 Redis 集群

本篇,将介绍通过 docker-compose 编排的方式快速搭建 Redis 集群。

计划安排:

  • 构建6个容器,名称分别为 redis1 ~ redis6
  • 内网 IP 分配 172.10.1.1 ~ 172.10.1.6
  • 所有实例的 redis.conf 配置文件相同
  • 将6个实例连接为集群
  • 演示集群中故障自动检测与自动恢复
分类至 Docker
0条评论

Docker 私有仓库界面化管理

前一篇我们介绍了《Docker 私有仓库搭建》,但是搭建完的私有仓库没有 UI 管理界面,操作很不方便。我们可以借助第三方 registry-web 镜像来实现界面化管理,目前比较流行的镜像包是 hyper/docker-registry-web。

通过两条 docker run 指令快速搭建:

docker run -d -p 5000:5000 --name registry-srv registry:2
docker run -it -p 8080:8080 --name registry-web --link registry-srv -e REGISTRY_URL=http://registry-srv:5000/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web 

我们将私有仓库的容器命名为 registry-srv,将 WebUI 管理容器命名为 registry-web,第2条指令的 --link 参数让 registry-srv 和 registry-web 做连接,这样我们在 registry-web 内部就可以通过 registry-srv:5000 地址来访问私有仓库了。

分类至 Docker
0条评论

Docker 私有仓库搭建

在 Docker 中,当我们执行 docker pull xxx 的时候 ,它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库。在工作中,我们不可能把企业项目push到公有仓库进行管理。所以为了更好的管理镜像,Docker 不仅提供了一个中央仓库,同时也允许我们搭建本地私有仓库。

Docker 官方提供了一个搭建私有仓库的镜像 registry ,只需把镜像下载下来,运行容器并暴露5000端口,就可以使用了。

分类至 Docker
0条评论

Let's Encrypt 通配符证书续期失败:must be provided with --manual-auth-hook

前几个月发表了一篇文章《申请免费的 Let's Encrypt 通配符 SSL/TLS 证书》,如今2个多月过去,今天收到了来自 Let's Encrypt 的邮件,提醒我证书该续期了。

原本以为只需要执行 certbot-auto renew 就可以愉快的完成续期,但执行报错了,输出结果如下:

The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',). Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/yangdx.com/fullchain.pem (failure)

重点这句:An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.

原来,通配符域名证书不能简单的通过执行 certbot-auto renew 来完成续期,必须通过 --manual-auth-hook 参数提供一个身份验证脚本来自动完成 DNS TXT 记录的验证操作。

分类至 杂项
0条评论