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

新增配置文件,根据自己安装的php-fpm路径修改   vim /usr/lib/systemd/system/php-fpm.service

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFILE=/data/soft/php56/var/run/php-fpm.pid
ExecStart=/data/soft/php56/sbin/php-fpm --nodaemonize --fpm-config /data/soft/php56/etc/php-fpm.conf
ExecRestart=/bin/kill -USR2 $PIDFILE
ExecStop=/bin/kill -SIGINT $PIDFILE

[Install]
WantedBy=multi-user.target

增加开机启动

systemctl enable php-fpm.service

操作命令

启动
systemctl start php-fpm.service 

停止
systemctl stop php-fpm.service 

重启
systemctl restart php-fpm.service 

阅读全文

Centos7下配置nginx启动服务脚本
发表于 2017-5-29 | 浏览(2034) | 服务器

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 | 浏览(1771) | 服务器

效果图

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 的教程

阅读全文

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

服务器配置与环境

系统: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内核参数优化
发表于 2016-10-17 | 浏览(776) | 服务器

1、修改   vim /etc/sysctl.conf   文件

# 值为0,说明禁止进行IP转发;如果是1,则说明IP转发功能已经打开
net.ipv4.ip_forward = 0

# 多网卡接收多播
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0

# 验证设置
kernel.sysrq = 0
kernel.core_uses_pid = 1

# 开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理
net.ipv4.tcp_syncookies = 1

# 确定一个消息队列的容量。该参数的取值存储在消息队列标识符结构的某个域中,用于确定是否存在着对新消息进行排队的空间。msgmnb 值可以动态修改,默认为16384。修改其取值会影响到所有新的消息队列的容量。用户可以通过 Msgctl()系统调用来增加现有消息队列的容量
kernel.msgmnb = 65536

# 限制进程可以发送的消息长度。该参数由 Msgsnd()函数加以应用。如果待发送消息的长度超过该值,则返回一个错误。该参数可以在运行时调整
kernel.msgmax = 65536

# 最大共享内存段大小。取物理内存大小的一半,单位为字节(此处为8G)
kernel.shmmax = 8589934592

# 整个系统共享内存段的最大数目
kernel.shmmni = 4096

# 可以使用的共享内存的总量
kernel.shmall = 4294967296

# 每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操作数;系统范围内最大信号对象集数
kernel.sem = 250 32000 100 128

# timewait 的数量,默认是180000
net.ipv4.tcp_max_tw_buckets = 204800

# web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值
net.core.somaxconn = 262144

# 该参数标识是否启用选择性确认SACKS选项。默认值为1(true)
net.ipv4.tcp_sack = 1

# 设置tcp/ip会话的滑动窗口大小是否可变。参数值为布尔值,为1时表示可变,为0时表示不可变。tcp/ip通常使用的窗口最大可达到 65535 字节,对于高速网络,该值可能太小,这时候如果启用了该功能,可以使tcp/ip滑动窗口大小增大数个数量级,从而提高数据传输的能力
net.ipv4.tcp_window_scaling = 1

# tcp_rmem:min表示为TCP socket预留用于接收缓冲的最小内存数量,default为TCP socket预留用于接收缓冲的缺省内存数量,max用于TCP socket接收缓冲的内存最大值
net.ipv4.tcp_rmem = 4096 87380 4194304

# tcp_wmem:min表示为TCP socket预留用于发送缓冲的内存最小值,default为TCP socket预留用于发送缓冲的缺省内存值,max用于TCP socket发送缓冲的内存最大值
net.ipv4.tcp_wmem = 4096 16384 4194304

# 系统套接字写默认缓冲区
net.core.wmem_default = 8388608

# 系统套接字读默认缓冲区
net.core.rmem_default = 8388608

# 系统套接字读最大缓冲区
net.core.rmem_max = 16777216

# 系统套接字写最大缓冲区
net.core.wmem_max = 16777216

# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144

# 统中最多有多少个TCP 套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 3276800

# 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M 内存的系统而言,缺省值是1024,小内存的系统则是128
net.ipv4.tcp_max_syn_backlog = 262144

