龚哥哥 爱生活、做自己!
Centos7下配置nginx启动服务脚本
发表于 2017-5-29 | 浏览(7374) | 服务器

1:nginx配置文件,nginx路径根据自己安装的位置而修改  vim /etc/init.d/nginx

#! /bin/bash
#chkconfig: 2345 80 90
#description:nginx run

# nginx启动脚本
# @author	Devil
# @version	0.0.1
# @date		2017-05-29

PATH=/data/soft/nginx
DESC="nginx daemon"
NAME=nginx
DAEMON=$PATH/$NAME
CONFIGFILE=$PATH/$NAME.conf
PIDFILE=$PATH/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start()
{
	$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop()
{
	$DAEMON -s stop || echo -n "nginx not running"
}
do_reload()
{
	$DAEMON -s reload || echo -n "nginx can't reload"
}
case "$1" in
	start)
		echo -n "Starting $DESC: $NAME"
		do_start
		echo "."
	;;
	stop)
		echo -n "Stopping $DESC: $NAME"
		do_stop
		echo "."
	;;
	reload|graceful)
		echo -n "Reloading $DESC configuration..."
		do_reload
		echo "."
	;;
	restart)
		echo -n "Restarting $DESC: $NAME"
		do_stop
		do_start
		echo "."
	;;
	*)
		echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
		exit 3
	;;
esac
exit 0

2:设置执行权限

chmod a+x /etc/init.d/nginx

3:注册成服务

chkconfig --add nginx

4:设置开机启动

chkconfig nginx on

5:重启, 查看nginx服务是否自动启动

shutdown -h 0 -r

ps -ef | grep nginx

6:对nginx服务执行停止/启动/重新读取配置文件操作

启动
systemctl start nginx.service

重载
systemctl reload nginx.service

停止
systemctl top nginx.service

重启
systemctl restart nginx.service

阅读全文

CentOS安装netdata监控服务器
发表于 2017-5-19 | 浏览(7776) | 服务器

效果图

Image

安装一些依赖包

yum -y install zlib-devel libuuid-devel libmnl-devel gcc make git autoconf autogen automake pkgconfig

安装netdata

mkdir -p /data/src
cd /data/src
git clone https://github.com/firehol/netdata.git
./netdata-installer.sh 

查看端口是否已经运行(如果存在netdata记录就不需要再次启动了)

netstat -ntlp | grep 19999

启动netdata(默认安装完成就已经启动了)

/usr/sbin/netdata

配置web访问,采用nginx反向代理(创建 netdata.conf 完成后重载nginx)

upstream backend {  
	server 127.0.0.1:19999;
	keepalive 64;
}

server {  
	listen 		80;
	server_name	netdata.gong.gg;

	location / {  
		proxy_set_header X-Forwarded-Host $host;
		proxy_set_header X-Forwarded-Server $host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_pass http://backend;
		proxy_http_version 1.1;
		proxy_pass_request_headers on;
		proxy_set_header Connection "keep-alive";
		proxy_store off;
	}
}

配置完成,访问查看监控信息

http://netdata.gong.gg/

1、放开防火墙 19999 端口,netdata会自动拉取该端口的服务器列表

2、netdata访问是没有限制的,我们使用htpasswd需要用户名和密码才能访问,参考博客中 htpasswd 的教程

阅读全文

CentOS下PHP7安装Redis扩展
发表于 2017-5-18 | 浏览(4395) | 服务器

下载扩展包

wget https://github.com/phpredis/phpredis/archive/php7.zip
mv php7.zip phpredis-php7.zip
unzip phpredis-php7.zip
cd phpredis-php7/
/data/soft/php7/bin/phpize
./configure --with-php-config=/data/soft/php7/bin/php-config
make && make install

php.ini中添加redis扩展

vim /data/soft/php7/lib/php.ini 
搜索 extension 在底部添加 redis 扩展记录
extension=redis.so

重启php-fpm后,查看扩展

/data/soft/php7/bin/php -m

阅读全文

CentOS安装PHP7
发表于 2017-5-18 | 浏览(3251) | 服务器

创建软件目录

mkdir -p /data/soft/php7

创建用户和用户组

groupadd www-data
useradd -g www-data www-data

安装PHP7,下载地址从php官网获取

wget http://cn2.php.net/distributions/php-7.1.5.tar.gz
tar -zxvf php-7.1.5.tar.gz
cd php-7.1.5
./configure --prefix=/data/soft/php7 --enable-fpm --with-mcrypt \--enable-mbstring --disable-pdo --with-curl --disable-debug  --disable-rpath \--enable-inline-optimization --with-bz2  --with-zlib --enable-sockets \--enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \--with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \--with-gd --with-jpeg-dir --enable-pdo --enable-ftp --with-pdo_sqlite --with-openssl=/usr/local/ssl/ --with-pdo_mysql
make && make install

