大部分内容来自于公司内网的整理,因为个人在日常工作中使用这块的时候也是经常借助于内网。在日常工作中可以多参考内网的Apache资料专题和搜索Apache的相关文章
为什么使用Apache
从Apache自身来看:
Apache是最主流的Web服务器
Apache非常高效和安全,全球访问量最大的站点除了MSN都是由apache来完成服务的,IIS以往的安全漏洞非常著名 Apache易于使用和配置
从Java动态应用来看:
建议安装一个apache来服务静态网页和图片等,动态请求也由apache来转发,这样可以提高负载能力和性能
动态应用由应用服务器的HTTP线程池调度,资源宝贵【演示:通过kill -3来查看线程池的情况,以及Tomcat中如何配置线程】 从任何一个网站来看,静态请求和动态请求之间的比例往往大于10:1;静态资源的并发压力大于动态资源,对线程池等资源消耗过大;
部分Tomcat本身发布静态资源不太稳定,有内存泄漏的现象;
如何编译Apache
Apache目前主要有Apache1.3,2.0和2.2三个系列,推荐使用最新的2.2系列。 Apache的部署手册:http://httpd.apache.org/docs/2.2/install.html 中的官方步骤: 解压缩:
$gzip -d httpd-NN.tar.gz
$ tar xvf httpd-NN.tar $ cd httpd-NN
可以使用tar –zxvf httpd-NN.tar.gz 配置:./configure --prefix=PREFIX 编译:make
安装:make install
定制参数:vi PREFIX/conf/httpd.conf
启动:PREFIX/bin/apachectl -k start
编译apache的时候大多数情况下面需要自己编译一些
Module(--enable-mods-shared=most包含的不全),这个时候可以使用:
./configure --prefix=/trsdata/Apache --enable-so --enable-mods-shared='auth-anon
auth-dbm auth-digest cache cern-meta charset-lite dav dav-fs deflate disk-cache expires ext-filter file-cache headers info logio mem-cache mime-magic isapi proxy proxy-connect proxy-ftp proxy-http rewrite speling ssl unique-id usertrack vhost-alias bucketeer case-filter case-filter-in echo example optional-fn-export optional-fn-import optional-hook-export optional-hook-import'
Apache目录结构与基本使用
Bin目录存放启动和停止等命令 Conf目录存放配置文件
Manual存放手册
Modules存放apache上面扩展的一些Module Logs存放apache的启动和停止日志
Apache基础配置
借助内网的httpd.conf来介绍Apache的基础配置。
关于User和Group节点的配置:
启动apache用root,但是apache会以nobody方式运行后台进程(httpd)。 可以将apache的文档目录用chown修改为nobody,如果还不行用chmod修改一下读写权限。
建议的方式是创建一个新的用户和用户组(比如:www),然后User/Group设置为www,然后把apache文档目录的owner设置为www,这样用www用户做FTP。
关于AddType:
增加默认网页的ContentType:AddType image/x-icon .ico
【借助HttpWatch查看一个网页的Content-Type】
Apache与Tomcat协同
两种协同方式,借助Mod_JK来协同和借助Mod_Proxy来协同。
Mod_Proxy反向代理模式
将动态应用分发给Tomcat的Http端口,不用调整AJP的线程池。【穿插简单介绍Tomcat的Server.conf文件】
a>在配置文件中增加proxy Module的引用:
LoadModule proxy_module libexec/apache22/mod_proxy.so
LoadModule proxy_connect_module libexec/apache22/mod_proxy_connect.so LoadModule proxy_http_module libexec/apache22/mod_proxy_http.so LoadModule proxy_ftp_module libexec/apache22/mod_proxy_ftp.so LoadModule proxy_ajp_module libexec/apache22/mod_proxy_ajp.so
b>增加转发 ServerName 192.9.200.130 ProxyPass /portal/testproxy.jsp http://192.9.200.130:8079/portal/testproxy.jsp ProxyPassReverse / http://192.9.200.130:8079/
c>问题:
获取最终客户端的IP需要从request的Header中获取:x-forwarded-for
利用JK组件和Tomcat协同
将动态应用分发给Tomcat的AJP 13端口,需要调整AJP13的线程池 【参考内网的配置来进行具体的说明,支持多个worker】
# Load mod_jk module
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile /usr/local/apache2/conf/workers.properties # Where to put jk logs
JkLogFile /usr/local/apache2/logs/mod_jk.log #Set the jk log level [debug/error/info] JkLogLevel info # Select the log format
JkLogStampFormat \"[%a %b %d %H:%M:%S %Y] \" # JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories # JkRequestLogFormat set the request format JkRequestLogFormat \"%w %V %T\" JkMount /*.jsp worker1
Gzip压缩配置
【参考内网配置进行说明】
LoadModule deflate_module modules/mod_deflate.so SetOutputFilter DEFLATE # Netscape 4.x has some problems… BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine # BrowserMatch \\bMSIE !no-gzip !gzip-only-text/html # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.59 # the above regex won’t work. You can use the following # workaround to get the desired effect: # BrowserMatch \\bMSIE !no-gzip !gzip-only-text/html force-gzip BrowserMatch \\bMSIE !no-gzip !gzip-only-text/html # Don’t compress images and other SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:pdf|doc)$ no-gzip dont-vary #SetEnvIfNoCase Remote_Addr (192.9.200.*)|(192.9.100.*)|(218.247.176.131)$ no-gzip dont-vary AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css AddOutputFilterByType DEFLATE application/x-javascript # Make sure proxies don’t deliver the wrong content Header append Vary User-Agent env=!dont-vary DeflateFilterNote ratio LogFormat '\"%v %h %l %u %t “%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"\" (%{ratio}n)' deflate CustomLog logs/deflate_log deflate
【演示借助HttpWatch查看当前的GZip压缩是否生效】
常见优化参数
优化操作系统网络参数
修改 /etc/sysctl.conf(建议重新启动) # defaut tcp_syncookies = 0 net.ipv4.tcp_syncookies = 1 # default tcp_fin_timeout = 60 net.ipv4.tcp_fin_timeout = 15 # default tcp_tw_reuse = 0 net.ipv4.tcp_tw_reuse = 1 # default tcp_tw_recycle = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 10240 65000
调整操作系统允许的进程最大打开文件数
a)在当前用户的环境变量.bash_profile中增加:ulimit -n 8192 b)/etc/security/limits.conf的修改部分: * soft nofile 163840 * hard nofile 163840
更多的平台参考内网文章:《在AIX/HP/Solais平台使用JDK, 请安装系统补丁和修改进程的线程数/文件数的限制》,作者肖锋,地址:
http://intranet.trs.com.cn/portal/portaldoc/document_show.jsp?SearchWordForTag=ulimit&ChannelId=371&DocumentId=97434
修改worker.c参数优化Apache
MaxClients 表示Apache最大连接数。应该大于等于ThreadsPerChild * ServerLimit;
ThreadLimit表示打开的最大线程数,和ThreadsPerChild相关。如果ThreadsPerChild大于64,则需要同时调整ThreadLimit,并且ThreadLimit应该大于等于ThreadsPerChild;
ServerLimit表示打开的最大进程数,和StartServers相关。如果StartServers大于64,则需要同时调整ServerLimit,并且ServerLimit应该大于等于StartServers;
详细内容请参考:http://httpd.apache.org/docs/2.0/mod/worker.html
为静态文件增加浏览器的Cache机制
LoadModule expires_module modules/mod_expires.so ExpiresActive on ExpiresDefault \"access plus 30 days\" ExpiresByType image/gif A2592000 ExpiresByType application/x-javascript A1280000 ExpiresByType text/css A2000000
借助cronolog配置日志按天存放
1. 配置和编译ocronolog组:http://cronolog.org/download/index.html 2. 在Apache原始记录日志的地方改成:
TransferLog \"|/sbin/cronolog /intranet/logs/%Y/%m/%d/intranet_access_none_ssl.log\" ErrorLog \"|/sbin/cronolog /intranet/logs/%Y/%m/%d/intranet_errors_none_ssl.log\"
如将:ErrorLog \"logs/error.log\"改成:
ErrorLog \"|/sbin/cronolog /logs/%Y/%m/%d/error.log\"
因篇幅问题不能全部显示,请点此查看更多更全内容