配置Nginx,完善Nginx启动脚本

来源:互联网 发布:淘宝店铺发布宝贝类目 编辑:程序博客网 时间:2024/06/05 17:35

 

备忘录:配置Nginx,完善Nginx启动脚本
2009-04-28 16:55

#!/bin/sh
#
### see http://www.muduo.net/index.php/uid-8974-action-viewspace-itemid-310023
#
### 脚本2写的比较完善,相比脚本1增加了在线升级及配置语法检测功能
#
# 脚本3是根据脚本1完善过来的。由于nginx本身不能通过pipe来传递日志数据,如apache那样直接。
# 所以,在这里通过fifo(named pipe)来将日志数据传递给cronolog,再通过cronolog将日志按照指定的格式来写日志文件。
# 脚本通过检索 nginx.conf 来查找日志文件的位置,然后通过监测该日志文件是否为fifo(test -p file),
# 如果不是fifo文件,则删掉该文件,并执行 mkfifo $fife生成fifo文件。
# 通过cat $fifofile,写入到cronolog的管道中,从而实现日志的轮转。基本实现了较好的功能。
# 有兴趣的朋友可以把脚本2和脚本3进行整合,实现更加完美的功能 :)
#
# Modified:刘胜 <nike.lius@163.com>
# 改进0:脚本3无需依赖 start-stop-daemon 命令
# 改进1:增加 ps, test 选项
# 改进2:修改LOGDIR,日志轮换格式 [/usr/local/nginx/logs/20071221/access.log]
# 改进3:修改LOGDIR,日志轮换格式 [/usr/local/nginx/logs/access.log.20071221] 参考log4j日志轮换格式
# 改进4:修复 restart时 日志轮换失效(在d_start后执行d_cronologs命令;注意d_stop后不能执行d_killcronologs命令)
# 改进5:增加 upgrade 选项,支持在线升级
#
# chkconfig: 2345 08 99
# description: Starts, stops nginx
#
#dscription: Startup script for nginx webserver on Debian. Place in /etc/init.d and
# run 'sudo update-rc.d nginx defaults', or use the appropriate command on your
# distro.
#
# Author: Ryan Norbauer <ryan.norbauer@gmail.com>
# Modified: Geoffrey Grosenbach http://topfunky.com
# Modified: chunshengster <chunshengster@gmial.com>

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Nginx/0.6.22"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
CONFIG=/usr/local/nginx/conf/nginx.conf
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
#CRONOLOG=/usr/local/sbin/cronolog
CRONOLOG=cronolog
#LOGDIR=/data1/nginxlogs/%Y-%m-%d/
#LOGDIR=/usr/local/nginx/logs/%Y%m%d/
LOGDIR=/usr/local/nginx/logs
LOGEND=.%Y%m%d

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

#functions
d_getlogs(){
LOGS=`grep -E "[access|error]_log" $CONFIG | grep -v "#" | awk '{print $2}' | cut -d/; -f 1`
echo "d_getlogs()...ok"
}
d_mkfifo(){
echo "d_mkfifo()..."
logs=$*
#echo $logs
for log in $logs;do
   #echo "mkfifo $log";
   if test ! -p $log; then
    echo "make fifo log $log..."
    rm -v $log;
    mkfifo $log
   fi
done;
echo "d_mkfifo()...ok"
}
d_mkfifolog(){
echo "d_mkfifolog()..."
LOGS=`grep -E "[access|error]_log" $CONFIG | grep -v "#" | awk '{print $2}' | cut -d/; -f 1`
d_mkfifo $LOGS;
echo "d_mkfifolog()...ok"
}
d_cronologs(){
echo "d_cronologs()..."
LOGS=`grep -E "[access|error]_log" $CONFIG | grep -v "#" | awk '{print $2}' | cut -d/; -f 1`
#echo $LOGS
d_mkfifo $LOGS;
for log in $LOGS; do
   logname=`basename $log`
   #echo "$logname"
   #cat $log | $CRONOLOG $LOGDIR/$logname &
   #cat $log | $CRONOLOG $LOGDIR/$logname.%Y%m%d &
   cat $log | $CRONOLOG $LOGDIR/$logname$LOGEND &
done
echo "d_cronologs()...ok"
}
d_killcronologs(){
echo "d_killcronologs()..."
LOGS=`grep -E "[access|error]_log" $CONFIG | grep -v "#" | awk '{print $2}' | cut -d/; -f 1`
pids_cat=`pidof cat`
pids_cronolog=`pidof cronolog`
for pid in pids_cronolog pids_cat; do
   kill -9 $pid
done
if test -z `pidof cat` -a test -z `pidof cronolog`; then
   echo "All depended pids are killed !"
else
   echo "Not all the pids are killed !"
fi
echo "d_killcronologs()...ok"
}
d_start() {
echo "### Starting $DESC: $NAME"
$DAEMON -c $CONFIG || echo " already running"
}

