使用zabbix自动发现自动监控多tomcat实例

说明

何为自动发现?首先我们监控多tomcat实例,如果一个个实例地添加或许可以完成当前需求。但是日后随着实例的增多,再手动一个个去添加就十分不方便了。这时候需要自动发现这个功能,来帮助我们自动添加监控tomcat实例。本文就以监控tomcat线程为例,来实现这个自动发现的功能。这里zabbix版本为3.0。

监控

创建自动发现脚本

可以理解为这个脚本能够打印出当前服务器上所有的tomcat实例名称。zabbix会定期执行这个脚本,做到自动发现当前所有的tomcat实例,脚本放在zabbix-agent安装路径的scripts目录下。而下一步就是给找到的tomcat实例添加所需要监控的值。下面先看脚本:

# cat discover_jvm.py
#!/usr/bin/python2.7 
#Usage: discover tomcat_app
#Last Modified:

import subprocess
import json

#args为自己定义查找项目名字的方式,由于各自部署方式的不同,这里需要根据实际情况来写命令。
args="find /opt/app/applications -name 'catalina.properties' | sort -n | uniq | awk -F'/' '{print $5}'"
t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0]

apps=[]

for app in t.split('n'):
    if len(app) != 0:
        apps.append({'{#APP_NAME}':app})

打印出zabbix可识别的json格式

print json.dumps({'data':apps},indent=4,separators=(',',':'))

执行打印结果如下所示:

# chmod a+x discover_jvm.py 赋予执行权限
# chown zabbix:zabbix discover_jvm.py 添加属主为zabbix用户
# ./discover_jvm.py 
{
    "data":[
        {
            "{#APP_NAME}":"app1"
        },
        {
            "{#APP_NAME}":"app2"
        }
    ]
}
这里打印出app1、app2两个实例,以后要是有其他实例,也能够同样打印出来。

创建监控项脚本

这个脚本的作用是打印出tomcat实例需要监控的项,本例为线程数。该脚本执行需要两个参数,$1为实例名,$2为监控项名。打印的结果为一个整型的数字。记得跟上面的脚本放在同样的位置,并赋予执行权限和正确的属主。

# cat app_status.sh 
#!/bin/bash
#Usage: tomcat_app status
#Last Modified:

app=$1
status=$2
pid=`ps -ef | grep "$app" | grep -v grep | grep -v "$0"| awk '{print $2}'`

case $status in
    thread.num)
        /opt/programs/jdk1.7.0_67/bin/jstack "$pid" | grep http | wc -l
        ;;
    *)
        echo "Usage:$0 {app_name status[thread.num]}" 
        exit 1
        ;;
esac

#执行
#./app_status.sh app_name thread.num

日后如果需要添加新的监控项,只需修改上面的脚本,改变$2的选择即可。

zabbix客户端配置

在客户端配置文件中添加自定义监控的key,其实就是给我们监控选项取个名字,然后如何获取这个值。示例如下:

#变量1的key为custom.discover.jvm_app,为自动发现的tomcat实例名,获取方式即为执行dicover_jvm脚本
UserParameter=custom.discover.jvm_app,/opt/programs/bd-zabbix-agentd_3.0.4/scripts/discover_jvm.py
#变量2的key为custom.app.thread_num,[*]表示需要变量支持,这里即为$1、$2(本例中$2的意义不同,监控项就不同)获取方式为执行app_status.sh脚本
UserParameter=custom.app.thread_num[*],/opt/programs/bd-zabbix-agentd_3.0.4/scripts/app_status.sh $1 $2

修改完后重启zabbix客户端。然后在服务端进行验证:

#验证获取custom.discover.jvm_app的key值
zabbix-server_3.0.4/bin/zabbix_get -s 10.205.51.22 -p 20050 -k custom.discover.jvm_app
#验证获取custom.app.thread_num的key值
./zabbix_get -s 10.205.51.22 -p 20050 -k custom.app.thread_num[app1,thread_num]
如果正确的话,就会返回在客户端执行脚本一样的结果。

zabbix界面添加自动发现模版