# 时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉
net.ipv4.tcp_timestamps = 0

# 为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量
net.ipv4.tcp_synack_retries = 1

# 在内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 1

# 启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1

# 开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_tw_reuse = 1

# 确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)
net.ipv4.tcp_mem = 94500000 915000000 927000000

# 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比FIN-WAIT-1 要小,因为它最多只能吃掉1.5K 内存,但是它们的生存期长些
net.ipv4.tcp_fin_timeout = 15

# 当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 15

# 允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000

# 系统中所允许的文件句柄最大数目
fs.file-max = 204800

1.1、让参数生效

/sbin/sysctl -p

2、修改文件句柄数量,修改   vim /etc/security/limits.conf

* soft nofile 204800
* hard nofile 204800

2.1、重启生效,查看参数

ulimit -a

阅读全文

CentOS下使用Ansible自动部署
发表于 2016-10-16 | 浏览(1039) | 服务器

一、服务器准备

Master 		10.0.82.55
Node1		10.0.82.56
Node2		10.0.82.37

二、配置Master SSH免密码登录节点服务器

具体方法,搜索本博客中的文章

三、Master安装Ansible服务

1、yum安装

yum -y install ansible

2、配置文件   vim /etc/ansible/hosts 添加node的ip

10.0.82.56
10.0.82.37

# 可以分组 如:
[web]
10.0.82.56

[db]
10.0.82.37

四、测试

1、在远程服务器根目录创建hello目录

ansible all -a "mkdir /hello"

运行结果
10.0.82.37 | SUCCESS | rc=0 >>
10.0.82.56 | SUCCESS | rc=0 >>

2、把Master本地文件拷贝到远程服务器

ansible all -m copy -a "src=/data/www/test.txt dest=/data/www"

报错了
10.0.82.56 | FAILED! => {
    "changed": false, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "failed": true, 
    "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"

解决方案(如果受控机开启SELinux,则必须在受控机上安装libselinux-python)
ansible all -k -m yum -a "name=libselinux-python state=installed"


再次运行 ansible all -m copy -a "src=/data/www/test.txt dest=/data/www"

运行结果
10.0.82.37 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/data/www/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476215949.6-127742282482280/source", 
    "state": "file", 
    "uid": 0
}
10.0.82.56 | SUCCESS => {
    "changed": true, 
    "checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709", 
    "dest": "/data/www/test.txt", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "d41d8cd98f00b204e9800998ecf8427e", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 0, 
    "src": "/root/.ansible/tmp/ansible-tmp-1476215949.96-237849415762054/source", 
    "state": "file", 
    "uid": 0
}

3、查看节点服务器的某个进程

ansible all -m shell -a "ps -ef | grep nginx"

运行结果
172.17.0.4 | SUCCESS | rc=0 >>
root         68      1  0 09:55 ?        00:00:00 nginx: master process /data/soft/nginx/nginx -c /data/soft/nginx/nginx.conf
nobody       69     68  0 09:55 ?        00:00:00 nginx: worker process
root        298    293  0 09:58 pts/0    00:00:00 /bin/sh -c ps -ef | grep nginx
root        300    298  0 09:58 pts/0    00:00:00 grep nginx

172.17.0.3 | SUCCESS | rc=0 >>
root         71      1  0 08:18 ?        00:00:00 nginx: master process /data/soft/nginx/nginx -c /data/soft/nginx/nginx.conf
nobody       72     71  0 08:18 ?        00:00:00 nginx: worker process
root       1816   1811  0 09:58 pts/0    00:00:00 /bin/sh -c ps -ef | grep nginx
root       1818   1816  0 09:58 pts/0    00:00:00 grep nginx

4、更改节点服务器文件权限

ansible all -m file -a "dest=/data/www/gong.txt mode=777"

运行结果
172.17.0.4 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "path": "/data/www/gong.txt", 
    "size": 6, 
    "state": "file", 
    "uid": 0
}
172.17.0.3 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "path": "/data/www/gong.txt", 
    "size": 6, 
    "state": "file", 
    "uid": 0
}

4、在节点服务器上拉取一个git库

