lnmp环境不重新编译php安装postgresql扩展(pgsql和pdo_pgsql)

新项目的服务器使用的是lnmp环境,已经把mysql换成了postgresql,那么必须让php支持pgsql扩展。

为了不重新编译php,使用phpize工具进行追加。

1.下载php7安装包

访问php官方下载页,找到自己对应的php版本:https://secure.php.net/downloads.php
wget //cn2.php.net/distributions/php-7.0.30.tar.gz

2.解压并进入扩展目录

tar xzf php-7.0.30.tar.gz
cd php-7.0.30/ext/pgsql

3.运行phpize(我的php安装目录为/usr/local/php/)

/usr/local/php/bin/phpize

4.编译安装

./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

5.修改php配置文件php.ini,添加pgsql.so模块

vi /usr/local/php/etc/php.ini
添加
extension=pgsql.so
extension=pdo_pgsql.so

6.重启php后,检查是否有pgsql模块

php -m

注:pdo_pgsql操作同上

使用 Jenkins 自动化发布 PHP 项目

什么是 Jenkins

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

使用 Docker 安装 Jenkins

避免装环境的折腾, 直接使用 docker-compose 安装,具体如何安装在 Docker 快速搭建 LNMP 环境 已经描述了

docker-compose.yml

jenkins:
  image: jenkins:latest
  ports:
    - "8080:8080"
  volumes:
      - ./jenkins:/var/jenkins_home:rw

注意:volumes 配置 jenkins 目录映射到本地

docker-compose up -d 

# 等待下载镜像,创建容器
Creating dnmp_jenkins_1    ... done
# 安装就这么简单

访问 8080 端口,进入初始化页面

访问: http://localhost:8080/

首次打开,需要输入秘钥,根据提示,可以在对应的目录 /jenkins/secrets 找到该文件
设置登录用户名密码后,进入几分钟的初始化过程…

未分类

配置自动化构建发布

配置远程服务器 SSH

菜单 -> 系统管理 -> 系统设置 -> SSH Servers

未分类

如图,是我配置的内容

未分类

Remote Directory 这个配置很关键,表示构建时的相对目录。这里我配置 “/“
配置完成后,最好 Test Configuration , 返回 Success 就表示成功!

新建发布项目

填写项目名称如, test
并选择项目类型,这里我选择”自由风格项目”

未分类

General

选择对应项目路径,我使用 GitHub project

未分类

源码管理

使用 git 源码仓库管理

未分类

构建

这里是最关键的,你可以打包源码发布到对应的服务器之上

未分类

  • Source files 表示打包好的源文件
  • Remote directory 表示你需要将源文件上传的远程路径(这个路径相对于 SSH 配置目录)
  • Exec command 上传完成后,执行的命令( hexo g 这个是我发布博客时的构建命令)

立即构建

选择对应的项目,点击立即构建

未分类

在构建执行状态中,可以点击 console output 看到构建的过程信息

未分类

Centos 6/7 升级 PHP 5.6 到 7.1/7.2

本站使用的是 WordPress 搭建,刚开始搭建的时候吧,没啥经验,网上搜一搜,就用了 PHP 5.6 版本,然后网站速度这个慢啊,虽然用了各种方法已经很快了,但是当时搜出来的使用 PHP 7 这个方法一直没试,心里痒,这回终于升级了一下。

1. 检查当前安装的 PHP

查看当前 PHP 版本

php -v

查看当前 PHP 相关的安装包

yum list installed | grep php

2. 更换 RPM 源

#Centos 5.X:
rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm

#CentOs 6.x:
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm

#CentOs 7.X:
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

3. 停止相关服务

关闭 php-fpm 和 nginx 服务

service php-fpm stop
/usr/local/nginx/sbin/nginx -s stop
BashCopy

4. 删除已经安装的 PHP 相关包

yum remove php*
BashCopy

5. 安装新版本 PHP

php 7.0/7.1/7.2 分别表示为 70w/71w/72w

目前(2018-5-4)

CentOs 6.x 的 RPM 源中最高只有 7.1

CentOs 7.x 的 RPM 源中有 7.2

yum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-fpm php71w-gd php71w-mbstring php71w-mysqlnd php71w-opcache php71w-pdo php71w-xml php71w-ldap php71w-mcrypt
BashCopy

6. 重新启动相关服务