为了便于后面更多的主机添加此监控,这里就创建一个模板来进行配置。首先创建一个发现规则,该规则就是用来自动发现tomcat实例的:

监控

取一个名字,并填上我们之前定义的key,然后保存即可:

监控

然后创建一个监控项:

监控

取一个名字,也填上我们之前定义的key,注意这里的#APP_NAME为之前脚本输出的变量,要填写一致:

监控

然后我们创建一个图像来观察数据:

监控

同样取名字的变量要跟之前一致,并添加数据源为刚刚我们定义的监控项:

监控

最后可以观察到图像:

监控

当然我们还可以定义一个触发器,比如大于多少线程就告警,这里就不一一赘述了。

Ansible安装配置zabbix-agent

Ansible Role: zabbix-agent

安装zabbix客户端

介绍

zabbix(音同 z?bix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
zabbix agent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。zabbix agent可以运行在Linux,Solaris,HP-UX,AIX,Free BSD,Open BSD, OS X, Tru64/OSF1, Windows NT4.0, Windows (2000/2003/XP/Vista)等系统之上。

官方地址: https://www.zabbix.com
官方文档地址:https://www.zabbix.com/documentation/3.2/manual

要求

此角色仅在RHEL及其衍生产品上运行。

测试环境

ansible 2.3.0.0
os Centos 6.7 X64
python 2.6.6

角色变量

software_files_path: "/opt/software"
software_install_path: "/usr/local"

zabbix_agent_version: "3.2.6"

zabbix_agent_file: "zabbix-{{ zabbix_agent_version }}.tar.gz"
zabbix_agent_file_path: "{{ software_files_path }}/{{ zabbix_agent_file }}"
zabbix_agent_file_url: "https://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/{{ zabbix_agent_version }}/{{ zabbix_agent_file }}"

zabbix_agent_repo_url: "http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpm"
zabbix_agent_packages:
  - "zabbix-agent-{{ zabbix_agent_version }}-1.el6"

zabbix_agent_user: zabbix
zabbix_agent_group: zabbix

zabbix_agent_install_from_source: false

zabbix_agent_source_dir: "/tmp/{{ zabbix_agent_file | replace('.tar.gz','') }}"
zabbix_agent_source_configure_command: >
  ./configure
  --prefix={{ software_install_path }}/zabbix-{{ zabbix_agent_version }}
  --enable-agent

zabbix_agent_conf_path: "/etc/zabbix" 
zabbix_agent_logs_path: "/var/log/zabbix"

zabbix_agent_hostname: "{{ ansible_hostname | d() }}"
zabbix_agent_server_host: "127.0.0.1"

依赖

None

github地址

https://github.com/kuailemy123/Ansible-roles/tree/master/zabbix-agent

Example Playbook

---
# 源码安装
- hosts: node2
  roles:
   - { role: zabbix-agent, zabbix_agent_install_from_source: true, zabbix_agent_server_host: "192.168.77.130" }

# rpm包安装
- hosts: node3
  roles:
   - { role: zabbix-agent, zabbix_agent_server_host: "192.168.77.130" }

使用

~]# /etc/init.d/zabbix-agent 
Usage: /etc/init.d/zabbix-agent {start|stop|status|restart|help}

    start        - start zabbix_agentd
    stop        - stop zabbix_agentd
    status        - show current status of zabbix_agentd
    restart        - restart zabbix_agentd if running by sending a SIGHUP or start if not running
    help        - this screen

Xtrabackup定时备份mysql数据库脚本

定时备份MySQL数据库

脚本内容:

#!/bin/bash