配置文件添加

cp php.ini-development /data/soft/php7/lib/php.ini
cd /data/soft/php7/etc
cp php-fpm.conf.default php-fpm.conf
cd php-fpm.d cp www.conf.default www.conf

修改 www.conf

user = www-data
group = www-data

修改 php-fpm.conf

cd /data/soft/php7/etc
vim php-fpm.conf
去掉 pid = run/php-fpm.pid 前面的分号 [ ; ]

启动PHP即可

/data/soft/php7/sbin/php-fpm

阅读全文

一次服务器高峰期宕机排查经历
发表于 2016-12-14 | 浏览(4514) | 服务器

服务器配置与环境

系统:CentOS7
内存:16G
CPU:8核
磁盘:两块(100G, 1T)
mysql:MySQL5.7
php:PHP5.6
带宽:10兆

将近百万访问量,每天上午9点左右和晚上10点左右必定会宕机。每次重启服务器后问题都没有了,没法知道具体是那块所造成。开始仔细想问题在那边,H5新闻站点基本上都是使用搜索引擎运行的,包括后来我开发的PC站点全部采用搜索引擎运行,不会有任何数据库操作。以为是mysql配置需要优化,所以就开始做起了服务器优化。

1、第一看见就是服务器IO过高造成了宕机,经过排查是mysql所占用,开始调整H5项目把直接操作数据库的部分都改成搜索引擎。重启后通过mysql命令行 show processlist; 查看正常,怀疑这个时候是脚本没运行,所以查不到问题了。

2、为了不影响业务运作,把线上有收益的业务迁移到其它服务器。磁盘重新分布,图片,数据库,搜索引擎全部分开,发现mysql磁盘过高,由此可以完全定位IO过高和mysql脱不了一点干系。

3、开始做mysql配置优化,不能让服务器宕机,经过两天的调试,服务器不宕机了,IO还是能够达到80%以上。平时偶尔也发现IO也不小。开始头疼了应用程序和服务器都优化了还是不见有个好的效果。

4、持续观察IO状况,在IO高的时候排查mysql,发现有部分sql运行时间都是在30秒以上,IO都是读的负载过高,肯定是这个原因导致的,这条sql所使用的字段没有索引,加上索引后,IO明显下降到5%左右。

5、当时心里非常激动,花了两天调试服务器各种配置优化。结果发现饶了这么大一个弯。最终还是因为mysql索引优化问题,最终问题还是出现在爬虫上面,每次爬虫跑的时候都会比对数据,再数据表越来越大的时候,字段没有索引就慢如蜗牛。虽然绕弯了还是有很大的收获的,在各种配置优化上也更明白的认识到了很多场景的优化方式。

6、很多时候都是本地开发好的项目,怎么玩都正常,只要上线都会有点问题,运营一段时间后问题也越来越多,这都是没有考虑到很多因素的问题。

阅读全文

Linux监控http服务是否正常
发表于 2016-12-7 | 浏览(3557) | 服务器

使用定时任务定时校验是否正确,如果状态不正常,则发送邮件通知,邮件发送服务可以搜索本博客中的文章。

添加文件 vim http_mog.sh   内容如下

#!/bin/bash

#@author:Devil
#@desc:监控http服务是否正常
#@blog:http://gong.gg/
#@date:2016-12-07

HTTP_CODE=`curl -I -m 10 -o /dev/null -s -w %{http_code}"\n" gong.gg`

# 不等于200则发送邮件
if [ $HTTP_CODE != 200 ]
then
	echo "亲^_^!你的服务器好像不乖了哦,状态码:[${HTTP_CODE}] ,请尽快处理哦~" | mail -v -s '服务器HTTP监控' devil@gong.gg
fi

阅读全文

Linux上排查IO使用过高的进程
发表于 2016-12-7 | 浏览(3184) | 服务器

iotop 命令

CentOS7以下使用yum安装
	yum -y install iotop
	iotop
CentOS7由于yum源没有包
	git clone git://repo.or.cz/iotop.git
		cd iotop
		python iotop.py

iostat 命令

iostat -x 1 10

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.48    0.00    1.24   10.22    4.28   78.78

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.37     3.00   27.30    5.47   722.00   173.14    54.64     0.78   23.81    9.61   94.70   1.40   4.58
xvdb              0.00     0.00    0.32    0.00     2.19     0.00    13.75     0.00    5.39    5.30   31.00   2.73   0.09
xvdc              1.29    21.12  130.74   13.60  3575.35   175.45    51.97     2.97   20.55   21.01   16.15   4.78  69.03

%idle小于70% IO压力就较大了,一般读取速度有较多的%wait.
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。

dstat 命令

