[root@localhost conf]# egrep -v "^.*#|^$" httpd.conf
ServerRoot "/applications/apache2.2.31" apache的根目录(安装目录),应该只能root登录,不需更改此配置
#listen 12.34.56.78:80 监听指定IP和端口
Listen 80 监听的端口 如果同时监控81端口,可以在下面增加一行,如:listen 81
#Dynamic Shared Object (DSO) Support 动态共享对象支持 DSO编译模块
<IfModule !mpm_netware_module> 专用的用户和组来运行httpd,即apache在运行时以此用户的身份启动服务和读取文件
<IfModule !mpm_winnt_module>
User daemon apache的用户,默认为daemon,建议修改下 如:oldboy
Group daemon apache的用户组,默认为daemon,建议修改下 如:oldboy
ServerAdmin you@example.com 服务管理员邮箱地址,出问题时发送邮件到这个邮箱
#ServerName www.example.com:80 初启动时报的错就是因为这里,更改这里就不会报错 通常配置成127.0.0.1
DocumentRoot "/applications/apache2.2.31/htdocs" apache默认的站点目录,路径结尾不要添加斜线
<Directory /> 根目录(以下是对根目录的限制)
Options FollowSymLinks FollowSymLinks表示允许符号链接,没加选项表示禁止,如不允许目录浏览等
AllowOverride None 表示禁止用户对目录配置文件(.htaccess进行修改)重载,普通站点目录此项建议不开启
Order deny,allow 允许未被明确拒绝的 (从后往前读)
Deny from all 拒绝所有访问
</Directory>
<Directory "/applications/apache2.2.31/htdocs"> 站点目录(以下为默认站点目录的限制,如果读者私自配置了站点目录而没有配置这里就会出现 403错误)
Options Indexes FollowSymLinks FollowSymLinks表示允许符号链接,indexes表示允许目录浏览,如允许目录浏览,允许符号链接
这里很危险,应禁止目录浏览 应更改为 Options FollowSymLinks或Options -Indexes FollowSymLinks
AllowOverride None 表示禁止用户对目录配置文件(.htaccess进行修改)重载 尽量不开启.htaccess 安全隐患大,规则多了网站访问性能低
Order allow,deny 拒绝未被明确允许的 (从后往前读)
Allow from all 所有人都能访问
</Directory>
<IfModule dir_module>
DirectoryIndex index.html 索引文件 首页文件(首页文件可以有多个,可以用空格匹配多个,)
</IfModule>
<FilesMatch "^\.ht"> 阻止.htaccess 和 .htpasswd等重要文件被web用户查看
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>
ErrorLog "logs/error_log" 错误日志路径
LogLevel warn 日志的级别 警告
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 日志的格式
LogFormat "%h %l %u %t \"%r\" %>s %b" common 普通访问日志格式
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
默认站点访问日志配置
CustomLog "logs/access_log" common 访问日志路径 common
#CustomLog "logs/access_log" combined 访问日志路径 combined (复合日志)
</IfModule>
以下为cgi的配置,没有特殊需求应考虑全部注释或者删掉
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/applications/apache2.2.31/cgi-bin/" cgi的别名 基本不用了(可以删除和注释掉)
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "/applications/apache2.2.31/cgi-bin"> cgi目录 基本不用了(可以删除和注释掉)
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
DefaultType text/plain DefaultType:定义当不能确定MIME类型时服务器提供的默认MIME类型(默认不更改)
如果你的服务器主要包含text 或者HTML文档,“text/plain” 是一个好的选择
<IfModule mime_module> 允许传送时使用以下几种压缩方式
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
# Some examples: 出现不同的错误跳转的指定页面
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
以下是开启一些包含文件的配置
# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf
# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
#Include conf/extra/httpd-autoindex.conf
# Language settings
#Include conf/extra/httpd-languages.conf
# User home directories
#Include conf/extra/httpd-userdir.conf
# Real-time info on requests and configuration
#Include conf/extra/httpd-info.conf
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf (开启虚拟主机的配置)
# Local access to the Apache HTTP Server Manual
#Include conf/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
apache 扩展配置文件(Include 调用文件)在 /appacation/apache/conf/extra 下,不开启就是默认配置。
extra/
├── httpd-autoindex.conf
├── httpd-dav.conf dav支持配置
├── httpd-default.conf 配置的是apache的相关服务参数,如超时时间,保持连接时间等
├── httpd-info.conf
├── httpd-languages.conf 语言支持模式
├── httpd-manual.conf
├── httpd-mpm.conf 服务器池管理,也就是优化apache的一个配置文件,选择apache的模式以及配置连接数等,常用的模式有worker模式和profork模式,默 认情况是profork模式
├── httpd-multilang-errordoc.conf
├── httpd-ssl.conf 支持ssl加密的文件
├── httpd-userdir.conf
└── httpd-vhosts.conf 虚拟主机的配置文件
虚拟主机配置文件 (httpd-vhosts.conf)
egrep -v "^.*#|^$" httpd-vhosts.conf
NameVirtualHost *:80 表示基于名称的虚拟主机配置,*表示监听本机的所有IP地址,可以更改为具体的IP地址
<VirtualHost *:80> 定义一个虚拟主机,*表示监听本机的所有IP地址,可以更改为具体的IP地址
ServerAdmin webmaster@dummy-host.example.com 配置管理员的邮箱
DocumentRoot "/applications/apache2.2.31/docs/dummy-host.example.com" 提供服务的程序目录,也成站点目录,如果不配置,则去主配置文件中寻找
ServerName dummy-host.example.com 提供服务的域名,测试需要在本机做hosts解析
ServerAlias www.dummy-host.example.com 虚拟主机的别名,也就是配置多个域名访问同一个站点,此功能需要apache mod_alias模块的支持
ErrorLog "logs/dummy-host.example.com-error_log" 配置错误日志的路径
CustomLog "logs/dummy-host.example.com-access_log" common 配置访问日志,一般用combined格式代替common格式,以获得更多的格式输出
</VirtualHost> 虚拟主机的结尾
2、apache优化
一、日志轮询
1.使用cronolog进行日志轮询.之所以不使用系统自带的rotatelogs,是因为切割日志时丢失日志。
2.使用复合日志(combined),显示会多一些。
3.配置cronolog日志轮询时,要写全路径,如 Customlog“|/usr/local/sbin/cronolog /application/apache/logs/access_www_%Y%m%d.log” combined
二。错误页面优雅显示
支持url、文件和脚本的形式。 配置方法 在主配置文件 写入 ErrorDocument 404 /http://www/51cto.com 或者 ErrorDocument 404 /missing.html
三、mod_deflate 文件压缩功能(压缩发送给客户端的内容)
以DSO方式安装 /application/apache/bin/apxs -i -c -a mod_deflate.c
把文件先在服务器端进行压缩,然后再传输,在客户端再进行解压。没特殊情况,所有文本内容都应该是gzip压缩。
把以下内容放在虚拟主机当中,就实现的压缩功能:
<ifmodule mod_defalte.c>
DeflateCompressionlevel 9 #压缩等级,等级也大,压缩比例越高,相反耗CPU也高
SetOutputFilter DEFLATE #启用压缩
#DeflateFilterNote Input instream #在日志中放置压缩率标记
#DeflateFilterNore Output outstream #在日志中放置压缩率标记
AddOutputFilterByType DEFLATE text/html text/plain text/xml #以下三行设置压缩的类型
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/css
#DeflateFilterNote Ratio ratio #在日志中放置压缩率标记,下面是记录日志的,这个功能一般不用,所以注释掉了
#LogFormat '"%r" %{outsream}n/%{instream}n (%{ratio}n%%)' deflate
#Customlog logs/deflate_log.log deflate
</ifmodule>
使用curl命令,头部信息会出现一行Vary: Accept-Encoding 表示已经压缩
四、mod_expires 缓存功能
通过设置expires header 来缓存如:图片,脚本,css,flash等,expires其实就是通过header报文来指定特定类型的文件在浏览器中的缓存时间,大多数的图片,flash在发布后都是不需要经常修改的,做了缓存以后这样浏览器就不会再从服务器下载这些文件而是直接从缓存中读取
优点:
1,加大访问页面的速度 2,提升用户体验 3,节约网站带宽成本 4,节约网站服务器及维护成本
<ifmodule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType test/html "access plus 12 months"
ExpiresByType test/scc "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus12 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
EXpiresByType application/x-shockwave-flash "access plus 12 months"
EXpiresByType application/x-javascript "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</ifmodule>
expires失效条件:用户主动删除和内容缓存期已到
如果网站更新功能或者更新文件,用户访问时的内容还是旧的
1.一般将经常变化的设置时间短 如1-30天
2.在更新文件上采取策略,如更新后使用新的文件名发布,这样对用户又是新的资源了
五、更改apache的默认用户
编译安装apache的用户是daemon
yum安装apache的用户的apache
尽可能的将用户改名,最好用大家都不知道用户名
六、worker模式 提升并发数(可以达到4500,网友测试结果)
编译安装时,使用worker模式
七、屏蔽apache版本等敏感信息
客户访问时不知道用的是什么版本的服务器,减少攻击
修改httpd-default.conf文件,ServerSignature off 和ServerTokens Prod
之后 apachectl graceful 使之生效
但还是会出现server=Apache 字样,如果想全部屏蔽,则需要从新编译
八、apache目录文件权限的设置 (属组root ,目录755,文件644)
在网站架构中,应该把资源文件,包括用户上传的图片,附件等和程序分离,最好把上传的程序也分离,这样就可以从容的授权了。
一般的公司授权:
chmod -R 777 /sitedir
chown -R apache.apache /sitedir 都不安全
九、修改apache的并发量等设置(默认apahce的并发量是150)
修改httpd.conf 打开Include conf/extra/httpd-mpm.conf 模块
Apachef服务为worker模式的配置 vim /conf/extra/httpd-mpm.conf
<IfModule mpm_worker_module>
StartServers 5
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerchild 0
</IfModule>
注:
MaxClients <= ServerLimit * ThreadsPerChild
Apache服务为prefork模式的配置
生产环境配置文件 httpd-default.conf并发连接数配置
vim conf/extra/httpd-mpm.conf
StartServers 10
MinSpareServers 10
maxSpareServers 15
ServerLimit 2000
MaxClients 2000
MaxRequestsPerChild 10000
修改完并发数后,要stop apache 再start apache ,restart和graceful是不管用的 可能是bug
十、apache的防盗链功能
自己所有的图片,不允许嵌套在别人的网页里面
十一、禁止目录Indexes
删除Indexes 或者Indexes前加-
十二、禁止用户重载
AllowOverride Nore
十三、关闭CGI
删除或者关闭CGI
十四、避免使用.htaccess文件
首先是性能的考虑,如果AllowOverride启用了.htaccess文件,则Apache需要在每个目录中查找.htaccess文件,另外,对每一个请求,都需要读取一次.htaccess文件因此会导致性能的下降。
其次是安全,这样会允许用户自己修改服务器的配置,这可能导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权
AccessFileName .htaccess
建议设置成:
#AccessFileName .htaccess
全部目录权限定义使用httpd.conf中的定义,不使用.htaccess.
十七、apache日志授予root 700权限
十八、内核优化 系统优化
十九、apache程序架构优化
1.程序页面服务器和 图片附件服务器、上传服务器 三者的功能尽量分离
2.分离最佳的方式是分别使用独立的服务器(需要程序的支持)
3.次选方案是在前端负载均衡器通过haproxy/nginx 根据目录或者扩展名,请求后面的对应服务器