ansible all -m shell -a "cd /data/www; git clone git@git.coding.net:gongfuxiang/hello.git"

运行结果
172.17.0.4 | SUCCESS | rc=0 >>
Cloning into 'hello'...

172.17.0.3 | SUCCESS | rc=0 >>
Cloning into 'hello'...

Ansible更多使用方法 Ansible中文使用权威指南

阅读全文

CentOS安装Munin监控服务器
发表于 2016-10-13 | 浏览(1468) | 服务器

效果图


作为一个网络资源监控工具,Munin能够帮助分析资源趋势和查看薄弱环节以及导致产生性能问题的原因。开发此软件的团队希望它能够易用和用户体验友好。该软件是用Perl开发的,并采用rrdtool来绘制图形,使用了web界面进行呈现。开发人员推广此应用时声称当前已有500多个监控插件可以“即插即用*”。

一、安装web服务器 nginx或apache都可以(搜索本博客中有nginx的安装教程)

服务器列表
Master 	192.168.1.100
Node1 	192.168.1.200
Node2 	192.168.1.201

二、Master安装Munin

1、安装EPEL源(已安装可跳过)

rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/epel/6/i386/epel-release-6-8.noarch.rpm

2、Master 安装munin服务

yum -y install munin

3、修改配置文件  vim /etc/munin/munin.conf

将以下几行的注释去掉(分别是 数据路径,wab路径,日志路径,运行run路径,模板文件路径)
dbdir  /var/lib/munin
htmldir /var/www/html/munin
logdir /var/log/munin
rundir  /var/run/munin
tmpldir /etc/munin/templates

将以下监控本机的代码注释掉
#[localhost]
#    address 127.0.0.1
#    use_node_name yes
同时添加被监控机地址
[node1]
	address 192.168.1.200
	use_node_name yes
[node2]
	address 192.168.1.201
	use_node_name yes

use_node_name命令控制munin命名节点的方式,如果后面跟的参数为yes就是用括号中的值来命名,如果是no则将执行一个DNS查询。

4、配置服务需要用户名和密码才能访问,apache中自带htpasswd,nginx中没,可以搜索本博客中的教程

htpasswd -c /etc/munin/munin-htpasswd 用户名
然后输入密码

5、在nginx中或apache中添加htpasswd用户认证(这里nginx做演示 server中)

auth_basic "Authorized users only";
auth_basic_user_file /etc/munin/munin-htpasswd;

6、安装完munin服务端后,程序会自动创建一个计划任务,可以看到是每5分钟获取一次数据(可以根据自己的需求修改定时任务时间)

cat /etc/cron.d/munin

*/5 * * * * munin test -x /usr/bin/munin-cron && /usr/bin/munin-cron

7、启动crond服务

service crond start

三、Node服务器安装Munin

1、安装EPEL源(已安装可跳过)

rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/epel/6/i386/epel-release-6-8.noarch.rpm

yum -y install munin-node

2、修改配置文件   vim /etc/munin/munin-node.conf

找到 allow ^127\.0\.0\.1$
这里是表示允许谁来获取信息,在下面加上监控机IP:
allow ^192\.168\.1\.100$

3、防火墙配置   vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 4949 -j ACCEPT

4、启动munin-node

service munin-node start

四、进入Master测试看看

telnet 192.168.1.200 4949

访问Master配置的尾部服务器查看节点服务的监控数据

阅读全文

CentOS编译安装MySQL5.7
发表于 2016-10-12 | 浏览(1100) | 数据库

1、准备

mkdir /data
cd /data
mkdir soft src dbdata
cd soft
mkdir mysql

2、安装cmake

cd /data/src
wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
tar -zxvf cmake-2.8.10.2.tar.gz
cd cmake-2.8.10.2
./bootstrap
gmake
gmake install

3、下载boost源码包,从5.7开始boost包是必须的

cd /data/src
wget http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
mkdir /usr/local/boost
tar -zxvf boost_1_59_0.tar.gz -C /usr/local/boost

4、安装mysql