dstat --top-io -d --top-bio -l
dstat -t --top-io-adv -d -l

监控工具,根据系统类型选择脚本然后直接运行即可,以下是centos

centos下直接
  yum -y install nmon

其它linux系统可以下载包使用
wget http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz
tar -zxvf http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz
./nmon_x86_64_centos6

阅读全文

Nginx中判断是否手机访问
发表于 2016-11-23 | 浏览(2613) | 服务器

1、开源库

无论是PC还是手机,由于操作系统、浏览器的多样性,自己来实现这个判断并不容易不够准确。国外有一套开源的通过User-Agent区分PC和手机的解决方案,支持的语言较多(Apache ASP ASP.NET ColdFusion C# IIS JSP JavaScript jQuery Lasso nginx node.js PHP Perl Python Rails)

传送门:http://detectmobilebrowsers.com/

2、Nginx实例,在server中加入

set $mobile_rewrite do_not_perform;

if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
	set $mobile_rewrite perform;
}

if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
	set $mobile_rewrite perform;
}

if ($mobile_rewrite = perform) {
	rewrite ^(.*) http://h5.gong.gg$1 redirect;
	break;
}

阅读全文

Linux磁盘使用量监控
发表于 2016-11-2 | 浏览(2256) | 服务器

Linux中使用crontab定时运行脚本即可。添加文件 vim disk.sh

#!/bin/bash

#@desc:服务器磁盘使用量报警脚本
#@author:Devil
#@blog:http://gong.gg/
#@date:2016-11-02

# 获取磁盘使用量
list=`df -h | awk 'NR==2,NR==$NF{print int(substr($5,0,length($5)-1));}'`

# 计算磁盘超过比例的值
server='博客'
max=95
count=0
for i in $list
do
	if [ $i -ge $max ]
	then
		let count++
	fi
done

# 邮件通知
if [ $count -gt 0 ]
then
	echo "亲^_^!您的[${server}]服务器有${count}块磁盘使用超过${max}%,请尽快处理哦~" | mail -v -s '服务器磁盘使用量报警' xxx[at]gongfuxiang.com
fi

邮件发送方法,搜索本博客中的文章

阅读全文

Python中文转拼音
发表于 2016-11-2 | 浏览(5851) | Python

最近写一个项目的时候,需要将汉字转化成拼音,在github上找到一个现成的库。

Python汉字转拼音 GitHub地址

1、使用如下

from pinyin import PinYin

test = PinYin()
test.load_word()
print test.hanzi2pinyin(string='钓鱼岛是中国的')
print test.hanzi2pinyin_split(string='钓鱼岛是中国的', split="-")

输出
['diao', 'yu', 'dao', 'shi', 'zhong', 'guo', 'de']
'diao-yu-dao-shi-zhong-guo-de'

2、在中文与英文混合的时候英文会丢失,所以我们需要对库进行一点调整。

2.1、hanzi2pinyin方法调整

# 原始
    def hanzi2pinyin(self, string=""):
        result = []
        if not isinstance(string, unicode):
            string = string.decode("utf-8")
        
        for char in string:
            key = '%X' % ord(char)
            result.append(self.word_dict.get(key, char).split()[0][:-1].lower())

        return result

# 调整后
    def hanzi2pinyin(self, string=""):
        result = []
        if not isinstance(string, unicode):
            string = string.decode("utf-8")
        en = ''
        for char in string:
            key = '%X' % ord(char)
            if not self.word_dict.get(key) :
                # 为字母或数字才进入(排除特殊字符)
                if(char.isalpha() == True or char.isdigit() == True) :
                    en += char
                else :
                    # 空格则分割数据
                    if(char.isspace() == True) :
                        result.append(en)
                        en = ''
            else:
                # en有数据则先处理
                if(len(en) > 0) :
                    result.append(en)
                    en = ''
                # 中文转拼音
                result.append(self.word_dict.get(key, char).split()[0][:-1].lower())
        # 防止全是英文或数字
        if(len(en) > 0) :
            result.append(en)
            en = ''

        return result

2.2、hanzi2pinyin_split方法调整

# 原始
    def hanzi2pinyin_split(self, string="", split=""):
        result = self.hanzi2pinyin(string=string)
        if split == "":
            return result
        else:
            return split.join(result)

# 调整后
    def hanzi2pinyin_split(self, string="", split=""):
        return split.join(self.hanzi2pinyin(string=string))

3、调整后的效果

print test.hanzi2pinyin(string='钓鱼岛是hello中国的')
print test.hanzi2pinyin_split(string='钓鱼岛是hello中国world的', split="-")

输出
['diao', 'yu', 'dao', 'shi', 'hello', 'zhong', 'guo', 'de']
diao-yu-dao-shi-hello-zhong-guo-world-de

阅读全文

TOP