Linux下安装与配置基于nginx的tomcat负载均衡和集群(通过cookie分发请求)

Linux下安装与配置基于nginx的tomcat负载均衡和集群

(通过cookie分发请求)

 

       由于最近项目组一直在搞性能,最近一直在研究HA方面的东东,看了网上很多关于NGINX替代Apache方案,于是自己也决定尝试体验一下。下面是通过网上资料以及自己总结,供大家参考。

 

第一步:搭建LINUX系统环境(由于家中没有所以用vmware workstation 9安装suse11)。

 

(1)在用Vmware安装SUSE11环境,如下图:(安装包--openSUSE-11.4-DVD-i586.iso)

 

 

(2)安装后的登录页面(里面我已经创建了多个用户):



 

(3)安装完LINUX系统以后,配置虚拟机网络,使虚拟机内部的系统能够通过主机电脑上网:

         (编辑Vmware网络设置,你能看到三种选择)




 

 具体介绍请参考附件《VMWare虚拟机上网设置图详解.doc》,本次使用NAT的方式连接,比较最简单。
  
 (4)安装LINUX系统一些常用包,当时主要是为了安装xmms播放器所需要安装的,也没管那么多,后来网上查看才知道相关用处。

 

gtk+-2.0.0.tar.gz

glib-2.22.5.tar.gz

pkgconfig-0.18.tar.gz

libgtk-3-0-3.0.0-3.3.i586.rpm

fcitx-4.0.0.tar.gz --- Linux下非常好的小企鹅中文输入法

xmms-1.2.8.tar.gz --- 播放器

QIpmsg --- 安装linux半版飞鸽用于传输资料很方便。

 

下载地址:

http://rpm.pbone.net/  ------  经典的rpm包,里面会告诉你包的依赖关系。

http://code.google.com/hosting/

http://www.freedesktop.org/wiki/Software/

 

在linux上安装rpm包直接点击安装就可以,对于.tar.gz这种源码包一般需要一下步骤:

./configure   --- 相关参数配置  (--prefix=/usr/local/ 安装路径)

make           --- 编译

make install --- 安装 

 

第二步:创建LINUX用户,安装JDK、TOMCAT以及配置环境变量。

(1)创建用户:

         用root用户登录后,执行

         a、groupadd bmsys  ---- 创建组

         b、useradd -d /home/bmsys  -g bmsys  -s /bin/bash username  bmsys   ----创建用户,指定初始化目录、组、以及使用的shell。

         c、passwd bmsys       ---- 修改密码

 

         useradd详解:

        

useradd [-u UID] [-g initial_group] [-G other_group] -[Mm] [-c 说明栏] [-d home] [-s shell] username
参数:
-u  :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个帐号;
-g  :后面接的那个群组名称就是我们上面提到的 initial group 啦~
      该 group ID (GID) 会被放置到 /etc/passwd 的第四个栏位内。
-G  :后面接的群组名称则是这个帐号还可以支援的群组。
      这个参数会修改 /etc/group 内的相关资料喔!
-M  :强制!不要建立使用者家目录
-m  :强制!要建立使用者家目录!
-c  :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设定的啦~
-d  :指定某个目录成为家目录,而不要使用预设值;
-r  :建立一个系统的帐号,这个帐号的 UID 会有限制 (/etc/login.defs)
-s  :后面接一个 shell ,预设是 /bin/bash 的啦~
 

 

(2)下载安装包:

          jdk-7u10-linux-i586.tar.gz

 

          下载地址: http://download.oracle.com/otn-pub/java/jdk/7u13-b20/jdk-7u13-linux-i586.tar.gz

 

          apache-tomcat-6.0.18.tar.gz

          

          apr-1.4.5.tar.gz

          apr-iconv-1.2.1.tar.gz

          apr-util-1.3.12.tar.gz

          tomcat-native-1.1.24-src.tar.gz (一般tomcat/bin下面都自带的有)

 

          下载地址:http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.34/bin/apache-tomcat-6.0.18.tar.gz

                            http://archive.apache.org/dist/apr/

 

 

(3)安装JDK与TOMCAT.:

        

mv jdk-7u10-linux-i586.tar.gz /home/bmsys/software/
tar -zxvf jdk-7u10-linux-i586.tar.gz
mv jdk-7u10-linux-i586 /home/bmsys/program/java/  ----- JDK安装好了。


mv  apache-tomcat-6.0.18.tar.gz /home/bmsys/software/
tar -zxvf apache-tomcat-6.0.18.tar.gz
mv apache-tomcat-6.0.32 /home/bmsys/program/tomcat/  ----- TOMCAT安装好了。
 
(4)设置环境变量:     这个是在root用户下,设置全局变量
cat >>/etc/profile<<EOF
export JAVA_HOME=/home/bmsys/program/java/jdk1.7.0_10
export CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=.:$PATH:$JAVA_HOME/bin
export CATALINA_HOME=/home/bmsys/program/tomcat/apache-tomcat-6.0.18
       上面这种用root用户设置全区环境变量是不安全的,一般我们都会在工作的当前用户下    设置用户的环境变量:(eg:  在新建的bmsys用户下。)   

 

 
使环境变量生效:source  .bashrc 注意:新建的用户,没有.bashrc文件,直接vi后保存就可以了。                

 关于APR理解

 APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。

 

简介

在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用APR而已。
目前APR主要还是由Apache使用,不过由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR。 APR使得平台细节的处理进行下移。对于应用程序而 言,它们根本就不需要考虑具体的平台,不管是Unix、Linux还是Window,应用程序执行的接口基本都是统一一致的。因此对于APR而言,可移植 性和统一的上层接口是其考虑的一个重点。而APR最早的目的并不是如此,它最早只是希望将Apache中用到的所有代码合并为一个通用的代码库,然而这不 是一个正确的策略,因此后来APR改变了其目标。有的时候使用公共代码并不是一件好事,比如如何将一个请求映射到线程或者进程是平台相关的,因此仅仅一个 公共的代码库并不能完成这种区分。
APR的目标则是希望安全合并所有的能够合并的代码而不需要牺牲性能。 APR的最早的一个目标就是为所有的平台(不是部分)提供一个公共的统一操作函数接口,这是一个非常了不起的目的,当然也是不现实的一个目标。我们不可能 支持所有平台的所有特征,因此APR目前只能为大多数平台提供所有的APR特性支持,包括Win32、OS/2、BeOS、Darwin、Linux等 等。为了能够实现这个目标,APR开发者必须为那些不能运行于所有平台的特性创建了一系列的特征宏(FEATURE MACROS)以在各个平台之间区分这些特征。这些特征宏定义非常简单,通常如下: APR_HAS_FEATURE 如果某个平台具有这个特性,则该宏必须设置为true,比如Linux和window都具有内存映射文件,同时APR提供了内存映射文件的操作接口,因此在这两个平台上,APR_HAS_MMAP宏必须设置,同时ap_mmap_*函数应该将磁盘文件映射为内存并返回适当的状态码。如果你的操作系统并不支持内存映射,那么APR_HAS_MMAP必须设置为0,而且所有的ap_mmap_*函数也可以不需要定义。第二步就是对于那些在程序中使用了不支持的函数必须提出警告。
APR中支持的基本类型
文件夹名称 描述
atomic/srclib/apr/atomic 原子操作
dso/srclib/apr/dso 动态加载共享库
fileio/srclib/apr/file_io 文件IO处理
mmap/srclib/apr/mmap 内存映射文件
locks/srclib/apr/locks 进程和线程互斥
memory/srclib/apr/memory 内存池操作
network_io/srclib/apr/network_io 网络IO处理
poll/srclib/apr/poll 轮询IO
table/srclib/apr/tables Apache数组(堆栈)和表格以及哈希表
process /srclib/apr/threadproc 进程和线程操作
user /srclib/apr/user 用户和用户组操作
time /srclib/apr/time 时间操作
string/srclib/apr/strings 字符串操作
password /srclib/apr/passwd 终端密码处理
misc /srclib/apr/misc 大杂烩,不属于其余类的任何apr类型都可以放在里面
shmem /srclib/apr/shmem 共享内存
random /srclib/apr/random 随机数生成库

利用APR本地库提高Tomcat性能 

Tomcat可以使用APR来提供超强的可伸缩性和性能,更好地集成本地服务器技术。APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心。APR有很多用途,包括访问高级IO功能(例如sendfile,epollOpenSSL)OS级别功能(随机数生成,系统状态等),本地进程管理(共享内存,NT管道和UNIX sockets)。这些功能可以使Tomcat作为一个通常的前台WEB服务器,能更好地和其它本地web技术集成,总体上让Java更有效率作为一个高性能web服务器平台而不是简单作为后台容器。

  在产品环境中,特别是直接使用TomcatWEB服务器的时候,您应该使用Tomcat Native来提高其性能,详细配置和安装请参考Tomcat文档。

如果没有apr技术,启动tomcat 时出现如下提示:

信    息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/jdk1.6.0_06/jre/lib/i386/client:/usr/java/jdk1.6.0_06/jre/lib/i386:/usr/java/jdk1.6.0_06/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib

按照官方说明需要:

·   APR library

·    OpenSSL libraries

openssl 可以用 yum install openssl-develapr还是下载*.gz来安装。
apr-1.4.5.tar.gz
apr-iconv-1.2.1.tar.gz
apr-util-1.3.12.tar.gz

两个可以在 http://apr.apache.org/  找到。
tomcat-native.tar.gz
可以在tomcat/bin目录下找到。

安装 apr

1.      # tar zxvf apr-1.4.5.tar.gz  

2.      # cd apr-1.4.5  

3.      # ./configure    

4.      # make  

5.      # make install  

apr默认安装在/usr/local/apr     所以下面安装到其它apr时会用--with-apr指定依赖的的包路径,当然也可以通过--prefix指定安装路径。

 

安装 apr-iconv

 

      # tar zxvf apr-iconv-1.2.1.tar.gz  

      # cd  apr-iconv-1.2.1

      # ./configure  --prefix=/usr/local/apr-iconv-1.2.1 --with-apr=/usr/local/apr

      # make  

      # make install  

安装 apr-util

      # tar zxvf apr-util-1.3.12.tar.gz

      # cd apr-util-1.3.12  

      # ./configure --prefix=/usr/local/apr-util-1.3.12 --with-apr=/usr/local/apr

      # make  

      # make install  

安装 tomcat-native

      # cd /usr/local/tomcat-6.0.18/bin  

      # tar zxvf tomcat-native.tar.gz  

      # cd tomcat-native-1.1.14-src/jni/native  

      # ./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.6.0_11  

      # make  

      # make install  

设置 apr 的环境变量:这个用的是系统级别的环境变量,配置后所有的用户都可以生效。如果你一开始的环境变量是当前用户的,那你需要把下面的环境变量添加到.bashrc文件中。

      # vi /etc/profile  

      // 后面添加以下内容  目录被改成安装到:/usr/local/apr-1.4.5下面了,不知道什么时候多出来个/usr/local/apr目录。一定要向下面那样指定,不能指定成:/usr/local/apr-1.4.5,否则不启作用

      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib  

      

     //使profile生效,  

     # source /etc/profile  

