zabbix监控华为服务器硬件状态

简介

zabbix监控华为服务器的硬件是通过iBMC,iBMC系统默认支持V3版本的SNMP服务,SNMP V1和SNMP V2C由于自身机制存在安全隐患,默认是不开启的。如果使用SNMP V1和SNMP V2C需要配置团体名,而用V3只需知道用户名密码及加密算法即可。

我们可以现在zabbix server上安装snmpwalk,然后进行如下测试:

[root@test ~]# snmpwalk -v 3 -u root -a sha -A 'Huawei12#$' -x AES -X 'Huawei12#$'  -l authPriv 192.168.5.48 1.3.6.1.4.1.2011.2.235.1.1.1.1.0
SNMPv2-SMI::enterprises.2011.2.235.1.1.1.1.0 = INTEGER: 1

我们根据https://share.zabbix.com/cat-server-hardware/huawei/huawei-pc-server提示进行监控华为RH1288 V3服务器。

配置zabbix

1. 下载模板

在以下链接中下载模板
https://share.zabbix.com/cat-server-hardware/huawei/huawei-pc-server

2. 导入模板

在”模板”-“导入”,按顺序先导入valuemaps.xml、再导入templates.xml

未分类

“Template_Huawei_PCServer”就是我们新导入的模板。

3. 编辑模板

我们可以模板中的各监控项中根据实际情况修改SNMP OID、验证口令及私钥。由于我们使用的是SNMP V3,因此我们保证验证口令及私钥正确即可;触发器及自动发现规则也是按此方式修改。

未分类

4. 创建主机

未分类

在”模板”中,添加”Template_Huawei_PCServer”模板链接即可。

5. 监控最新数据

未分类

至此华为RH1288 V3服务器的硬件状态监控完成。

企业级监控系统:Zabbix详细安装配置教程

Zabbix是一款开源并且完全免费的企业级系统监控软件,它拥有强大无比的各种监控功能,可以全方位监控你的服务器或是VPS系统运行状态。

首先各位别被企业级这几个字眼给唬住了,很多朋友可能一看到这种字眼就觉得,哇,这玩意儿不会特别难装吧!?其实我说句实在话,Zabbix安装还是挺简单的,倒是配置使用起来需要花一些时间,因为它有太多的功能,所以显的操作界面乱七八糟,初次使用的朋友可能会有点摸不着头脑。所以,LALA决定分两篇文章来写Zabbix,今天这一篇就是教大家如何安装和基本配置Zabbix。而后面会专门再写一篇Zabbix监控系统的教程。

熟悉我的人都知道,我不喜欢把一个教程写的繁琐和复杂。作为一个教程,我认为让看的人能够轻松看懂、轻松学会,那么这个教程就是一个好教程,所以,我每篇文章都尽量写的通俗易懂。

进入正题:

准备一台稳定的VPS或者独立服务器,系统选择CentOS7X64,使用Xshell以root用户的身份登录到你的机器内。

更新系统:

yum update

安装宝塔WEB面板:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh

在面板安装完成后,我们使用宝塔面板安装一个LNMP环境,组件请务必按照如下图的版本号来选择:

未分类

这里,我们喝杯咖啡或者看看妹子都可以的,一定要等这个LNMP环境安装完成后,我们才能继续下一步的操作。

环境安装完成后,我们回到Xshell内,新建一个用户:

groupadd zabbix
useradd zabbix -g zabbix -s /sbin/nologin

安装EPEL源:

yum -y install epel-release

安装编译Zabbix需要的各种依赖和组件:

yum -y install net-snmp-devel fping

在root目录内下载Zabbix源码(在你的本地电脑也提前下载一份,待会会用到):

cd /root
wget https://excellmedia.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.4.7/zabbix-3.4.7.tar.gz

解压并进入到Zabbix目录内:

tar -zxvf zabbix-3.4.7.tar.gz
cd zabbix-3.4.7

编译:

./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2

完成后如图所示:

未分类

安装:

make install

完成后如图所示:

未分类

现在回到宝塔WEB面板中,按如下图操作打开phpMyAdmin:

未分类

新建一个Zabbix数据库,请注意这个数据库的排序规则一定要是utf8_general_ci,如图所示:

未分类

接着我们导入zabbix-3.4.7/database/mysql目录下的数据库文件:

schema.sql
images.sql
data.sql