d_stop() {
echo "### Stopping $DESC: $NAME"
test -f $PIDFILE && kill -QUIT `cat $PIDFILE`
}

d_reload() {
echo "### Reloading $DESC configuration ..."
kill -HUP `cat $PIDFILE` || echo " can't reload"
}
d_ps() {
ps -ef | egrep '(PID|nginx|cronolog)' | grep -v grep | grep -v ".sh"
#ps aux | egrep '(PID|nginx|cronolog)' | grep -v grep | grep -v ".sh"
}

configtest() {
#ebegin "Checking nginx' configuration"
#/usr/sbin/nginx -c /etc/nginx/nginx.conf -t
#eend $? "failed, please correct errors above"
echo "### Checking $DESC configuration..."
$DAEMON -c $CONFIG -t
}

upgrade() {
configtest || return 1
echo "### Upgrading $DESC: $NAME"
echo "### 1) Sending USR2 to old binary"
kill -USR2 `cat $PIDFILE` &>/dev/null
echo "### 2) Sleeping 3 seconds before pid-files checking"
sleep 3
if [ ! -f $PIDFILE.oldbin ]; then
   echo "### E File with old pid not found"
   return 1
fi
if [ ! -f $PIDFILE ]; then
   echo "### E New binary failed to start"
   return 1
fi
echo "### 3) Sleeping 3 seconds before WINCH"
sleep 3 ; kill -WINCH `cat $PIDFILE.oldbin`

echo "### 4) Sending QUIT to old binary"
   kill -QUIT `cat $PIDFILE.oldbin`
echo "### 5) Upgrade completed"
d_ps
sleep 3
#eend $? "Upgrade failed"
}

case "$1" in
start)
d_ps
d_start
d_cronologs
echo "."
;;
stop)
d_ps
d_stop
d_killcronologs
echo "."
;;
reload)
d_reload
echo "### Reloading $DESC: OK"
;;
restart)
echo "### Restarting $DESC: $NAME"
d_ps
d_stop;   #d_killcronologs #不能增加,否则异常退出
# One second might not be time enough for a daemon to stop,
# if this happens, d_start will fail (and dpkg will break if
# the package is being upgraded). Change the timeout if needed
# be, or change d_stop to have start-stop-daemon use --retry.
# Notice that using --retry slows down the shutdown process somewhat.
sleep 3
d_ps
d_start; d_cronologs
echo "### Restarting $DESC: OK"
        ;;
mklog)
d_mkfifolog
;;
test)
echo "### Checking $DESC configuration..."
$DAEMON -c $CONFIG -t
$DAEMON -v
;;
ps)
#d_ps
$DAEMON -v
;;
upgrade)
upgrade
echo "### Upgrade $DESC: OK"
;;
*)
echo "### Usage: $SCRIPTNAME {start|stop|restart|reload|test|ps|upgrade}" >&2
exit 3
;;
esac

d_ps

exit 1

---------

http://cache.baidu.com/c?word=cronolog%2Cnginx&url=http%3A//my%2Edonews%2Ecom/terryzhou/&p=8b2a965986cc41ac42a7f8364f48&user=baidu#baidusnap1

