[转]日均百万PV网站解决方案

来源:互联网 发布:java入门基础书籍 编辑:程序博客网 时间:2024/04/28 12:27

项目需求:
现在基本环境:
日均百万PV的导航站,静态页面,服务器环境IIS,配合10M CDN,实际上经常超出至18M左右,因此费用也不低,并且CDN节点有时会出问题,还需要每次的更改后刷新CDN,不太方便。
改造后期望:
配置独立服务器,升级带宽,更改环境以支持PHP的程序,实现本地化的广告投放功能,以扩展自有化。

具体实现:
下面将记录实现过程的点滴,期间得益于互联网上许多资料的帮助,在此一并表示感谢。此文章力争做到细致,清晰,希望对后来者起到一定帮助作用。

一,服务器方面
1,服务器选择
根据项目所需,具体业务情况,选择为CPU较高,内存一般,硬盘一般,主板较好,较稳定的1U服务器,最后定为DELL R410。
2,服务器基本环境
Centos+apache+php+mysql
3,开始安装,选择F11进入启动选择,选择2 SATA OPTICAL启动模式,即为从光驱启动,提示找不到光盘,可以重新放置,调整位置,一般均为不能正确读盘造成。
4,安装完毕后,发现网卡工作不正常,驱动没有正常安装,查找网上文章,下载最新BCM5716驱动,安装均未能成功,怀疑是LINUX内核版本问题。
5,centos5.2—>centos5.4后安装完毕,网卡装上,但不稳定,是因为固件支持文件所引起
yum upgrade 升级内核及一切必要升级的组件,保证环境为最新
下载dell最新补丁,并安装,过程中可能需要其它组件支持,均使用yum安装即可
wget http://ftp.us.dell.com/network/NETW_FRMW_LX_R239524.BIN
 chmod +x NETW_FRMW_LX_R239524.BIN
 ./NETW_FRMW_LX_R239524.BIN
注意过程的完整性,完毕后,重启,设置IP,工作正常。

二,软环境方面

1,基本环境实现
具体安装配置请参考,配置服务器环境那篇文章
2,转移项目,使用了SVN,配置项目环境,smarty,adodb,建立MVC工作模式,具体参考之前文章

三,测试方面

为了实现项目需求,此部分也是重点部分,过程中碰到一些问题,也累积了一些经验。
1,安装 webbench进行压力测试
首先下载tar包
 tar -zxvf webbench-1.5.tar.gz
 cd webbench-1.5
 make && make install
 webbench –help
webbench [option]… URL
  -f|–force               Don’t wait for reply from server.
  -r|–reload              Send reload request - Pragma: no-cache.
  -t|–time           Run benchmark for seconds. Default 30.
  -p|–proxy Use proxy server for request.
  -c|–clients          Run HTTP clients at once. Default one.
  -9|–http09              Use HTTP/0.9 style requests.
  -1|–http10              Use HTTP/1.0 protocol.
  -2|–http11              Use HTTP/1.1 protocol.
  –get                    Use GET request method.
  –head                   Use HEAD request method.
  –options                Use OPTIONS request method.
  –trace                  Use TRACE request method.
  -?|-h|–help             This information.
  -V|–version             Display program version.
具体方法:
webbench -c 3000 -t 60 http://localhost/index.html
60秒内3000个访问,此时可以用IE访问该链接,看看是否速度正常。。

2,apache测试
经测试,在压力情况下,并不能很好支持服务,于是修改了最大连接数
查看当前的连接数可以用:
ps aux | grep httpd | wc -l

或:
pgrep httpd|wc -l控制最大连接数的MaxClients ,因此可以尝试配置为:
<IfModule mpm_prefork_module>
                StartServers                      5
                MinSpareServers                   5
                MaxSpareServers                  10
                ServerLimit                    5500
                MaxClients                     5000
                MaxRequestsPerChild               100
</IfModule>
注意:MaxClients默认最大为250,若要超过这个值就要显式设置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重启httpd时会有提示。  

经以上修改后,重启服务,上线后,稍一会就打不开了,apache在多用户并发的情况下处理的并不理想。

3,更改环境nginx提供WEB服务
由于centos没有默认的nginx软件包,需要启用REHL的附件包

 rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
