Linux系统下WEB服务器的架设与性能优化

 

Linux系统下WEB服务器的架设与性能优化
一:概述 Linux系统的特点与发展
简单地说, Linux是一套免费使用和自由传播的类 Unix操作系统,它主要用于基于 Intel x86系列 CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的 Unix兼容产品。 Linux的出现,最早开始于一位名叫 Linus Torvalds的计算机业余爱好者,当时他是芬兰赫尔辛基大学的学生。他的目的是想设计一个代替 Minix(是由一位名叫 Andrew Tannebaum的计算机教授编写的一个操作系统示教程序)的操作系统,这个操作系统可用于 386、 486或奔腾处理器的个人
计算机上,并且具有 Unix操作系统的全部功能,因而开始了 Linux雏形的设计。Linux以它的高效性和灵活性著称。它能够在 PC计算机上实现全部的 Unix特性,具有多任务、多用户的能力。 Linux是在 GNU公共许可权限下免费获得的,是一个符合 POSIX标准的操作系统。 Linux操作系统软件包不仅包括完整的 Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的 X-Windows图形用户界面,如同我们使用 Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。
二:WEB服务器---Apache
Apache是世界使用排名第一的Web服务器。它可以运行在几乎所有广泛使用的计算机平台上。 Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简 单、速度快、性能稳定,并可做代理服务器来使用。
本来它只用于小型或试验Internet网络,后来逐步扩充到各种Unix系统中,尤其对Linux的支持相当完美。Apache有多种产品,可以支持 SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左 右。世界上很多著名的网站如Amazon.com、Yahoo!、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、 Windows、Linux系统平台上)以及它的可移植性等方面。
     Apache的诞生极富有戏剧性。当NCSA WWW服务器项目停顿后,那些使用NCSA WWW服务器的人们开始交换他们用于该服务器的补丁程序,他们也很快认识到成立管理这些补丁程序的论坛是必要的。就这样,诞生了Apache Group,后来这个团体在NCSA的基础上创建了Apache。