http://my.donews.com/terryzhou/2007/11/07/nginx-web%e6%9c%8d%e5%8a%a1%e5%99%a8/

Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx
是由 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了。直到2007年4月,俄罗 斯大约有20%左右的虚拟主机是由nignx服务或代理的。Google在线安全博客中统计nginx服务或代理了大约所有Internet虚拟主机的4%。而netcraft的统计显示,nginx服务的主机在过去的一年里以四倍的速度增长。短短的几年里,它的排名已跃进第9。(参见:http://survey.netcraft.com/Reports/200707/ )

现在,Igor 将源代码以类BSD许可证的形式发布。Nginx因为它的稳定性、丰富的模块库、灵活的配置和低系统资源的消耗而闻名.业界一致认为它是Apache2.2+mod_proxy_balancer的轻量级代替者,不仅是因为响应静态页面的速度非常快,而且它的模块数量达到Apache的近2/3。对proxy 和 rewrite 模块的支持很彻底,还支持mod_fcgi、ssl 、vhosts ,适合用来做mongrel clusters的前端HTTP响应。

nginx做为HTTP服务器,有以下几项基本特性:
–>处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
–>无缓存的反向代理加速,简单的负载均衡和容错.
–>FastCGI,简单的负载均衡和容错.
–>模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
–>支持SSL 和 TLS
SNI.

Nginx专为性能优化而开发,性能是其最重要的考量, 实现上非常注重效率 。它支持内核Poll模型,能经受高负载的考验,
有报告表明能支持高达 50,000 个并发连接数。

Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。就稳定性而言, nginx比lighthttpd更胜一筹。

Nginx支持热部署。它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。

Nginx采用master-slave模型, 能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟。当采用select()/poll()调用时,还可以限制每个进程的连接数。

Nginx代码质量非常高,代码很规范,手法成熟, 模块扩展也很容易。特别值得一提的是强大的Upstream与Filter链。 Upstream为诸如reverse proxy, 与其他服务器通信模块的编写奠定了很好的基础。而Filter链最酷的部分就是各个filter不必等待前一个filter执行完毕。它可以把前一个filter的输出做为当前filter的输入,这有点像Unix的管线。这意味着,一个模块可以开始压缩从后端服务器发送过来的请求,且可以在模块接收完后端服务器的整个请求之前把压缩流转向客户端。

Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+),accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能。

当然,nginx还很年轻,多多少少存在一些问题,比如:
–>Nginx是俄罗斯人创建,目前文档方面还不是很完善.因为文档大多是俄语,所以文档方面这也是个障碍.
–>尽管nignx的模块比较多,但它们还不够完善。
–>对脚本的支持力度不够。

这些问题,nginx的作者和社区都在努力解决,我们有理由相信nginx将继续以高速的增长率来分享轻量级HTTP服务器市场,会有一个更美好的未来。

http://www.riceonfire.org/emiller/nginx-modules-guide.html#create_loc_conf 开发Nginx模块
High-Level Overview of Nginx's Module Delegation
Nginx modules have three roles we'll cover:
-handlers process a request and produce output
-filters manipulate the output produced by a handler
-load-balancers choose a backend server to send a request to, when more than one backend server is eligible

http://www.phpchina.com/bbs/redirect.php?tid=45848&goto=lastpost&sid=z0PPk5
由于现在的BT下载软件越来越多了,我们如何限制下载的并发数和速率呢?apache需要三方模块,nginx就不用了:)
在nginx利用两个指令即可实现:limit_zone(limit_conn) 来限制并发数,limit_rate来限制下载的速率,请看上面的配置实例.
               #Zone limit
               location / {
                   limit_conn   one 1;
                   limit_rate 20k;
               }

http://www.google.cn/trends?q=memcached%2C%2CJCS%2Coscache%2CJCache&ctab=0&hl=zh-CN&geo=all&date=all memcached,,JCS,oscache,JCache 的流行程度。
http://smallbizit.ctocio.com.cn/tips/336/7699336.shtml   大型网站架构之:Wikimedia的体系结构
关于wikimedia服务器的文章
  平台:Apache,Linux,MySQL,PHP,Squid,LVS,Lucene搜索,分布式对象高速缓存Memcached,Lighttpd图像服务器
  统计信息:
  8 百万文章,覆盖了超过100中语言
  世界前10最繁忙的站点
  指数增长:访问者/流量/服务器数量在每4-6个月翻倍;高峰期30000HTTP请求量;3 Gbit/s 数据流量;
  3个数据中心:坦帕[美国佛罗里达州西部港市]、阿姆斯特丹、汉城
  350个服务器,从1x P4到2x Xeon Quad-Core排列,0.5 - 16 GB内存
  大约6个人员管理
  3个不同的州设有3个群集器

