1. Nginx+Keepalived+Tomcat之动静分离的web集群  2012-02-06 15:23:07|  分类: nginx |  标签: |字号大中小 订阅 .  
  2.  
  3. 为小公司提供大概一天持续在100万/日之间访问的高性能、高可用、高并发访问及动静分离的web集群方案  
  4.  
  5. Nginx+Keepalived            高可用、反向代理  
  6. Nginx+PHP                   高并发、动态解析  
  7. Tomcat                      JSP 动态解析  
  8. Apache                      稳定的HTML静态访问  
  9. 一、整体介绍:  
  10. 1.架构图  
  11.  
  12.    
  13. 本文涉及的几个知识点:  
  14.  ①:Nginx  ②:FastCGI ③:Keepalived ④:tomcat ⑤:LAMP ⑥:Squid ⑦:memcache //后两个目前不涉及  
  15.  
  16.  
  17. 2.为什么要用 nginx  
  18.      Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的,它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;国内几个重要的视频分享网站也部署了Nginx,如六房间、酷6等。新近发现Nginx 技术在国内日趋火热,越来越多的网站开始部署Nginx。  
  19.  
  20.  
  21. 3.Nginx 发布   
  22. 当前开发版: Nginx 1.1.5 | Nginx/windows 1.1.5 (更新记录) (2011年10月6日)   
  23. 当前稳定版: Nginx 1.0.8 | Nginx/windows 1.0.8 (更新记录) (2011年10月1日)   
  24. 历史稳定版: Nginx 0.8.54 | Nginx/windows 0.8.55 (更新记录) (2011年7月19日)   
  25. 历史稳定版: Nginx 0.7.69 | Nginx/windows 0.7.69 (更新记录) (2011年7月19日)  
  26.  
  27.  
  28. 4.笔者谈Nginx  
  29.      Nginx有低内存占用,高性能高并发访问,使得很多新平台的搭建、旧应用的迁移开始应用nginx,话说nginx不得不说张宴,就像谈LVS不得不说章文嵩一样;  
  30.      张宴简历:  
  31.      张宴,就职于北京金山软件公司,金山游戏官方网站──逍遥网系统架构师,技术支持部平台组组长。曾在新浪网、赶集网等公司任系统工程师、系统架构师,工作内容主要涉及:服务器系统架构设计与部署、系统运维与调优、网络故障解决、网站后端以及接口类PHP程序开发、Unix开源软件二次开发、服务器监控系统开发、系统运维与平台研发团队管理。  
  32.    
  33. 5.学习Nginx用书  
  34.      一本《实战Nginx:取代Apache的高性能Web服务器》通俗易懂,不过有些读者看到后,即说起此书无非就是配置文件的讲解,我到反驳,道:nginx之所以这么强盛的应用,简单的配置文件和灵活的模块也是一大亮点,如果你能将部分模块应用好,那么你的web服务,将会在访问速度、服务器性能、硬件成本胜过了竞争对手;  
  35.  
  36.  
  37. 二、Nginx软件应用部署  
  38. 1.安装环境   
  39. 采用 五台Centos 5.4  kernel:2.6.18-164.el5xen Server、一台XP sp3 Client  
  40. IP地址分配:  
  41. 提供域名         www.abc.com  
  42. 解析地址         VIP:172.17.80.10  
  43. front1           内网IP 192.168.1.11  
  44. front2           内网IP 192.168.1.12  
  45.  
  46.  
  47.  
  48. WebServer集群:tomcat 192.168.1.17、20  nginx 192.168.1.18  apache 192.168.1.19   
  49.  
  50. 前端:Nginx 只做高可用和代理    
  51.  
  52. 后端:web集群有 nginx PHP 请求;tomcat 动态jsp .do文件;apache 静态html 等  
  53.  
  54.  
  55. 分析:nginx 静态访问比较好,apache+php作动态,此处只为说明LNMP架构的构建!  
  56.  
  57. 软件版本:  
  58.  nginx:       nginx-1.1.6.tar.gz           // 下载:www.nginx.org  
  59.  tomcat:      apache-tomcat-7.0.21.tar.gz  
  60.  JDK:         jdk-1_5_0_16-linux-i586.bin  
  61.  PHP:         php-5.3.8.tar.gz             //提供FastCGI   
  62.  apache:      httpd-2.2.3-31.el5          // yum install httpd php   
  63.    
  64. 2.安装部署 系统环境:   
  65. Centos 5.4 制作本地yum源  
  66. #mkdir /mnt/cdrom{1,2}  
  67. #mount /dev/cdrom /mnt/cdrom1  
  68. #cp -r /mnt/cdrom1/* /mnt/cdrom2  
  69. #cd /mnt/cdrom2  
  70. #rpm -ivh createrepo-0.4.11-3.el5.noarch.rpm   
  71. #createrepo  -g /mnt/cdrom/repodata/repomd.xml /mnt/cdrom/CentOS/  
  72. #vi /etc/yum.repos.d/server.repo  
  73. [CentOS]  
  74. name=CentOS 
  75. baseurl=file:///mnt/cdrom/CentOS  
  76. gpgcheck=0 
  77. enable=1 
  78. #yum -y install gcc openssl-devel zlib-devel pcre-devel  
  79. #yum -y install gcc gcc-c++ autoconf automake         //安装编译gcc环境  
  80.  
  81.  
  82. 3.nginx的安装  
  83. #tar zxvf  nginx-1.1.6.tar.gz  
  84. #cd nginx-1.1.6  
  85. #useradd -s /sbin/nologin -M nginx                        //添加nginx 用户,没有登录shell,没有家目录  
  86. #./configure \   
  87.   --prefix=/usr/local/nginx \                             //安装路径  
  88.   --sbin-path=/usr/sbin/nginx \                           //可执行文件路径  
  89.   --conf-path=/etc/nginx/nginx.conf \                //默认为<prefix>/conf/nginx.conf 最好定义到/etc下  
  90.   --pid-path=/var/run/nginx/nginx.pid  \                  //pid文件存放位置,后面将会用到  
  91.   --error-log-path=/var/log/nginx/error.log \             //错误日志文件,默认为<prefix>/logs/error.log  
  92.   --http-log-path=/var/log/nginx/access.log \             //访问日志,默认为<prefix>/logs/access.log  
  93.   --lock-path=/var/lock/nginx.lock \             
  94.   --user=nginx \  
  95.   --group=nginx \   
  96.   --with-http_stub_status_module \                        //以取得一些nginx的运行状态  
  97.   --with-http_ssl_module \                                //支持https加密连接  
  98.   --with-http_gzip_static_module \                        //静态缓存模块  
  99.   --with-http_realip_module  \                            //让Nginx透明获取客户端IP  
  100.   --http-client-body-temp-path=/var/tmp/nginx/client/ \   //指定http客户端请求缓存文件存放目录  
  101.   --http-proxy-temp-path=/var/tmp/nginx/proxy/ \          //指定http反向代理缓存文件存放目录  
  102.   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/           //指定FastCGI缓存文件存放目录  
  103. #make && make install                                     //安装nginx  
  104.  
  105.  
  106. 4.编写SystemV风格的启动脚本  
  107. #vim /etc/init.d/nginxd  
  108. ############################################  
  109. #!/bin/bash  
  110. #BY hanfeng  
  111. #datetime 20111031  
  112. . /etc/rc.d/init.d/functions  
  113. # Source networking configuration.  
  114. . /etc/sysconfig/network  
  115. # Check that networking is up.  
  116. [ "$NETWORKING" = "no" ] && exit 0  
  117. nginx="/usr/sbin/nginx" 
  118. prog=$(basename $nginx)  
  119. NGINX_CONF_FILE="/etc/nginx/nginx.conf" 
  120. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx  
  121. lockfile=/var/lock/subsys/nginx  
  122. make_dirs() {  
  123.    # make required directories  
  124.    user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`  
  125.    options=`$nginx -V 2>&1 | grep 'configure arguments:'`  
  126.    for opt in $options; do  
  127.        if [ `echo $opt | grep '.*-temp-path'` ]; then  
  128.            value=`echo $opt | cut -d "=" -f 2`  
  129.            if [ ! -d "$value" ]; then  
  130.                # echo "creating" $value  
  131.                mkdir -p $value && chown -R $user $value  
  132.            fi  
  133.        fi  
  134.    done  
  135. }  
  136. start() {  
  137.     [ -x $nginx ] || exit 5  
  138.     [ -f $NGINX_CONF_FILE ] || exit 6  
  139.     make_dirs  
  140.     echo -n $"Starting $prog: "  
  141.     daemon $nginx -c $NGINX_CONF_FILE  
  142.     retval=$?  
  143.     echo  
  144.     [ $retval -eq 0 ] && touch $lockfile  
  145.     return $retval  
  146. }  
  147. stop() {  
  148.     echo -n $"Stopping $prog: "  
  149.     killproc $prog -QUIT  
  150.     retval=$?  
  151.     echo  
  152.     [ $retval -eq 0 ] && rm -f $lockfile  
  153.     return $retval  
  154. }  
  155. restart() {  
  156.     configtest || return $?  
  157.     stop  
  158.     sleep 1  
  159.     start  
  160. }  
  161. reload() {  
  162.     configtest || return $?  
  163.     echo -n $"Reloading $prog: "  
  164.     killproc $nginx -HUP  
  165.     RETVAL=$?  
  166.     echo  
  167. }  
  168. force_reload() {  
  169.     restart  
  170. }  
  171. configtest() {  
  172.   $nginx -t -c $NGINX_CONF_FILE  
  173. }  
  174. rh_status() {  
  175.     status $prog  
  176. }  
  177. rh_status_q() {  
  178.     rh_status >/dev/null 2>&1  
  179. }  
  180. case "$1" in  
  181.     start)  
  182.         rh_status_q && exit 0  
  183.         $1  
  184.         ;;  
  185.     stop)  
  186.         rh_status_q || exit 0  
  187.         $1  
  188.         ;;  
  189.     restart|configtest)  
  190.         $1  
  191.         ;;  
  192.     reload)  
  193.         rh_status_q || exit 7  
  194.         $1  
  195.         ;;  
  196.     force-reload)  
  197.         force_reload  
  198.         ;;  
  199.     status)  
  200.         rh_status  
  201.         ;;  
  202.     condrestart|try-restart)  
  203.         rh_status_q || exit 0  
  204.             ;;  
  205.     *)  
  206.         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"  
  207.         exit 2  
  208. esac  
  209. ############################################  
  210.  
  211. 保存nginxd脚本,赋予执行权限,添加服务和开机启动  
  212. #chmod +x /etc/init.d/nginxd  
  213. #chkconfig --add nginxd  
  214. // 如果不支持,则添加一下2行即可  
  215. // # chkconfig: - 85 15                #为必须字符  
  216. // # description: nginx is a World Wide Web server. It is used to serve  
  217. #chkconfig --level 2345 nginxd on          
  218.               
  219. #service nginxd start               //先启动nginx 看看,没问题的话就OK了  
  220. Starting nginx: [  OK  ]  
  221. 5.在Client上访问front1上的nginx   
  222. http://172.17.80.11  
  223.  
  224.  
  225.  6.将 front1上的nginx scp到front2上,并同样部署并在安装后将nginx.conf文件对拷  
  226. #scp nginx-1.1.6.tar.gz [email protected]:/root  
  227. #scp /etc/nginx/nginx.conf [email protected]:/etc/nginx/nginx.conf  
  228.  
  229.  
  230. 三、nginx的动静分离和负载均衡  
  231. 1.在front1 、front2 配置  
  232. A:动静分离说明:  
  233.    有前置nginx 做反向代理,采用nginx的location做动静分离,将静态HTML网页、图片、JS、CSS等使用后端nginx或apache处理,以便得到更快的速度;将.jsp、.jspx、.do等交给后端tomcat来处理,  
  234. 从而实现动静分离的应用;  
  235. B:负载均衡的说明:  
  236.    此处采用nginx的proxy_pass将location做动静分离后的jsp、do等jsp程序文件分发到后端upstreamd模块中tomcat集群上,rewrite做正则分发,此时也将应用到nginx经典之处的IP哈希(ip_hash)模块,这样每个访客固定访问一个后端web服务器,可以解决session的问题;  
  237.  
  238. 2.分别在front1和front2上配置nginx动静分离和负载均衡  
  239. #vi /etc/nginx/nginx.conf  
  240. ############################################  
  241. user  nginx nginx;  
  242. worker_processes  4;  
  243. events {  
  244.     worker_connections  1024;  
  245. }  
  246. http {  
  247.     include       mime.types;  
  248.     default_type  application/octet-stream;  
  249.     sendfile        on;  
  250.     keepalive_timeout  65;  
  251.     gzip  on;  
  252. upstream tomcat_server {  
  253. #        ip_hash;  
  254.         server 192.168.1.17 weight=2;  
  255.         server 192.168.1.20 max_fails=2 fail_timeout=30s;  
  256.     }  
  257. upstream apache_server {  
  258.         ip_hash;  
  259.         server 192.168.1.19;  
  260.     }  
  261. upstream nginx_server {  
  262.         ip_hash;  
  263.        server 192.168.1.18;  
  264.     }  
  265.      server  
  266.      {  
  267.         listen       80;  
  268.         server_name  www.abc.com;  
  269.         location / {  
  270.             index  index.html index.php index.htm index.jsp index.do default.do;  
  271.             root   html;  
  272.         if (-d $request_filename)  
  273. ###############################################  
  274.           {  
  275.              rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;  
  276.           }  
  277.        location ~ \.(jsp|jspx|do)?$ {  
  278.            proxy_set_header Host %host;  
  279.            proxy_set_header X-Forwarded-For $remote_addr;  
  280.            proxy_pass http://tomcat_server;  
  281.          }  
  282. ###############################################  
  283.        location ~ \.(php|php5)?$ {  
  284.            proxy_set_header Host %host;  
  285.            proxy_set_header X-Forwarded-For $remote_addr;  
  286.            proxy_pass   http://nginx_server;  
  287.          }  
  288. #############################################  
  289.        location ~ \.(html|htm)?$ {  
  290.            proxy_set_header Host %host;  
  291.            proxy_set_header X-Forwarded-For $remote_addr;  
  292.            proxy_pass http://apache_server;  
  293.          }  
  294. #############################################  
  295.        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {  
  296.            expires      30d;  
  297.           }  
  298.         location ~ .*\.(js|css)?$ {  
  299.             expires      1h;  
  300.           }  
  301. #############################################  
  302.          }  
  303.         error_page  404              /404.html;  
  304.         error_page   500 502 503 504  /50x.html;  
  305.         location = /50x.html {  
  306.             root   html;  
  307.         }  
  308.     }  
  309. }  
  310. ############################################  
  311. 3.重启nginx服务  
  312. #service nginxd restart  
  313. Shutting down interface eth0:  [  OK  ]  
  314. Shutting down interface eth1:  [  OK  ]  
  315. Shutting down loopback interface:  [  OK  ]  
  316. Bringing up loopback interface:  [  OK  ]  
  317. Bringing up interface eth0:  [  OK  ]  
  318. Bringing up interface eth1:  [  OK  ]  
  319.  
  320.  
  321.  
  322.  
  323. 四、接下来配置高可用组建keepalived  
  324. 1.为什么使用keepalived  
  325. 软件官网:http://www.keepalived.org  
  326. 软件获得:#wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz  
  327.        keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,  
  328. Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。  
  329. keepalived和heartbeat的广泛应用足以说明了两者估计是因为本质不同而已!  
  330.  
  331.  
  332. 2.分别在front1和front2部署keepalived需要却分主从关系  
  333. #vim /etc/hosts                           //修改front1 和front2 的hosts文件,保证文件信息相同  
  334. 172.17.80.11 front1.ha.com front1  
  335. 172.17.80.12 front2.ha.com front2  
  336.  
  337. 3.编译安装keepalived  
  338. #tar zxvf keepalived-1.2.2.tar.gz  
  339. #cd keepalived-1.2.2  
  340. #./configure --prefix=/usr/local/keepalived  
  341. #make && make install   
  342.  
  343. 4.修改Keepalived配置文件  
  344. #mkdir /etc/keepalived  
  345. #cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf  
  346. #cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/  
  347. #cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/  
  348. #cp /usr/local/keepalived/sbin/keepalived /usr/sbin/   
  349. #chkconfig --level 2345 keepalived on  
  350. ############################################  
  351. @front1上的keepalived.conf  
  352. #vim /etc/keepalived/keepalived.conf  
  353. ! Configuration File for keepalived  
  354. global_defs {  
  355.    notification_email {  
  356.   [email protected]  
  357.  }  
  358.    notification_email_from [email protected]  
  359.    smtp_server 127.0.0.1  
  360.    smtp_connect_timeout 30  
  361.    router_id LVS_DEVEL  
  362. }  
  363. vrrp_instance VI_1 {  
  364.     state MASTER  
  365.     interface eth1  
  366.     virtual_router_id 51  
  367.     mcast_src_ip 192.168.1.11  
  368.     priority 200  
  369.     advert_int 1  
  370.     authentication {  
  371.         auth_type PASS  
  372.         auth_pass 1111  
  373.     }  
  374. virtual_ipaddress {  
  375.         172.17.80.10  
  376.     }  
  377. }  
  378. ############################################  
  379. @front2上的keepalived.conf  
  380. ! Configuration File for keepalived  
  381. global_defs {  
  382.    notification_email {  
  383.      [email protected]  
  384.    }  
  385.    notification_email_from [email protected]  
  386.    smtp_server 127.0.0.1  
  387.    smtp_connect_timeout 30  
  388.    router_id LVS_DEVEL  
  389. }  
  390. vrrp_instance VI_1 {  
  391.     state BACKUP  
  392.     interface eth1  
  393.     virtual_router_id 51  
  394.     mcast_src_ip 192.168.1.12  
  395.     priority 100  
  396.     advert_int 1  
  397.     authentication {  
  398.         auth_type PASS  
  399.         auth_pass 1111  
  400.     }  
  401.  
  402. virtual_ipaddress {  
  403.         172.17.80.10  
  404.     }  
  405. }  
  406. ############################################  
  407. #service keepalived start             //启动keepalived,如果没有错误高可用到此配置完成  
  408.  
  409.  附加一个keepalived配置,此配置添加了一个脚本用来检查机子的nginx是否正常的运行
  410. vrrp_script chk_http_port {
    script "/opt/nginx_pid.sh"
    interval 2
    weight 2
    }
    vrrp_instance VI_1 {
    state BACKUP ### 设置为 辅机
    interface eth0
    virtual_router_id 51 ### 与 MASTRE 设置 值一样
    priority 100 ### 比 MASTRE权重值 低
    authentication {
    auth_type PASS
    auth_pass eric ### 密码 与 MASTRE 一样
    }
    track_script {
    chk_http_port
    }
    virtual_ipaddress {
    192.168.6.7
    }
    }
  411.  
  412. 这是检查nginx进程的脚本
    vim /opt/nginx_pid.sh
    #!/bin/bash
    # varsion 0.0.2
    # 根据一网友说这样做不科学,如果nginx服务起来了,但是我把keepalived 杀掉了,我的理由是,如果nginx死掉了,我觉得就很难在起来,再有就是nagios 当然要给你报警了啊。不过这位同学说的有道理,所以就稍加改了一下脚本
    A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx进程 把值赋给变量A
    if [ $A -eq 0 ];then ## 如果没有进程值得为 零
    /usr/local/nginx/sbin/nginx
    sleep 3
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
    killall keepalived ## 则结束 keepalived 进程
    fi
    fi
  1.  
  2. 五、重量级web集群资源  
  3. 1.安装WebServer之Nginx+PHP  
  4. 配置服务器IP为:192.168.1.18  
  5. 在nginx的基础上安装FastCGIのPHP 使其支持动态PHP请求  
  6. 说明:此处为  yum install mysql-devel mysql-server php-mysql perl-DBD-MySQL libxml2-devel libart_lgpl libart_lgpl-devel 简单安装mysql  
  7. 安装后的PHP为nginx提供php-fpm  
  8. ①:libevent 事件触发网络库  
  9. libevent-2.0.15-stable.tar.gz   
  10. #tar zxvf libevent-2.0.15-stable.tar.gz   
  11. #cd libevent-2.0.15-stable  
  12. #./configure && make && make install  
  13. ②:libiconv字符编码转换  
  14. libconv-1.13.1.tar.gz  
  15. #tar zxvf  libconv-1.13.1.tar.gz  
  16. #cd libconv-1.13.1  
  17. #./configure && make && make install  
  18. ③:FastCGIのPHP   
  19. php-5.3.8.tar.gz  
  20. #tar zxvf php-5.3.8.tar.gz  
  21. #cd php-5.3.8  
  22. #./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-openssl --enable-fpm  --with-libevent-dir=/usr/local/lib --  
  23. enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-iconv-dir=/usr/local  
  24. @ 你将会看到:Thank you for using PHP  
  25. @error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory  
  26. #ln -s /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2        //做个连接防止make时缺少libiconv.so.2  
  27. #ln -s /usr/local/lib/libiconv.so.2 /usr/local/libiconv.so.2  
  28. #make ZEND_EXTRA_LIBS='-liconv'   
  29. @说明:make的时候加参数ZEND_EXTRA_LIBS='-liconv'是因为编译时需要iconv库, 但是configure的时候没有写到Makefile中, 还有一种方法是直接修改Makefile, 在链接库的地方(应该在100行左右)加  
  30. 上-liconv;或者sed -i 's#-lz -lm -lxml2 -lz -lm -lxml2 -lz -lm -lcrypt#& -liconv#' Makefile;  
  31. @久等之后将会看到:Build complete. Don't forget to run 'make test'. 不等test了,直接make install 安装  
  32. #make install   
  33. #cp php-5.3.8/php.ini-production /usr/local/php/etc/php.ini  
  34. ④接下来配置PHP及其他文件  
  35. #cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf  
  36. #vi /usr/local/php/etc/php-fpm.conf  
  37. @开启以下几项  
  38. pm.max_children = 50 
  39. pm.start_servers = 20 
  40. pm.min_spare_servers = 5 
  41. pm.max_spare_servers = 35 
  42. ⑤在后台启动 php-fpm,并ps查看进程运行情况  
  43. #/usr/local/php/sbin/php-fpm &  
  44. #ps -ef |grep php-fpm  
  45. @将其添加到开机自动启动  
  46. #echo "/usr/local/php/sbin/php-fpm &" >> /etc/rc.d/rc.local  
  47. ⑥.接下来在nginx中配置fastcgi_params 文件  
  48. #vi /etc/nginx/fastcgi.conf  
  49. @将里面内容替换为  
  50. fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;  
  51. fastcgi_param  SERVER_SOFTWARE    nginx;  
  52. fastcgi_param  QUERY_STRING       $query_string;  
  53. fastcgi_param  REQUEST_METHOD     $request_method;  
  54. fastcgi_param  CONTENT_TYPE       $content_type;  
  55. fastcgi_param  CONTENT_LENGTH     $content_length;  
  56. fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;  
  57. fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;  
  58. fastcgi_param  REQUEST_URI        $request_uri;  
  59. fastcgi_param  DOCUMENT_URI       $document_uri;  
  60. fastcgi_param  DOCUMENT_ROOT      $document_root;  
  61. fastcgi_param  SERVER_PROTOCOL    $server_protocol;  
  62. fastcgi_param  REMOTE_ADDR        $remote_addr;  
  63. fastcgi_param  REMOTE_PORT        $remote_port;  
  64. fastcgi_param  SERVER_ADDR        $server_addr;  
  65. fastcgi_param  SERVER_PORT        $server_port;  
  66. fastcgi_param  SERVER_NAME        $server_name;  
  67. # PHP only, required if PHP was built with --enable-force-cgi-redirect  
  68. fastcgi_param  REDIRECT_STATUS    200;  
  69.  
  70.  
  71.  
  72. #vi /etc/ngnix/nginx.conf  
  73.  
  74. #####  
  75. location ~ \.php$ {  
  76.             root           /www;  
  77.             fastcgi_pass   127.0.0.1:9000;  
  78.             fastcgi_index  index.php;  
  79.             fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  80.             include        fastcgi_params;  
  81.         }  
  82. #####  
  83. location / {  
  84.             root   /html;  
  85.             index  index.php index.html index.htm;  
  86.         }  
  87. ##################################  
  88.  
  89. #vi /usr/local/nginx/index.php  
  90.  
  91. php 
  92. $link=mysql_connect("localhost","root","123456");  
  93. if(!$link) echo "FAILD!";  
  94. else echo "OK!";  
  95. phpinfo();  
  96. ?> 
  97.  
  98. #service nginxd restart  
  99. @优化linux内核参数:  
  100. #vi /etc/sysctl.conf                  // 增加一下内容,并是修改生效  
  101. net.ipv4.tcp_max_syn_backlog = 65536 
  102. net.core.netdev_max_backlog = 32768 
  103. net.core.somaxconn = 32768 
  104. net.core.wmem_default = 8388608 
  105. net.core.rmem_default = 8388608 
  106. net.core.rmem_max = 16777216 
  107. net.core.wmem_max = 16777216 
  108. net.ipv4.tcp_timestamps = 0 
  109. net.ipv4.tcp_synack_retries = 2 
  110. net.ipv4.tcp_syn_retries = 2 
  111. net.ipv4.tcp_tw_recycle = 1 
  112. net.ipv4.tcp_tw.reuse = 1 
  113. net.ipv4.tcp_mem = 94500000 915000000 927000000  
  114. net.ipv4.tcp_max_orphans = 3276800 
  115. net.ipv4.ip_local_port_range = 1024 65535  
  116.  
  117.  
  118. #sysctl -p                           //使其及时生效  
  119. ##################################  
  120.  
  121.  
  122. 问题处理:phpinfo 页面date的解析显示乱码!  
  123.  Warning: phpinfo() [function.phpinfo]:。。。。。。。。。  
  124. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in /usr/local/nginx/html/index.php on line 8  
  125. 解析:以下是三种方法(任选一种都行):  
  126. a、在页头使用date_default_timezone_set()设置 date_default_timezone_set('PRC'); //东八时区 echo date('Y-m-d H:i:s');  
  127. b、在页头使用 ini_set('date.timezone','Asia/Shanghai');  
  128. c、修改php.ini。打开php.ini查找date.timezone 去掉前面的分号修改成为:date.timezone =PRC 
  129. 重启http服务(如apache2或iis等)即可。   
  130. XXX可以任意正确的值。在我国内:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木齐)港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北),新加坡:Asia/Singapore,PRC可以。  
  131. ===================================   
  132.  
  133.  
  134.  
  135.  
  136. 2.安装WebServer之tomcat+JDK 使其支持动态jsp程序和.do文件  
  137. 配置服务器IP地址为:192.168.1.17/20  
  138. ①:JDK的安装和部署  
  139. #chmod +x jdk-1_5_0_16-linux-i586.bin  
  140. #./jdk-1_5_0_16-linux-i586.bin  
  141. #mv jdk1.5.0_16 /usr/local/jdk1.5.0_16  
  142. #vi .bash_profile                     //修改环境变量文件,增加一下内容  
  143. JAVA_HOME="/usr/local/jdk1.5.0_16" 
  144. CLASS_PATH="$JAVA_HOME/bin" 
  145. CATALINA_HOME="/usr/local/tomcat-6.0.18" 
  146. export JAVA_HOME CATALINA_HOME  
  147. #source .bash_profile                 //使修改的环境变量生效  
  148. #tar zxvf apache-tomcat-6.0.18.tar.gz  
  149. #mv apache-tomcat-6.0.18 /usr/local/tomcat-6.0.18  
  150. #cd /usr/local/tomcat-6.0.18/bin  
  151. #./startup.sh                          
  152. #ps -ef |grep java     //启动tomcat,如果JDK版本支持且环境变量正确的话,此时你的tomcat已经成功了!  
  153.  
  154.  
  155.  
  156.  
  157. 3.安装WebServer之Apache 使其能够很好提供HTML等静态访问请求!  
  158. 说明:此处的Apache 作为WebServer 只要yum 安装即可!你也可以编译安装并且组成LAMP架构!笔者不多说了。。。  
  159.  
  160.  
  161.  
  162.  
  163. 六、测试。。。  
  164. 测试环境准备  
  165. 1.将测试域名www.abc.com解析到前置机front1、front2的虚拟(virtual)IP上!   
  166. 在XP客户端使用浏览器http://www.abc.com/index.*测试首页测试        
  167.  
  168.  
  169. 2.测试要求  
  170. 测试页面分别针对前置机nginx的动静分离和到tomcat上负载均衡  
  171. 3.分别在对应的WebServer 上制作测试页面,并用不同IE在客户端测试  
  172. ①:index.html  
  173. This is a html test page, the server address is 192.168.1.19  
  174. ②:index.php  
  175. This is a php test page, the server address is 192.168.1.18  
  176. ③:index.jsp 和index.do  只做测试页面,不做具体动态程序  
  177. This is a jsp test page, the server address is 192.168.1.17/20  
  178. This is a do test page, the server address is 192.168.1.17/20  
  179. 4.测试故障  
  180. 此时在客户机上ping www.abc.com -t 并将front1 的eth1 给ifdown掉!观察至丢失了一个数据包即恢复了域名到服务器的访问!  
  181. 5.在linux 使用ab命令,对前置front1、front2做简单的压力测试!  
  182. #ab -c 1000 -n 100000 http://www.abc.com/index.*测试页  
  183.  
  184. 至此一篇基于nginx的高可用、高性能、高并发访问的动静分离的web集群方案出炉!谢谢查阅  
  185. 提供技术支持,hanfeng#qq.com   //请将#改为