一, Apache 运行环境优化
1, 使用单独的主机运行 Apache 服务
Apache 所运行的硬件环境都是对性能影响最大的因素, 即使不能对硬件进行升级, 也最好给 apache 一个单独的主机以免受到其他应用的干扰.
2, 给 Apache 服务器增加内存
所有硬件指标中, 对性能影响最大的是内存, 对于静态内容(图片, javascript 文件, CSS 文件等), 它决定了 apache 可以缓存多少内容, 它缓存的内容越多, 在硬盘上读取内容的机会就越少, 而存取硬盘上的特定文件是一件很费时的操作, 大内存可以极大提高静态站点的速度; 对动态高负载站点来说, 每个请求保存的时间更多一些, apache 的 mpm 模块会为每个请求派生出相应的进程或线程分别处理, 而进程或线程的数量与内存的消耗近似成正比, 因此增大内存对提高动态站点的负载和运行速度也极为有利.
3, 给 Apache 服务器更换高速硬盘
硬盘的速度对 Apache 静态站点尤为突出, apache 不断的在读取文件并发送给相应的请求, 硬盘的读写是极其频繁的; 动态站点也要不断的加载 web 程序(php 等), 一个请求甚至要读取十几个文件才能处理完成, 因此尽可能的提高硬盘速度和质量对提高 apache 的性能是有积极意义的.
4, 更换更好的 CPU 和更大的网络带宽
最后影响 Apache 访问速度的是 cpu 和网络, cpu 影响的是 web 程序执行速度, 网络影响流量大小.
5, 使用类 Unix 系统运行 Apache 服务
影响性能的另一因素是操作系统, php 程序在类 unix 环境中的执行速度仍然比 windows 中要快, 所以我们尽量使用 Linux 操作系统作为 Apache 服务的运行系统.
二, Apache 相关功能优化
1, 禁止 Apache 目录索引浏览功能.
Apache 默认配置是当网站没有首页文件时, Apache 会把整个目录结构展示给网站用户, 这是非常大的隐患, 必须要屏蔽掉. 在主配置文件 httpd.conf 或者虚拟主机的配置文件 httpd-vhost.conf 文件中配置如下内容即可.
- <Directory /var/html>
- Options FollowSymLinks
- AllowOverride None
- Order allow, deny
- Allow from all
- </Directory>
或者
- <Directory /var/html>
- Options -Indexes FollowSymLinks
- AllowOverride None
- Order allow, deny
- Allow from all
- </Directory>
说明: 也就是把配置文件中 Options Indexes FollowSymLinks
修改为: Options FollowSymLinks 或把 Indexes 改成 -Indexes 即可
2, 隐藏 Apache 的版本信息
- [root@centos1 conf]# curl -I 192.168.115.105
- HTTP/1.1 200 OK
- Date: Sun, 20 Aug 2017 11:34:37 GMT
Server: Apache/2.4.7 (Unix) 可以看到 Apache 的版本号是 2.4.7 的
- Last-Modified: Sun, 20 Aug 2017 06:38:57 GMT
- ETag: "14-557299ddc43ae"
- Accept-Ranges: bytes
- Content-Length: 20
- Content-Type: text/html
- [root@centos1 conf]# vim /usr/local/apache2/conf/extra/httpd-default.conf
ServerTokens Prod 把 Full 改成 Prod
ServerSignature Off 把 On 改成 Off
[root@centos1 conf]# vim /usr/local/apache2/conf/httpd.conf
Include conf/extra/httpd-default.conf 把这一行注释去掉让 httpd-default.conf 文件生效
- [root@centos1 conf]# /usr/local/apache2/bin/apachectl restart 重启生效即可
- [root@centos1 conf]# curl -I 192.168.115.105
- HTTP/1.1 200 OK
- Date: Sun, 20 Aug 2017 11:35:40 GMT
Server: Apache 可以看到版本号已经没有了
- Last-Modified: Sun, 20 Aug 2017 06:38:57 GMT
- ETag: "14-557299ddc43ae"
- Accept-Ranges: bytes
- Content-Length: 20
- Content-Type: text/html
3, 禁止 Apache 用户重载功能
对于使用虚拟主机的朋友可能会觉得不方便, 这样设置将会使. htaccess 中的设置失效, 如果实在需要, 并且在有条件的情况下, 请在 conf 配置文件中直接写入 rewrite 规则
- <Directory "/usr/local/apache2/htdocs">
- Options none
AllowOverride None 禁止用户重载
- Order allow, deny
- Allow from all
- </Directory>
提示: 禁止用户对目录配置文件 (.htaccess 进行修改) 重载, 这会加快服务器响应速度, 因为它不在为每个请求寻找每个目录访问控制文件(.htaccess). 也杜绝了开发人员变相修改配置的安全隐患.
4, 避免使用. htaccess 文件
首先是从 web 性能考虑, 如果 AllowOverride 启用了支持. htaccess 文件, 则 Apache 需要在每个站点目录中查找. htaccess 文件, 因此无论是否真正用到, 启用. htaccess 都会导致 web 性能的下降. 另外对每一个请求, 都需要读取一次. htaccess 文件.
其次是安全考虑, 这样会允许开发人员或者代码管理者可以修改服务器的配置, 这可能会导致某些意想不到的修改, 应该避免使用. htaccess 文件功能, 如果要实现类似的功能, 可以在主配置中配置.
5, 禁止资源目录解析 PHP 程序
方法 1: 提示下载不解析.
- <Directory ~ "/var/www/bbs/uploads">
- Options FollowSymLinks
- AllowOverride None
- Order allow, deny
- Allow from all
php_flag engine off 添加这行
</Directory>
方法 2: 返回 403 错误
- <Directory /var/www/blog>
- <Files ~ ".php">
- Order allow, deny
- Deny from all
- </Files>
- </Directory>
6, 配置 Apache 错误页面优雅显示(自定义错误页面)
(1)配置 Apache 错误页面优雅显示的目的
我们在浏览某些网站时, 往往浏览器显示给我的是无法找到我们要访问的页面的错误信息. 这是因为我们在浏览器中输入了错误的 url 或者网站的管理者将之前的页面移到了其他目录. 此时其他 web 服务器 就会给浏览器返回一个 404 的错误信息. 浏览器在收到其他 web 服务器 返回的 404 错误信息时, 就会显示相应的错误页面. 很多网站都有自己个性化的 404 错误页面, 在这个页面上我们可以看到很多很友好的提示信息, 但是也有部分网站的 404 错误信息显示的页面就是浏览器自己默认的页面, 从浏览器的默认 404 错误页面上我们得不到关于网站的任何信息, 这样势必会导致网站用户的流失. 那么我如何在 apache 下配置 404 错误页面呢. 下面我们就一起来看看如何设置 apache, 使其能够显示携带更多信息的 404 错误页面. 为服务器默认文件夹设置 404 错误页面.
(2)Apache 错误页面优雅显示设置
打开 apache 的安装目录, 在该目录下的 conf 目录中找到 httpd.conf 文件, 在该文件中找到 "ErrorDocument 404" 字符串, 一般情况下显示如下:
- #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
首先将前面的 #去掉, missing.html 是出现 404 错误时 apache 要返回给浏览器的页面. 我们可以在 missing.html 页面中添加自己个性的网页信息. 当然页面的名字我们是可以随便取的. missing.html 默认应该放在网站的根目录下, 但是我们可以根据自己的设置来将其放在其他目录. 如 / error/missing.html, 那配置文件就应该作如下修改:
errordocument 404 /error/missing.html
在完成上述配置之后, 重启 apache, 测试一下, 就可以看到我们想要的效果.
但是 IE 往往事与愿违, 在做了上述配置之后, IE 有时还会返回自带的 404 错误默认页面. 这是为什么呢, 因为 ie 在检测到 apache 返回的错误页面小于 512 个字节时, 就会显示自带的 404 错误页面.
解决方法 : 配置文件中 404 错误所指向的 url 地址改成绝对地址 , 如:
errordocument 404 http://localhost/error/missing.html
7, 配置 Apache 对站点文件压缩传输
在 apache2.0 以上 (包括 apache2.0) 的版中 gzip 压缩使用的是 mod_deflate 模块, 下面是具体配置步骤
vim /usr/local/apache2/conf/httpd.conf
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
打开 httpd.conf 后, 先将上面两行配置前面的 #号去掉, 启用这两个模块, 其中 mod_deflate 是压缩模块, 就是对要传输到客户端的代码进行 gzip 压缩; mod_headers 模块的作用是告诉浏览器页面使用了 gzip 压缩, 如果不开启 mod_headers 那么浏览器就会对 gzip 压缩过的页面进行下载, 而无法正常显示.
在 httpd.conf 中加入以下代码, 可以加到任何空白地方, 不了解 apache 的朋友, 如果担心加错地方, 就放到 http.conf 文件的最后一行, 如果是虚拟服务器可以写. htaccess 文件里面, 然后放在项目下即可.
- <IfModule mod_deflate.c>
- SetOutputFilter DEFLATE
- # 必须的, 就像一个开关一样, 告诉 apache 对传输到浏览器的内容进行压缩
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
# 设置不对后缀 gif,jpg,jpeg,png 的图片文件进行压缩
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
- # 同上, 就是设置不对 exe,tgz,gz... 的文件进行压缩
- SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
- AddOutputFilterByType DEFLATE text/*
- # 设置对文件是文本的内容进行压缩, 例如 text/html text/css text/plain 等
- AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript
- # 这段代码你只需要了解 application/javascript application/x-javascript 这段就可以了, 这段的意思是对 javascript 文件进行压缩
- AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
- # 这段是告诉 apache 对 php 类型的文件进行压缩
- BrowserMatch ^Mozilla/4 gzip-only-text/html
- # Netscape 4.x 有一些问题, 所以只压缩文件类型是 text/html 的
- BrowserMatch ^Mozilla/4.0[678] no-gzip
- # Netscape 4.06-4.08 有更多的问题, 所以不开启压缩
- BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
- # IE 浏览器会伪装成 Netscape , 但是事实上它没有问题
- </IfModule>
本配置到这里 apache 中的 gzip 压缩就配置完成, 重启 apache 后, 新的配置就会生效. 最后再用工具检查一下是否生效. 不过开启 gzip 功能需要额外 CPU 资源开销.
8, 启用 mod_expires 或 mod_headers 设置静态文件缓存时间
(1)mod_expires 缓存静态文件的好处及安装方法
采用 mod_expires 缓存静态文件能提高服务器的性能, 缩短服务的响应时间, 减轻服务器负担, 减少网络带宽使用量.
在安装 apache 的时 Configure 步骤中添加 --enable-expires 安装之后, 在 apache 安装目录的 modules 目录里会有: mod_expires.so 同时在 httpd.conf 会自动添加下面的内容
LoadModule expires_module modules/mod_expires.so
(2)通过 mod_expires 设置缓存(三种格式)
#LoadModule expires_module modules/mod_expires.so
编辑 Apache 的 httpd.conf 主配置文件, 将上面那行前面的 "#" 号删除,"mod_expires" 的设定资料除了可以写在 Apache 的 "httpd.conf" 设定档中, 也可以写在 ".htaccess" 设定档里.
语句格式 1:
ExpiresByType 类型 描述性语言
描述性语言: modification,access,now |plus|years,months,weeks,days,hours,minutes,seconds
例如:
- ExpiresByType image/png "access plus 7 days"
- # 设置 png 格式的缓存时间为 7 天
范例一:
- <IfModule mod_expires.c>
- ExpiresActive On
- ExpiresDefault "access plus 10 days"
- ExpiresByType text/css "access plus 1 second"
- </IfModule>
语句格式 2:
ExpiresByType 类型 A/M + 时间(以秒为单位)
A:access 表示从浏览器访问时间算起
M:modification 表示文件修改时间算起
例如:
ExpiresByType image/png A604800 #设置 png 格式的缓存时间为 7 天
范例二:
- <IfModule mod_expires.c>
- ExpiresActive On
- ExpiresDefault A86400
- ExpiresByType image/x-icon A2592000
- ExpiresByType application/x-javascript A2592000
- ExpiresByType text/css A2592000
- ExpiresByType image/gif A604800
- ExpiresByType image/png A604800
- ExpiresByType image/jpeg A604800
- ExpiresByType text/plain A604800
- ExpiresByType application/x-shockwave-flash A604800
- ExpiresByType video/x-flv A604800
- ExpiresByType application/pdf A604800
- ExpiresByType text/html A900
- </IfModule>
语句格式 3:
- <FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
- ExpiresDefault A604800
- </FilesMatch>
- # 表示匹配 jpg|jpeg|png|gif|swf 格式的文件缓存为 7 天
范例三:
- <IfModule mod_expires.c>
- ExpiresActive On
- ExpiresDefault A0
- # 缓存 1 年
<FilesMatch "\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$">
ExpiresDefault A9030400
</FilesMatch>
# 缓存 1 星期
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
ExpiresDefault A604800
</FilesMatch>
- # 缓存 3 小时
- <FilesMatch "\.(txt|xml|js|css)$">
- ExpiresDefault A10800
- </FilesMatch>
- </IfModule>
将下列代码加入. htaccess 文件中(本次采用的为语法格式一):
- <IfModule mod_expires.c>
- ExpiresActive On #开启缓存功能
- ExpiresDefault A86400 #设置默认的缓存时间
- # 以下是针对不同的文件类型设置不同的缓存时间
- ExpiresByType image/x-icon A2592000
- ExpiresByType application/x-javascript A2592000
- ExpiresByType text/css A2592000
- ExpiresByType image/gif A604800
- ExpiresByType image/png A604800
- ExpiresByType image/jpeg A604800
- ExpiresByType text/plain A604800
- ExpiresByType application/x-shockwave-flash A604800
- ExpiresByType video/x-flv A604800
- ExpiresByType application/pdf A604800
- ExpiresByType text/html A900
- </IfModule>
(3)使用 mod_headers 模块设置缓存
Expires 是浏览器 Cache 机制的一部分, 浏览器的缓存取决于 Header 中的四个值: Cache-Control, Expires, Last-Modified, ETag. 优化这个选项, 所要做的是对站内所有的文件有针对性的设置 Cache-Control 和 Expires, 我们要实现加上过期标志可以利用 apache 模块 mod_expires 和 mod_headers.
通过配置. htaccess 文件, 可以轻易地按文件类别设置缓存时间. 对提高网站速度有一定帮助. 有一个问题是我们常用的 Apache 主机经常不怎么支持 mod_expires, 没有关系, 我们用另一个模块使用 mod_headers.
同样在. htaccess 文件中添加如下内容可以实现缓存:
- <ifmodule mod_headers.c>
- # htm,html,txt 类的文件缓存一个小时
- <filesmatch "\.(html|htm|txt)$">
- header set cache-control "max-age=3600
- </filesmatch>
# css, js, swf 类的文件缓存一个星期
- <filesmatch "\.(css|js|swf)$">
- header set cache-control "max-age=604800
- </filesmatch>
- # jpg,gif,jpeg,png,ico,flv,pdf 等文件缓存一年
- <filesmatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
- header set cache-control "max-age=29030400
- </filesmatch>
- </ifmodule>
以下为样本代码:
- <ifmodule mod_headers.c>
- <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
- Header set Cache-Control "max-age=604800, public"
- </FilesMatch>
- <FilesMatch "\.(xml|txt)$">
- Header set Cache-Control "max-age=18000, public, must-revalidate"
- </FilesMatch>
- <FilesMatch "\.(html|htm|php)$">
- Header set Cache-Control "max-age=3600, must-revalidate"
- </FilesMatch>
- # 其它文件可参照设置, 此略.
- </ifmodule>
9, 更改 Apache 的默认用户和组
在 apache 部署中, 我们习惯将整个项目的所有者和组设置为 apache(注: apache 是新建的一个用户), 这样可以把整个项目的权限设置成 744, 提高安全性. 在如此设置的时候需要将 httpd 进程的拥有者和组设置为 apache(用户). 需要修改 httpd.conf 文件, 修改成下面这样即可.
- vim /usr/local/apache2/conf/httpd.conf
- User apache
- Group apache
- /usr/local/apache2/bin/apachectl graceful
10, 调整 Apache 的工作模式并修改相关参数优化
如何调整 Apache 工作模式及优化这里不再说明, 详情见我的另一篇博客
http://blog.51cto.com/longlei/2109039
11, 最小化设置 Apache 目录及文件权限
为了保证网站不遭受木马入侵上传及修改文件.
安全的权限设置如下:
(1)所有站点目录的用户和组都应该为 root
(2)所有目录权限是默认的 755
(3)所有文件权限是默认的 644
注意: 网站服务的用户不能用 root
12, 最小化设置 Apache 日志目录权限
假如日志目录为 / var/logs, 则授权方法为:
- chown -R root.root /var/logs
- chmod -R 700 /var/logs
13, 配置软件轮询 Apache 访问日志
轮询 Apache 访问日志方法这里不再说明, 详情见我的另一篇博客, 地址如下:
http://blog.51cto.com/longlei/2103580
14, 优化访问日志记录的信息
(1)定义日志级别, 让问题定位更加精准
(2)定义日志的规范格式, 让整个团队的日志格式统一, 便于查看及排错.
(3)对日志进行分类, 方便管理和查看(例如: 从功能方面可分为诊断日志, 统计日志, 审计日志等.)
(4)日志中尽量不要记录无用信息, 且重要日志记录必须完整
(5)在生产环境中解决问题并不断完善日志
(6)对日志文件进行按周或按天轮询, 保证日志文件不会过大
(7)定期清理很久之前的日志文件, 释放磁盘空间
15, 限制指定 IP 访问网站
Apache 从 2.2 升级到 Apache2.4.x 后配置文件 httpd.conf 的设置方法有了大变化, 以前是将 deny from all 全部改成 Allow from all 实现外网访问, 现在是将 Require all denied 以及 Require local 都改为 Require all granted 就可以了.
.htaccess 如果不起作用将 LoadModule rewrite_module modules/mod_rewrite.so 前面的注释 (#) 去掉就可以了.
(1)所有的请求都被拒绝
2.2 上的配置
- Order deny,allow
- Deny from all
2.4 上的配置
Require all denied
(2)所有请求都是允许的
2.2 上的配置
- Order allow,deny
- Allow from all
2.4 上的配置
Require all granted
(3)Apache2.4 上经常会用到的配置
- Require all denied
- Require all granted
- Require host xxx.com
- Require ip 192.168.1 192.168.2
- Require local
举例说明
a, 仅允许 IP:192.168.0.1 访问
- Require all granted
- Require ip 192.168.0.1
b, 仅禁止 IP:192.168.0.1 访问
- Require all granted
- Require not ip 192.168.0.1
c, 允许所有访问
Require all granted
d, 拒绝所有访问
Require all denied
提示: 默认是 Require local 仅允许本地访问.
16, 控制 MaxClients 的设置, 以避免服务器产生太多的子进程而发生交换.
进程间的数据交换会占用很大内存, 数据交换产生的滞后使用户总感觉 "不够快", 所以用户就可能去按 "停止" 和 "刷新", 从而带来更大的负载. 一般建议小网站将 MaxClients 设置为 12-24.
17,HostnameLookups 设置为 off
尽量减少 DNS 查询的次数. 如果你使用了 "Allow from domain" 或 "Deny from domain" 指令(也就是 domain 使用的是主机名而不是 IP 地址), 则代价是要进行两次 DNS 查询(一次正向和一次反向, 以确认没有作假). 所以, 为了得到最高的性能, 应该避免使用这些指令(不用域名而用 IP 地址也是可以的).
18, 为 Directory 加上 FollowSymLinks
如果网站空间中没有使用 Options FollowSymLinks ,Apache 就必须执行额外的系统调用以验证符号连接. 例如: 在请求 "/index.html" 时, Apache 将对 "/www","/www/htdocs","/www/htdocs/index.html" 执行 lstat()调用. 而且 lstat()的执行结果不被缓存, 因此对每一个请求都要执行一次.
19,MaxRequestsPerChild 设置为非 0 以防止内存泄漏
MaxRequestsPerChild 用于控制 Apache 子进程在何时销毁, 默认为 0, 代表永不销毁子进程, 这可能会存在内存泄漏的风险, 建议设置为 10000
20,KeepAlive 与 KeepAliveTimeOut
如果你使用的使 mpm_prefork 模式(Apache 默认安装), 那么建议你将 KeepAlive 设置为 off; 因为, 开启 keepalive 会为每个客户端建立一个连接, prefork 不会创建线程, 估计 100 个用户同时访问你的网站, Apache 就会挂了, 如果你实在想开启, 那么请将 KeepAliveTimeOut 时间设置更短些, 例如 5, 默认是 60 秒
21, 使用 CDN 做网站加速
简单的讲, 通过在现有的 Internet 中增加一层新的网络架构, 将网站的内容发布到最接近用户的 cache 服务器内, 通过 DNS 负载均衡技术, 判断用户来源就近访问 cache 服务器取得所需的内容, 这样可以有效减少数据在网络上传输的时间, 提高速度. 把静态内容分布到 CDN 减少了用户影响时间 20% 或更多.
来源: http://www.bubuko.com/infodetail-2599155.html