yum -y install nginx  
设置开机启动
chkconfig nginx on
安装spawn-fcgi来运行php-cgi

yum install spawn-fcgi
下载spawn-fcgi 的启动脚本
wget http://bash.cyberciti.biz/dl/419.sh.zip
unzip 419.sh.zip
mv 419.sh /etc/init.d/php_cgi
chmod +x /etc/init.d/php_cgi
启动php_cgi
/etc/init.d/php_cgi start
查看进程
netstat -tulpn | grep :9000
若出现如下代表一切正常
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 4352/php-cgi

然后要配置php.ini
去掉;使之生效
cgi.fix_pathinfo=1
加上;
; doc_root =

 
也可单独安装nginx0.8.15
yum -y install gcc gcc-c++ autoconf 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 openldap openldap-devel nss_ldap openldap-clients openldap-servers
tar zxvf nginx-0.8.15.tar.gz
cd nginx-0.8.15/
./configure –user=www –group=www –prefix=/usr/local/webserver/nginx –with-http_stub_status_module –with-http_ssl_module
make && make install
cd ../

 
rc.local里加入

/usr/local/webserver/nginx/sbin/nginx

开机自启动服务
可用

ps -ef | grep “nginx: master process” | grep -v “grep” | awk -F ‘ ‘ ‘{print $2}’

查看当前nginx进程情况,我是装了两个,如果都起来,则有两个pid进程,要确定哪个是0.8.15的,然后做完修改好
要重启生效

kill -HUP 12996
配置虚机
server {
        listen       81;
      
        server_name  www.abc.com;
 root   /work/site/www/abc/docs;
#如下必须加上index.php否则有可能出现403forbidden错误
            index  index.html index.htm index.php;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

        location ~ /.php$ {
        
 #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
#如下 必须加上这一行,是指定script_filename, 否则有可能返回404没有找到的错误
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
#fastcgi_params文件不用修改
      include fastcgi_params;
        }
    }

同时可配置error页面。
配置status状态监测页面
server
  {
    listen  80;
    server_name  status.abc.com;
 location / {
    stub_status on;
    access_log   off;
    }
  }

解决500错误
vi /etc/nginx/nginx.conf
events {
    worker_connections  1024;
}
调整为
events {
    worker_connections  10240;
}

cat /proc/sys/fs/file-max

 ulimit -n 改为上面的大数

vi /etc/profile
添加
ulimit -HSn 大数

source /etc/profile

 
配置完成后,要kill -HUP 11223重启nginx,访问php正常。。。也可以同在0.6.39中配置,一样通过81也正常,别忘了更改selinux端口生效。

为了开机自启动NGINX相关的服务必须在rc.d/rc.local中加入:

ulimit -n 163672
/etc/init.d/php_cgi start
/usr/local/webserver/nginx/sbin/nginx
注意先后顺序,否则可能出现502网关错误或500打为开错误。

 

 

ls -l查看文件 所属
给nginx开通session的管理权限,很重要,使PHP中应用的SESSION能够起作用
默认安装的nginx通过make就会有一个nginx的用户,要给它加上使用session的权限
chown -R nginx /var/lib/php/session
这样就可以在nginx中结合php使用session了,至此,原在apache中运行的项目就移植到nginx中了,同时80,81,82均正常,对外使用80,通过status查看
Active connections: 7658
连接数在7000多时,正常访问!!!
当然为了本地化的实现,是用php分析地区来源然后跳到对应地区页面上,在框架里,所以前端访问还是域名。

四,总结补充

综上,基本可以配置出支持日均百万PV的网站架构。过程中可能有不详细的地方,稍后不断补充,丰富。
开通vsftp
1,创建用户
useradd bjh2o -d /work/site/bjh2o.com -m
2,设置密码
passwd bjh2o
XXX
3,修改/etc/vsftpd/chroot_list
加入bjh2o

给bjh2o这个ftp用户操作相应目录的权限
chown -R bjh2o /work/site/bjh2o.com

4,配置站点http.conf

5,重启web,vsftpd服务

 

转自:http://blog.atcns.com/blog/?p=184 作者:程式飞扬