1、Apache安装
在Linux系统下安装软件主要有两种方式,rpm包和tar包,一般在系统安装时就会将Apache的rpm包安装好,由于目前Apache被重新命名为httpd,因此可以用下面的命令查看系统中是否安装Apache以及其版本:
rpm –q httpd
命令执行结果如果出现httpd not installed则表明没有安装Apache,否则会显示版本。
对于没有安装rpm的用户,我们可以到Apache的官方网站www.apache.org下载最新的tar包来进行安装,具体步骤如下:
tar zvxf apache_2.0.54.tar.gz
cd apache_2.0.54
vi src/include/httpd.h
#define HARD_SERVER_LIMIT 256
为增大最大线程数,改成:
#define HARD_SERVER_LIMIT 2560
保存退出编译apache。
./configure --prefix=/usr/local/apache --enable-module=so
make
make install
apache安装好了,启动apache:
/etc/init.d/httpd start
然后用IE打开http://127.0.0.1,应该能看到熟悉的apache羽毛标志。
2、Apache基本配置
早期Apache服务器版本里,其配置内容分散在httpd.conf、srm.conf、access.conf三个文件里。而新版本的Apache服 务器,则统一在httpd.conf里进行配置。对于默认安装的Red Hat Linux来说,该配置文件位于/etc/httpd/conf目录下,如果安装的是tar.gz版本,则该文件位于/usr/local/apache /conf目录。
利用httpd.conf,我们可以对Apache服务器进行全局配置、主要或预设服务器的参数定义、虚拟主机的设置。httpd.conf是一个文本文 件,我们可以用Vi、Kate等文本编辑工具进行修改。通过分析该httpd.conf配置文件,我们不难发现该配置文件分为若干个小节,例如 Section 1: Global Environment(全局环境);Section 2: 'Main' server configuration(主服务器配置)。 每个小节都有若干个配置参数,其表达形式为“配置参数名称 具体值”,每个配置参数都有详尽的英文解释(用#号引导每一个注释行)。
为了帮助大家理解,这里给出httpd.conf的最常用配置参数:
(1) DocumentRoot
该参数指定Apache服务器存放网页的路径,默认所有要求提供HTTP服务的连接,都以这个目录为主目录。以下为Apache的默认值:
(2)   DocumentRoot "/var/www/html"
(3) (2)MaxClients
(4) 该参数限制Apache所能提供服务的最高数值,即同一时间连接的数目不能超过这个数值。一旦连接数目达到这个限制,Apache服务器则不再为别的连接提供服务,以免系统性能大幅度下降。本例假设最大连接数是150个: MaxClients 150
(5) (3)Port
(6) 该参数用来指定Apache服务器的监听端口。一般来说,标准的HTTP服务默认端口号是80,一般不要更改这个数值。本例为80端口: Port 80
(7)   (4)ServerName
(8) 该参数使得用户可以自行设置主机名,以取代安装Apache服务器主机的真实名字。此名字必须是已经在DNS服务器上注册的主机名。如果当前主机没有已注册的名字,也可以指定IP地址。本例将服务器名设为huanxun.cn
ServerName huanxun.cn
(5)MaxKeepAliveRequests
当使用保持连接(Persistent Connection)功能时,可以使用本参数决定每次连接所能发出的要求数目的上限。如果此数值为0,则表示没有限制。建议尽可能使用较高的数值,以充 分发挥Apache的高性能,本例设置每次连接所能发出的要求数目上限为100:MaxKeepAliveRequests 100   
(6)MaxRequestsPerChild
该参数限制每个子进程(Child Process)在结束前所能处理的请求数目,一旦达到该数目,这个子进程就会被中止,以避免长时间占据Apache(或者Apache服务器所采用的函数库),防止造成内存或者其他系统资源的超负荷。
需要注意的是,该参数的数值并不包括保持连接所发出的请求数目。举例说明,如果某个子进程负责某一个请求,该请求随后带来保持连接功能所需的10个请求, 这时候对于该参数而言,Apache服务器会认为这个子进程只处理了1个要求,而非11个要求。以下设置最多可以处理10个要 求:MaxRequestsPerChild 10
(7)MaxSpareServers 和MinSpareServers
提供Web服务的HTTP守护进程,其数目会随连接的数目而变动。Apache服务器采用动态调整的方法,维持足够的HTTP守护进程数目,以处理目前的负载,也就是同时保持一定的空闲HTTP守护进程来等候新的连接请求。
Apache会定期检查有多少个HTTP守护进程正在等待连接请求,如果空闲的HTTP守护进程多于MaxSpareServers参数指定的值,则 Apache会终止某些空闲进程;如果空闲HTTP守护进程少于MinSpareServers参数指定的值,则Apache会产生新的HTTP守护进 程。本例将最高空闲守护进程设置为20个,将最低的空闲守护进程设置为5个:
MaxSpareServers 20   MinSpareServers 5
当然这只是Apache的一些基本设置项,可以根据自己的实际情况加以灵活的修改,以充分发挥Apache的潜能。如果修改配置文件之后没能立即生效,可以重启Apache服务。  
3、图形化配置界面
图形化配置直观、简单,足够应付Apache服务器的日常管理维护工作。我们可以通过单击“主菜单→系统设置→服务器设置→HTTP服务器”菜单项,或者 直接在“运行命令”对话框里输入“apacheconf”命令并回车,来访问“Apache配置”对话框。可以看到该配置对话框共有4个标签页。
(1)“主”标签页
在“服务器名”框中可以输入服务器的名称,等同于httpd.conf文件里的“ServerName”字段。“网主电子邮件地址”框中可以输入管理员的 邮件地址,等同于httpd.conf文件里的“ServerAdmin”字段。单击“可用地址”选项组中的“添加”(或者“编辑”)按钮,我们可以添加 或者修改服务器的IP地址和端口。
(2)“虚拟主机”标签页
所谓的虚拟主机服务就是指将一台计算机虚拟成多台Web服务器。利用Apache服务器提供的“虚拟主机”服务,我们可以利用一台计算机提供多个Web服务。
用Apache设置虚拟主机服务通常可以采用两种方案:基于IP地址的虚拟主机和基于名字的虚拟主机。基于IP地址的虚拟主机的实现方法有一个严重的不足,每增加一个虚拟主机,就必须增加一个IP地址。所以这里介绍如何创建基于名字的虚拟主机。
假设一台Apache服务器的IP地址是61.135.160.84,主机名称为同时它拥有两个别名:bbs.huanxun.cn、 123.huanxun.cn。虽然这2个网站的IP地址相同,都指向61.135.160.84,但是由于架设了基于名字的虚拟主机,所以可以指向不同 的网页。
4、Apache 优化
Apache主要是一个内存消耗型的服务应用,我个人总结的经验公 式:apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢?原因是在 低负载下系统可以使用更多的内存用于文件系统的缓存,从而进一步提高单个请求的响应速度。在高负载下,系统的单个请求响应速度会慢不少,而超过 apache_max_process,系统会因为开始使用硬盘做虚拟内存交换空间而导致系统效率急剧下降。此外,同样的服务:2G内存的机器的 apache_max_process一般只设置到1G内存的1.7倍,因为Apache本身会因为进程过多导致性能下降。
例子1:一个apache + mod_php的服务器:一个apache进程一般需要4M内存
因此在一个1G内存的机器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500,apache_max_process = 500 * 1.5 = 750,所以规划你的应用让服务尽量跑在500个进程以下以保持比较高的效率,并设置Apache的软上限在800个。
例子2:一个apache + mod_resin的服务器: 一个apache进程一般需要2M内存
在一个2G内存的机器上:apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000,apache_max_process = 2000 * 1.5 = 3000
以上估算都是按小文件服务估算的(一个请求一般大小在20k以下)。对于文件下载类型站点,可能还会受其他因素:比如带宽等的影响。
所以在Apache安装过程中,服务器个数的硬上限HARD_SERVER_LIMIT的修改--将原来的HARD_SERVER_LIMIT 256 后面加个“0
vi apache_2.0.54/src/include/httpd.h
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560
#endif
解释:Apache缺省的最大用户数是256个:这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置,但随着内存成本的急剧下降,现在 大型站点的服务器内存配置一般比当时要高一个数量级不止。所以256个进程的硬限制对于一台1G内存的机器来说是太浪费了,而且Apache的软上限 max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服务器内存大于256M,都应该调高Apache的 HARD_SERVER_LIMIT。根据个人的经验:2560已经可以满足大部分小于2G内存的服务器的容量规划了。
apache的缺省配置文件一般比较大:可以使用去掉注释的方法精简一下:然后再进入具体的培植过程能让你更快的定制出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf
需要修改的通用项目有以下几个:
#服务端口,缺省是8080,建议将整个Apache配置调整好后再将服务端口改到正式服务的端口
Port 8080 => 80
#服务器名:缺省没有
ServerName name.example.com
#最大服务进程数:根据服务容量预测设置
MaxClients 256 => 800
#缺省启动服务后的服务进程数:等服务比较平稳后,按平均负载下的httpd个数设置就可以
StartServers 5 => 200
不要修改,以前有建议说修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200
但从我的经验看来:缺省值已经是非常优化的了,而且让Apache自己调整子共享进程个数还是比较好的。
特别修改:在Solaris系统或一些比较容易出现内存泄露的应用 MaxRequestsPerChild 0 =>3000
三:tomcat在web服务器中的应用
JSP是由Sun微系统公司于1999年6月推出的一项技术。它基于Java Servlet技术,是整个J2EE体系中一项重要的Web开发技术。利用这一技术可以建立先进、安全和跨平台的动态网站。 JSP技术是目前主流Web技术中应用最广泛的一种,它可以让Web开发人员和设计人员非常容易地创建和维护动态网页。作为JavaTM技术的一部 分,JSP能够快速开发出基于Web、独立于平台的应用程序。JSP把用户界面从系统内容中分离出来,使得设计人员能够在不改变底层动态内容的前提下改变 整个网页布局。JSP的优势在于能够开发大型的具有良好扩充性的程序,所以目前的许多大型商业系统都采用了JSP技术。
而Apache本身是不支持JSP的,它无法独立解释JSP脚本语句,需要JSP容器(如Tomcat)的支持,通过整合tomcat和apache来运行JSP程序。
这里我们又不得不需要提到的是J2DK—java开发工具包的缩写,它是一种用于构建在java平台上发布的应用程序、applet和组件的开发环境。一 切java应用程序的基础,所有的java应用程序都是构建在J2DK 上的,它是一组API,也可以说是一些Java Class。Tomcat的运行需要J2DK的支持,我们需要先安装J2DK。
1、安装J2DK:
J2DK的下载可以访问http://java.sun.com.
J2DK的安装文件是一个可执行文件,先执行以下命令为其增加运行权限:
chmod +x jdk-1_5_0_05-linux-i586-rpm.bin
安装:
./jdk-1_5_0_05-linux-i586-rpm.bin
建立符号连接:
ln -s /usr/java/jdk1.5.0_05 /usr/jdk
2、安装tomcat
Tomcat的下载可以到http://jakarta.apache.org/,然后执行:
tar zxvf jakarta-tomcat-5.5.9.tar.gz -C /usr/local/
建立符号连接:
ln -s /usr/local/jakarta-tomcat-5.5.9/ /usr/local/tomcat
3、配置tomcat:
vi /usr/local/tomcat/bin/startup.sh
vi /usr/local/tomcat/bin/shutdown.sh
分别在#------------------------#后添加如下语句:
export JAVA_HOME=/usr/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib
使用vi /etc/rc.d/rc.local打开自启动文件添加/usr/local/tomcat/bin/startup.sh以实现服务的开机启动。
Tomcat的测试地址是:http://127.0.0.1:8080
4、整合apache和tomcat
vi /data0/apache/conf/httpd.conf ,添加
LoadModule jk_module modules/mod_jk.so
JkWorkersFile /data0/apache/conf/workers.properties
JkLogFile /data0/apache/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
<VirtualHost *:80>
DocumentRoot /data1/sc_cms
ServerName 61.135.160.83
JkMount /wholesearch/* worker1
JkMount /duanweichang/* jvm1
JkMount /databaser/* jvm1
</VirtualHost>
同时更改各tomcat配置,
#vi /usr/local/tomcat/conf/server.xml
<Connector port="8009"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"
redirectPort="8443" protocol="AJP/1.3" />
在119行左右加入如下语句:
<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1"></Engine>
若第二台tomcat,将jvmRoute的修改为tomcat2
5、配置tomcat群集,实现负载均衡
http://www.apache.org下载tomcat-connectors,执行如下命令:
tar xzvf tomcat-connectors-1.2.19-src.tar.gz
cd native
./configure --with-apxs=/data0/apache/bin/apxs
新建workers.properties
vi /data0/apache/conf/workers.properties
# Define 1 real worker using ajp13
worker.list=worker1,jvm1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.reclycle_timeout=300

worker.jvm1.port=8009
worker.jvm1.host=61.135.160.84
worker.jvm1.type=ajp13
worker.jvm1.socket_keepalive=true
6. 优化
Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机。您可以选择自己的需要选择不同的操作系统和对应的 JDK的版本(只要是符合Sun发布的Java规范的),但我们推荐您使用Sun公司发布的JDK。确保您所使用的版本是最新的,因为Sun公司和其它一 些公司一直在为提高性能而对java虚拟机做一些升级改进。一些报告显示JDK1.4在性能上比JDK1.3提高了将近10%到20%。
可以给Java虚拟机设置使用的内存,但是如果你的选择不对的话,虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。
参数                                  描述
-Xms<size>                        JVM初始化堆的大小
-Xmx<size>                        JVM堆的最大值
这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载 的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必 须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用 程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的 最大值设置为可用内存的最大值的80%。
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,需要调大。
linnux下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下设置:
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'
需要把这个两个参数值调大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化内存为256MB,可以使用的最大内存为512MB。
另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分 析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很 快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的 大小设大,保证垃圾收集不在整个基准测试的过程中出现。
如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值