在192.168.0.82上安装Nginx-0.6.17版
$ uname -a # Linux localhost.localdomain 2.6.9-22.EL #1 Mon Sep 19 18:20:28 EDT 2005 i686 i686 i386 GNU/Linux
//107 Linux ubuntu 2.6.22-14-server #1 SMP Sun Oct 14 23:34:23 GMT 2007 i686 GNU/Linux
//121 Linux mail.infothunder.com 2.6.9-22.ELsmp #1 SMP Mon Sep 19 18:32:14 EDT 2005 i686 i686 i386 GNU/Linux
$ cd /home/appusr/lius/src/
$ tar zxvf pcre-7.4.tar.gz
$ cd pcre-7.4
$ ./configure
$ make
# make install # root 权限
$ tar nginx-0.6.17.tar.gz
$ cd nginx-0.6.17
$ ./configure --with-md5=/usr/lib --with-sha1=/usr/lib --with-openssl=/usr/include --with-http_stub_status_module
$ make
# make install
# cp nginx.sh /usr/local/nginx/conf
# cp start-stop-daemon /usr/local/nginx/conf
# cd /usr/local/nginx/conf
# chmod +x *.sh start-stop-daemon
# vi nginx.sh # 添加当前路径 .

# ./nginx.sh start # 【失败,无法使用start-stop-daemon启动】
Starting nginx-0.6.17: start-stop-daemon: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by start-stop-daemon)
# ls -lt /lib/tls/libc*   # 版本过低,在Ubuntu中【/lib/libc.so.6 -> libc-2.6.1.so】
lrwxrwxrwx 1 root root      13 Mar 1 2007 /lib/tls/libc.so.6 -> libc-2.3.4.so
-rwxr-xr-x 1 root root 1454462 Aug 20 2005 /lib/tls/libc-2.3.4.so

http://man.chinaunix.net/linux/debian/debian_faq.html 7.2 如何升级一个运行中的程序
Debian GNU/Linux 系统的内核支持运行中替换文件.—— 我们另外提供可一个称作start-stop-daemon 程序用于启动时驱动进程或内核运行级别发生变化时停掉进程(如,由多用户到单用户模式或到关机模式).包含某个进程的软件包安装时,安装脚本停止和重起进程调用用的也是这个程序.

# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
2007/12/06 14:44:53 [emerg] 21836#0: getpwnam("www-data") failed in /usr/local/nginx/conf/nginx.conf:3
2007/12/06 14:44:53 [emerg] 21836#0: the configuration file /usr/local/nginx/conf/nginx.conf test failed
# vi nginx.conf # 将第二行 usr www-data 修改为 user nobody nobody;
# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
2007/12/06 14:49:29 [info] 21850#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
2007/12/06 14:49:29 [info] 21850#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully

http://blog.chinaunix.net/u/26862/showart_384362.html web负载均衡与反向代理之/RHEL AS4/nginx-0.5.17
# 定义启动脚本
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 启动81端口
# ps aux|grep nginx|grep -v grep   # 检查ngins进程是否启动:
# netstat -ln # 查看端口81是否存在
tcp        0      0 0.0.0.0:81                  0.0.0.0:*                   LISTEN     
# http://192.168.0.82:81/status/ # 无法访问,修改nginx.conf 的 localtion /status部分对IP的限制;
# kill -9 nginx 《slave process的pid》
# killall -9 nginx

# 给nginxstatus做身份验证:
# htpasswd -c htpasswd lius

查看nginxstatus:
http://192.168.0.82/nginxstatus/,输入验证帐号密码,即可看到类似如下内容:
Active connections: 328
server accepts handled requests
9309 8982 28890
Reading: 1 Writing: 3 Waiting: 324
第一行表示目前活跃的连接数
第三行的第三个数字表示Nginx运行到当前时间接受到的总请求数,如果快达到了上限,就需要加大上限值了。

查看日志:
#cd /usr/local/nginx
#tail -f logs/access.logs(查看访问情况)


验证Nginx功能:
-负载均衡,是否能自动恢复。。。pass http://192.168.2.107:81/test2/
-负载均衡,是否能根据特殊HTTP头信息(如手机号),指向特点服务器。。。第三方补丁,根据url的hash来定向;
-日志格式,是否能保存特殊HTTP头信息。。。参考 http://blogger.org.cn/blog/more.asp?name=lhwork&id=21841
-设备配置,是否能配置/dev/shm的大小(缺省128M内存虚拟路径)。。。手工修改方式成功,自动方式未实际测试;
-测试文件,设置从定向到php/jsp等,生成文件,通过X-Accel-Redirect返回给Nginx,使用sendfile发送。
-支持PHP脚本,通过FastCGI/spawn-fcgi
-支持Ruby脚本,通过FastCGI或者moral

http://blog.s135.com/read.php?314 Nginx 0.5.33 + PHP 5.2.5(FastCGI)搭建胜过Apache 10倍的Web服务器(第2版)

