Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。
Nginx 的中文维基:
在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果,Nginx 0.5.31 + PHP 5.2.4 (FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。
Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx 作为 Web 服务器的网站也越来越多,其中包括新浪博客、新浪播客、网易新闻、腾讯网、搜狐博客等门户网站频道,六间房、56.com等视频分享网站,discuz!官方论坛、水木社区等知名论坛,盛大在线、金山逍遥网等网络游戏网站,豆瓣、人人网、YUPOO相册、金山爱词霸、迅雷在线等新兴Web 2.0网站。
在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果,Nginx 0.8.46 + PHP 5.2.14 (FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。
根据我的经验,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留1GB的内存。我曾经就有两台Apache服务器,因为在配置文件中设置的MaxClients为4000,当Apache并发连接数达到3800时,导致服务器内存和Swap空间用满而崩溃。
而这台 Nginx 0.8.46 + PHP 5.2.14 (FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。
在3万并发连接下,访问Nginx 0.8.46 + PHP 5.2.14 (FastCGI) 服务器的PHP程序,仍然速度飞快。下图为Nginx的状态监控页面,显示的活动连接数为28457(关于Nginx的监控页配置,会在本文接下来所给出的Nginx配置文件中写明):
<img title="Nginx反向代理+DNS轮询+iis7.5 千万PV 百万IP 双线 网站架构案例" alt="Nginx反向代理+DNS轮询+IIS7.5 千万PV 百万IP 双线 网站架构案例" class=insertimage>1:远程登陆巨慢无比
2:远程登陆系统后无法操作,表现为鼠标移动缓慢,操作延时,系统呆滞.
3:CPU长期在80%以上,内存消耗极高
4:....
经过部门讨论后决定采用Nginx反向代理的架构替代目前不堪重负的站点.拓扑图如下
<img title="Nginx反向代理+DNS轮询+IIS7.5 千万PV 百万IP 双线 网站架构案例" alt="Nginx反向代理+DNS轮询+IIS7.5 千万PV 百万IP 双线 网站架构案例" class=insertimage>
#修改系统源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget
cp CentOS5-Base-163.repo /etc/yum.repos.d/
#yum 升级安装,根据需求自己行删除
yum install -y lrzsz gcc gcc-c++ make flex autoconf automake vixie-cron 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 kernel-devel wget patch ntp libevent m4 zip unzip gd gd-devel file libtool-libs gmp-devel pspell-devel mod_perl-devel parted apr-util readline-devel sysstat vim* popt-devel patch openssh-clients net-snmp net-snmp-devel net-snmp-utils net-snmp-libs
#设置ssh下 SecureCRT标签显示为帐号@IP
touch /etc/sysconfig/bash-prompt-xterm
vim /etc/sysconfig/bash-prompt-xterm
#添加以下一行
echo -ne "e]2;${USER}@$(/sbin/ifconfig eth0|grep 'inet addr'|sed -e 's/^.*inet addr:(.*) Bcast.*$/1/')a"
#设置term类型是screen时(命令screen进入新窗口时)标签显示内容, 和xterm一样
cp /etc/sysconfig/bash-prompt-xterm /etc/sysconfig/bash-prompt-screen
#设置term类型不是xterm和screen时标签显示内容, 也和xterm一样
cp /etc/sysconfig/bash-prompt-xterm /etc/sysconfig/bash-prompt-default
#给予可执行权限
chmod +x /etc/sysconfig/bash-prompt-*
#修改文件句柄数为65535,默认系统为1024
echo "session required /lib64/security/pam_limits.so" >>/etc/pam.d/login
echo -ne "
* soft nofile 65534
* hard nofile 65534
" >>/etc/security/limits.conf
#添加iptables
rm -rf /etc/sysconfig/iptables
touch /etc/sysconfig/iptables
cat > /etc/sysconfig/iptables
此段加入你的iptables规则
EOF
service iptables restart
#根据硬件优化Linux性能
cat > /etc/sysctl.conf
# Add
#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理
net.ipv4.tcp_syncookies = 1
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 65536
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 30
#当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时
net.ipv4.tcp_keepalive_time = 1200
#redis设置
net.core.somaxconn = 262144
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
#参数的值决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_synack_retries = 2
#在内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_syn_retries = 2
#启用timewAIt快速回收
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 3276800
#允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65535
#增加系统文件描述符限制
fs.file-max = 65535
#允许更多的PIDs (减少滚动翻转问题); may break some programs 32768
kernel.pid_max = 65536
# 增加TCP最大缓冲区大小
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.all.send_redirects = 0
#2012-8-30
#net.ipv4.ip_conntrack_max=1048576
#net.ipv4.netfilter.ip_conntrack_max=1048576
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120
net.ipv4.neigh.default.gc_thresh1=10240
net.ipv4.neigh.default.gc_thresh2=40960
net.ipv4.neigh.default.gc_thresh3=81920
#timewait的数量
net.ipv4.tcp_max_tw_buckets =6000
EOF
#刷新sysctl.conf
复制代码 代码如下:
/sbin/sysctl -p
#禁用ipv6
复制代码 代码如下:
echo -ne "alias net-pf-10 offnoptions ipv6 disable=1" >>/etc/modprobe.conf
/sbin/chkconfig --level 35 ip6tables off
#关闭 selinux
复制代码 代码如下:
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
#将同步好的时间写到CMOS里
复制代码 代码如下:
sed -i 's#SYNC_HWCLOCK=no#SYNC_HWCLOCK=yes#' /etc/sysconfig/ntpd
#设置同步时间
复制代码 代码如下:
echo "0 6 * * * /usr/sbin/ntpdate 192.168.0.172;/sbin/hwclock -w; >/dev/null 2>&1" >>/var/spool/cron/root
service crond restart
#修改系统启动级别
复制代码 代码如下:
sed -i 's/id:5:initdefault:/id:3:initdefault:/g' /etc/inittab
#禁止ctrl+alt+del
复制代码 代码如下: |