nginx的http session管理

Posted by 曹宇伟 on 五月 16th, 2009

http session,基本上可以认为就是我们平常所理解的完成GET或者POST请求的HTTP应用的TCP Session。

从自已的使用经验、以及归纳、总结网上各类关于Nginx的文章,个人觉得Nginx最擅长的是对静态内容提供HTTP服务,以及Session管理(HTTP任务管理)。Nginx使用了epoll的模式来管理TCP session,所以,性能高,系统资源消耗低。

实事上,Nginx提供动态内容需要通过FastCGI方式(也支持内置的对perl的支持),当觉得Nginx慢时,实际上是FastCGI慢(而FastCGI慢,大多数时候,又是因为数据库读写慢—-高并发的请求导致的阻塞属于不常见的原因之一,比如在遭遇DDos攻击的时候)。

大量的并发FastCGI请求,会使FastCGI管理器应接不暇(暂不去管后台数据库的因素,我们要解决的是FastCGI任务调度慢的情况),从而引起阻塞,引发系统上的“撞车效应”。所以瓶颈在FastCGI处理。

不少关于使用Nginx做负载均衡的例子,实际上就是利用Nginx的 session 管理能力。将处理较慢、花时间较多的FastCGI处理任务分发到多台系统上,这样可以提高系统的负载能力,提高系统发生阻塞的阈值。

Nginx的upstream模块,对“负载均衡”提供了良好的支持,详见:

http://wiki.nginx.org/NginxHttpUpstreamModule

例:
upstream app_group1 {
server 192.168.1.111:9000 weight=5 ;
server 192.168.1.112:9000 weight=5 ;
server 192.168.1.113:9000 weight=3 ;
server 192.168.1.114:9000 weight=5 ;
}

…………

location ~ \.php$ {
fastcgi_pass   app_group_01;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $fastcgi_script_name;
include        extra/fastcgi_params.conf;
}

之前,是将Nginx分别放在四台FastCGI服务器上,然后使用LVS来作负载调度,运行良好。为了给系统构架分层,使架构清晰,更易于管理和扩展,降低维护难度,试着使用Nginx来调度负载。

一个较明显的效果是四个FastCGI的系统负载下降(原来有Nginx运行在同一系统上)。

Nginx系统的负载很低,活动连接1.7k左右,负载系统不超过1,用掉不到50M的物理内存。相对于LVS复杂的实施以及背后的管理成本,Nginx在低于100M流量的应用中相当有优势。

给cacti添加对nginx的统计

Posted by 曹宇伟 on 五月 15th, 2009

官方论坛上有详细说明

http://forums.cacti.net/about26458.html

需要说明的是,本地系统可能没有安装perl的LWP模块,对于CentOS系统来说:

yum -y install perl-libwww-perl

即可。

另一个,便是编译nginx时增加 –with-http_stub_status_module 选项

然后,在Server容器里增加如下配置:

location /status {
stub_status             on;
access_log              off;
allow   192.168.0.0/16;
deny    all;
}

nginxctl

Posted by 曹宇伟 on 九月 10th, 2008

自已仿照写了一个nginx的控制角本,运行在我们的CentOS Linux系统上,使用良好。代码如下:

#!/bin/bash
# Author  : Cao Yuwei
# MSN     :
# QQ       :
# E-Mail   :

# master process
# TERM,INT  shutdown fast
# QUIT         shutdown graceful
# HUP           reload config
# USR1          reopen log file
# USR2          update nginx bin file graceful
# WINCH       shutdown worke prcess graceful

# work process
# TERM,INT   shutdown fast
# QUIT          shutdown graceful
# USR1          reopen log file

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

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
if [[ $NETWORKING == [Nn][Oo] ]]; then exit 0; fi

start() {

echo -n ‘Starting Nginx: ‘
#这里要指定你的nginx的路径: /opt/nginx/sbin/nginx
daemon /opt/nginx/sbin/nginx “$EXTRAOPTIONS”
local RETVAL=$?
echo
if [ $RETVAL -eq 0 ]; then touch /var/lock/subsys/nginx ; fi
return $RETVAL
}

stop() {
echo -n ‘Shutting down Nginx: ‘
killproc nginx
local RETVAL=$?
case nptl in
[Ll]inux[Tt]hreads*|lt*)
# Wait until all threads have terminated.
local -i count=20
while [[ count -gt 0 ]] && pidof nginx > /dev/null
do
usleep 200000
let –count
done
;;
esac
echo
if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/nginx; fi
return $RETVAL
}

restart() {
stop
start
}

relog() {
echo -n ‘Relog Nginx: ‘
killproc nginx -USR1
local RETVAL=$?
echo
return $RETVAL
}

reload() {
echo -n ‘Reload Nginx: ‘
killproc nginx -HUP
local RETVAL=$?
echo
return $RETVAL
}

check() {
/opt/nginx/sbin/nginx -t
}

#
#       See how we were called.
#
case “$1″ in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
relog)
relog
;;
check)
check
;;
*)
echo $”Usage: nginxctl {start|stop|restart|reload|relog|check}”
exit 1
esac

exit

Nginx versus Apache

Posted by 曹宇伟 on 四月 25th, 2008

Copyright © 2007 花开的地方. All rights reserved.