cd /data/src
wget http://dev.mysql.com/get/archives/mysql-5.7/mysql-5.7.15.tar.gz
tar -zxvf mysql-5.7.15.tar.gz
cd mysql-5.7.15
cmake . -DCMAKE_INSTALL_PREFIX=/data/soft/mysql -DMYSQL_DATADIR=/data/dbdata -DSYSCONFDIR=/data/soft/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DMYSQL_USER=mysql -DWITH_DEBUG=0 -DMYSQL_TCP_PORT=3306 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_READLINE=1 -DWITH_SSL=yes -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
make
make install

5、初始化操作

cd /data/soft/mysql
bin/mysqld --initialize --user=mysql --basedir=/data/soft/mysql --datadir=/dbdata --explicit_defaults_for_timestamp=1
/data/soft/mysql/support-files
这里会给出默认的随机密码,请一定要记下来一会儿登录使用(mysql从5.7开始密码不再默认空了)

6、mysql配置文件

cd support-files
cp my-default.cnf /etc/my.cnf

7、配置mysql服务开机自动启动

cp mysql.server /etc/init.d/mysql
chmod 755 /etc/init.d/mysql

8、检查自启动项列表中没有mysql这个,如果没有就添加mysql

chkconfig --list mysql
chkconfig --add mysql

9、设置MySQL在345等级自动启动

chkconfig --level 345 mysql on
chkconfig mysql on

10、创建mysql命令路径

ln -s /data/soft/mysql/bin/mysql /usr/bin

11、mysql操作命令

service mysql start
service mysql stop
service mysql restart

12、登录mysql

mysql -uroot -p
输入安装完成的时候给的随机密码,如:123456

13、修改root的密码

alter user 'root'@'localhost' identified by '123456';

退出后重新登录使用新密码即可

阅读全文

Nginx+Lua+Redis搭建高并发服务
发表于 2016-10-2 | 浏览(2224) | 服务器

架构图


一、准备

1、服务器首先是需要安装redis服务,查看本博客中的另一篇文章
2、安装nginx+luq服务,查看本博客中的另一篇文章

二、下载lua redis库

lua-redis库地址 https://github.com/openresty/lua-resty-redis
cd /data/www/lua/vendor
git clone https://github.com/openresty/lua-resty-redis.git

三、vim nginx.conf,http中添加

lua_package_path "/data/www/lua/vendor/lua-resty-redis/lib/?.lua;;";

四、nginx server中操作redis

1、在nginx.conf中嵌入lua代码

location /hello {
	default_type 'text/json';
	local redis = require "resty.redis";
	local instance = redis:new();
	local host = "127.0.0.1";
	local port = 6379;
	local ok,err = instance:connect(host,port);
	if not ok then
	   ngx.log(ngx.ERR,err);
	   ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
	end
	local suc, err instance:set('devil', 'hello world')
	f not suc then
		ngx.say("error")
	else
		ngx.say(instance:get('instance'))
	end
}

2、在实际业务中,独立lua代码(下面是一个redis简单的demo)

location /hello {
    default_type 'text/json';
    lua_need_request_body on;
    content_by_lua_file /data/www/lua/www/redis.lua;
}

2.1、lua文件的代码   vim /data/www/lua/www/redis.lua

#!/usr/local/bin/lua

--[[
	redis操作demo
	Devil
	http://gongfuxiang.com
--]]

-- 引入redis库
local redis = require "resty.redis";

-- 实例化redis
local instance = redis:new();

-- redis配置参数
local host = "127.0.0.1";
local port = 6379;

-- 创建redis连接
local ok,err = instance:connect(host,port);
if not ok then
   ngx.log(ngx.ERR,err);
   ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
end

-- 获取客户端post过来的body数据
local request_body = ngx.req.get_body_data() or nil
if( request_body ~= nil )
then
	-- 客户端ip
    local client_ip =ngx.req.get_headers()["X-Real-IP"]
    if client_ip == nil then
            client_ip = ngx.req.get_headers()["x_forworded_for"]
    end
    if client_ip == nil then
            client_ip = ngx.var.remote_addr
    end

    -- 当前时间戳
    local time = os.time()

    -- 拼接redis数据
    local data = client_ip.."{-}"..time.."{-}"..request_body

    -- 队列方式存储redis数据
    local suc, err = instance:lpush('key_list', data)
    if not suc then
        ngx.say('{"code":-2, "msg":"操作失败"}')
    end
    ngx.say('{"code":0, "msg":"操作成功"}')