service php-fpm start
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
BashCopy

7. 再次检查版本

php -v

LNMP架构 (1) 之 架构介绍、MySQL安装、PHP安装、Nginx介绍

1. LNMP架构介绍

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。

未分类

  • 和LAMP不同的是,提供web服务的是Nginx
  • 并且php是作为一个独立服务存在的,这个服务叫做php-fpm
  • Nginx直接处理静态请求,动态请求会转发给php-fpm。

2. MySQL安装

2.1 卸载二进制包安装的MySQL

确认MySQL服务运行状态,并停止

[root@host ~]# ps -ef | grep mysql
[root@host ~]# /etc/init.d/mysql.server status
[root@host ~]# /etc/init.d/mysql.server stop

删除MySQL安装时的相关文件

[root@host ~]# rm -rf /usr/local/mysql 
[root@host ~]# rm -rf /etc/init.d/mysqld 
[root@host ~]# rm -rf /data/mysql

2.2 安装MySQL

和之前LAMP环境安装MySQL的方法一样 可以参考前面的文章 LAMP架构及安装配置(https://my.oschina.net/zhouyuntai/blog/1647058) 中的Mysql安装。

3. PHP安装

和LAMP安装PHP有区别,需要开启php-fpm服务。

3.1 准备PHP的包和用户

[root@host ~]# cd /usr/local/src/
[root@host src]# wget http://cn2.php.net/distributions/php-5.6.30.tar.gz   //下载php二进制包
[root@host src]# tar zxvf php-5.6.30.tar.gz   //解压缩
[root@host  src]# useradd -s /sbin/nologin php-fpm   //创建专门账号用来运行php-fpm服务,因为在LNMP环境中,PHP是以一种服务的形式独立存在的

3.2 卸载之前编译安装的PHP(如果之前有安装的话)

[root@host ~]# cd /usr/local/src
[root@host src]# ls
[root@host src]# cd php-5.6.30
[root@host php-5.6.30]# ls
[root@host php-5.6.30]# make clean

3.3 安装PHP

[root@host php-5.6.30]# cd php-5.6.30
[root@host php-5.6.30]# ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl  --with-openssl   //初始化

3.4 编译过程中的出错排查

错误1:

onfigure: error: xml2-config not found. Please check your libxml2 installation.

解决办法1:

[root@host php-5.6.30]# yum list |grep libxml2
libxml2.x86_64                          2.9.1-6.el7_2.3                @anaconda
libxml2.i686                            2.9.1-6.el7_2.3                base    
libxml2-devel.i686                      2.9.1-6.el7_2.3                base    
libxml2-devel.x86_64                    2.9.1-6.el7_2.3                base    
libxml2-python.x86_64                  2.9.1-6.el7_2.3                base    
libxml2-static.i686                    2.9.1-6.el7_2.3                base    
libxml2-static.x86_64                  2.9.1-6.el7_2.3                base    

[root@host php-5.6.30]# yum install -y libxml2 libxml2-devel     //一般只需要安裝devel的庫文件就好了

错误2:

configure: error: Cannot find OpenSSL's <evp.h>

解决办法2:

[root@host php-5.6.30]# yum install -y openssl openssl-devel

错误3:

configure: error: Please reinstall the libcurl distribution -
    easy.h should be in <curl-dir>/include/curl/

解决办法3:

[root@host php-5.6.30]# yum install -y libcurl libcurl-devel

错误4:

configure: error: jpeglib.h not found.

解决办法4:

[root@host php-5.6.30]# yum install -y libjpeg libjpeg-turbo-devel 

错误5:

configure: error: png.h not found.

解决办法5:

[root@host php-5.6.30]# yum install -y libpng libpng-devel

错误6:

configure: error: freetype-config not found.

解决办法6:

[root@host php-5.6.30]# yum install -y freetype freetype-devel

错误7:

configure: error: mcrypt.h not found. Please reinstall libmcrypt.

解决办法7:

[root@host php-5.6.30]# yum install -y libmcrypt libmcrypt-devel

错误8:

configure: error: mcrypt.h not found. Please reinstall libmcrypt.
(centos源不能安装libmcrypt-devel,由于版权的原因没有自带mcrypt的包rpm -qa|grep limcrypt limcrypt-devel,此源为rethot社区版的源)

解决办法8:安装第三方yum源

wget http://www.atomicorp.com/installers/atomic
sh ./atomic

yum  install  php-mcrypt  libmcrypt  libmcrypt-devel

检测、编译和安装

[root@host php-5.6.30]# echo $?
0

[root@host php-5.6.30]# make 

[root@host php-5.6.30]# make install

3.5 配置PHP

添加配置文件

[root@host php-5.6.30]# cp php.ini-production /usr/local/php-fpm/etc/php.ini

配置文件编辑

[root@host php-5.6.30]# vi /usr/local/php/etc/php-fpm.conf   //写入如下内容

[global]
#定义全局参数
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
#监听地址,也可以写:listen = 127.0.0.1::9000,本地监听,也可以监听其他IP:port
#此处格式会影响配置Nginx和PHP结合时Nginx寻址PHP的路径
listen.mode = 666
#当监听的为socket文件时该部分才生效,用于指定.sock文件的权限
user = php-fpm
group = php-fpm
#定义php-fpm服务的用户
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
#以上部分为进程相关信息

配置启动脚本

[root@host etc]# cd /usr/local/src/php-5.6.30  //进入源码目录下来

[root@host php-5.6.30]#  cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm  //把启动脚本放到到系统配置

[root@host php-5.6.30]# chmod 755 /etc/init.d/php-fpm  //修改权限

[root@host php-5.6.30]# chkconfig --add php-fpm  //添加到开机启动项

[root@host php-5.6.30]# chkconfig php-fpm on  //设置开机启动

[root@host php-5.6.30]# service php-fpm start  //启动php-fpm服务
Starting php-fpm  done

[root@host php-5.6.30]# ps aux |grep php-fpm  //查看后台www的pool是否启动

4. Nginx介绍

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

  • Nginx官网 nginx.org,最新版1.13,最新稳定版1.12
  • Nginx应用场景:web服务、反向代理、负载均衡
  • Nginx著名分支,淘宝基于Nginx开发的Tengine,使用上和Nginx一致,服务名,配置文件名都一样,和Nginx的最大区别在于Tenging增加了一些定制化模块,在安全限速方面表现突出,另外它支持对js,css合并
  • Nginx核心+lua相关的组件和模块组成了一个支持lua的高性能web容器openresty。

1、Nginx优点 Nginx设计为一个主进程多个工作进程的工作模式,每个进程是单线程来处理多个连接,而且每个工作进程采用了非阻塞I/O来处理多个连接,从而减少了线程上下文切换,从而实现了公认的高性能、高并发;因此在生成环境中会通过把CPU绑定给Nginx工作进程从而提升其性能;另外因为单线程工作模式的特点,内存占用就非常少了。 Nginx更改配置重启速度非常快,可以毫秒级,而且支持不停止Nginx进行升级Nginx版本、动态重载Nginx配置。 Nginx模块也是非常多,功能也很强劲,不仅可以作为http负载均衡,Nginx发布1.9.0版本还支持TCP负载均衡,还可以很容易的实现内容缓存、web服务器、反向代理、访问控制等功能。

2、Lua的优点 Lua是一种轻量级、可嵌入式的脚本语言,这样可以非常容易的嵌入到其他语言中使用。另外Lua提供了协程并发,即以同步调用的方式进行异步执行,从而实现并发,比起回调机制的并发来说代码更容易编写和理解,排查问题也会容易。Lua还提供了闭包机制,函数可以作为First Class Value 进行参数传递,另外其实现了标记清除垃圾收集。 因为Lua的小巧轻量级,可以在Nginx中嵌入Lua VM,请求的时候创建一个VM,请求结束的时候回收VM。

3、什么是ngx_lua ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,这样就可以使用Lua编写应用脚本,部署到Nginx中运行,即Nginx变成了一个Web容器;这样开发人员就可以使用Lua语言开发高性能Web应用了。 ngx_lua提供了与Nginx交互的很多的API,对于开发人员来说只需要学习这些API就可以进行功能开发,而对于开发web应用来说,如果接触过Servlet的话,其开发和Servlet类似,无外乎就是知道接收请求、参数解析、功能处理、返回响应这几步的API是什么样子的。

4、开发环境 我们可以使用OpenResty来搭建开发环境,OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一起;这样开发人员只需要安装OpenResty,不需要了解Nginx核心和写复杂的C/C++模块就可以,只需要使用Lua语言进行Web应用开发了。

debian9安装mariadb apache php7

一、

apt install apache2

二、

apt install php (安装后测试phpinfo)
<?php
phpinfo();
?>

三、

apt install mariadb-server

1、安装完 MariaDB 之后,运行 mysql_secure_installation 可以设置root密码及删除测试账户之类的信息。

2、新建一个用户:

insert into mysql.user(Host,User,Password) values("localhost","admin",password("admin"));

刷新系统权限表

flush privileges;

这样就创建了一个名为:admin 密码为:admin 的用户

3、创建数据库(在root权限下)

create database abc;
//授权admin用户拥有abc数据库的所有权限。

grant all privileges on abc.* to admin@localhost identified by 'admin';
//刷新系统权限表
mysql>flush privileges;

4、删除用户。

@>mysql -u root -p
@>密码
mysql>

DELETE FROM mysql.user WHERE User="admin" and Host="localhost";
mysql>flush privileges;

5、mysql>drop database abc;//删除用户的数据库

6、查看数据库中具体某个用户的权限

mysql> show grants for 'cactiuser'@'%';

7、查询所有用户:

SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;

8、显示所有数据库

show databases;

9、修改指定用户密码。

@>mysql -u root -p
@>密码
mysql>

update mysql.user set password=password('新密码') where User="admin" and Host="localhost";
mysql>flush privileges;

10、删除某个用户权限

revoke all privileges on wordpress.* from 'admin'@'localhost';

Ubuntu安装php curl扩展

1、使用apt-cache搜索curl

sudo apt-cache search curl

在搜索结果里找到类似:

php5.6-curl - CURL module for PHP
php7.1-curl - CURL module for PHP

2、使用apt-get安装

选择php对应版本的curl,使用apt-get安装:

sudo apt-get install php7.1-curl

3、安装完成后重启相关服务,如php,apache

Centos 下 安装 PHP + Nginx + Sql server

一、安装前必要配置

1.1 安装epel 仓库(因为CentOs6默认的yum源没有libmcrypt-devel这个包)

yum install -y epel-release

1.2 安装必要扩展

sudo yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel gcc libmcrypt-devel

二、安装PHP

2.1 下载PHP-7.1.15

wget -c http://cn2.php.net/get/php-7.1.15.tar.gz/from/this/mirror -O php-7.1.15.tar.gz

2.2 解压 php-7.1.15.tar.gz

tar -zxvf php-7.1.15.tar.gz

2.3 进入 php-7.1.15

cd php-7.1.15

2.4 .编译与安装

sudo make && make install

这里需要一点时间

2.4 .配置php-fpm

sudo cp php.ini-production /etc/php.ini
sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
sudo chmod +x /etc/init.d/php-fpm

2.5 .启动php-fpm

···
/etc/init.d/php-fpm start

三、安装Nginx

3.1 下载Nginx

wget http://nginx.org/download/nginx-1.13.9.tar.gz

3.2 安装Nginx

tar -zxvf nginx-1.13.9.tar.gz

cd nginx-1.13.9

./configure --prefix=/usr/local/nginx

3.3 启动Nginx

sudo /usr/local/nginx/sbin/nginx 

sudo /usr/local/nginx/sbin/nginx -s reload

sudo /usr/local/nginx/sbin/nginx -s stop

四、安装FreeTDS

4.1 下载FreeTDS

wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-patched.tar.gz

4.2 安装FreeTDS

需要注意的就是这里的–with-tdsver=7.1,这个非常重要

tar -zxvf freetds-0.91.tar.gz

cd freetds-0.91

./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib

make && make install

4.3 验证FreeTDS

/usr/local/freetds/bin/tsql -C

/usr/local/freetds/bin/tsql -H 数据库服务器IP -p 1433 -U 用户名 -P 密码

4.4 添加PHP扩展pdo_dblib

cd ../php-7.1.15/ext/pdo_dblib

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-dblib=/usr/local/freetds/

make && make install

4.5 在php.ini中增加pdo_dblib.so

extension ="pdo_dblib.so"

php-fpm占用内存过高分析及解决

昨天刚买了个vps搭建了一个wordPress博客,刚搭建的时候有一大堆的问题。好不容易搭建完成了发现运行一阵子以后内存几乎用完了。开始以为是服务器的问题,费了好大的劲把Apache服务器换成了Nginx。但是问题还是没有解决,最后用top命令看了一下是php-fpm的问题。问题的解决办法如下:

未分类

1、查看php-fpm的进程个数

ps -fe |grep "php-fpm"|grep "pool"|wc -l

2、查看每个php-fpm占用的内存大小

ps -ylC php-fpm --sort:rss

3、配置php-fpm参数

找到php-fpm的配置文件php-fpm.conf

pm = dynamic #对于专用服务器,pm可以设置为static。#如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children #子进程最大数
pm.start_servers #启动时的进程数
pm.min_spare_servers #保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #保证空闲进程数最大值,如果空闲进程大于此值,此进行清理

对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。

对于内存小的服务器,使用动态方式。具体最大数量根据 内存/20M 得到。比如512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。

nginx+php-fpm出现502 bad gateway错误解决方法

1. php-fpm进程数不够用

使用 netstat -napo |grep “php-fpm” | wc -l 查看一下当前fastcgi进程个数,如果个数接近conf里配置的上限,就需要调高进程数。

但也不能无休止调高,可以根据服务器内存情况,可以把php-fpm子进程数调到100或以上,在4G内存的服务器上200就可以。

2. 调高调高linux内核打开文件数量

可以使用这些命令(必须是root帐号)

echo ‘ulimit -HSn 65536’ >> /etc/profile

echo ‘ulimit -HSn 65536’ >> /etc/rc.local

source /etc/profile

3. 脚本执行时间超时

如果脚本因为某种原因长时间等待不返回 ,导致新来的请求不能得到处理,可以适当调小如下配置。

nginx.conf里面主要是如下

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

php-fpm.conf里如要是如下

request_terminate_timeout = 10s

4. 缓存设置比较小

修改或增加配置到nginx.conf

proxy_buffer_size 64k;
proxy_buffers  512k;
proxy_busy_buffers_size 128k;

5. recv() failed (104: Connection reset by peer) while reading response header from upstream

可能的原因机房网络丢包或者机房有硬件防火墙禁止访问该域名

但最重要的是程序里要设置好超时,不要使用php-fpm的request_terminate_timeout,

最好设成request_terminate_timeout=0;

因为这个参数会直接杀掉php进程,然后重启php进程,这样前端nginx就会返回104: Connection reset by peer。这个过程是很慢,总体感觉就是网站很卡。

使用zabbix监控nginx和php-fpm性能

一、系统环境

1.1 软件及其版本

未分类

1.2 软件安装路径

zabbix安装在/usr/local/zabbix路径下,其相关配置文件及二进制执行程序都放置其中。
nginx安装在/usr/local/nginx下,其相关配置文件及二进制执行程序都放置其中。
php安装在/usr/local/php下,其相关配置文件及二进制执行程序都放置其中。
继续后面的操作前,请确认nginx和php-fpm的服务端口都处于监听状态。

二、配置nginx的status

2.1 确认nginx的status已编译到程序包中

使用nginx -V可以查看nginx是否将模块·http_stub_status_module`编译进包中:

[root@monitor-server2 zabbix_agentd.conf.d]# nginx -V
nginx version: nginx/1.10.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx-1.10.3 
--with-http_ssl_module 
--with-http_stub_status_module --with-pcre   
#出现with-http_stub_status_module说明已装载status模块

2.2 启用nginx的status模块

  • 修改nginx.conf文件

一般在默认主机中增加如下location即可:

location /nginx_status {
  stub_status on;
  access_log off;
  allow 127.0.0.1;
  allow 192.168.249.0/24;
  deny all;
  • 查看nginx status

nginx配置文件修改完成以后,使用nginx -t测试配置文件是否有明显逻辑及语法错误,没有问题则重载配置文件。

nginx -t
nginx -s reload

然后使用浏览器或者curl指令查看nginx status:

[root@monitor-server2 zabbix_agentd.conf.d]# curl localhost/nginx_status
Active connections: 2 
server accepts handled requests
 1585 1585 7785 
Reading: 0 Writing: 1 Waiting: 1 

2.3 nginx status数值的含义说明

未分类

三、配置php-fpm的status

php-fpm自带的有用于查询其工作状态的页面,需要进行如下 两步,以启用这一功能。

3.1 启用php-fpm status页面

修改php-fpm.conf文件,去掉status页面的注释,并可以根据需要将其改名。操作如下:

vim /usr/local/php/etc/php-fpm.conf
pm.status_path = /php_fpm-status      
 #去掉了前面的;注释符,并更名为php_fpm-status

3.2 查看php-fpm的status

修改完php-fpm.conf后,使用service php-fpm reload重新加载配置文件,然后在浏览器或者使用curl指令查看php-fpm的status。操作如下:

[root@monitor-server2 zabbix_agentd.conf.d]# curl localhost/php_fpm-status
pool:                 www
process manager:      dynamic
start time:           01/May/2017:15:14:23 +0800
start since:          29536
accepted conn:        5947
listen queue:         0
max listen queue:     3
listen queue len:     128
idle processes:       2
active processes:     1
total processes:      3
max active processes: 3
max children reached: 0
slow requests:        0

php-fpm的status可以查看汇总信息和详细信息,详细信息比汇总信息要多出每一个php-fpm进程的相关信息,同时支持多种格式输出,如xml、html和json,默认情况下分别使用如果指令即可:

Examples for summary status page:
http://example.com/status
http://example.com/status?json
http://example.com/status?html
http://example.com/status?xml
Example for detailed status page:
http://example.com/status?full
http://example.com/status?json&full
http://example.com/status?html&full
http://example.com/status?xml&full

使用何种格式查看status决定了后续使用zabbix进行监控获取status数值的方式。本文以上述curl localhost/php_fpm-status的输出为例。

3.3 php-fpm status的含义

未分类

四、编写status数据提取脚本

在适当的位置,一般是/usr/local/zabbix/bin里准备脚本用于提取status里每个字段的数值。

4.1 nginx的status数值提取脚本

此脚本为/usr/local/zabbix/bin/nginx_status.sh,其内容如下:

#!/bin/bash
#check nginx status
ip=127.0.0.1
function ping() {                              #用于检测nginx进程是否存在
    /sbin/pidof nginx | wc -l
}

function active() {                 #用于提取status中的active数值
    /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '1p' | awk '{print $NF}'
}

function accepts() {            #用于提取status中的accepts数值
    /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '3p' | awk '{print $1}'
}

function handled() {          #用于提取status中的handled数值
    /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '3p' | awk '{print $2}'
}

function requests() {        #用于提取status中的request数值
    /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '3p' | awk '{print $3}'
}

function reading() {        #用于提取status中的reading数值
    /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '4p' | awk '{print $2}'
}

function writing() {        #用于提取status中的writing数值
    /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '4p' | awk '{print $4}'
}

function waiting() {     #用于提取status中的waiting数值
    /usr/bin/curl http://$ip/nginx_status 2>/dev/null | sed -n '4p' | awk '{print $6}'
}

$1                           #通过第一个位置参数的值来调用相应的函数  

4.2 php-fpm status数值提取脚本

php-fpm status数值提取脚本为/usr/local/zabbix/bin/php_fpm_status.sh,内容如下:

#!/bin/bash
#check php-fpm status
case $1 in
    ping)                           #检测php-fpm进程是否存在
    /sbin/pidof php-fpm | wc -l
    ;;
    start_since)             #提取status中的start since数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==4{print $3}'
    ;;
    conn)                     #提取status中的accepted conn数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==5{print $3}'
    ;;
    listen_queue)         #提取status中的listen queue数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==6{print $3}'
    ;;
     max_listen_queue)  #提取status中的max listen queue数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==7{print $4}'
    ;;
    listen_queue_len)    #提取status中的listen queue len
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==8{print $4}'
    ;;
    idle_processes)      #提取status中的idle processes数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==9{print $3}'
    ;;
    active_processes)   #提取status中的active processes数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==10{print $3}'
    ;;
     total_processes)    #提取status中的total processess数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==11{print $3}'
    ;;
    max_active_processes)     #提取status中的max active processes数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==12{print $4}'
    ;;
     max_children_reached)    #提取status中的max children reached数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==13{print $4}'
    ;;
    slow_requests)   #提取status中的slow requests数值
    /usr/bin/curl localhost/php_fpm-status 2>/dev/null  | awk 'NR==14{print $3}'  
    ;;
    *)
    echo "Usage: $0 {conn|listen_queue|max_listen_queue|listen_queue_len|idle_processes|active_processess|total_processes|max_active_processes|max_children_reached|slow_requests}"
    exit 1
    ;;
esac

五、创建zabbix_agentd的子配置文件

在/usr/local/zabbix/etc/zabbix_agentd.d/中创建关联nginx status和php-fpm status的子配置文件,创建一个,或者在已有的某配置文件中增加也可以,我这里分别为它们创建配置文件,文件名可自定义,只要确保此文件夹全部内容在zabbix_agentd.conf中包含(include)了。

5.1 userparameter_nginx.conf

[root@monitor-server2 zabbix_agentd.conf.d]# cat userparameter_nginx.conf 
#/usr/local/zabbix/bin/nginx_status.sh
UserParameter=nginx.status[*],/usr/local/zabbix/bin/nginx_status.sh $1  
 #这种写法比较简洁,参考zabbix 3.2.4中自带的的userparameter_examples.conf
UserParameter=nginx.version,/usr/local/nginx/sbin/nginx -v     
#让zabbix-agentd获取nginx的版本信息 ,一切shell指令都推荐使用绝对路径 

5.2 userparameter_php-fpm.conf

[root@monitor-server2 zabbix_agentd.conf.d]# cat userparameter_php-fpm.conf 
#/usr/local/zabbix/bin/php_fpm_status.sh
UserParameter=php-fpm.status[*],/usr/local/zabbix/bin/php_fpm_status.sh $1
UserParameter=php-fpm.version,/usr/local/php/sbin/php-fpm -v | awk 'NR==1{print $0}'   
#获取php-fpm版本信息

5.3 确认子配置文件被zabbix_agentd配置文件包含

确认在/usr/local/zabbix/etc/zabbix_agentd.conf中包含:Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/且没有被注释。

六、重启zabbix_agentd服务

service zabbix_agentd restart 让zabbix_agentd加载新的配置文件。

七、测试zabbix_get能否取到数据

在zabbix server上使用如下指令测试能否获取到nginx和php-fpm status数值。

[root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'nginx.status[ping]'      
1
[root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'nginx.status[active]'
6
[root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'nginx.status[requests]'  
1841
[root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'php-fpm.status[ping]' 
1
[root@monitor-server2 zabbix_agentd.conf.d]# zabbix_get -s 127.0.0.1 -k 'php-fpm.status[conn]'
1247

注意:

  • zabbix_get指令在zabbix server上运行。
  • userparameter_*.conf文件位于zabbix_agentd端。
  • nginx_status.sh和php_fpm_status.sh位于zabbix_agentd端。
  • zabbix-get后-s指定的ip为zabbix-agentd的监听ip。

八、zabbix server上配置相应的模板

这里的模板包含对nginx status和php-fpm status要监控的item、trigger、Graphs等一系列内容。对于在zabbix server上新增要监控的内容,最好的办法就是从模板开始,然后按照顺序依次配置相应内容,无需去网上找现成的模板导入,对于系统的监控按需配置是最好的。下面是相应的操作过程。

8.1 添加nginx status监控模板

未分类

新建nginx status模板

未分类

定义nginx status模板

未分类

新建nginxApplication

未分类

定义nginx status items,这里我使用的是被动临控

未分类

增加nginx status状态码映射

未分类

nginx trigger定义

未分类

定义nginx监控视图

8.2 添加php-fpm status监控模板

php-fpm status的模板添加步骤和上述方法一样,此处不在赘述。

8.3 选择相应的主机或主机组关联上相应的模板

未分类

给主机或主机组关联模板

九、实际监控效果展示

查看监控效果可以通过查看Monitoring—->Latest data,过滤出相应的主机及应用名进行查看,最新收集的各item的监控结果,凡是监控到数据的item会显示数据,出现灰色的表示没有监控到数据,需要排查原因。如下所示:

未分类

nginx的监控数据

也可以通过定义的Graphs查看监控效果:

未分类

nginx statur监控视图

十、小结

zabbix中要实现对用户自定义的item的监控,大致过程如下:

  • 启用相应软件的性能统计功能
  • 编写性能统计数据提取脚本
  • 配置自定义的userparameter conf文件
  • 重启zabbix_agentd服务
  • zabbix server web上添加相应的模板
  • 给主机或主机组调用模板