启动 tomcat 后,看日志:

      # bin/startup.sh  

      # head logs/catalina.out    

      // 可以看到以下结果:  

      信息: Loaded APR based Apache Tomcat Native library 1.1.22.  

      2009-1-13 11:12:51 org.apache.catalina.core.AprLifecycleListener init  

      信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].  

实践过成功,
另外一个配置APR环境变量方式:
1.修改 tomcat 的启动 shell ( catalina.sh ),在该文件中加入启动参数: CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib" 这个没有实践。

 

 

记忆深刻的命令:chown [-cfhvR] [--help] [--version] user[:group] file...
user : 新的档案拥有者的使用者 ID   

group : 新的档案拥有者的使用者群体(group)   

-c : 若该档案拥有者确实已经更改,才显示其更改动作   

-f : 若该档案拥有者无法被更改也不要显示错误讯息   

-h : 只对于连结(link)进行变更,而非该 link 真正指向的档案   

-v : 显示拥有者变更的详细资料   

-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)   

--help : 显示辅助说明   

--version : 显示版本

 

chmod -R 777 指定目录/*    ---凡是权限问题 ,只要执行了它绝对好了。

 

注意:切忌是需要指定目录,不能把根目录 chmod..如果执行了,那么就 完了,系统就崩溃了。

 

第三部步:安装与配置NGINX。

 

(1)下载相关安装包:

         pcre-8.32.tar.gz 

         PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正规表达式库.这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是很有用的。Boost太庞大了,使用boost regex后,程序的编译速度明显变慢。测试了一下,同样一个程序,使用boost::regex编译时需要3秒,而使用pcre不到1秒。因此改用pcre来解决C语言中使用正则表达式的问题。

   

            zlib-1.2.7.tar.gz  --- 为了gzip压缩

         下载路径:http://zlib.net/zlib-1.2.7.tar.gz

         gperftools-2.0.tar.gz   --- Tcmalloc 优化nginx

          Tcmalloc原理:http://blog.163.com/cp7618@yeah/blog/static/70234777201251345350339/

 

         nginx-1.2.6.tar.gz

         官方路径:http://nginx.org/download/nginx-1.2.6.tar.gz

 

  (2)安装pcre、gperftools、nginx:(新建一个nginx用户,在它下面安装nginx以及辅助包)

          nginx可以使用各平台的默认包来安装,下面介绍使用源码编译安装,包括具体的编译参数信息。
          正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好。
          ububtu平台可以使用以下指令
          apt-get install build-essential
          apt-get install libtool            
nginx@linux-ihah:~>tar zxvf pcre-8.32.tar.gz

nginx@linux-ihah:~>cd pcre-8.32/

nginx@linux-ihah:~>./configure

nginx@linux-ihah:~>make

nginx@linux-ihah:~>make install
     
nginx@linux-ihah:~>tar -zxvf zlib-1.2.7.tar.gz
nginx@linux-ihah:~>cd zlib-1.2.7
nginx@linux-ihah:~>./configure
nginx@linux-ihah:~>make
nginx@linux-ihah:~>make install
     
在学习nginx的性能优化时,网上搜到了"利用TCMalloc优化nginx的性能"和“使用google-perftool优化nginx的性能”的文章。
其实,google-perftools包含四个工具,分别是:TCMalloc、heap-checker、heap-profiler和cpu-profiler,TCMalloc是google-perftools的其中一个工具,用于优化内存分配的效率和速度,帮助在高并发的情况下很好的控制内存的使用。
在mysql 和nginx 性能优化方案中,大多数教程都是使用google-perftools提供的TCMalloc工具,TCMalloc在内存的分配上效率和速度要比malloc高得多。但是,nginx的内存占用其实是很少的,一个进程占用的内存大概只有12M左右,所以google-perftools对nginx的优化效果可能不太明显。
 
 
安装配置google-perftools
安装之前需要先确定是64位的还是32位的,如果是64位的OS,需要在安装google-perftools之前安装libunwind库,查看方法:
 
1.[root@lvs ~]# uname -a 2.Linux lvs.master 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux 3.[root@lvs ~]#   
这则表示我的环境是32位的环境。所以libunwind的安装方法自己搜吧。
 
 一、安装google-perftools
 
nginx@linux-ihah:~>tar -zxvf google-perftools-1.7.tar.gz
nginx@linux-ihah:~>cd google-perftools-1.7/
nginx@linux-ihah:~>./configure 
nginx@linux-ihah:~>make
nginx@linux-ihah:~>make install
nginx@linux-ihah:~>echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf 
nginx@linux-ihah:~>ldconfig 
     
安装ssl(某些vps默认没装ssl,需要手动安装)
apt-get install openssl
apt-get install libssl-dev
     
tar zxvf nginx-1.2.6.tar.gz
cd nginx-1.2.6/
./configure 

--user=nginx --group=bmsys 

--prefix=/home/nginx/program/nginx #(安装路径)

--with-http_stub_status_module 

--with-http_ssl_module 

--with-http_flv_module 

--with-http_gzip_static_module 

--with-google_perftools_module 

--with-pcre=/home/nginx/program/pcre-8.32 #(源码解压目录) 

--with-zlib=/home/nginx/program/zlib-1.2.7 #(源码解压目录)

--add-module=/home/nginx/program/nginx_upstream_jvm_route #(源码解压目录)

make
make install
      NGINX安装后的目录为:   

  附:可能遇到的错误和一些帮助信息     编译pcre错误
libtool: compile: unrecognized option `-DHAVE_CONFIG_H'
libtool: compile: Try `libtool --help' for more information.
make[1]: *** [pcrecpp.lo] Error 1
make[1]: Leaving directory `/usr/local/src/pcre-8.32'
make: *** [all] Error 2
    解决办法:安装g++,别忘了重新configure
    apt-get install g++
    apt-get install build-essential
    make clean
    ./configure
    make         make出错
make: *** No rule to make target `build', needed by `default'.  Stop.
./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

按照NGINX安装方法或者添加--with-openssl=<path>
cd /usr/local/src
wget http://www.openssl.org/source/openssl-1.0.1c.tar.gz
tar -zxvf openssl-1.0.1c.tar.gz
重新编译
cd ../nginx-1.2.6
../configure --user=nginx 
--group=bmsys  
--prefix=/home/nginx/program/ 
--with-http_stub_status_module 
--with-http_ssl_module 
--with-http_flv_module 
--with-http_gzip_static_module 
--with-google_perftools_module 
--with-pcre=/usr/local/src/pcre-8.32  
--with-zlib=/usr/local/src/zlib-1.2.7 
--with-openssl=/usr/local/src/openssl-1.0.1c
--add-module=/home/nginx/program/nginx_upstream_jvm_route
       nginx编译选项
make                 是用来编译的,它从Makefile中读取指令,然后编译。

make install      是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

configure         命令是用来检测你的安装平台的目标特征的。它定义了系统的各个方面,包括nginx的被允许使用的连接处理的方法,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本,执行结束时,它会创建一个Makefile文件。nginx的configure命令支持以下参数:

--prefix=path          定义一个目录,存放服务器上的文件 ,也就是nginx的安装目录。默认使用 /usr/local/nginx。 
--sbin-path=path   设置nginx的可执行文件的路径,默认为  prefix/sbin/nginx. 
--conf-path=path   设置在nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf. 
--pid-path=path     设置nginx.pid文件,将存储的主进程的进程号。安装完成后,可以随时改变的文件名 , 在nginx.conf配置文件中使用 PID指令。默认情况下,文件名 为prefix/logs/nginx.pid. 
--error-log-path=path 设置主错误,警告,和诊断文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的error_log指令。默认情况下,文件名 为prefix/logs/error.log. 
--http-log-path=path  设置主请求的HTTP服务器的日志文件的名称。安装完成后,可以随时改变的文件名 ,在nginx.conf配置文件中 使用 的access_log指令。默认情况下,文件名 为prefix/logs/access.log. 
--user=name     设置nginx工作进程的用户。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的用户名是nobody。 
--group=name  设置nginx工作进程的用户组。安装完成后,可以随时更改的名称在nginx.conf配置文件中 使用的 user指令。默认的为非特权用户。 
--with-select_module --without-select_module 启用或禁用构建一个模块来允许服务器使用select()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。 
--with-poll_module --without-poll_module       启用或禁用构建一个模块来允许服务器使用poll()方法。该模块将自动建立,如果平台不支持的kqueue,epoll,rtsig或/dev/poll。 
--without-http_gzip_module       不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。 
--without-http_rewrite_module  不编译重写模块。编译并运行此模块需要PCRE库支持。 
--without-http_proxy_module    不编译http_proxy模块。 
--with-http_ssl_module              使用https协议模块。默认情况下,该模块没有被构建。建立并运行此模块的OpenSSL库是必需的。 
--with-pcre=path                       设置PCRE库的源码路径。PCRE库的源码(版本4.4 - 8.30)需要从PCRE网站下载并解压。其余的工作是Nginx的./ configure和make来完成。正则表达式使用在location指令和 ngx_http_rewrite_module 模块中。 
--with-pcre-jit                            编译PCRE包含“just-in-time compilation”(1.1.12中, pcre_jit指令)。 
--with-zlib=path                        设置的zlib库的源码路径。要下载从 zlib(版本1.1.3 - 1.2.5)的并解压。其余的工作是Nginx的./ configure和make完成。ngx_http_gzip_module模块需要使用zlib 。 
--with-cc-opt=parameters        设置额外的参数将被添加到CFLAGS变量。例如,当你在FreeBSD上使用PCRE库时需要使用:--with-cc-opt="-I /usr/local/include。.如需要需要增加 select()支持的文件数量:--with-cc-opt="-D FD_SETSIZE=2048". 
--with-ld-opt=parameters        设置附加的参数,将用于在链接期间。例如,当在FreeBSD下使用该系统的PCRE库,应指定:--with-ld-opt="-L /usr/local/lib". 
 

  

四、NGINX配置(nginx.conf)
#定义Nginx运行的用户和用户组
user nginx bmsys;  
#nginx进程数,建议设置为等于CPU总核心数。 
worker_processes 4; 
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log  /home/nginx/log/nginx_error.log info; 
#进程文件
pid        /home/nginx/run/nginx.pid; 
 
#使用Tcmalloc优化nginx性能(为google-perftools添加线程目录)
google_perftools_profiles /var/tmp/tcmalloc;
 
#Specifies the value for maximum file descriptors that can be opened by this process.
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。 
#ulimit -SHn 65535
worker_rlimit_nofile 65535; #工作模式及连接数上限 
#工作模式与连接数上限
events 
{   
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;   
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535; 
 
#设定http服务器,利用它的反向代理功能提供负载均衡支持 
http 
{     
#设定mime类型     
include       mime.types; #文件扩展名与文件类型映射表     
default_type  application/octet-stream; #默认文件类型       
#charset  utf-8; #默认编码   
#设定请求缓冲        
server_names_hash_bucket_size 128; #服务器名字的hash表大小    
client_header_buffer_size 32k; #上传文件大小限制   
large_client_header_buffers 4 32k; #设定请求缓存    
client_max_body_size 300m; #设定请求缓存   
sendfile on; #注意:如果图片显示不正常把这个改成off。   
 
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
#开启目录列表访问,合适下载服务器,默认关闭。
autoindex off; 
tcp_nopush     on; #防止网络阻塞 
tcp_nodelay    on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒    
server_tokens off;  
client_body_buffer_size 512k;
 
proxy_connect_timeout   5;   
proxy_send_timeout      60;   
proxy_read_timeout      5;   
proxy_buffer_size       16k;   
proxy_buffers           4 64k;   
proxy_busy_buffers_size 128k;   
proxy_temp_file_write_size 128k;
 
proxy_temp_path /home/nginx/temp_dir;
proxy_cache_path /home/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
 
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
#  fastcgi_connect_timeout 300;   
#  fastcgi_send_timeout 300;   
#  fastcgi_read_timeout 300;  
#  fastcgi_buffer_size 64k;   
#  fastcgi_buffers 4 64k;   
#  fastcgi_busy_buffers_size 128k;   
#  fastcgi_temp_file_write_size 128k;  
 
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.1; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
 
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
upstream mybmsys {
            server 192.168.48.128:8080 max_fails=3 fail_timeout=30s;
            server 192.168.0.104:8080 max_fails=3 fail_timeout=30s;
}
 

#通过第三方nginx-upstream-jvm-route实现基于JSESSIONID保持会话分发

#upstream myJvmRoute {

           #server 192.168.48.128:8080 srun_id=a;

           #server 192.168.0.102:8088 srun_id=b;

           #jvm_route $cookie_JSESSIONID|sessionid reverse;

 #}

#需要根据cookie转发,查询的cookie的键(key)为JSESSIONID,如果该cookie值(value)以a结尾则转发到apache001,以b结尾则转发到apache002(表达式匹配方式实现)
map $COOKIE_JSESSIONID $group {
      ~*a$     apache001;
      ~*b$     apache002;
      default  mybmsys;
}
upstream apache001 {
    server 192.168.48.128:8080 weight=1 max_fails=1 fail_timeout=30s;
}
upstream apache002 {
    server 192.168.0.104:8080 weight=1 max_fails=1 fail_timeout=30s;
}
 
###禁止通过ip访问站点     
#server{          
#server_name _;          
#return 404;           
#}    
 
#定义访问日志的写入格式  
#nginx: [warn] the "log_format" directive may be used only on "http"   log_format必须在http层定义。
   log_format  accesslog  '$remote_addr - $remote_user [$time_local] "$request"'  '$status $body_bytes_sent "$http_referer"'  '"$http_user_agent" $http_x_forwarded_for'  '"$http_user_agent" "$test_cookie"';
 
#虚拟主机配置 (可以配置多个,这样就可以通过访问不同的虚拟主机---通过虚名:端口)
server  
{      
listen       8088; #监听端口 NGINX对外访问端口   
server_name  192.168.48.128 www.bmsys.com bmsys.com; #域名可以有多个,用空格隔开     
index index.html index.htm index.jsp index.do; #设定访问的默认首页地址 
 
root  /home/nginx/cache; #设定网站的资源存放路径 
      
#limit_conn   crawler  20;   
 
if (-d $request_filename) 
{  
         rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 
if ($http_cookie ~* "(.*)$")         
{                 
        set $test_cookie $1;
#所有jsp的页面均交由tomcat处理 
location ~ \.(jsp|jspx|do)$ 
{  
proxy_set_header  Host $host;    
proxy_set_header  X-Real-IP  $remote_addr;  
#proxy_pass http://mybmsys;
#转向tomcat处理 
#实现会话级别的负载均衡
proxy_pass http://$group;
}             
 
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ #设定访问静态文件直接读取不经过tomcat      
             proxy_pass http://mybmsys;
             proxy_redirect off;
            proxy_set_header Host $host;
            proxy_cache cache_one;
            proxy_cache_valid 200 302 1h;
            proxy_cache_valid 301 1d;
            proxy_cache_valid any 1m;        
            expires 30d;      
}       
location ~ .*\.(js|css)$      
           proxy_pass http://mybmsys; 
           proxy_redirect off;
           proxy_set_header Host $host;
           proxy_cache cache_one;
           proxy_cache_valid 200 302 1h;
           proxy_cache_valid 301 1d;
           proxy_cache_valid any 1m;        
           expires      1h;      
}        
 
#对 "/" 启用反向代理
location / {
proxy_pass http://$group;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m;     #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;   #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90;      #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90;           #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90;            #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k;         #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;          #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k;  #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
#设定查看Nginx状态的地址
location /NginxStatus {
     stub_status on;
     access_log on;
     auth_basic "NginxStatus";
     auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
access_log  /home/nginx/log/access_nginx.log accesslog; #设定访问日志的存放路径  
error_log  /home/nginx/log/error_nginx.log error; #设定访问日志的存放路径     
}   
}
以下对于配置的关键几点进行解释:
(1)PID
         pid文件就是一个纯文本文件,里面记录的是进程的pid号。
        nginx使用了pid文件来记录master process的pid号,如果编译时没有指定,那它的路径就是:<prefix/logs/nginx.pid其中<prefix是nginx的安装路径
        如果你想修改默认的pid文件路径,可以在编译时加入配置。(参数如下:: ./configure –-pid-path=/data/test/ngx.pid)
        指定后,默认的pid文件路径就更改为::/data/test/ngx.pid
        如果指定只是路径,没有pid的文件名,那么pid的文件名还是nginx.pid
 
          通过配置文件修改pid
        除了使用默认值和通过编译时修改外,还可以通过在nginx的配置文件中修改。如下:
        pid /data/test/nginx.pid;
        这里修改的值只对使用该配置文件的nginx有效。
 
          用PID文件停止Nginx
        假设pid文件路径为/data/logs/nginx.pid
        kill –QUIT `cat /data/logs/nginx.pid`
 
         用pid文件重新加载配置文件
        kill –HUP `cat /data/logs/nginx.pid`
 
(2)upstream的分配方式

upstream test{
    server 192.168.0.1:3000;
    server 192.168.0.1:3001;
}

upstream bakend {

              server 192.168.159.10 weight=10
                        server 192.168.159.11 weight=10

}

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

例如:

upstream resinserver{

ip_hash;

server 192.168.159.10:8080;

server 192.168.159.11:8080;

}

4、fair(第三方)--需要安装Upstream Fair Balancer Module

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream resinserver{

server server1;

server server2;

           fair;

}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream resinserver{

server squid1:3128;

server squid2:3128;

hash $request_uri;

hash_method crc32;

}

 

#定义负载均衡设备的Ip及设备状态

upstream resinserver{

ip_hash;

server 127.0.0.1:8000 down;

server 127.0.0.1:8080 weight=2;

server 127.0.0.1:6801;

server 127.0.0.1:6802 backup;

}

在需要使用负载均衡的server中增加

proxy_pass http://resinserver/;

 

每个设备的状态设置为:

1.down 表示单前的server暂时不参与负载

2.weight 默认为1.weight越大,负载的权重就越大。

3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

4.fail_timeout:max_fails次失败后,暂停的时间。

5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug

client_body_temp_path 设置记录文件的目录 可以设置最多3层目录

location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

 
(3)基于会话进行负载(即JSESSIONID
          安装nginx-upstream-jvm-route模块
          需要安装第三方模块 nginx-upstream-jvm-route(下载 nginx-upstream-jvm-route-0.1.tar.gz
         nginx@linux-ihah:/home/nginx/program> tar -zxvf nginx-upstream-jvm-route-0.1.tar.gz 
          ngi nx@linux-ihah:/home/nginx/program>cd  nginx-1.2.6
         nginx@linux-ihah:/home/nginx/program/nginx-1.2.6> patch -p0 < ../nginx-upstream-jvm-route-0.1/jvm_route.patch
          nginx@linux-ihah:/home/nginx/program/nginx-1.2.6> ./configure --add-module=/home/nginx/program/nginx-upstream-jvm-route(在原来的配置上新增----解压后的路径)
         接着就是安装nginx.........
 
         Tomcat配置
                 设置 tomcat server.xml,  在两台服务器的 tomcat 的配置文件中分别找到:
               <Engine name="Catalina" defaultHost="localhost" >
分别修改为:
Tomcat01:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="a">
Tomcat02:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="b">
 
NGINX基于SESSION的upstream负载配置
upstream mybmsys {
        server 192.168.2.88:8080 srun_id=a; 
        server 192.168.2.89:8080 srun_id=b;
        jvm_route $cookie_JSESSIONID|sessionid reverse;
}
           
(4)
Nginx 监控NginxStatus显示的内容解释( 用于监控NGINX当前运行的状态)

 

#设定查看Nginx状态的地址

location /NginxStatus {

      stub_status on;

      access_log on;

      auth_basic "NginxStatus";

      auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。

      allow 192.168.48.1/24; #限访问IP来控制访问的IP地址。

      deny all;#全部拒绝,除了制定的IP。

}

以上这个配置以后,必须密码输入正确,同时是指定的IP访问。

Active connections: 364

server accepts handled requests

5477919 5477919 17515830

Reading: 10 Writing: 26 Waiting: 328

 

NginxStatus 显示的内容意思如下:

active connections – 当前 Nginx 正处理的活动连接数。

serveraccepts handled requests -- 总共处理了 5477919 个连接 , 成功创建 5477919 次握手 (证明中间没有失败的 ), 总共处理了 17515830 个请求 ( 平均每次握手处理了 3.2 个数据请求 )。

reading -- nginx 读取到客户端的 Header 信息数。

writing -- nginx 返回给客户端的 Header 信息数。

waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

 

(5)apache提供的htpasswd工具使用说明

 安装Apache核心httpd(只介绍加密工具使用,其它不做介绍):

> wget http://mirrors.hust.edu.cn/apache//httpd/httpd-2.4.9.tar.gz 

> tar -zxvf httpd-2.4.9.tar.gz

> cd httpd-2.4.9

> make && make install

安装结束以后,查看最后显示的安装路劲是什么(默认是:/usr/local/apache2),当然了你自己也可以指定。

 

使用htpasswd命令生成加密文件:

> cd /usr/local/apache2/bin/

> ./htpasswd -cb ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

 

关于htpasswd命令使用说明:

 

apache htpasswd命令选项参数说明

  -c 创建一个加密文件

  -n 不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上

  -m 默认apache htpassswd命令采用MD5算法对密码进行加密

  -d apache htpassswd命令采用CRYPT算法对密码进行加密

  -p apache htpassswd命令不对密码进行进行加密,即明文密码

  -s apache htpassswd命令采用SHA算法对密码进行加密

  -b 在apache htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码

  -D 删除指定的用户

apache htpasswd命令用法实例

 

(1)利用htpasswd命令添加用户

  htpasswd -bc ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

(2)在原有密码文件中增加下一个用户

  htpasswd -b ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

(3)如何不更新密码文件,只显示加密后的用户名和密码

  htpasswd -nb mignlei 1234 ----查看对用户名和密码加密后的结果。例如:minglei:$apr1$.iyB/i6u$j2p7qpXN5.IwqLnmlqD/m0

(4)利用htpasswd命令删除用户名和密码

  htpasswd -D ./home/nginx/program/nginx/conf/conf/htpasswd minglei

(5)利用htpasswd命令修改密码

  htpasswd -D ./home/nginx/program/nginx/conf/conf/htpasswd minglei   -----提示输入密码

  htpasswd -b ./home/nginx/program/nginx/conf/conf/htpasswd minglei 789456 ----直接修改密码为789456

(6)
NGINX启动,重启,关闭命令
主进程可以处理以下的信号:
TERM, INT 快速关闭
QUIT 从容关闭
HUP 重载配置
用新的配置开始新的工作进程
从容关闭旧的工作进程
USR1 重新打开日志文件
USR2 平滑升级可执行程序。
WINCH 从容关闭工作进程                               

尽管你不必自己操作工作进程,但是,它们也支持一些信号:

TERM, INT 快速关闭                                             
QUIT 从容关闭
USR1 重新打开日志文件

       

启动Nginx

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf        
停止操作
停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的
步骤1:查询nginx主进程号
ps -ef | grep nginx
在进程列表里 面找master进程,它的编号就是主进程号了。
步骤2:发送信号
从容停止Nginx:
kill -QUIT 主进程号
快速停止Nginx:
kill -TERM 主进程号
强制停止Nginx:
pkill -9 nginx
另外, 若在nginx.conf配置了pid文件存放路径则该文件存放的就是Nginx主进程号,如果没指定则放在nginx的logs目录下。有了pid文 件,我们就不用先查询Nginx的主进程号,而直接向Nginx发送信号了,命令如下:
kill -信号类型 '/usr/nginx/logs/nginx.pid'
 
平滑重启
如果更改了配置就要重启Nginx,要先关闭Nginx再打开?不是的,可以向Nginx 发送信号,平滑重启。
平滑重启命令:
kill -HUP 住进称号或进程号文件路径

或者使用

/usr/nginx/sbin/nginx -s reload

注意,修改了配置文件后最好先检查一下修改过的配置文件是否正 确,以免重启后Nginx出现错误影响服务器稳定运行。判断Nginx配置是否正确命令如下:
nginx -t -c /usr/nginx/conf/nginx.conf

或者

/usr/nginx/sbin/nginx -t
 
 
平滑升级
如果服务器正在运行的Nginx要进行升级、添加或删除模块时,我们需 要停掉服务器并做相应修改,这样服务器就要在一段时间内停止服务,Nginx可以在不停机的情况下进行各种升级动作而不影响服务器运行。
步骤1:
如 果升级Nginx程序,先用新程序替换旧程序文件,编译安装的话新程序直接编译到Nginx安装目录中。
步 骤2:执行命令
kill -USR2 旧版程序的主进程号或进程文件名
此时旧的Nginx主进程将会把自己的进程文件改名为.oldbin,然后执行新版 Nginx。新旧Nginx会同市运行,共同处理请求。
这时要逐步停止旧版 Nginx,输入命令:
kill -WINCH 旧版主进程号
慢慢旧的工作进程就都会随着任务执行完毕而退出,新版的Nginx的工作进程会逐渐取代旧版 工作进程。
 
此 时,我们可以决定使用新版还是恢复到旧版。
不重载配置启动新/旧工作进程
kill -HUP 旧/新版主进程号
从容关闭旧/新进程
kill -QUIT 旧/新主进程号
如果此时报错,提示还有进程没有结束就用下面命令先关闭旧/新工作进程,再关闭主进程号:
kill -TERM 旧/新工作进程号
 
第四步:验证
1. 例如:192.168.48.128:8080---对应Tomcat01;192.168.0.104:8080---对应Tomcat01。
2.  针对SESSSION保持分配方式进行测试进行-----这里需要结合上面的说明对nginx.conf略作修改。
3. 分别在两个tomcat中的webapps下面建立aa文件夹,在里面建立要测试的index.jsp文件,内容如下: 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
%> 
<html> 
<head> 
    </head> 
      <body> 
       88 
       <!--server1 这里为 88888;server2 需要改为  99999这样才能区分是否保值会话了 --> 
        <br /> 
       <%out.print(request.getSession()) ;%> 
       <!--输出session--> 
        <br /> 
        <%out.println(request.getHeader("Cookie")); %> 
      <!--输出Cookie--> 
      </body> 
</html> 
4. 启动NGINX与两个TOMCAT
5. 打开浏览器测试
    打开IE浏览器,输入:http://192.168.48.128:8088/aa/ 
     刷新了N次还都是888888,也就是会话保持补丁起作用了,cookie 值也获得了,为了测试,我又打开了“火狐”(因为session 和 cookie问题所以从新打开别的浏览器)。
     输入网址: http://192.168.48.128:8088/aa/ 
     显示999999,刷新N次后还是999999。
   注意: 把 nginx 配置文件的srun_id=a srun_id=b 去掉,然后在访问,就会知道页面是轮询访问得了。
 

第五步:性能测试

 

摘自:http://down.chinaz.com/server/201202/1671_1.htm

目前较为常见的网站压力测试工具有webbench、ab(apache bench)、tcpcopy、loadrunner。

webbench由Lionbridge公司开发,主要测试每秒钟请求数和每秒钟数据传输量,同时支持静态、动态、SSL,部署简单,静动态均可测试。适用于小型网站压力测试(单例最多可模拟3万并发) 。

ab(apache bench)Apache自带的压力测试工具,主要功能用于测试网站每秒钟处理请求个数,多见用于静态压力测试,功能较弱,非专业压力测试工具。

tcpcopy基于底层应用请求复制,可转发各种在线请求到测试服务器,具有分布式压力测试功能,所测试数据与实际生产数据较为接近后起之秀,主要用于中大型压力测试,所有基于tcp的packets均可测试。

loadrunner压力测试界的泰斗,可以创建虚拟用户,可以模拟用户真实访问流程从而录制成脚本,其测试结果也最为逼真模拟最为逼真,并可进行独立的单元测试,但是部署配置较为复杂,需要专业人员才可以。

以webbench为例,来讲解一下网站在上线之前压力测试是如何做的:

   安装webbench

    >  wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz

    >  tar -zxvf webbench-1.5.tar.gz

    >  cd webbench-1.5

    >  make && make install

   进行压力测试,并发200时。

   webbench-c 200-t 60 http://192.168.48.128:8088/Test/index.jsp

    参数解释:-c为并发数,-t为时间(秒)

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

    200 clients, running 60 sec.

    Speed=1454 pages/min,2153340 bytes/sec.

    Requests:1454 susceed,0 failed.

    当并发200时,网站访问速度正常.

   并发800时

   webbench-c 800-t 60 http://192.168.48.128:8088/Test/index.jsp

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

    800 clients, running 60 sec.

    Speed=1194 pages/min,2057881 bytes/sec.

    Requests:1185 susceed,9 failed.

    当并发连接为800时,网站访问速度稍慢.

    并发1600时

   webbench-c 1600-t 60 http://192.168.48.128:8088/Test/index.jsp

     Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

     Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

     1600 clients, running 60 sec.

     Speed=1256 pages/min,1983506 bytes/sec.

     Requests:1183 susceed,73 failed.

    当并发连接为1600时,网站访问速度便非常慢了.

    并发2000时

    webbench-c 2000-t 60 http://192.168.48.128:8088/Test/index.jsp

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

   2000 clients, running 60 sec.

    Speed=2154 pages/min,1968292 bytes/sec.

    Requests:2076 susceed,78 failed.

    当并发2000时,网站便出现"502 Bad Gateway",由此可见web服务器已无法再处理用户访问请求.

总结:

1、压力测试工作应该放到产品上线之前,而不是上线以后。

2、测试时尽量跨公网进行,而不是内网。

3、测试时并发应当由小逐渐加大,比如并发100时观察一下网站负载是多少、打开是否流程,并发200时又是多少、网站打开缓慢时并发是多少、网站打不开时并发又是多少。

4、 应尽量进行单元测试,如B2C网站可以着重测试购物车、推广页面等,因为这些页面占整个网站访问量比重较大。

四、NGINX配置(nginx.conf)
#定义Nginx运行的用户和用户组
user nginx bmsys;  
#nginx进程数,建议设置为等于CPU总核心数。 
worker_processes 4; 
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log  /home/nginx/log/nginx_error.log info; 
#进程文件
pid        /home/nginx/run/nginx.pid; 
 
#使用Tcmalloc优化nginx性能(为google-perftools添加线程目录)
google_perftools_profiles /var/tmp/tcmalloc;
 
#Specifies the value for maximum file descriptors that can be opened by this process.
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。 
#ulimit -SHn 65535
worker_rlimit_nofile 65535; #工作模式及连接数上限 
#工作模式与连接数上限
events 
{   
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;   
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535; 
 
#设定http服务器,利用它的反向代理功能提供负载均衡支持 
http 
{     
#设定mime类型     
include       mime.types; #文件扩展名与文件类型映射表     
default_type  application/octet-stream; #默认文件类型       
#charset  utf-8; #默认编码   
#设定请求缓冲        
server_names_hash_bucket_size 128; #服务器名字的hash表大小    
client_header_buffer_size 32k; #上传文件大小限制   
large_client_header_buffers 4 32k; #设定请求缓存    
client_max_body_size 300m; #设定请求缓存   
sendfile on; #注意:如果图片显示不正常把这个改成off。   
 
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
#开启目录列表访问,合适下载服务器,默认关闭。
autoindex off; 
tcp_nopush     on; #防止网络阻塞 
tcp_nodelay    on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒    
server_tokens off;  
client_body_buffer_size 512k;
 
proxy_connect_timeout   5;   
proxy_send_timeout      60;   
proxy_read_timeout      5;   
proxy_buffer_size       16k;   
proxy_buffers           4 64k;   
proxy_busy_buffers_size 128k;   
proxy_temp_file_write_size 128k;
 
proxy_temp_path /home/nginx/temp_dir;
proxy_cache_path /home/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
 
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
#  fastcgi_connect_timeout 300;   
#  fastcgi_send_timeout 300;   
#  fastcgi_read_timeout 300;  
#  fastcgi_buffer_size 64k;   
#  fastcgi_buffers 4 64k;   
#  fastcgi_busy_buffers_size 128k;   
#  fastcgi_temp_file_write_size 128k;  
 
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.1; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
 
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
upstream mybmsys {
            server 192.168.48.128:8080 max_fails=3 fail_timeout=30s;
            server 192.168.0.104:8080 max_fails=3 fail_timeout=30s;
}
 

#通过第三方nginx-upstream-jvm-route实现基于JSESSIONID保持会话分发

#upstream myJvmRoute {

           #server 192.168.48.128:8080 srun_id=a;

           #server 192.168.0.102:8088 srun_id=b;

           #jvm_route $cookie_JSESSIONID|sessionid reverse;

 #}

#需要根据cookie转发,查询的cookie的键(key)为JSESSIONID,如果该cookie值(value)以a结尾则转发到apache001,以b结尾则转发到apache002(表达式匹配方式实现)
map $COOKIE_JSESSIONID $group {
      ~*a$     apache001;
      ~*b$     apache002;
      default  mybmsys;
}
upstream apache001 {
    server 192.168.48.128:8080 weight=1 max_fails=1 fail_timeout=30s;
}
upstream apache002 {
    server 192.168.0.104:8080 weight=1 max_fails=1 fail_timeout=30s;
}
 
###禁止通过ip访问站点     
#server{          
#server_name _;          
#return 404;           
#}    
 
#定义访问日志的写入格式  
#nginx: [warn] the "log_format" directive may be used only on "http"   log_format必须在http层定义。
   log_format  accesslog  '$remote_addr - $remote_user [$time_local] "$request"'  '$status $body_bytes_sent "$http_referer"'  '"$http_user_agent" $http_x_forwarded_for'  '"$http_user_agent" "$test_cookie"';
 
#虚拟主机配置 (可以配置多个,这样就可以通过访问不同的虚拟主机---通过虚名:端口)
server  
{      
listen       8088; #监听端口 NGINX对外访问端口   
server_name  192.168.48.128 www.bmsys.com bmsys.com; #域名可以有多个,用空格隔开     
index index.html index.htm index.jsp index.do; #设定访问的默认首页地址 
 
root  /home/nginx/cache; #设定网站的资源存放路径 
      
#limit_conn   crawler  20;   
 
if (-d $request_filename) 
{  
         rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 
if ($http_cookie ~* "(.*)$")         
{                 
        set $test_cookie $1;
#所有jsp的页面均交由tomcat处理 
location ~ \.(jsp|jspx|do)$ 
{  
proxy_set_header  Host $host;    
proxy_set_header  X-Real-IP  $remote_addr;  
#proxy_pass http://mybmsys;
#转向tomcat处理 
#实现会话级别的负载均衡
proxy_pass http://$group;
}             
 
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ #设定访问静态文件直接读取不经过tomcat      
             proxy_pass http://mybmsys;
             proxy_redirect off;
            proxy_set_header Host $host;
            proxy_cache cache_one;
            proxy_cache_valid 200 302 1h;
            proxy_cache_valid 301 1d;
            proxy_cache_valid any 1m;        
            expires 30d;      
}       
location ~ .*\.(js|css)$      
           proxy_pass http://mybmsys; 
           proxy_redirect off;
           proxy_set_header Host $host;
           proxy_cache cache_one;
           proxy_cache_valid 200 302 1h;
           proxy_cache_valid 301 1d;
           proxy_cache_valid any 1m;        
           expires      1h;      
}        
 
#对 "/" 启用反向代理
location / {
proxy_pass http://$group;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m;     #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;   #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90;      #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90;           #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90;            #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k;         #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;          #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k;  #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
#设定查看Nginx状态的地址
location /NginxStatus {
     stub_status on;
     access_log on;
     auth_basic "NginxStatus";
     auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
access_log  /home/nginx/log/access_nginx.log accesslog; #设定访问日志的存放路径  
error_log  /home/nginx/log/error_nginx.log error; #设定访问日志的存放路径     
}   
}
以下对于配置的关键几点进行解释:
(1)PID
         pid文件就是一个纯文本文件,里面记录的是进程的pid号。
        nginx使用了pid文件来记录master process的pid号,如果编译时没有指定,那它的路径就是:<prefix/logs/nginx.pid其中<prefix是nginx的安装路径
        如果你想修改默认的pid文件路径,可以在编译时加入配置。(参数如下:: ./configure –-pid-path=/data/test/ngx.pid)
        指定后,默认的pid文件路径就更改为::/data/test/ngx.pid
        如果指定只是路径,没有pid的文件名,那么pid的文件名还是nginx.pid
 
          通过配置文件修改pid
        除了使用默认值和通过编译时修改外,还可以通过在nginx的配置文件中修改。如下:
        pid /data/test/nginx.pid;
        这里修改的值只对使用该配置文件的nginx有效。
 
          用PID文件停止Nginx
        假设pid文件路径为/data/logs/nginx.pid
        kill –QUIT `cat /data/logs/nginx.pid`
 
         用pid文件重新加载配置文件
        kill –HUP `cat /data/logs/nginx.pid`
 
(2)upstream的分配方式
四、NGINX配置(nginx.conf)
#定义Nginx运行的用户和用户组
user nginx bmsys;  
#nginx进程数,建议设置为等于CPU总核心数。 
worker_processes 4; 
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log  /home/nginx/log/nginx_error.log info; 
#进程文件
pid        /home/nginx/run/nginx.pid; 
 
#使用Tcmalloc优化nginx性能(为google-perftools添加线程目录)
google_perftools_profiles /var/tmp/tcmalloc;
 
#Specifies the value for maximum file descriptors that can be opened by this process.
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。 
#ulimit -SHn 65535
worker_rlimit_nofile 65535; #工作模式及连接数上限 
#工作模式与连接数上限
events 
{   
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;   
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535; 
 
#设定http服务器,利用它的反向代理功能提供负载均衡支持 
http 
{     
#设定mime类型     
include       mime.types; #文件扩展名与文件类型映射表     
default_type  application/octet-stream; #默认文件类型       
#charset  utf-8; #默认编码   
#设定请求缓冲        
server_names_hash_bucket_size 128; #服务器名字的hash表大小    
client_header_buffer_size 32k; #上传文件大小限制   
large_client_header_buffers 4 32k; #设定请求缓存    
client_max_body_size 300m; #设定请求缓存   
sendfile on; #注意:如果图片显示不正常把这个改成off。   
 
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
#开启目录列表访问,合适下载服务器,默认关闭。
autoindex off; 
tcp_nopush     on; #防止网络阻塞 
tcp_nodelay    on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒    
server_tokens off;  
client_body_buffer_size 512k;
 
proxy_connect_timeout   5;   
proxy_send_timeout      60;   
proxy_read_timeout      5;   
proxy_buffer_size       16k;   
proxy_buffers           4 64k;   
proxy_busy_buffers_size 128k;   
proxy_temp_file_write_size 128k;
 
proxy_temp_path /home/nginx/temp_dir;
proxy_cache_path /home/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
 
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
#  fastcgi_connect_timeout 300;   
#  fastcgi_send_timeout 300;   
#  fastcgi_read_timeout 300;  
#  fastcgi_buffer_size 64k;   
#  fastcgi_buffers 4 64k;   
#  fastcgi_busy_buffers_size 128k;   
#  fastcgi_temp_file_write_size 128k;  
 
#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.1; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
 
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
upstream mybmsys {
            server 192.168.48.128:8080 max_fails=3 fail_timeout=30s;
            server 192.168.0.104:8080 max_fails=3 fail_timeout=30s;
}
 

#通过第三方nginx-upstream-jvm-route实现基于JSESSIONID保持会话分发

#upstream myJvmRoute {

           #server 192.168.48.128:8080 srun_id=a;

           #server 192.168.0.102:8088 srun_id=b;

           #jvm_route $cookie_JSESSIONID|sessionid reverse;

 #}

#需要根据cookie转发,查询的cookie的键(key)为JSESSIONID,如果该cookie值(value)以a结尾则转发到apache001,以b结尾则转发到apache002(表达式匹配方式实现)
map $COOKIE_JSESSIONID $group {
      ~*a$     apache001;
      ~*b$     apache002;
      default  mybmsys;
}
upstream apache001 {
    server 192.168.48.128:8080 weight=1 max_fails=1 fail_timeout=30s;
}
upstream apache002 {
    server 192.168.0.104:8080 weight=1 max_fails=1 fail_timeout=30s;
}
 
###禁止通过ip访问站点     
#server{          
#server_name _;          
#return 404;           
#}    
 
#定义访问日志的写入格式  
#nginx: [warn] the "log_format" directive may be used only on "http"   log_format必须在http层定义。
   log_format  accesslog  '$remote_addr - $remote_user [$time_local] "$request"'  '$status $body_bytes_sent "$http_referer"'  '"$http_user_agent" $http_x_forwarded_for'  '"$http_user_agent" "$test_cookie"';
 
#虚拟主机配置 (可以配置多个,这样就可以通过访问不同的虚拟主机---通过虚名:端口)
server  
{      
listen       8088; #监听端口 NGINX对外访问端口   
server_name  192.168.48.128 www.bmsys.com bmsys.com; #域名可以有多个,用空格隔开     
index index.html index.htm index.jsp index.do; #设定访问的默认首页地址 
 
root  /home/nginx/cache; #设定网站的资源存放路径 
      
#limit_conn   crawler  20;   
 
if (-d $request_filename) 
{  
         rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 
if ($http_cookie ~* "(.*)$")         
{                 
        set $test_cookie $1;
#所有jsp的页面均交由tomcat处理 
location ~ \.(jsp|jspx|do)$ 
{  
proxy_set_header  Host $host;    
proxy_set_header  X-Real-IP  $remote_addr;  
#proxy_pass http://mybmsys;
#转向tomcat处理 
#实现会话级别的负载均衡
proxy_pass http://$group;
}             
 
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ #设定访问静态文件直接读取不经过tomcat      
             proxy_pass http://mybmsys;
             proxy_redirect off;
            proxy_set_header Host $host;
            proxy_cache cache_one;
            proxy_cache_valid 200 302 1h;
            proxy_cache_valid 301 1d;
            proxy_cache_valid any 1m;        
            expires 30d;      
}       
location ~ .*\.(js|css)$      
           proxy_pass http://mybmsys; 
           proxy_redirect off;
           proxy_set_header Host $host;
           proxy_cache cache_one;
           proxy_cache_valid 200 302 1h;
           proxy_cache_valid 301 1d;
           proxy_cache_valid any 1m;        
           expires      1h;      
}        
 
#对 "/" 启用反向代理
location / {
proxy_pass http://$group;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m;     #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k;   #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90;      #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90;           #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90;            #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k;         #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k;          #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k;  #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
#设定查看Nginx状态的地址
location /NginxStatus {
     stub_status on;
     access_log on;
     auth_basic "NginxStatus";
     auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
access_log  /home/nginx/log/access_nginx.log accesslog; #设定访问日志的存放路径  
error_log  /home/nginx/log/error_nginx.log error; #设定访问日志的存放路径     
}   
}
以下对于配置的关键几点进行解释:
(1)PID
         pid文件就是一个纯文本文件,里面记录的是进程的pid号。
        nginx使用了pid文件来记录master process的pid号,如果编译时没有指定,那它的路径就是:<prefix/logs/nginx.pid其中<prefix是nginx的安装路径
        如果你想修改默认的pid文件路径,可以在编译时加入配置。(参数如下:: ./configure –-pid-path=/data/test/ngx.pid)
        指定后,默认的pid文件路径就更改为::/data/test/ngx.pid
        如果指定只是路径,没有pid的文件名,那么pid的文件名还是nginx.pid
 
          通过配置文件修改pid
        除了使用默认值和通过编译时修改外,还可以通过在nginx的配置文件中修改。如下:
        pid /data/test/nginx.pid;
        这里修改的值只对使用该配置文件的nginx有效。
 
          用PID文件停止Nginx
        假设pid文件路径为/data/logs/nginx.pid
        kill –QUIT `cat /data/logs/nginx.pid`
 
         用pid文件重新加载配置文件
        kill –HUP `cat /data/logs/nginx.pid`
 
(2)upstream的分配方式
#定义Nginx运行的用户和用户组 user nginx bmsys;   #nginx进程数,建议设置为等于CPU总核心数。  worker_processes 4;  #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log  /home/nginx/log/nginx_error.log info;  #进程文件 pid        /home/nginx/run/nginx.pid;    #使用Tcmalloc优化nginx性能(为google-perftools添加线程目录) google_perftools_profiles /var/tmp/tcmalloc;   #Specifies the value for maximum file descriptors that can be opened by this process. #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。  #ulimit -SHn 65535 worker_rlimit_nofile 65535; #工作模式及连接数上限  #工作模式与连接数上限 events  {    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。 use epoll;    #单个进程最大连接数(最大连接数=连接数*进程数) worker_connections 65535;    #设定http服务器,利用它的反向代理功能提供负载均衡支持  http  {      #设定mime类型      include       mime.types; #文件扩展名与文件类型映射表      default_type  application/octet-stream; #默认文件类型        #charset  utf-8; #默认编码    #设定请求缓冲         server_names_hash_bucket_size 128; #服务器名字的hash表大小     client_header_buffer_size 32k; #上传文件大小限制    large_client_header_buffers 4 32k; #设定请求缓存     client_max_body_size 300m; #设定请求缓存    sendfile on; #注意:如果图片显示不正常把这个改成off。      #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。 #开启目录列表访问,合适下载服务器,默认关闭。 autoindex off;  tcp_nopush     on; #防止网络阻塞  tcp_nodelay    on; #防止网络阻塞 keepalive_timeout 120; #长连接超时时间,单位是秒     server_tokens off;   client_body_buffer_size 512k;   proxy_connect_timeout   5;    proxy_send_timeout      60;    proxy_read_timeout      5;    proxy_buffer_size       16k;    proxy_buffers           4 64k;    proxy_busy_buffers_size 128k;    proxy_temp_file_write_size 128k;   proxy_temp_path /home/nginx/temp_dir; proxy_cache_path /home/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;   #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。 #  fastcgi_connect_timeout 300;    #  fastcgi_send_timeout 300;    #  fastcgi_read_timeout 300;   #  fastcgi_buffer_size 64k;    #  fastcgi_buffers 4 64k;    #  fastcgi_busy_buffers_size 128k;    #  fastcgi_temp_file_write_size 128k;     #gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.1; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_comp_level 2; #压缩等级   #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用 #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。 upstream mybmsys {             server 192.168.48.128:8080 max_fails=3 fail_timeout=30s;             server 192.168.0.104:8080 max_fails=3 fail_timeout=30s; }  

#通过第三方nginx-upstream-jvm-route实现基于JSESSIONID保持会话分发

#upstream myJvmRoute {

           #server 192.168.48.128:8080 srun_id=a;

           #server 192.168.0.102:8088 srun_id=b;

           #jvm_route $cookie_JSESSIONID|sessionid reverse;

 #}

#需要根据cookie转发,查询的cookie的键(key)为JSESSIONID,如果该cookie值(value)以a结尾则转发到apache001,以b结尾则转发到apache002(表达式匹配方式实现) map $COOKIE_JSESSIONID $group {       ~*a$     apache001;       ~*b$     apache002;       default  mybmsys; } upstream apache001 {     server 192.168.48.128:8080 weight=1 max_fails=1 fail_timeout=30s; } upstream apache002 {     server 192.168.0.104:8080 weight=1 max_fails=1 fail_timeout=30s; }   ###禁止通过ip访问站点      #server{           #server_name _;           #return 404;            #}       #定义访问日志的写入格式   #nginx: [warn] the "log_format" directive may be used only on "http"   log_format必须在http层定义。    log_format  accesslog  '$remote_addr - $remote_user [$time_local] "$request"'  '$status $body_bytes_sent "$http_referer"'  '"$http_user_agent" $http_x_forwarded_for'  '"$http_user_agent" "$test_cookie"';   #虚拟主机配置 (可以配置多个,这样就可以通过访问不同的虚拟主机---通过虚名:端口) server   {       listen       8088; #监听端口 NGINX对外访问端口    server_name  192.168.48.128 www.bmsys.com bmsys.com; #域名可以有多个,用空格隔开      index index.html index.htm index.jsp index.do; #设定访问的默认首页地址    root  /home/nginx/cache; #设定网站的资源存放路径         #limit_conn   crawler  20;      if (-d $request_filename)  {            rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;  if ($http_cookie ~* "(.*)$")          {                          set $test_cookie $1; #所有jsp的页面均交由tomcat处理  location ~ \.(jsp|jspx|do)$  {   proxy_set_header  Host $host;     proxy_set_header  X-Real-IP  $remote_addr;   #proxy_pass http://mybmsys; #转向tomcat处理  #实现会话级别的负载均衡 proxy_pass http://$group; }                location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ #设定访问静态文件直接读取不经过tomcat                    proxy_pass http://mybmsys;              proxy_redirect off;             proxy_set_header Host $host;             proxy_cache cache_one;             proxy_cache_valid 200 302 1h;             proxy_cache_valid 301 1d;             proxy_cache_valid any 1m;                     expires 30d;       }        location ~ .*\.(js|css)$                  proxy_pass http://mybmsys;             proxy_redirect off;            proxy_set_header Host $host;            proxy_cache cache_one;            proxy_cache_valid 200 302 1h;            proxy_cache_valid 301 1d;            proxy_cache_valid any 1m;                    expires      1h;       }           #对 "/" 启用反向代理 location / { proxy_pass http://$group; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   #以下是一些反向代理的配置,可选。 proxy_set_header Host $host; client_max_body_size 10m;     #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k;   #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90;      #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90;           #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90;            #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k;         #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k;          #proxy_buffers缓冲区,网页平均在32k以下的设置 proxy_busy_buffers_size 64k;  #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传 } #设定查看Nginx状态的地址 location /NginxStatus {      stub_status on;      access_log on;      auth_basic "NginxStatus";      auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。 } access_log  /home/nginx/log/access_nginx.log accesslog; #设定访问日志的存放路径   error_log  /home/nginx/log/error_nginx.log error; #设定访问日志的存放路径      }    } 以下对于配置的关键几点进行解释: (1)PID          pid文件就是一个纯文本文件,里面记录的是进程的pid号。   (2)upstream的分配方式

upstream test{
    server 192.168.0.1:3000;
    server 192.168.0.1:3001;
}

upstream test{
    server 192.168.0.1:3000;
    server 192.168.0.1:3001;
}

upstream bakend {

              server 192.168.159.10 weight=10

upstream bakend {

              server 192.168.159.10 weight=10
                        server 192.168.159.11 weight=10
                        server 192.168.159.11 weight=10

}

}

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

例如:

3、ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

例如:

upstream resinserver{

upstream resinserver{

ip_hash;

ip_hash;

server 192.168.159.10:8080;

server 192.168.159.10:8080;

server 192.168.159.11:8080;

server 192.168.159.11:8080;

}

}

4、fair(第三方)--需要安装Upstream Fair Balancer Module

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

4、fair(第三方)--需要安装Upstream Fair Balancer Module

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream resinserver{

upstream resinserver{

server server1;

server server2;

server server1;

server server2;

           fair;

           fair;

}

}

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

5、url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

upstream resinserver{

upstream resinserver{

server squid1:3128;

server squid1:3128;

server squid2:3128;

server squid2:3128;

hash $request_uri;

hash $request_uri;

hash_method crc32;

hash_method crc32;

}

}

 

#定义负载均衡设备的Ip及设备状态

upstream resinserver{

 

#定义负载均衡设备的Ip及设备状态

upstream resinserver{

ip_hash;

ip_hash;

server 127.0.0.1:8000 down;

server 127.0.0.1:8000 down;

server 127.0.0.1:8080 weight=2;

server 127.0.0.1:8080 weight=2;

server 127.0.0.1:6801;

server 127.0.0.1:6801;

server 127.0.0.1:6802 backup;

server 127.0.0.1:6802 backup;

}

}

在需要使用负载均衡的server中增加

proxy_pass http://resinserver/;

在需要使用负载均衡的server中增加

proxy_pass http://resinserver/;

 

 

每个设备的状态设置为:

每个设备的状态设置为:

1.down 表示单前的server暂时不参与负载

1.down 表示单前的server暂时不参与负载

2.weight 默认为1.weight越大,负载的权重就越大。

2.weight 默认为1.weight越大,负载的权重就越大。

3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

4.fail_timeout:max_fails次失败后,暂停的时间。

4.fail_timeout:max_fails次失败后,暂停的时间。

5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug

client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug

client_body_temp_path 设置记录文件的目录 可以设置最多3层目录

client_body_temp_path 设置记录文件的目录 可以设置最多3层目录

location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

 
(3)基于会话进行负载(即JSESSIONID
 
(3)基于会话进行负载(即JSESSIONID
          安装nginx-upstream-jvm-route模块
          需要安装第三方模块 nginx-upstream-jvm-route(下载 nginx-upstream-jvm-route-0.1.tar.gz
         nginx@linux-ihah:/home/nginx/program> tar -zxvf nginx-upstream-jvm-route-0.1.tar.gz 
          ngi nx@linux-ihah:/home/nginx/program>cd  nginx-1.2.6
         nginx@linux-ihah:/home/nginx/program/nginx-1.2.6> patch -p0 < ../nginx-upstream-jvm-route-0.1/jvm_route.patch
          nginx@linux-ihah:/home/nginx/program/nginx-1.2.6> ./configure --add-module=/home/nginx/program/nginx-upstream-jvm-route(在原来的配置上新增----解压后的路径)
         接着就是安装nginx.........
 
         Tomcat配置
                 设置 tomcat server.xml,  在两台服务器的 tomcat 的配置文件中分别找到:
               <Engine name="Catalina" defaultHost="localhost" >
          安装nginx-upstream-jvm-route模块           需要安装第三方模块 nginx-upstream-jvm-route(下载 nginx-upstream-jvm-route-0.1.tar.gz          nginx@linux-ihah:/home/nginx/program> tar -zxvf nginx-upstream-jvm-route-0.1.tar.gz            ngi nx@linux-ihah:/home/nginx/program>cd  nginx-1.2.6          nginx@linux-ihah:/home/nginx/program/nginx-1.2.6> patch -p0 < ../nginx-upstream-jvm-route-0.1/jvm_route.patch
分别修改为:
Tomcat01:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="a">
Tomcat02:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="b">
 
NGINX基于SESSION的upstream负载配置
upstream mybmsys {
        server 192.168.2.88:8080 srun_id=a; 
        server 192.168.2.89:8080 srun_id=b;
        jvm_route $cookie_JSESSIONID|sessionid reverse;
}
           
(4)
Nginx 监控NginxStatus显示的内容解释( 用于监控NGINX当前运行的状态)
(4)
Nginx 监控NginxStatus显示的内容解释( 用于监控NGINX当前运行的状态)

 

#设定查看Nginx状态的地址

location /NginxStatus {

      stub_status on;

      access_log on;

      auth_basic "NginxStatus";

      auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。

      allow 192.168.48.1/24; #限访问IP来控制访问的IP地址。

      deny all;#全部拒绝,除了制定的IP。

}

以上这个配置以后,必须密码输入正确,同时是指定的IP访问。

Active connections: 364

 

#设定查看Nginx状态的地址

location /NginxStatus {

      stub_status on;

      access_log on;

      auth_basic "NginxStatus";

      auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。

      allow 192.168.48.1/24; #限访问IP来控制访问的IP地址。

      deny all;#全部拒绝,除了制定的IP。

}

以上这个配置以后,必须密码输入正确,同时是指定的IP访问。

Active connections: 364

 

#设定查看Nginx状态的地址

location /NginxStatus {

      stub_status on;

      access_log on;

      auth_basic "NginxStatus";

      auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。

      allow 192.168.48.1/24; #限访问IP来控制访问的IP地址。

      deny all;#全部拒绝,除了制定的IP。

}

以上这个配置以后,必须密码输入正确,同时是指定的IP访问。

Active connections: 364

 

#设定查看Nginx状态的地址

location /NginxStatus {

      stub_status on;

      access_log on;

      auth_basic "NginxStatus";

      auth_basic_user_file conf/htpasswd;#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。

      allow 192.168.48.1/24; #限访问IP来控制访问的IP地址。

      deny all;#全部拒绝,除了制定的IP。

}

以上这个配置以后,必须密码输入正确,同时是指定的IP访问。

Active connections: 364

server accepts handled requests

server accepts handled requests

server accepts handled requests

server accepts handled requests

5477919 5477919 17515830

5477919 5477919 17515830

5477919 5477919 17515830

5477919 5477919 17515830

Reading: 10 Writing: 26 Waiting: 328

Reading: 10 Writing: 26 Waiting: 328

Reading: 10 Writing: 26 Waiting: 328

Reading: 10 Writing: 26 Waiting: 328

 

 

 

 

NginxStatus 显示的内容意思如下:

NginxStatus 显示的内容意思如下:

NginxStatus 显示的内容意思如下:

NginxStatus 显示的内容意思如下:

active connections – 当前 Nginx 正处理的活动连接数。

active connections – 当前 Nginx 正处理的活动连接数。

active connections – 当前 Nginx 正处理的活动连接数。

active connections – 当前 Nginx 正处理的活动连接数。

serveraccepts handled requests -- 总共处理了 5477919 个连接 , 成功创建 5477919 次握手 (证明中间没有失败的 ), 总共处理了 17515830 个请求 ( 平均每次握手处理了 3.2 个数据请求 )。

serveraccepts handled requests -- 总共处理了 5477919 个连接 , 成功创建 5477919 次握手 (证明中间没有失败的 ), 总共处理了 17515830 个请求 ( 平均每次握手处理了 3.2 个数据请求 )。

serveraccepts handled requests -- 总共处理了 5477919 个连接 , 成功创建 5477919 次握手 (证明中间没有失败的 ), 总共处理了 17515830 个请求 ( 平均每次握手处理了 3.2 个数据请求 )。

serveraccepts handled requests -- 总共处理了 5477919 个连接 , 成功创建 5477919 次握手 (证明中间没有失败的 ), 总共处理了 17515830 个请求 ( 平均每次握手处理了 3.2 个数据请求 )。

reading -- nginx 读取到客户端的 Header 信息数。

reading -- nginx 读取到客户端的 Header 信息数。

reading -- nginx 读取到客户端的 Header 信息数。

reading -- nginx 读取到客户端的 Header 信息数。

writing -- nginx 返回给客户端的 Header 信息数。

writing -- nginx 返回给客户端的 Header 信息数。

writing -- nginx 返回给客户端的 Header 信息数。

writing -- nginx 返回给客户端的 Header 信息数。

waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。

 

(5)apache提供的htpasswd工具使用说明

 安装Apache核心httpd(只介绍加密工具使用,其它不做介绍):

> wget http://mirrors.hust.edu.cn/apache//httpd/httpd-2.4.9.tar.gz 

> tar -zxvf httpd-2.4.9.tar.gz

> cd httpd-2.4.9

> make && make install

安装结束以后,查看最后显示的安装路劲是什么(默认是:/usr/local/apache2),当然了你自己也可以指定。

 

使用htpasswd命令生成加密文件:

> cd /usr/local/apache2/bin/

> ./htpasswd -cb ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

 

关于htpasswd命令使用说明:

 

apache htpasswd命令选项参数说明

  -c 创建一个加密文件

  -n 不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上

  -m 默认apache htpassswd命令采用MD5算法对密码进行加密

  -d apache htpassswd命令采用CRYPT算法对密码进行加密

  -p apache htpassswd命令不对密码进行进行加密,即明文密码

  -s apache htpassswd命令采用SHA算法对密码进行加密

  -b 在apache htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码

  -D 删除指定的用户

apache htpasswd命令用法实例

 

(1)利用htpasswd命令添加用户

  htpasswd -bc ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

(2)在原有密码文件中增加下一个用户

  htpasswd -b ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

(3)如何不更新密码文件,只显示加密后的用户名和密码

  htpasswd -nb mignlei 1234 ----查看对用户名和密码加密后的结果。例如:minglei:$apr1$.iyB/i6u$j2p7qpXN5.IwqLnmlqD/m0

(4)利用htpasswd命令删除用户名和密码

  htpasswd -D ./home/nginx/program/nginx/conf/conf/htpasswd minglei

(5)利用htpasswd命令修改密码

  htpasswd -D ./home/nginx/program/nginx/conf/conf/htpasswd minglei   -----提示输入密码

  htpasswd -b ./home/nginx/program/nginx/conf/conf/htpasswd minglei 789456 ----直接修改密码为789456

(6)
NGINX启动,重启,关闭命令
主进程可以处理以下的信号:
TERM, INT 快速关闭
QUIT 从容关闭
HUP 重载配置
用新的配置开始新的工作进程
从容关闭旧的工作进程
USR1 重新打开日志文件
USR2 平滑升级可执行程序。
WINCH 从容关闭工作进程                               

尽管你不必自己操作工作进程,但是,它们也支持一些信号:

TERM, INT 快速关闭                                             
QUIT 从容关闭
USR1 重新打开日志文件

       
 

(5)apache提供的htpasswd工具使用说明

 安装Apache核心httpd(只介绍加密工具使用,其它不做介绍):

> wget http://mirrors.hust.edu.cn/apache//httpd/httpd-2.4.9.tar.gz 

> tar -zxvf httpd-2.4.9.tar.gz

> cd httpd-2.4.9

> make && make install

安装结束以后,查看最后显示的安装路劲是什么(默认是:/usr/local/apache2),当然了你自己也可以指定。

 

使用htpasswd命令生成加密文件:

> cd /usr/local/apache2/bin/

> ./htpasswd -cb ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

 

关于htpasswd命令使用说明:

 

apache htpasswd命令选项参数说明

  -c 创建一个加密文件

  -n 不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上

  -m 默认apache htpassswd命令采用MD5算法对密码进行加密

  -d apache htpassswd命令采用CRYPT算法对密码进行加密

  -p apache htpassswd命令不对密码进行进行加密,即明文密码

  -s apache htpassswd命令采用SHA算法对密码进行加密

  -b 在apache htpassswd命令行中一并输入用户名和密码而不是根据提示输入密码

  -D 删除指定的用户

apache htpasswd命令用法实例

 

(1)利用htpasswd命令添加用户

  htpasswd -bc ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

(2)在原有密码文件中增加下一个用户

  htpasswd -b ./home/nginx/program/nginx/conf/conf/htpasswd minglei 521775

(3)如何不更新密码文件,只显示加密后的用户名和密码

  htpasswd -nb mignlei 1234 ----查看对用户名和密码加密后的结果。例如:minglei:$apr1$.iyB/i6u$j2p7qpXN5.IwqLnmlqD/m0

(4)利用htpasswd命令删除用户名和密码

  htpasswd -D ./home/nginx/program/nginx/conf/conf/htpasswd minglei

(5)利用htpasswd命令修改密码

  htpasswd -D ./home/nginx/program/nginx/conf/conf/htpasswd minglei   -----提示输入密码

  htpasswd -b ./home/nginx/program/nginx/conf/conf/htpasswd minglei 789456 ----直接修改密码为789456

(6)
NGINX启动,重启,关闭命令 主进程可以处理以下的信号:        

启动Nginx

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf        
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf        
停止操作
停止操作 停止操作是通过向nginx进程发送信号(什么是信号请参阅linux文 章)来进行的 步骤1:查询nginx主进程号 ps -ef | grep nginx 在进程列表里 面找master进程,它的编号就是主进程号了。 步骤2:发送信号 从容停止Nginx: kill -QUIT 主进程号 快速停止Nginx: kill -TERM 主进程号 强制停止Nginx: pkill -9 nginx 另外, 若在nginx.conf配置了pid文件存放路径则该文件存放的就是Nginx主进程号,如果没指定则放在nginx的logs目录下。有了pid文 件,我们就不用先查询Nginx的主进程号,而直接向Nginx发送信号了,命令如下: kill -信号类型 '/usr/nginx/logs/nginx.pid'   平滑重启 如果更改了配置就要重启Nginx,要先关闭Nginx再打开?不是的,可以向Nginx 发送信号,平滑重启。 平滑重启命令: kill -HUP 住进称号或进程号文件路径

或者使用

/usr/nginx/sbin/nginx -s reload

注意,修改了配置文件后最好先检查一下修改过的配置文件是否正 确,以免重启后Nginx出现错误影响服务器稳定运行。判断Nginx配置是否正确命令如下: nginx -t -c /usr/nginx/conf/nginx.conf

或者

/usr/nginx/sbin/nginx -t     平滑升级 如果服务器正在运行的Nginx要进行升级、添加或删除模块时,我们需 要停掉服务器并做相应修改,这样服务器就要在一段时间内停止服务,Nginx可以在不停机的情况下进行各种升级动作而不影响服务器运行。 步骤1: 如 果升级Nginx程序,先用新程序替换旧程序文件,编译安装的话新程序直接编译到Nginx安装目录中。 步 骤2:执行命令 kill -USR2 旧版程序的主进程号或进程文件名 此时旧的Nginx主进程将会把自己的进程文件改名为.oldbin,然后执行新版 Nginx。新旧Nginx会同市运行,共同处理请求。 这时要逐步停止旧版 Nginx,输入命令: kill -WINCH 旧版主进程号 慢慢旧的工作进程就都会随着任务执行完毕而退出,新版的Nginx的工作进程会逐渐取代旧版 工作进程。   此 时,我们可以决定使用新版还是恢复到旧版。 不重载配置启动新/旧工作进程 kill -HUP 旧/新版主进程号 从容关闭旧/新进程 kill -QUIT 旧/新主进程号 如果此时报错,提示还有进程没有结束就用下面命令先关闭旧/新工作进程,再关闭主进程号: kill -TERM 旧/新工作进程号  
第四步:验证
1. 例如:192.168.48.128:8080---对应Tomcat01;192.168.0.104:8080---对应Tomcat01。
2.  针对SESSSION保持分配方式进行测试进行-----这里需要结合上面的说明对nginx.conf略作修改。
3. 分别在两个tomcat中的webapps下面建立aa文件夹,在里面建立要测试的index.jsp文件,内容如下: 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
%> 
<html> 
<head> 
    </head> 
      <body> 
       88 
       <!--server1 这里为 88888;server2 需要改为  99999这样才能区分是否保值会话了 --> 
        <br /> 
       <%out.print(request.getSession()) ;%> 
       <!--输出session--> 
        <br /> 
        <%out.println(request.getHeader("Cookie")); %> 
      <!--输出Cookie--> 
      </body> 
</html> 
4. 启动NGINX与两个TOMCAT
5. 打开浏览器测试
    打开IE浏览器,输入:http://192.168.48.128:8088/aa/ 
     刷新了N次还都是888888,也就是会话保持补丁起作用了,cookie 值也获得了,为了测试,我又打开了“火狐”(因为session 和 cookie问题所以从新打开别的浏览器)。
     输入网址: http://192.168.48.128:8088/aa/ 
     显示999999,刷新N次后还是999999。
   注意: 把 nginx 配置文件的srun_id=a srun_id=b 去掉,然后在访问,就会知道页面是轮询访问得了。
 

第五步:性能测试

 

摘自:http://down.chinaz.com/server/201202/1671_1.htm

目前较为常见的网站压力测试工具有webbench、ab(apache bench)、tcpcopy、loadrunner。

webbench由Lionbridge公司开发,主要测试每秒钟请求数和每秒钟数据传输量,同时支持静态、动态、SSL,部署简单,静动态均可测试。适用于小型网站压力测试(单例最多可模拟3万并发) 。

ab(apache bench)Apache自带的压力测试工具,主要功能用于测试网站每秒钟处理请求个数,多见用于静态压力测试,功能较弱,非专业压力测试工具。

tcpcopy基于底层应用请求复制,可转发各种在线请求到测试服务器,具有分布式压力测试功能,所测试数据与实际生产数据较为接近后起之秀,主要用于中大型压力测试,所有基于tcp的packets均可测试。

loadrunner压力测试界的泰斗,可以创建虚拟用户,可以模拟用户真实访问流程从而录制成脚本,其测试结果也最为逼真模拟最为逼真,并可进行独立的单元测试,但是部署配置较为复杂,需要专业人员才可以。

以webbench为例,来讲解一下网站在上线之前压力测试是如何做的:

   安装webbench

    >  wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz

    >  tar -zxvf webbench-1.5.tar.gz

    >  cd webbench-1.5

    >  make && make install

   进行压力测试,并发200时。

   webbench-c 200-t 60 http://192.168.48.128:8088/Test/index.jsp

    参数解释:-c为并发数,-t为时间(秒)

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

    200 clients, running 60 sec.

    Speed=1454 pages/min,2153340 bytes/sec.

    Requests:1454 susceed,0 failed.

    当并发200时,网站访问速度正常.

   并发800时

   webbench-c 800-t 60 http://192.168.48.128:8088/Test/index.jsp

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

    800 clients, running 60 sec.

    Speed=1194 pages/min,2057881 bytes/sec.

    Requests:1185 susceed,9 failed.

    当并发连接为800时,网站访问速度稍慢.

    并发1600时

   webbench-c 1600-t 60 http://192.168.48.128:8088/Test/index.jsp

     Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

     Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

     1600 clients, running 60 sec.

     Speed=1256 pages/min,1983506 bytes/sec.

     Requests:1183 susceed,73 failed.

    当并发连接为1600时,网站访问速度便非常慢了.

    并发2000时

    webbench-c 2000-t 60 http://192.168.48.128:8088/Test/index.jsp

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

   2000 clients, running 60 sec.

    Speed=2154 pages/min,1968292 bytes/sec.

    Requests:2076 susceed,78 failed.

    当并发2000时,网站便出现"502 Bad Gateway",由此可见web服务器已无法再处理用户访问请求.

总结:

1、压力测试工作应该放到产品上线之前,而不是上线以后。

2、测试时尽量跨公网进行,而不是内网。

3、测试时并发应当由小逐渐加大,比如并发100时观察一下网站负载是多少、打开是否流程,并发200时又是多少、网站打开缓慢时并发是多少、网站打不开时并发又是多少。

4、 应尽量进行单元测试,如B2C网站可以着重测试购物车、推广页面等,因为这些页面占整个网站访问量比重较大。

第四步:验证 1. 例如:192.168.48.128:8080---对应Tomcat01;192.168.0.104:8080---对应Tomcat01。 2.  针对SESSSION保持分配方式进行测试进行-----这里需要结合上面的说明对nginx.conf略作修改。 3. 分别在两个tomcat中的webapps下面建立aa文件夹,在里面建立要测试的index.jsp文件,内容如下: 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
%> 
<html> 
<head> 
    </head> 
      <body> 
       88 
       <!--server1 这里为 88888;server2 需要改为  99999这样才能区分是否保值会话了 --> 
        <br /> 
       <%out.print(request.getSession()) ;%> 
       <!--输出session--> 
        <br /> 
        <%out.println(request.getHeader("Cookie")); %> 
      <!--输出Cookie--> 
      </body> 
</html> 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
<% 
%> 
<html> 
<head> 
    </head> 
      <body> 
       88 
       <!--server1 这里为 88888;server2 需要改为  99999这样才能区分是否保值会话了 --> 
        <br /> 
       <%out.print(request.getSession()) ;%> 
       <!--输出session--> 
        <br /> 
        <%out.println(request.getHeader("Cookie")); %> 
      <!--输出Cookie--> 
      </body> 
</html>  4. 启动NGINX与两个TOMCAT 5. 打开浏览器测试     打开IE浏览器,输入:http://192.168.48.128:8088/aa/ 
     刷新了N次还都是888888,也就是会话保持补丁起作用了,cookie 值也获得了,为了测试,我又打开了“火狐”(因为session 和 cookie问题所以从新打开别的浏览器)。      输入网址: http://192.168.48.128:8088/aa/ 
     显示999999,刷新N次后还是999999。    注意: 把 nginx 配置文件的srun_id=a srun_id=b 去掉,然后在访问,就会知道页面是轮询访问得了。    参考: http://www.howtocn.org/nginx  

第五步:性能测试

 

摘自:http://down.chinaz.com/server/201202/1671_1.htm

目前较为常见的网站压力测试工具有webbench、ab(apache bench)、tcpcopy、loadrunner。

webbench由Lionbridge公司开发,主要测试每秒钟请求数和每秒钟数据传输量,同时支持静态、动态、SSL,部署简单,静动态均可测试。适用于小型网站压力测试(单例最多可模拟3万并发) 。

ab(apache bench)Apache自带的压力测试工具,主要功能用于测试网站每秒钟处理请求个数,多见用于静态压力测试,功能较弱,非专业压力测试工具。

tcpcopy基于底层应用请求复制,可转发各种在线请求到测试服务器,具有分布式压力测试功能,所测试数据与实际生产数据较为接近后起之秀,主要用于中大型压力测试,所有基于tcp的packets均可测试。

loadrunner压力测试界的泰斗,可以创建虚拟用户,可以模拟用户真实访问流程从而录制成脚本,其测试结果也最为逼真模拟最为逼真,并可进行独立的单元测试,但是部署配置较为复杂,需要专业人员才可以。

以webbench为例,来讲解一下网站在上线之前压力测试是如何做的:

   安装webbench

    >  wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz

    >  tar -zxvf webbench-1.5.tar.gz

    >  cd webbench-1.5

    >  make && make install

   进行压力测试,并发200时。

   webbench-c 200-t 60 http://192.168.48.128:8088/Test/index.jsp

    参数解释:-c为并发数,-t为时间(秒)

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

    200 clients, running 60 sec.

    Speed=1454 pages/min,2153340 bytes/sec.

    Requests:1454 susceed,0 failed.

    当并发200时,网站访问速度正常.

   并发800时

   webbench-c 800-t 60 http://192.168.48.128:8088/Test/index.jsp

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

    800 clients, running 60 sec.

    Speed=1194 pages/min,2057881 bytes/sec.

    Requests:1185 susceed,9 failed.

    当并发连接为800时,网站访问速度稍慢.

    并发1600时

   webbench-c 1600-t 60 http://192.168.48.128:8088/Test/index.jsp

     Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

     Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

     1600 clients, running 60 sec.

     Speed=1256 pages/min,1983506 bytes/sec.

     Requests:1183 susceed,73 failed.

    当并发连接为1600时,网站访问速度便非常慢了.

    并发2000时

    webbench-c 2000-t 60 http://192.168.48.128:8088/Test/index.jsp

    Webbench - Simple Web Benchmark 1.5Copyright(c) Radim Kolar 1997-2004, GPL Open SourceSoftware.

    Benchmarking:GET http://192.168.48.128:8088/Test/index.jsp

   2000 clients, running 60 sec.

    Speed=2154 pages/min,1968292 bytes/sec.

    Requests:2076 susceed,78 failed.

    当并发2000时,网站便出现"502 Bad Gateway",由此可见web服务器已无法再处理用户访问请求.

总结:

1、压力测试工作应该放到产品上线之前,而不是上线以后。

2、测试时尽量跨公网进行,而不是内网。

3、测试时并发应当由小逐渐加大,比如并发100时观察一下网站负载是多少、打开是否流程,并发200时又是多少、网站打开缓慢时并发是多少、网站打不开时并发又是多少。

4、 应尽量进行单元测试,如B2C网站可以着重测试购物车、推广页面等,因为这些页面占整个网站访问量比重较大。

猜你喜欢

转载自mljavalife.iteye.com/blog/1779444