上一篇:sax2 和nvidia-setting无法调整15寸LCD显示器分辨率的解决   下一篇:ubuntu使用中文man
http://www.cneduz.com/it/Linux/Guide/382867.html

应用程序如果遵循POSIX或者使用GLIBC(2.2和更高版本),通常使用/dev/shm作共享内存(shm_open,shm_unlink)。/dev/shm是一个临时文件系统(tmpfs),可以从/etc/fstab中mount。因此,支持标准的参数例如"size",可以用来增加或者减少在/dev/shm上的tmpfs大小.(默认的,它的大小是系统RAM的一半)。

lius@ubuntu:/usr/local/nginx/conf$ df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1              3889892   1348528   2343768 37% /
varrun                  127952       208    127744   1% /var/run
varlock                 127952         0    127952   0% /var/lock
udev                    127952        36    127916   1% /dev
devshm                  127952         0    127952   0% /dev/shm

http://blogger.org.cn/blog/more.asp?name=lhwork&id=21841 #设定日志格式
        log_format main         '$remote_addr - $remote_user [$time_local] '
                                                '"$request" $status $bytes_sent '
                                                '"$http_referer" "$http_user_agent" '
                                                '"$gzip_ratio"';

        log_format download '$remote_addr - $remote_user [$time_local] '
                                                '"$request" $status $bytes_sent '
                                                '"$http_referer" "$http_user_agent" '
                                                '"$http_range" "$sent_http_content_range"';

日志问题:1,记录特殊http头信息;2;自动切换,每天一个日志文件。

http://cache.baidu.com/c?word=nginx%2Clog%2Cdaily&url=http%3A//linux%2Echinaunix%2Enet/bbs/archiver/%3Ftid%2D905873%2Ehtml&p=9374c64ad7c259e608e2947d514089&user=baidu
apache的rotatelogs不是很好的么?干吗要自己去那么费劲?
在apache的虚拟主机中设置:
CustomLog "|/opt/apache/bin/rotatelogs /var/log/apache/aaa/aaa_access_log-%g%m%d 86400 480" combinedio

如果你想自己写的话,这样的方法也许能够参考一下(我使用的Nginx没有apache的rotatelogs,所以自己写个脚本,你可以参考一下):

1、crontab中设置如下
# root crontab entry:
59 23 * * *   /opt/nginx/bin/nginx-aaa.rotatelog 2>&1 > /dev/null

2、截断脚本
## nginx-aaa.rotatelog
cd /var/log/nginx/aaa
/bin/mv aaa_access_log aaa_access_log-`/bin/date +"%y%m%d"`
/bin/kill -USR1 `/bin/cat /var/run/nginx/nginx.pid`


http://wiki.codemongers.com/NginxSimpleRubyFCGI 通过FastCGI支持Ruby的脚本;
Need a Ruby guy to step up and expand on this: Can the following be used/modified to support simple Ruby CGI?
fcgi_handler.rb http://dev.rubyonrails.org/browser/trunk/railties/lib/fcgi_handler.rb

http://wiki.codemongers.com/NginxChsHttpUpstreamRequestHashModule 根据URL进行hash选择的负载均衡(需要第三方补丁)
本模块由第三方提供,不包含在 Nginx 的源码发布版中。安装介绍等请看 这里.
The upstream_hash module provides simple upstream load distribution by hashing a configurable variable (e.g., the request URI, incoming HTTP headers, or some combination). Example usage:
upstream backend {
    server server1;
    server server2;
    hash   $request_uri;
}
Here, Nginx will choose server1 or server2 by hashing the request URI ($request_uri).

http://wiki.codemongers.com/NginxHttpGeoModule 通过geo定义变量
geo $geo {
    default          0;
    127.0.0.1/32     2;
    192.168.1.0/24   1;
    10.1.0.0/16      1;
}

http://wiki.codemongers.com/NginxHttpFlvStreamModule 支持特殊文件类型(flv)

http://wiki.codemongers.com/NginxChsHttpProxyModule 反向代理,加缓存(参考)
location /images/ {
    root                 /data/www;
    error_page           404 = /fetch$uri;
}
location /fetch {
    internal;
    proxy_pass           http://backend;
    proxy_store          on;
    proxy_store_access   user:rw group:rw all:r;
    proxy_temp_path      /data/temp;
    alias                /data/www;
}