请一定依次按照1-3的顺序导入,如下图所示:

未分类

在phpMyAdmin内导入我们的数据库文件,如图所示:

未分类

将schema.sql、images.sql、data.sql都按照上图的方法导入到我们的Zabbix数据库中。确定都导入成功后,回到Xshell内。

编辑Zabbix的服务端配置文件:

vi /usr/local/etc/zabbix_server.conf

修改数据库名、数据库用户名、数据库用户对应的root密码,如图所示:

未分类

数据库的root密码在哪里查看?如下图所示:

未分类

接着修改Zabbix的客户端配置文件:

vi /usr/local/etc/zabbix_agentd.conf

将Server=127.0.0.1后面的IP修改成你的服务器或是VPS的公网IP,如图所示:

未分类

关闭CentOS7的防火墙:

systemctl stop firewalld.service
systemctl disable firewalld.service

启动Zabbix的服务端和客户端:

zabbix_server
zabbix_agentd

查看运行状态:

ps -ef | grep zabbix_server
ps -ef | grep zabbix_agentd

确保都是正常运行的,如下图所示:

未分类

现在我们来安装Zabbix的WEB前端。

首先回到宝塔WEB面板中,点击如下图所示的按钮新建一个站点:

未分类

输入你的站点域名,然后点提交:

未分类

接着点击宝塔面板左侧的“软件管理”,找到对应的PHP版本设置,点击配置修改,按照如下图把max_input_time的值改成300:

未分类

回到Xshell内,复制Zabbix的前端程序文件到你的站点目录内:

cp -r /root/zabbix-3.4.7/frontends/php/* /www/wwwroot/你的站点`目录

此时通过浏览器,访问你的站点,不出意外的话可以看到Zabbix的安装界面了:

未分类

检测环境组件,这里需要注意的是往下拉会有一个PHPLDAP的Warning,PHP的LDAP扩展非必须安装,所以我们无视掉即可:

未分类

填写MySQL的数据库连接信息,这里和之前我们在zabbix_server.conf配置文件内填写的内容要一致:

未分类

填写站点名字,请注意上面的Host和Port不要做更改:

未分类

再次确认你之前填写的这些信息是否无误,没问题就点击Next step:

未分类

不出意外这里会报一个错误,所以这里我们将配置文件下载到本地:

未分类

回到宝塔面板中,将配置文件上传到我们的站点根目录下的conf目录内:

未分类

回到浏览器中,再次点击Finish,就安装完成了:

未分类

至此,Zabbix就安装完毕,接下来是进行一些简单的配置设置。

首先打开站点首页,出现登录界面:

未分类

默认的管理员账号:Admin
密码:zabbix

登录进去后,第一件事情就是把密码改了,然后把站点语言修改成中文:

未分类

接着Zabbix默认会给我们启用一个没密码的Guest,为了安全起见,我们需要把这个账号停用掉:

未分类

至此,Zabbix的安装和基本配置就完成了。

稍等一会儿,LALA会再开一篇文章专门来写Zabbix的监控使用方法。

Zabbix监控VPS主机详细教程

如果你还不知道或是不了解什么是Zabbix,可以先移步看看下面这篇文章:

企业级监控系统:Zabbix详细安装配置教程

在你初步了解并安装完Zabbix后,现在就可以跟着我的这篇文章来尝试使用Zabbix来监控自己的服务器或是VPS主机了。

进入正题:

我们先尝试监控宿主机,也就是安装Zabbix的这台机器。

点击-配置-主机-Zabbix server,如图:

未分类

在Agent代理程序的接口这里,将IP地址修改成我们的Zabbix服务器公网IP:

未分类

这样我们就完成了对宿主机的系统监控。在监测中-图形,选择对应名字的群组,然后选择对应的主机名,再选择要显示的图形,即可看到监控图表:

未分类

上图中我只是随便选择了一个CPU负载的图形,实际上可选的图形多的数不胜数,就比如这样:

未分类

再比如我们选择一个常用的,查看eth0网卡流量的图表:

未分类

以上,是我想让大家先稍微熟悉一下Zabbix的基本监控操作。

那么下面,我们该如何监控除宿主机以外的其他机器呢?

这里我用CentOS7做示范,在被监控的机器上我们需要安装Agentd客户端。

使用Xshell登录到你的被监控机器内,首先安装EPEL源:

yum -y install epel-release

安装监控所需的依赖组件(Zabbix监控Ping值、丢包率等必须安装fping):

yum -y install fping

一条命令即可安装完成Agentd:

rpm -ivh http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-agent-3.4.7-1.el7.x86_64.rpm

注:更多其他系统的Agentd安装包可浏览:http://repo.zabbix.com/zabbix/3.4/

查找Agentd的配置文件:

find / -name zabbix_agentd.conf

编辑它:

vi /etc/zabbix/zabbix_agentd.conf

将Server=后面的IP地址修改成你的Zabbix服务端公网IP,如图所示:

未分类

最后启动Agentd:

zabbix_agentd

这样我们就在被监控的机器上安装好了客户端,那么下面就回到Zabbix的WEB界面内。

点击配置-主机-创建主机,如图所示:

未分类

填写主机名称、可见的名称以及选择一个合适的群组,然后在agent代理程序的接口这儿把IP地址修改成被监控机器的公网IP:

未分类

接着点击模版-选择链接指示器:

未分类

在弹出的新窗口内,我们可以看到各式各样的监控模版,这里假设LALA要监控Enoctus HKDC1 VPS的PING值和丢包率,我们就可以选择Template Module ICMP Ping,如图所示:

未分类

选择好了后,我们点击添加,确定链接指示器内有我们刚才选择的模版名后,再点击最下面的添加按钮,保存设置:

未分类

这样我们就把一台VPS主机加入到了Zabbix的监控列表中,此时Zabbix就在帮我们无时不刻的监控此VPS到Zabbix宿主机之间的Ping值、丢包率了。

但我们如何用图表的方式来查看监控的具体数据呢?这里我们就需要自己创建一个图形了,点击如图所示按钮:

未分类

右上角点击创建图形:

未分类

填写图形的名称,然后在监控项内点击添加按钮:

未分类

在弹出的新窗口中,我们可以看到之前添加的监控模版,都有哪些具体的监控项目,选择我们要显示在图形中的监控项目:

未分类

然后我们对图形的绘图风格进行适当的调整:

未分类

注:建议监控Ping值的时候,将ICMP response time的纵轴Y侧修改成:右。

然后我们就可以点击预览,来查看一下当前的图形显示状态:

未分类

这样,我们就配置好了一个监控Ping值、丢包率的监控项目。

同理,作为我们日常使用的话,除去添加一个监控Ping值、丢包率的模版外,还最常用到的必然是:Template OS Linux

方法一样,找到对应的模版名添加即可:

未分类

与之前不同的是,这个模版在添加完成后,会自动帮我们创建一些图形,而不再需要我们手动去添加。当然Zabbix也只是帮我们创建了一些最基本的图形:

未分类

如果你需要更多的图形,则还是需要手动添加,只不过这次可以添加的图形选择就很多了:

未分类

相信,你把这篇文章看到这里,就大概明白Zabbix添加监控某一个项目的具体方法了,无非流程就是这样:

1、在被监控的机器上安装Agentd客户端。

2、在Zabbix的WEB界面上创建主机,并填写被监控主机的IP地址。

3、使用Zabbix自带的模版,来添加监控项目。

4、绘制图形,用来显示监控项目的具体数据。

其实你理解后,就会发现操作起来很简单的,看,就只有4步。

但Zabbix作为一个企业级的监控软件,实际上可自定义的功能多的数不胜数,虽然内置的模版已经够强大了,但Zabbix并不局限于用模版来添加监控项目,实际上我们还可以自己手动来自定义某一个监控条件。

当然LALA不推荐各位使用接下来下面说的方法来监控,因为这些操作一般个人是根本使用不上的。

首先,我们点击监控项:

未分类

右上角创建监控项:

未分类

在这里有一个非常关键的键值:

未分类

点击选择,我们在新窗口中可以看到各式各样的“标准检测器”:

未分类

你们可以把“标准检测器”下面的这些键值理解成每一个键值都是一个监控项目,并且这些监控项目都是受高度DIY的,比如说监控的频率、时间、等等都是可以自定义的。

所以,这里我就点到为止,个人用户只是拿来监控VPS的话,根本不需要用到这些。当然如果你喜欢折腾,可以在这里尝试使用一下。

至此,我想你把文章看到这里,就应该基本知道该如何使用Zabbix来监控一个自己的项目了。现在让我们一起看看之前我们监控的Enoctus VPS各项数据展现如何。

网卡流量:

未分类

内存使用率:

未分类

CPU负载情况:

未分类

Ping值、丢包率情况:

未分类

空闲硬盘大小:

未分类

系统运行时间:

未分类

这里还有很多图形,就不一一列举了。在这里我想告诉大家的是,Zabbix还有一个强大的地方就在于图形的查看时间是可以自定义的,比如我上面的这些图形,有的是查看的1小时内的数据,有的是2小时内的数据,这里就用到了图形的缩放。那么Zabbix的缩放功能就在过滤器的下方。你们仔细看上面的几张图可以了解到。

至此,今天的教程就差不多结束了。

写在最后:

这里有一个Zabbix的小BUG,我觉得很有必要给大家提一下,顺带给大家一个修复办法。

如果你将Zabbix的WEB面板语言改成中文,那么图形内的中文会变成乱码,为何我文中的图形都没有乱码呢?因为我事先替换掉了Zabbix的WEB字体文件。

如何替换解决字体乱码?

1、找到你电脑系统内任何一款简体字(Windows/Fonts),把字体文件复制出来:

未分类

2、把字体文件上传到ZabbixWEB站点根目录下的fonts目录内,并把之前的字体重命名:

未分类

3、把我们刚上传的字体文件重命名为DejaVuSans.ttf:

未分类

如何关闭Agentd服务端?

查找Agentd进程PID:

ps -ef | grep zabbix_agentd

强制结束:

kill -9 进程PID

被监控机器无法正常和Zabbix的服务端通信?

关闭被监控机器内的防火墙:

systemctl stop firewalld.service
systemctl disable firewalld.service

利用 xtrabackup 工具实现增量备份 mysql(附脚本)

1、安装 percona 源

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm

2、安装 xtrabackup

yum install percona-xtrabackup-24 -y            #2.4 之前版本可能不支持 mysql5.7

3、创建备份文件夹

mkdir /data/backup/mysqlbak

4、编写备份脚本

vim mysqldump.sh
#!/bin/sh
base_dir="/data/backup/mysqlbak/"
log_file="/tmp/Backup.log"
increse_dir=
grep "Backup created in directory" $log_file | awk -F "'" {'print$2'}

dir_name=
grep "Backup created in directory" $log_file | awk -F "'" {'print$2'} | awk -F "/" {'print$5'}

increse_dir_path=
grep "Backup created in directory" $log_file | awk -F "'" {'print$2'} | awk -F '/' '{for(i=1;i<=4;i++)printf $i"/"; printf "n"}'

fullbackup_exist=
ls $base_dir | wc -l

if [$fullbackup_exist = 0 -a "$1" != "full_backup"];then
echo "you must make the fullbackup first! please usage: $0 full_backup"
exit 88;
fi
full_backup() {
innobackupex --user=root --password=password $base_dir
}
increase_backup() {
innobackupex --user=root --password=password --incremental-basedir=$increse_dir --incremental $base_dir
cd $increse_dir_path
tar -zcvf ${dir_name}.tar.gz $dir_name
mv $increse_dir /tmp/
}
case "$1" in
full_backup)
full_backup > $log_file 2>& 1
;;
increase_backup)
increase_backup > $log_file 2>& 1
;;
)
echo "usage: $0 {full_backup|increase_backup}"
;;
esac

5、执行第一次全量备份

./mysqldump.sh full_backup

6、创建计划任务,进行日常增量备份

crontab -e


01 00 sh /root/mysqldump.sh increase_backup

7、制作还原脚本

#!/bin/sh
base_dir="/data/backup/"
tar_files=
find $base_dir -name "*.tar.gz"

recover_mysql() {
for tar_file in $tar_files
do
cd $base_dir
tar -zxvf $tar_file
rm -f $tar_file
done
full_dir=
ls -lt $base_dir | tail -1 | awk {'print$9'}

increase_dirs=
ls -lrt $base_dir | grep "root" | awk {'print$9'}

innobackupex --apply-log --redo-only ${base_dir}${full_dir}
for increase_dir in $increase_dirs
do
if ["$increase_dir" != "$full_dir"];then
innobackupex --apply-log --redo-only --incremental ${base_dir}${full_dir} --incremental-dir=${base_dir}${increase_dir}
fi
done
innobackupex --copy-back ${base_dir}${full_dir}
}
recover_mysql > /tmp/recover_mysql.log 2>& 1

Xtrabackup实现Mysql的InnoDB引擎热备份

前面Zabbix使用的数据库是mysql,数据库备份不用多说,必须滴,由于使用的是innodb引擎,既然做,那就使用第三方强大的Xtrabackup工具来热备吧,Xtrabackup的说明,参见https://my.oschina.net/u/1171265/blog/200437

数据库备份

简单粗暴,下面给出mysql备份脚本:

#!/bin/bash
#mysql热备脚本,Version:1.0
#Author:jzd
#备份策略:每周一进行完整备份,以后每一天在前一天的基础上进行增量备份
#
#备份目录
back_dir="/back"

#备份数据库信息
host="127.0.0.1"
dbuser="dbuser"
dbpasswd="dbpasswd"

#日志文件
back_log="${back_dir}/mysql_back.log"

#week day
week_day=`date +%w`
#yesterday
yesterday=`date +%F -d "1 days ago"`

#日志记录函数
function log(){

  echo "`date` $1" | tee -a ${back_log}

}

#判断当前日期,是周一进行全备份,其他时间进行增量备份
if [ ${week_day} -eq 1 ]; then
#完整备份
  log "周${week_day}开始完全备份..."
  innobackupex --host=${host} --user=${dbuser} --password=${dbpasswd} ${back_dir} &>> ${back_log}
  if [ $? -eq 0 ]; then
    log "完全备份完毕."
    else
       log "完全备份出错,请检查."
       exit 1
  fi
  else
    let dir_num=`find ${back_dir} -type d -name "${yesterday}*" | wc -l`
    if [ ${dir_num} -ne 1 ]; then
      log "昨天增量目录未找到或昨天备份目录大于等于2个,请确认后再次备份."
      exit 1
    fi
    incremental_dir=`find ${back_dir} -type d -name "${yesterday}*"`
    log "周${week_day}开始增量备份..."
    #增量备份
    innobackupex --host=${host} --user=${dbuser} --password=${dbpasswd} --incremental ${back_dir} --incremental-basedir=${incremental_dir} &>> ${back_log}
    if [ $? -eq 0 ]; then
      log "增量备份成功."
      else
        log "备份失败,请检查日志..."
        exit 1
    fi
fi

exit $?

需修改的地方,也可以写成配置文件source进去,完全可以用在生产环境。

#备份目录

back_dir="/back"



#备份数据库信息

host="127.0.0.1"

dbuser="dbuser"

dbpasswd="dbpasswd"



#日志文件

back_log="${back_dir}/mysql_back.log"

数据恢复

话说备份容易,恢复不易啊,下面也给出恢复脚本,配合上面备份脚本使用,但是恢复完毕后,需手动恢复当日的二进制文件,恢复方法见开篇Xtrabackup介绍文章;

恢复脚本的星期和日期对应的转换,搞得头都大了,缠了两天,判断太多,导致太乱,于是多使用函数,发现自己对函数的使用加强了(哈哈,相对于以前,感觉自己有面向对象的思想了,但这是shell)

#!/bin/bash
#mysql数据恢复脚本
#Author:jzd
#Version:V1.0

#back dir
back_dir='/back'
#full back day
full_back_day=1
#today
today=`date +%F`
#week day
week_day=`date +%w`
#log file
recovery_log="${back_dir}/mysql_recovery.log"

#log
function log(){
  echo "`date` $1" | tee -a ${recovery_log}
}

#find back dir
function finddir(){
  if [ `find $back_dir -type d -name "$1*" | wc -l` -ne 1 ]; then
    log "发现备份目录$1为0个或多于一个,请检查..."
    exit 1
    else
      log "发现备份目录`find $back_dir -type d -name "$1*"`"
      find_dir="`find $back_dir -type d -name "$1*"`"
  fi
}

#all recovery
function allredo(){
 log "开始完整备份恢复准备..."
 innobackupex --apply-log --redo-only $1 &>> ${recovery_log}
 if [ $? -ne 0 ]; then
    log "完整恢复准备出错,请检查..."
    exit 1
 fi
 log "完整备份恢复准备完成"
}

#incremental recovery
function incredo(){
 log "开始增量数据恢复准备..."
 innobackupex --apply-log --redo-only $1 --incremental-dir=$2 &>> ${recovery_log}
 if [ $? -ne 0 ]; then
    log "增量数据恢复准备出错,请检查..."
    exit 1
  fi
  log "增量数据$2恢复准备完成"
}
#real recovery
function recovery(){
  log "备份数据准备完成,开始恢复数据..."
  innobackupex --copy-back $1 &>> ${recovery_log}
  if [ $? -ne 0 ]; then
    log "完整恢复准备出错,请检查..."
    exit 1
  fi
  log "恢复数据完成,请检查."
  log "请手动恢复二进制文件数据."
}

#判断今日是否是周一

if [ $week_day -eq ${full_back_day} ]; then
  finddir ${today}
  all_dir="${find_dir}"
  if [ ! -z "${all_dir}" ]; then
    allredo $all_dir
    recovery $all_dir
    else
      log "未发现今日备份,恢复上周数据."
      for i in "7 6 5 4 3 2 1"
        do
          back_date=`date +%F -d "${i} days ago"`
          if [ $i -eq 7 ]; then
            finddir ${back_date}
            all_dir="${find_dir}"
            allredo ${all_dir}
            else
              finddir ${back_date}
              dir_back=${find_dir}
              incredo ${all_dir} ${dir_back}
          fi
      done
      recovery ${all_dir}
  fi
  else
    back_date=`date +%F -d "$((${week_day}-${full_back_day})) days ago"`
    finddir ${back_date}
    all_dir="${find_dir}"
    allredo ${all_dir}
    let flag=$((${week_day}-1-${full_back_day}))
    while [ ${flag} -ge 0 ]
      do
        incr_date=`date +%F -d "${flag} days ago"`
        finddir ${incr_date}
        incr_dir="${find_dir}"
        incredo ${all_dir} ${incr_dir}
        let flag=`expr $flag - 1`
    done
    recovery ${all_dir}
fi

exit 0

WordPress上传文件提示HTTP错误解决实例

简述

在公司内部搭建内部视频学习网站,经过对比选择了WordPress进行站点搭建。但是在上传视频遭遇到了各种问题,特将此处理过程进行记录。

原因排查

1. 上传一个十几兆mp4的文件上传进度到达百分之百,会媒体提示http错误

未分类

2. 刚开始怀疑是PHP、Nginx的上传大小限制了。但是查看PHP、Nginx配置均配置了1000M

vim /etc/nginx/conf.d/default.conf
location / {
        root  /data/web;
        index  index.php index.html index.htm;
        client_max_body_size    000M;
}
vim /etc/php.ini
upload_max_filesize = 000M
post_max_size = 000M
max_execution_time = 300

3. 查看Nginx erro日志

tail /var/log/nginx/error.log
2018/02/14 09:32:07 [error] 87522#87522: *1 client intended to send too large body: 35016434 bytes, client: 36.111.88.33, server: localhost, request: "POST /wp-admin/async-upload.php HTTP/1.1", host: "117.66.240.116:81", referrer: "http://117.66.240.116:81/wp-admin/media-new.php"

只有下面这一行是最主要的保存信息。以下错误就是body限制大小的问题

client intended to send too large body

4. 将限制大小的设定在http中后上串资源就不会在有限制

vim /etc/nginx/nginx.conf
http{
    client_max_body_size    1000M;
keepalive_timeout  300;
}

如何修复 WordPress 中的 HTTP 错误

我们会向你介绍,如何在 Linux VPS 上修复 WordPress 中的 HTTP 错误。 下面列出了 WordPress 用户遇到的最常见的 HTTP 错误,我们的建议侧重于如何发现错误原因以及解决方法。

1、 修复在上传图像时出现的 HTTP 错误

如果你在基于 WordPress 的网页中上传图像时出现错误,这也许是因为服务器上 PHP 的配置,例如存储空间不足或者其他配置问题造成的。

用如下命令查找 php 配置文件:

php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

根据输出结果,php 配置文件位于 /etc 文件夹下。编辑 /etc/php.ini 文件,找出下列行,并按照下面的例子修改其中相对应的值:

vi /etc/php.ini
upload_max_filesize = 64M
post_max_size = 32M
max_execution_time = 300
max_input_time 300
memory_limit = 128M

当然,如果你不习惯使用 vi 文本编辑器,你可以选用自己喜欢的。

不要忘记重启你的网页服务器来让改动生效。

如果你安装的网页服务器是 Apache,你也可以使用 .htaccess 文件。首先,找到 .htaccess 文件。它位于 WordPress 安装路径的根文件夹下。如果没有找到 .htaccess 文件,需要自己手动创建一个,然后加入如下内容:

vi /www/html/path_to_wordpress/.htaccess
php_value upload_max_filesize 64M
php_value post_max_size 32M
php_value max_execution_time 180
php_value max_input_time 180
# BEGIN WordPress
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index.php$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>
# END WordPress

如果你使用的网页服务器是 nginx,在 nginx 的 server 配置块中配置你的 WordPress 实例。详细配置和下面的例子相似:

server {
  listen 80;
  client_max_body_size 128m;
  client_body_timeout 300;
  server_name your-domain.com www.your-domain.com;
  root /var/www/html/wordpress;
  index index.php;
  location = /favicon.ico {
  log_not_found off;
  access_log off;
  }
  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
  }
  location / {
    try_files $uri $uri/ /index.php?$args;
  }
  location ~ .php$ {
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
  location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }
}

根据自己的 PHP 配置,你需要将 fastcgi_pass 127.0.0.1:9000; 用类似于 fastcgi_pass unix:/var/run/php7-fpm.sock; 替换掉(依照实际连接方式)

重启 nginx 服务来使改动生效。

2、 修复因为不恰当的文件权限而产生的 HTTP 错误

如果你在 WordPress 中出现一个意外错误,也许是因为不恰当的文件权限导致的,所以需要给 WordPress 文件和文件夹设置一个正确的权限:

chown www-data:www-data -R /var/www/html/path_to_wordpress/

将 www-data 替换成实际的网页服务器用户,将 /var/www/html/path_to_wordpress 换成 WordPress 的实际安装路径。

3、 修复因为内存不足而产生的 HTTP 错误

你可以通过在 wp-config.php 中添加如下内容来设置 PHP 的最大内存限制:

define('WP_MEMORY_LIMIT', '128MB');

4、 修复因为 php.ini 文件错误配置而产生的 HTTP 错误

编辑 PHP 配置主文件,然后找到 cgi.fix_pathinfo 这一行。 这一行内容默认情况下是被注释掉的,默认值为 1。取消这一行的注释(删掉这一行最前面的分号),然后将 1 改为 0 。同时需要修改 date.timezone 这一 PHP 设置,再次编辑 PHP 配置文件并将这一选项改成 date.timezone = Asia/Shanghai (或者将等号后内容改为你所在的时区)。

vi /etc/php.ini
cgi.fix_pathinfo=0
date.timezone = Asia/Shanghai

5、 修复因为 Apache mod_security 模块而产生的 HTTP 错误

如果你在使用 Apache mod_security 模块,这可能也会引起问题。试着禁用这一模块,确认是否因为在 .htaccess 文件中加入如下内容而引起了问题:

<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>

6、 修复因为有问题的插件/主题而产生的 HTTP 错误

一些插件或主题也会导致 HTTP 错误以及其他问题。你可以首先禁用有问题的插件/主题,或暂时禁用所有 WordPress 插件。如果你有 phpMyAdmin,使用它来禁用所有插件:在其中找到 wp_options 数据表,在 option_name 这一列中找到 active_plugins 这一记录,然后将 option_value 改为 :a:0:{}。

或者用以下命令通过SSH重命名插件所在文件夹:

mv /www/html/path_to_wordpress/wp-content/plugins /www/html/path_to_wordpress/wp-content/plugins.old

通常情况下,HTTP 错误会被记录在网页服务器的日志文件中,所以寻找错误时一个很好的切入点就是查看服务器日志。

nginx代理tomcat导致css或js加载失败

Web服务器经常会使用nginx作前置路由,在使用nginx配置Web服务器负载均衡、动静分离,会碰到设置反向代理后导致前端资源无法加载的问题

nginx反向代理的tomcat服务器导致前端资源css或js加载失败大概可以分为:端口丢失、真实ip或端口获取错误、js或者css太大加载失败等情形

端口丢失

之前笔者也有文章单独介绍,可参考http://flyflyfish.com/2018/02/24/nginx%E8%BD%AC%E5%8F%91%E4%B8%A2%E5%A4%B1%E7%AB%AF%E5%8F%A3%E9%97%AE%E9%A2%98/

反向代理获取真实ip(域名)、端口、协议

nginx反向代理后,servlet应用通过request.getRemoteAddr()取到的IP是nginx的IP,并非客户端的真实IP;通过request.getRequestUrl()获取的ip(域名)、端口、协议都是nginx对应的参数。

  • 比如nginx的配置:
http {
    upstream backend {
        server 127.0.0.1:8080;
        #server backend1.example.com wight=5;
        #server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;

        #server backup1.example.com backup;
    }

    server {
        listen 80;
        server_name your.domain.com;

        location /test {
            proxy_pass http://backend/test;
        }
        ...
    }
}

在浏览器打开http://your.domain.com/test访问servlet应用,获取客户端IP和URL:

log.info("RemoteAddr:{}, URL:{}", request.getRemoteAddr(), request.getRequestURL());
//输出结果
RemoteAddr:127.0.0.1, URL:http://127.0.0.1:8080/test
  • 针对tomcat+nginx的解决方案:

nginx添加如下配置,:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

如果不知道如何添加,可参考nginx转发丢失端口的问题。添加完后,输出结果如下:

//输出结果
RemoteAddr:127.0.0.1, URL:http://浏览器的ip地址/test

发现RemoteAddr仍然获取不正确,解决方案如下:

  • 方案一:通过request.getHeader("X-Forwrad-For")request.getHeader("X-Real-IP")获取到nginx配置的Header。

  • 方案二: 配置tomcat,通过Servlet APIrequest.getRemoteAddr()方法获取客户端的IP。Tomcat的server.xml,在Host元素内最后加入:

<Valve className="org.apache.catalina.valves.RemoteIpValve" />

JS或css无法完全加载

nginx的代理缓存区,默认较小导致部分文件出现加载不全的问题,比较典型的如jQuery框架,可以通过配置调整nginx的缓存区即可。

最终完整配置如下:

http {
    # http_proxy 
    proxy_buffer_size 128k;
    proxy_buffers 32 128k;
    proxy_busy_buffers_size 128k;

    upstream backend {
        server 127.0.0.1:8080;
    }

    server {
        listen 80;
        server_name your.domain.com;

        location /test {
            proxy_pass http://backend/test;
            # proxy_params
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
        ...
    }
    ...
}

关于nginx的http_proxy模块参数含义:

未分类

参考链接:

  • https://lanjingling.github.io/2015/10/28/nginx-tomcat-cluster/

  • http://www.zving.com/c/2014-03-19/257610.shtml

  • http://blog.csdn.net/xiao__gui/article/details/73733797

  • https://www.jianshu.com/p/5c7d718f15d2

tomcat中配置mime类型

mime类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。

修改方法:

在tomcat中,找到、conf目录下的web.xml文件

我们可以看到这样的配置片段:

<mime-mapping>
        <extension></extension>
        <mime-type></mime-type>
</mime-mapping>
  1. 如果你的应用程序的后缀不在中,那他会默认当做txt类型来打开,所以有时会看到一堆乱码。

  2. 如果存在,就会用中设置的方式来打开。

  3. 如果有些文件,你是希望下载下来,而不是用应用程序来打开,就这样配置application/octet-stream。

Linux命令之sed批量替换字符串操作

使用sed命令可以进行字符串的批量替换操作,以节省大量的时间及人力;

使用的格式如下:

sed -i "s/oldstring/newstring/g" `grep oldstring -rl path`

其中,oldstring是待被替换的字符串,newstring是待替换oldstring的新字符串,grep操作主要是按照所给的路径查找oldstring,path是所替换文件的路径;

-i 选项是直接在文件中替换,不在终端输出;

-r 选项是所给的path中的目录递归查找;

-l 选项是输出所有匹配到oldstring的文件;

实例:

1、替换指定文件的字符串

sed -i "s/oldstring/newstring/g" filename

sed -i "s/6/sk/g" ./test01.txt

2、字符串替换批量文件操作

sed -i "s/6/sk/g" ·grep 6 -rl /home/work/test`

sed -i "s/6/sk/g" ·grep 6 -rl /home/work/test/*.sh`

可将test目录下的所有相关文件都进行字符串替换

参考:

http://blog.163.com/daniel_ao/blog/static/1100988432010722642551/

http://www.jb51.net/LINUXjishu/155122.html

sed -i "" "s/搜索的字符串/替换的字符串/g" grep搜索的字符串 -rl 所在目录

由于mac需要标准输入 所以 -i 后面加上""