else
    ngx.say('{"code":-1, "msg":"数据有误"}')
end

五、测试,访问 http://localhost/hello

hello world

阅读全文

Nginx结合Lua模块
发表于 2016-10-2 | 浏览(846) | 服务器

一、准备(软件存放目录创建)

mkdir /data
cd /data
mkdir src soft www
cd www
mkdir lua vendor
cd lua www 

二、常用库安装

yum -y install automake autoconf libtool make gcc gcc-c++ libmcrypt-devel mhash-devel libxslt-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel

三、nginx依赖库安装

1、安装PCRE库

ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ 下载最新的 PCRE 源码包,使用下面命令下载编译和安装 PCRE 包:
cd /data/src
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
tar -zxvf pcre-8.38.tar.gz
./configure
make && make install

2、安装zlib库

http://zlib.net/zlib-1.2.8.tar.gz 下载最新的 zlib 源码包,使用下面命令下载编译和安装 zlib包:
cd /data/src
wget http://zlib.net/zlib-1.2.8.tar.gz
tar -zxvf zlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure
make && make install

3、安装ssl(某些vps默认没装ssl)

cd /data/src
wget http://www.openssl.org/source/openssl-1.0.2.tar.gz
tar -zxvf openssl-1.0.2.tar.gz
./config
make && make install
cp apps/openssl /usr/bin/
如果提示覆盖,确认就OK了,再查看openssl version版本就是最新版了

4、nginx lua扩展库

cd /data/src
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.6.tar.gz
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
mv v0.3.0.tar.gz ngx_devel_kit-0.3.0.tar.gz
mv v0.10.6.tar.gz lua-nginx-module-0.10.6.tar.gz
tar -zxvf ngx_devel_kit-0.3.0.tar.gz
tar -zxvf lua-nginx-module-0.10.6.tar.gz

5、LuaJIT安装

cd /data/src
wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar -zxvf LuaJIT-2.0.4.tar.gz 
cd LuaJIT-2.0.4
make && make install

四、安装nginx

1、安装nginx

Nginx 一般有两个版本,分别是稳定版和开发版,您可以根据您的目的来选择这两个版本的其中一个,下面是把 Nginx 安装到 /data/soft/nginx 目录下的详细步骤:
cd /data/src
wget http://nginx.org/download/nginx-1.9.9.tar.gz
tar -zxvf nginx-1.9.9.tar.gz
cd nginx-1.9.9
./configure --sbin-path=/data/soft/nginx/nginx \--conf-path=/data/soft/nginx/nginx.conf \--pid-path=/data/soft/nginx/nginx.pid \--with-http_realip_module \--with-http_ssl_module \--with-pcre=/data/src/pcre-8.38 \--with-zlib=/data/src/zlib-1.2.8 \--with-http_stub_status_module \--add-module=/data/src/ngx_cache_purge-2.3 \--add-module=/data/src/ngx_devel_kit-0.3.0 \--add-module=/data/src/lua-nginx-module-0.10.6
make && make install

2、告诉nginxlua库路径

export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0

3、查看nginx是否正常

nginx -v
可能会出现下面的错误
./objs/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
解决方法:
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

8、nginx常用操作

cp /data/soft/nginx/nginx /etc/init.d/
/etc/init.d/nginx 				启动nginx
/etc/init.d/nginx -s reload		重启nginx
/etc/init.d/nginx -s stop		关闭nginx

9、进入nginx目录校验lua是否能够正常运行

cd /data/soft/nginx
vim nginx.conf(server中添加以下代码)
location /hello { 
	default_type 'text/plain'; 
	content_by_lua 'ngx.say("hello, lua")'; 
}
重启nginx即可,访问 http://localhost/hello 会出现 hello,lua

阅读全文

TOP