## 备份计划任务
## 
## 每天凌晨1:30一次全量备份
## 每天间隔1小时一次增量备份
## 30 1 * * * backup.sh full
## 00 * * * * backup.sh inc
##
##  恢复数据步骤:
##  (1)、查看备份日志,找到全量备份和增量备份的关系(注意增量备份的顺序)
##
##  cat ${BACKUP_BASE_DIR}/${INC_BASE_LIST}
##  (2)、全量备份
##  innobackupex --defaults-file=/etc/my.cnf --apply-log ${BACKUP_BASE_DIR}/full_dir
##
##  (3)、第一个增量
##  innobackupex --defaults-file=/etc/my.cnf --apply-log ${BACKUP_BASE_DIR}/full_dir 
##  --incremental-dir=${BACKUP_BASE_DIR}/one_inc_dir
##
##  (4)、第二个增量
##  innobackupex --defaults-file=/etc/my.cnf --apply-log ${BACKUP_BASE_DIR}/full_dir 
##  --incremental-dir=${BACKUP_BASE_DIR}/two_inc_dir
##
##  (5)、恢复数据
##  innobackupex --defaults-file=/etc/my.cnf --copy-back ${BACKUP_BASE_DIR}/full_dir

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

BACKUP_BASE_DIR="/backup/xtrabackup"
INC_BASE_LIST="${BACKUP_BASE_DIR}/inc_list.txt"
XTRABACKUP_PATH="/usr/local/xtrabackup/bin/innobackupex"

MYSQL_CNF="/etc/my.cnf"
MYSQL_HOSTNAME=127.0.0.1
MYSQL_USERNAME=root
MYSQL_PASSWORD=w7tQ5NNWWRk

LOCK_FILE=/tmp/innobackupex.lock
THREAD=3

mkdir -p ${BACKUP_BASE_DIR}
CURRENT_BACKUP_PATH="${BACKUP_BASE_DIR}/$(date +%F_%H-%M)"
[[ -d ${CURRENT_BACKUP_PATH} ]] && CURRENT_BACKUP_PATH="${BACKUP_BASE_DIR}/$(date +%F_%H-%M-%S)"

print_help(){
    echo "--------------------------------------------------------------"
    echo "Usage: $0 full | inc | help               "
    echo "--------------------------------------------------------------"
    exit 1
}