http://hi.baidu.com/xilihwala/blog/item/2130b8128ccdebccc3fd7837.html 如何在反向代理中加快大文件处理
Serving Big Files with PHP/Rails faster
(1 Apache - mod_xsendfile 2 nginx - X-Accel-Redirect 3 lighttpd(lighty) - x-sendfile)
http://wiki.codemongers.com/NginxXSendfile 通过X-SendFile加速
Lighttpd has this feature and there is a mod_xsendfile for Apache2.
location /protected/ {
    internal;
    root   /some/path;
}
add_header("X-Accel-Redirect: /protected/iso.img");
X-Accel-Limit-Rate: 1024
X-Accel-Buffering: yes|no
X-Accel-Charset: utf-8
http://blog.kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/ Using X-Accel-Redirect Header With Nginx to Implement Controlled Downloads (with rails and php examples)

http://bianbian.lilydoc.net/index.php/technology/linux/156.html 设置多少个Nginx工作进程才合适?
搜索到原作者的话:
一般一个进程足够了,你可以把连接数设得很大。如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有block)。
As a general rule you need the only worker with large number of worker_connections, say 10,000 or 20,000.
However, if nginx does CPU-intensive work as SSL or gzipping and you have 2 or more CPU, then you may set worker_processes to be equal to CPU number.
Besides, if you serve many static files and the total size of the files is bigger than memory, then you may increase worker_processes to utilize a full disk bandwidth.
——Igor Sysoev
经我实践配置,多cpu+gzip+N多小文件+文件总大小大大超过内存 的环境(BBS啦~),设置为cpu的两倍较好。(不过一个nginx是4.3M噢)

2 Responses to “[译]nginx的worker_processes设为多少才合适?”

轻 Says: October 21st, 2007 at 06:25:04
在我的实际使用中(nginx+php-cgi),还是觉得CPU*1为好
一个CPU开启多个worker_processes的话,会导致负载瞬间狂升至20+
相反一个CPU只开一个的话,会很稳!

bianbian Says:
October 22nd, 2007 at 01:03:05
嗯,这个要根据环境调节的。我的是8个CPU的服务器。。。另外,可以修改nginx的cc make参数,把gcc的-g(debug)参数去掉。可以大大减小编译后的bin大小。
-----------------
# nginx.conf.hh 支持根据手机号分发

user nobody nobody;
worker_processes 4;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid        logs/nginx.pid;


events {
    use epoll;
    worker_connections 2048;
}


http {
include       mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
   '$status $body_bytes_sent "$http_referer" '
   '"$http_user_agent" "$http_x_forwarded_for"
   "$http_x_up_calling_line_id"
   "$upstream_addr"
   $upstream_response_time '
   ;

    access_log /usr/local/nginx/logs/access.log main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout 0;
    keepalive_timeout 65;

    gzip on;

    #设定负载均衡的服务器列表
    upstream resin0 {
        server 10.28.1.35:8080 weight=5;
        server 10.28.1.37:8080 weight=1;
    }
    upstream resin1 {
        server 10.28.1.35:8080 weight=1;
        server 10.28.1.37:8080 weight=5;
    }
    upstream resin2 {
        server 10.28.1.38:8080 weight=5;
    }
    upstream resin3 {
        server 10.28.1.3:8080 weight=2;
    }

    server {
        listen       80;
        server_name localhost;

        #charset koi8-r;

        #access_log logs/host.access.log main;

        location / {
            root   /home/www/html;
            index index.html index.htm;
        }

        location /NginxStatus {
            stub_status             on;
            access_log              /usr/local/nginx/logs/NginxStatus.log;
            auth_basic              "NginxStatus";
            auth_basic_user_file    htpasswd;
        }

        #对 "/store" 启用负载均衡
        location /store {
            if ( $http_x_up_calling_line_id ~ ^86139 ) {
                rewrite ^(/store/)(.*)$ /store139/$2 last;
            }
            if ( $http_x_up_calling_line_id ~ ^86136 ) {
                rewrite ^(/store/)(.*)$ /store136/$2 last;
            }
            rewrite ^(/store/)(.*)$ /store135/$2 last;
        }
        location /store139 {
            proxy_pass      http://resin3/store;
            include         proxy.conf;
        }
        location /store136 {
            proxy_pass      http://resin2/store;
            include         proxy.conf;
        }
        location /store135 {
            proxy_pass      http://resin1/store;
            include         proxy.conf;
        }
        location /drminf {
            proxy_pass      http://resin0/drminf;
            include         proxy.conf;
        }

        #error_page 404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504 /50x.html;
        location = /50x.html {
            root   html;
        }

      }

原创粉丝点击