您的当前位置:首页正文

Apache配置与优化

2020-02-24 来源:步旅网
前言

大部分内容来自于公司内网的整理,因为个人在日常工作中使用这块的时候也是经常借助于内网。在日常工作中可以多参考内网的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 #Insert filter

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

ThreadLimit 128 ServerLimit 32 StartServers 5 MaxClients 4096 MinSpareThreads 125 MaxSpareThreads 256 ThreadsPerChild 128 MaxRequestsPerChild 5000

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\"

因篇幅问题不能全部显示,请点此查看更多更全内容