[[ $# -lt 1 || "$1" == "help" ]] && print_help

[[ -f "$LOCK_FILE" ]] && echo -e "Usage: rm -f $LOCK_FILEnUsage: chattr -i $LOCK_FILE && rm -f $LOCK_FILE" && exit 1

FullBackup(){
    touch $LOCK_FILE
    chattr +i $LOCK_FILE
    local rc=0
    ${XTRABACKUP_PATH} 
    --defaults-file=${MYSQL_CNF} 
    --user=${MYSQL_USERNAME} 
    --password=${MYSQL_PASSWORD} 
    --host=${MYSQL_HOSTNAME} 
    --parallel=${THREAD} 
    --no-timestamp ${CURRENT_BACKUP_PATH} > ${CURRENT_BACKUP_PATH}_full.log 2>&1
    grep ".* completed OK!" ${CURRENT_BACKUP_PATH}_full.log > /dev/null 2>&1
    if [ $? -ne 0 ];then
        rc=1
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && rm -rf ${CURRENT_BACKUP_PATH}
    else
        echo "NULL|${CURRENT_BACKUP_PATH}|full" >> ${INC_BASE_LIST}
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && chattr +i ${CURRENT_BACKUP_PATH} || rc=1
    fi
    chattr -i ${LOCK_FILE}
    rm -f $LOCK_FILE
    chattr +a ${INC_BASE_LIST}
    return $rc
}

IncBackup(){
    touch $LOCK_FILE
    chattr +i $LOCK_FILE
    local rc=0
    PREV_BACKUP_DIR=$(sed '/^$/d' ${INC_BASE_LIST} | tail -1 | awk -F '|' '{print $2}')
    ${XTRABACKUP_PATH} 
    --defaults-file=${MYSQL_CNF} 
    --user=${MYSQL_USERNAME} 
    --password=${MYSQL_PASSWORD} 
    --host=${MYSQL_HOSTNAME} 
    --no-timestamp --incremental ${CURRENT_BACKUP_PATH} 
    --incremental-basedir=${PREV_BACKUP_DIR} > ${CURRENT_BACKUP_PATH}_inc.log 2>&1
    grep ".* completed OK!" ${CURRENT_BACKUP_PATH}_inc.log > /dev/null 2>&1
    if [ $? -ne 0 ];then
        rc=1
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && rm -rf ${CURRENT_BACKUP_PATH}
    else
        echo "${PREV_BACKUP_DIR}|${CURRENT_BACKUP_PATH}|inc" >> ${INC_BASE_LIST}
        [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && chattr +i ${CURRENT_BACKUP_PATH} || rc=1
    fi
    chattr -i ${LOCK_FILE}
    rm -f $LOCK_FILE
    chattr +a ${INC_BASE_LIST}
    return $rc
}

## 全量备份
if [ "$1" == "full" ];then
    FullBackup
fi

## 增量备份
if [ "$1" == "inc" ];then
    ## 判断上一次备份是否存在,无则进行全量备份
    if [[ ! -f ${INC_BASE_LIST} || $(sed '/^$/d' ${INC_BASE_LIST} | wc -l) -eq 0 ]];then
        FullBackup
    else
        IncBackup
    fi
fi

## 删除14天前的备份
if [[ -d ${BACKUP_BASE_DIR} && $(pwd) != "/" ]];then
    find ${BACKUP_BASE_DIR} -name "$(date -d '14 days ago' +'%F')_*" | xargs chattr -i
    find ${BACKUP_BASE_DIR} -name "$(date -d '14 days ago' +'%F')_*" | xargs rm -rf
fi

加入计划任务

crontab -e
30 1 * * * /home/sh/backup.sh full
00 */6 * * * /home/sh/backup.sh inc
# mysql 

CentOS 6.5安装XtraBackup 还原RDS Mysql备份文件到本地Mysql服务器

有个网站的数据库用了下RDS,本文记录将RDS备份文件backup.gz还原到本地Mysql服务器中的流程。

顺便解决了innobackupex_55: command not found报错的问题。

MySQL

安装XtraBackup工具,去官网根据对应系统版本,安装XtraBackup,我安装的是比较经典稳定的2.1.5版

wget https://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.5/RPM/rhel6/x86_64/percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm

安装依赖包

yum install -y perl-DBD-MySQL perl-DBI  perl-Time-HiRes libaio*

安装

rpm -ivh percona-xtrabackup-2.1.5-680.rhel6.x86_64.rpm

查看安装成功没有

rpm -qa |grep  xtrabackup

显示

percona-xtrabackup-2.1.5-680.rhel6.x86_64

rpm -ql percona-xtrabackup-2.1.5-680.rhel6.x86_64

显示

/usr/bin/innobackupex
/usr/bin/innobackupex-1.5.1
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/bin/xtrabackup_55
/usr/bin/xtrabackup_56
/usr/share/doc/percona-xtrabackup-2.1.5
/usr/share/doc/percona-xtrabackup-2.1.5/COPYING

使用wget从下载备份文件,下载下来的文件需要重新命名 使用mv命令重命名为backu.gz

下载xtrabackup程序完成后,首先解压backup.gz,再使用xtrabackup中附带的解包工具进行解包。
执行命令:

mkdir -p /home/mysql/data_dir && gzip -d -c backup.gz | xbstream -x -C /home/mysql/data_dir

完成解压及解包后应用innodb的redo-log,执行命令(注意百度教程中是错的)

以下是百度教程中的错误命令:

innobackupex_55 --defaults-file=/home/mysql/data_dir/backup-my.cnf --apply-log /home/mysql/data_dir

但是,innobackupex_55命令执行后报错,如下:

# innobackupex_55 --defaults-file=/home/mysql/data_dir/backup-my.cnf --apply-log /home/mysql/data_dir
-bash: innobackupex_55: command not found

发百度工单瞎耽误工夫,最后自己搞定了,正确的命令为:

innobackupex --defaults-file=/home/mysql/data_dir/backup-my.cnf --apply-log /home/mysql/data_dir

执行后出现以下信息则说明成功了

命令执行完毕后,参考/home/mysql/data_dir/backup-my.cnf文件修改mysql数据库配置中的innodb_log_file_size参数;
使用/home/mysql/data_dir文件夹作为数据目录启动mysql即可。

vi /etc/my.cnf

将原来的datadir = /usr/local/mysql/var注释掉(怎么注释?语句前面加一个#号)
然后将以下的配置加入my.cnf文件中,注意加在原my.cnf文件中的[mysqld]下面,:wq命令保存

[mysqld]
innodb_checksum_algorithm=innodb
innodb_log_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:32M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=268435456
innodb_fast_checksum=0
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_tablespaces=0

然后重启Mysql服务

/etc/init.d/mysql restart

配置WordPress上传图片/附件文件同步到UPYUN又拍云存储

这几天笔者一直在折腾UPYUN又拍云存储相关的问题且整理到不少的基础文章,昨天已经创建且绑定域名,并且又拍云还支持一键快速配置SSL证书。对于一般的站长而言,我们希望网站速度打开快一些,这样用户体验会比较好,如果在本身的服务器资源比较固定限制的时候,我们就要寻求细微的改善,比如将静态资源与网站分离,一般会使用到第三方云存储+CDN加速。

因为考虑到UPYUN又拍云免费空间支持HTTPS流量,所以暂时就准备将占用资源较大的图片资源单独存放到又拍云存储中,这样就减低页面的加载资源提高速度。我们可以实现的方法有很多种,比如可以手工将图片传到云存储空间中,然后编辑文章的时候调用图片,或者采用W3 Total Cache缓存插件结合FTP同步上传图片。

在这篇文章中,我准备使用hacklog remote attachment upyun插件,实现WordPress附件图片文件上传到又拍云存储中,然后直接从又拍云存储调用图片,一来可以降低服务器的存储空间,二来可以提高网站打开速度,毕竟这类第三方存储空间具备CDN加速,应该是比自己服务器速度快。

未分类

第一、 WordPress同步又拍云插件

插件地址:https://github.com/ihacklog/hacklog-remote-attachment-upyun

目前这款插件并没有在WordPress官方平台中,以前有一款老版本在的,这款比较新的插件提交在GITHUN上,我们下载后安装到当前WordPress网站中。

第二、 配置同步又拍云插件准备工作

1、如果我们直接看到这篇文章的,那需要创建一个又拍云存储空间,如果我们域名有BA过的,可以设定绑定自己的域名,这样觉得更加专业一点点,也可以选择启动SSL证书,具体可以参考这篇文章。

2、开启表单API

未分类

因为我们上传的图片、附件文件会直接上传到又拍云存储中,所以需要开启API,这样不经过本地服务器,直接传到又拍云存储空间中。

3、开启防盗链

未分类

如果我们附件文件较大,或者希望启动防盗链,可以直接开启Token 防盗链,设置一个密钥,记下来,等会设置需要,如果不希望启动那就不管了。

第三、 又拍云同步WordPress插件设置

1、管理员、表单API设置

未分类

根据我们创建的云存储空间设置空间名称、操作员用户名和密码。以及我们开启的API密钥,其他参数默认。如果防盗链设置密钥后,就填写,没设置启动就留空。

2、设置URL和路径

未分类

上面几行的参数都默认即可,主要是最后这三行,远程URL是我们自定义的域名,以及在服务器和存储空间保存文件的路径。

第四、 WordPress站点文件的路径定向

因为我们即将图片和附件都采用又拍云存储空间上的,如果我们是新网站那就不用管,但是已经本地有存储图片的,我们需要全部转移拷贝一份到远程空间中。这里我们直接用FTP链接到又拍云,然后对应路径传上去。

未分类

理论上我们需要将全站本地地址的目录替换成又拍云的绑定空间的地址,但是这个插件提供一键转移,点击后直接就替换掉了。刷新页面,我们可以看到当前的全部使用的又拍云空间存储地址文件。

第五、 小结

1、这个hacklog remote attachment upyun插件能够和又拍云完美结合,将WordPress附件文件传到存储中,使得静态文件完全调用又拍云存储的,提高网站速度降低资源占用。

2、唯一不足的是上传文件完全到又拍云存储中,本地没有同步一份,如果能给用户选择本地也保存一份这样对于数据的安全会更好一些。这样完全是在又拍云,如果,我们定期也需要将又拍云存储文件备份到本地,确保数据的安全。

解决WordPress的Fatal Error: Out of Memory

WordPress 偶尔出现 502 Bad Gateway 错误,通过查看日志,发现是 Fatal Error: Out of Memory 错误,也就是内存不足导致的,最好的解决方法就是直接升级服务器配置啦,如果你是VPS 或者 是共享主机,可以尝试下面的方法来解决:

方法一:You can even consider adding a line in .htaccess file which will resolve the issue.

php_value memory_limit 256M

就是在 .htaccess 文件中加上红色的那行字

方法二:Add this to your wp-config.php file:

define (‘WP_MEMORY_LIMIT’, ‘256M’ );

在你的 wp-config.php 文件中加上红色的那行字

方法三:wp-settings.php,编辑这个文件,修改define(‘WP_MEMORY_LIMIT’, ’32M’);为

define(‘WP_MEMORY_LIMIT’, ‘256M’);

方法四:在你的博客目录中添加一个 php.ini 文件,并且写入下面那行

memory_limit=256M

方法五:其实是方法四升级版:在你的博客目录中添加一个 php.ini 文件,并且写入下面的内容

register_globals=Off
safe_mode=off
magic_quotes_gpc=On
allow_url_include=Off
file_uploads=on
memory_limit=256M
max_executi alt=90
post_max_size=10M
upload_max_filesize=10M
max_input_time=300

如果以上加大内存的方法,还是不能够解决 Fatal Error: Out of Memory ,那你的WordPress可能某个插件 或 个功能,真的很耗内存,可以尝试用「WordPress插件:P3,找出拖慢网站的插件」排查。

CentOS LNMP WordPress自动更新需填写FTP解决方法

无论是使用阿里云还是其他云 VPS 下的 Linux + LNMP 一键安装包环境,安装 WordPress 后,遇上提示更新升级的时候,都会出现需要填写 FTP 相关信息的情况,相当不方便。不过,根据 LNMP 作者军哥的博客提示,只需要在服务器内做一些文件权限的修改变可以。

这个问题的产生,主要是网站目录的权限执行身份非文件属主身份。

解决方法如下:

假设你的 WordPress 安装目录为 /home/wwwroot/lnmp.org

用 Putty 登录 Linux VPS ,执行:chown -R www /home/wwwroot/lnmp.org

执行上面的命令就可以将 /home/wwwroot/lnmp.org 下所有文件的属主改为 www ,这样就可以解决自动更新必须填FTP的问题。

基本上按以上方法就可以解决问题,如果还不能正常成功更新,可以尝试修改 wp-config.php 文件

在 wp-config.php 中加入一行代码

define('FS_METHOD', "direct");

如此就能可以在后台点击更新升级。

使用docker-compose来部署WordPress

很早的时候想维护一个个人Blog,一开始通过 github home page + jekyll,奈何没精力再去把ruby玩溜,自己也不是个擅长改写前端页面的人,无疾而终。今天终于鼓起勇气,买了服务器和域名,部署了wordpress,毕竟wordpress易用易上手,模板也多,也就懒得自己改了。既然本Blog是运行在Docker之上的,那第一篇文章也就来说说这个吧。

部署方式介绍

  • 我的服务器安装的是Arch Linux,自己也是比较喜欢这个极简的Linux发行版。
  • 我使用了docker-compose来做镜像编排工具,nginx,mysql(mairadb),wordpress分别运行于不同的容器。
  • 托上面两个先决条件的福,下面的内容大家根据自己的实际环境,酌情选择。

准备工作

安装Docker

托Arch Linux的福,安装Docker非常简单。

pacman -S docker

安装docker-compose

同样是托Arch的福,安装依旧简单粗暴。

pacman -S docker-compose

准备配置

首先我们需要做的是准备好docker wordpress运行的用户,执行以下命令,添加一个叫wordpress的新用户,将它添加到docker用户组,并为它设置密码

useradd -m -s /bin/zsh wordpress
usermod -a -G docker wordpress
passwd wordpress

紧接着,创建一些目录,保存docker-compose配置文件,存储运行产生的文件,让数据库落地到本机而不是容器,执行以下命令

su - wordpress
cd
mkdir wordpress-compose
touch docker-compose.yml
mkdir -p wordpress-compose/db-data
mkdir -p wordpress-compose/logs/nginx
mkdir -p wordpress-compose/nginx
mkdir -p wordpress-compose/wordpress

这些目录和文件的功能分别如下:

目录或文件 含义

  • wordpress-compose 容器相关根目录
  • wordpress-compose/db-data 数据库数据存储目录
  • wordpress-compose/logs/nginx nginx存储目录
  • wordpress-compose/nginx nginx配置文件
  • wordpress-compose/wordpress wordpress本体,因为安装插件等会改变php文件

接下来我们编写必要的nginx配置文件。在wordpress-compose/nginx下新建wordpress.conf文件,文件中写入下面这些配置,一个很经典的php-fpm的nginx配置文件。

server {
    listen 80;
    server_name www.gsgtzq.com;

    root /var/www/html;
    index index.php;

    access_log /var/log/nginx/wordpress-access.log;
    error_log /var/log/nginx/wordpress-error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ .php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass wordpress:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

接下来就是docker-compose配置文件的编写了,首先将工作目录切换至刚刚创建的wordpress-compose目录,用自己熟悉的编辑器打开docker-compose.yml文件。

vim docker-compose.yml

先是nginx部分,我使用最新的nginx镜像,暴露80端口给本机,挂载conf.d、log、/var/www/html目录到本机,连接nginx和wordpress容器。

nginx:
        image: nginx:latest
        ports:
                - '80:80'
        volumes:
                - ./nginx:/etc/nginx/conf.d
                - ./logs/nginx:/var/log/nginx
                - ./wordpress:/var/www/html
        links:
                - wordpress
        restart: always

然后是mysql部分,我使用了mairadb的最新镜像,挂载mysql数据存储点到本机,链接mysql和wordpress容器,通过环境变量设置mysql的默认root密码。

mysql:
        image: mariadb:latest
        volumes:
                - ./db-data:/var/lib/mysql
        environment:
                - MYSQL_ROOT_PASSWORD=123345
        restart: always

最后是wordpress本体,我使用wordpress:php7.1-fpm的镜像,挂载/var/www/html目录到本机,链接连接mysql容器和wordpress,并且使用环境变量,指定mysql主机名,表前缀,和库名。

wordpress:
        image: wordpress:php7.1-fpm
        volumes:
                - ./wordpress:/var/www/html
        environment:
                - WORDPRESS_DB_NAME=wpdb
                - WORDPRESS_TABLE_PREFIX=wp_
                - WORDPRESS_DB_HOST=mysql
        links:
                - mysql
        restart: always

到此位置,docker-compose的配置文件全部编写完毕。

启动容器

编排文件已写完,接下来启动容器即可。

docker-compose up -d

当收到三个done以后,编排好的容器就正式启动了,我们现在可以访问本机的IP或域名来访问wordpress了。
我还可以使用下面这些命令来检查容器的运行情况,注意,docker-compose命令只有在刚才写好配置文件的目录下执行才有效果。

命令 含义

  • docker ps -a 查看当前所有运行的docker容器
  • docker-compose logs wordpress 查看wordpress容器的日志
  • docker-compose ps 查看当前编排好的应用的所有容器状态
  • docker-compose top 查看当前编排好的应用中各容器中的进程情况

具体还有一些其他的办法,可以通过查阅docker手册和docker-compose文档来进行使用。

结束语

到此为止,使用docker来运行wordpress已经完成,从开始折腾Docker到现在少说1个半月过去了,也是学习到了非常多的东西,目前而言公司的项目想用起docker来还是有不少难度,我思考了很多使用docker对传统部署和开发带来冲击的问题,例如对开发人员的要求其实高了很多,尤其是在运维这块,基础环境部署等等……但很希望自己能把它用好了,开发受益,运维也受益。

WordPress迁移网站目录时如何修改数据库信息

当我们搭建好网站后,如果需要给网站更换主机空间和迁移网站目录,也就是站长常说的“网站搬家”,对于新手站长来说可能会比较复杂,最近很多用户咨询:主机上的网站目录如何迁移,下面为大家详细介绍Wordpress迁移网站目录数据库信息的修改方法!

1、登陆数据库修改下配置然后移动到站点根目录

未分类

WordPress迁移网站目录数据库信息的修改方法

2、修改两个字段siteurlhome

未分类

修改两个字段siteurlhome

3、点击执行操作即可

未分类

点击执行操作

Ubuntu 16.04使用Docker部署WordPress

未分类

介绍

WordPress是基于PHP和MySQL的著名内容管理系统,根据GNU GPLv2(或更高版本)的规定分发。通常它安装在像Apache这样的Web服务器上,但也可以在使用Docker容器构建的隔离环境中运行它,特别是使用Docker Compose。本教程的主题时使用Ubuntu 16.04作为操作系统。

入门

首先,有必要安装Docker和Docker Compose。 在Ubuntu 16.04中,这可以通过两种不同的方式完成:

  • 设置存储库并从中安装,方便安装和升级任务
  • 下载DEB包并手动安装; 还允许您完全手动管理升级

在本教程中,Docker将使用存储库方法进行安装。 因此,您需要安装软件包以允许apt通过HTTPS使用存储库:

# apt install -y --no-install-recommends apt-transport-https ca-certificates curl software-properties-common

接下来,添加Docker的官方GPG密钥:

$ curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -

密钥ID应为58118E89F3A912897C070ADBF76221572C52609D,因此验证:

$ apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

使用以下命令设置稳定存储库:

# add-apt-repository 
       "deb https://apt.dockerproject.org/repo/ 
       ubuntu-$(lsb_release -cs) 
       main"

现在可以安装Docker了。

首先,更新apt包索引:

# apt update

然后:

# apt install docker-engine
This will install docker and its daemon should start automatically.

安装 Docker Compose

安装Docker后,下一步是安装Compose,这是此过程所必需的。 只需执行命令:

# curl -L https://github.com/docker/compose/releases/download/1.11.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

更改docker-compose binary的权限:

# chmod +x /usr/local/bin/docker-compose

测试:

$ docker-compose --version

现在Docker和Docker Compose已安装并可以使用。

安装 MariaDB

创建一个空目录,例如docker_wordpress。
然后改成:

$ cd docker_wordpress

创建一个docker-compose.yml文件,该文件将启动您的WordPress博客和一个单独的MySQL实例与卷挂载数据持久性。
在此文件中,输入以下文本:

version: '2'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

接下来,在docker_wordpress文件夹中,使用以下命令启动容器:

# docker-compose up -d

这很简单,因为Docker团队确保一切都配置良好。 事实上,WordPress Docker容器中有一个脚本,它从wordpress容器中读取MYSQL_ROOT_PASSWORD变量,并使用它来连接到WordPress。

安装 PHPMyAdmin

添加PHPMyAdmin与添加数据库没有什么不同。在docker-compose.yml文件中,只需在“services”部分添加以下行:

phpmyadmin:
image: corbinu/docker-phpmyadmin
  links:
    - wordpress_db:mysql
  ports:
    - 8181:80
  environment:
    MYSQL_USERNAME: root
    MYSQL_ROOT_PASSWORD: wordpress

保存这些配置并运行docker-compose命令来创建和启动容器:

# docker-compose up -d

配置几乎完成! 使用Web浏览器,转到URL:http://SERVER_IP:8181。 它将显示PhpMyAdmin的登录屏幕。 使用在docker-compose.yml文件中配置的相同凭据进行登录。

总结

就这样!现在服务器正在运行WordPress安全和隔离的容器。虽然Docker是“开发人员工具”,但它可以用于各种项目,就像这里所示。 当然,配置文件可以通过更细致的细节进行编辑和定制,例如DNS部分和一些硬件限制,如CPU和内存使用。 祝你玩得开心!