LAMP配置优化

Apache优化:

Apache Modules提供一个国外下载免费的网站,国内的都是要钱或者几分的,为了打破这个限制,找了好久,终于把mod_fcgid.so模块给装起来了:https://www.apachehaus.com/cgi-bin/download.plx

1.Apache配置静态缓存

<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif “access plus 1 days”
ExpiresByType image/jpeg “access plus 24 hours”
ExpiresByType image/png “access plus 24 hours”
ExpiresByType text/css “now plus 2 hour”
ExpiresByType application/x-javascript “now plus 2 hours”
ExpiresByType application/javascript “now plus 2 hours”
ExpiresByType application/x-shockwave-flash “now plus 2 hours”
ExpiresDefault “now plus 0 min”
</IfModule>
———————————————————————————————————-
2.apache开启压缩功能
首先,需要看一下我们的apache是否支持压缩功能。
/usr/local/apache2/bin/apachectl -l
看看是否有mod_deflate
如果这里没有,那继续看一下
ls /usr/local/apache2/modules/
下面有没有 mod_deflate.so 这个文件
如果这里也没有,那说明你的apache不支持压缩,需要重编译一下,或者扩展形式安装,或者重新编译apache, 需要在编译的时候,加上 –enable-deflate=shared
好,如果你的apache有了deflate这个模块支持,也就支持了压缩功能。
下面该配置httpd.conf 了。
在httpd.conf 中增加 :
LoadModule deflate_module modules/mod_deflate.so
然后再增加如下配置:
<IfModule mod_deflate.c>
DeflateCompressionLevel 5
AddOutputFilterByType DEFLATE text/html text/plain text/xml
AddOutputFilter DEFLATE js css
</IfModule>
其中DeflateCompressionLevel 是指压缩程度的等级,从1到9,9是最高等级。
———————————————————————————————————-

3.apache几种限制IP的方法

3.1. 禁止访问某些文件/目录
增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库:
<Files ~ “\.insc$”>
3.2. 禁止访问某些指定的目录:(可以用 <DirectoryMatch> 来进行正则匹配)
<Directory ~ “/var/www/(.+)*[0-9]{3}”>
当然也可以写目录全局路径
<Directory /var/www/111>
3.3. 通过文件匹配来进行禁止,比如禁止所有针对图片的访问:
<Filesmatch (.*)php>
3.4. 针对URL相对路径的禁止访问
<Location /dir/>
———————————————————————————————————-
4.apachef2.4访问控制
1.所有请求被拒绝
Require all denied #拒绝所有
2.所有请求被允许
Require all granted #允许所有
除^/aaa/.* 外拒绝所有
Require host ^/aaa/.*
apache Require 指令
Require all granted #允许所有
Require all denied #拒绝所有
Require env env-var [env-var] … #允许,匹配环境变量中任意一个
Require method http-method [http-method] … #允许,特定的HTTP方法
Require expr expression #允许,表达式为true
Require user userid [ userid ] … #允许,特定用户
Require group group-name [group-name] … #允许,特定用户组
Require valid-user # #允许,有效用户
Require ip 10 172.20 192.168.2 #允许 特定IP
 —————————————————————————–
5.Apache不记录指定日志类型
SetEnvIf Request_URI “.*\.gif$” image-requet
SetEnvIf Request_URI “.*\.jpg$” image-requet
SetEnvIf Request_URI “.*\.png$” image-requet
SetEnvIf Request_URI “.*\.bmp$” image-requet
SetEnvIf Request_URI “.*\.swf$” image-requet
SetEnvIf Request_URI “.*\.js$” image-requet
SetEnvIf Request_URI “.*\.css$” image-requet
apache只记录指定URI的日志
我的需求是,把类似请求 www.aaa.com/aaa/… 这样的请求才记录日志。
在httpd.conf 或者 相关的虚拟主机配置文件中添加
SetEnvIf Request_URI “^/aaa/.*” aaa-request
CustomLog “|/usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/aaa-access_%Y%m%d.log 86400” combined env=aaa-request
apache记录代理IP和真实客户端IP
默认情况下log日志格式为:
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
其中%h 是记录访问者的IP,如果在web的前端有一层代理,那么这个%h其实就是代理机器的IP,这不是我们想要的。在这种情况下,
%{X-FORWARDED-FOR}i 字段会记录客户端真实的IP。所以log日志改为:
LogFormat “%h %{X-FORWARDED-FOR}i %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
————————————————————————————————————————————————
6.Apache日志切割
访问日志时间长了会很大,所以要进行切割,每天或者每周切割一次,并以当前的日期命名
在对应的虚拟主机中加入:
Errorlog “|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-error_%Y%m%d.log 86400”
CustomLog “/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/aaa-access_%Y$m$d.log 86400” combined
Errorlog是错误日志,Customlog是访问日志,-l的一是是校准时间为UTC
—————————————————————————————————
方法一: 使用 cronolog 为每一天建立一个新的日志
CustomLog “|bin/cronolog logs/access_%Y%m%d.log” combined
也可以按小时
CustomLog “|bin/cronolog logs/access_%Y%m%d%h.log” combined
方法二:使用 rotatelogs 每一天记录一个日志
CustomLog “|bin/rotatelogs -l logs/access_%Y%m%d.log 86400” combined
每小时
CustomLog “|bin/rotatelogs -l logs/access_%Y%m%d%H.log 3600” combined
再看apache rotatelogs语法
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
选项
-l
使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。所以一定要加上-l 否则出现的日志时间和实际时间是相差8小时的。
logfile
它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime
日志文件滚动的以秒为单位的间隔时间。
offset
相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。
filesizeM
指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。
————————————————————————————————————————————–
7.Apache用户认证
后台有些东西不能给游客看到,要进行用户认证
#vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
在应的虚拟主机下面添加
<Directory /data/www/admin.php>
AllowOverride AuthConfig
AuthName “djfdjnfdnfdf”
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</Directory>
首先制定或对哪个目录进行验证,AuthName自定义,AuthUserFile指定密码在哪里
#/usr/local/apache2/bin/htpasswd -cm /data/.httpasswd aming
创建进行验证的用户,回车输入密码
重启阿帕奇服务
#/usr/local/apache2/bin/apachectl graceful
重新加载
 ———————————————————————————
7.Apache配置防盗链
SetEnvIfNoCase Referer “^http://.*\.apelearn\.com” local_ref
SetEnvIfNoCase Referer “.*\.aminglinux\.com” local_ref
SetEnvIfNoCase Referer “^$” local_ref
<filesmatch “\.(txt|doc|mp3|zip|rar|jpg|gif)”>
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
 ———————————————————————————
8.Apache禁止解析php,禁止指定user_agent
禁止这个目录下面的访问解析PHP,并禁止下载PHP
<Directory /data/www/data/>
php_admin_flag engine off
<filesmatch “(.*)php”>
Order deny,allow
Deny from all
</fiesmatch>
</Directory
禁止指定uerl_agent
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^*Firefox/4.0* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^*Tomato Bot/1.0* [NC]
RewriteRule .* -[F]
</IfModule>
———————————————————————————————–
9.Apache通过rewrite限制某个目录
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} ^.*/tmp/* [NC]
RewriteRule .* -[F]
</IfModule>
————————————————————————————————-
10.Apache访问控制
Allow允许 deny拒绝
对某个目录做限制:
<Directoy /data/www/>
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Directoy>
要先看Order后面的哪个在前 哪个在后
针对请求的uri做限制:
<filesmatch “(.*)admin(.*)”>
order deny,allow
Deny from all
Allow from 127.0.0.1
</filesmatch>
————————————————————————————————-
PHP优化:
11.软件方面:
1).PHP运行机制的改变。比如fastcgi通常比cgi更好等(配合php的黑魔法fastcgi_finish_request非常好用);
2).PHP使用最新稳定的版本7.1
3).对于不需实时更新的数据如新闻资讯可生成文件缓存,以缓解并发压力;
4).并发中数据一致性问题,使用队列(高并发框架swoole);
5).高速缓存:用的memcached,这一层的作用主要是减轻数据库IO和加快热数据访问,缓存策略与程序耦合度较高,不赘述,但简单地说有两种方式,一种是在程序的全局层面加一个缓存处理,这种方法代码耦合度低,但是有效命中率不高,有些项目不一定适应,另一种是在具体的数据存取处加缓存处理,这种办法程序耦合度较高,但是缓存命中率非常高,几乎没有无效缓存存在;更多参照:https://www.zhihu.com/question/20049768
12.硬件方面主要是负载均衡:
1).CDN静态文件加速。auto scale(vertical scale && horizontal scale)
2).Webserver (Nginx) :这一层是可以轻松分布式部署的,结合智能DNS解析可以简易地防止单点故障、实现区域访问加速,结合LVS很容易实现负载均衡。这一层主要是负责处理静态请求和转发PHP请求至第二层的PHP处理节点,至于静态资源地址(misc.xxxx.com)可以单独拿出来部署,或者直接使用商用的云存储服务(国内七牛不错,国外有Amazon S3)
————————————————————————————————-
MySQL优化:
1).拆表:大表拆小表(垂直拆,水平拆;分表,分区partition,分片sharding),可以在应用层实现,也可以在数据库层面实现一部分;提高系统性能。
2).分库:把表放到不同的数据库,这也是分布式数据库的基础;提高系统性能。
3).分布式:不同的数据库放到不同的服务器;提高系统性能。
4).集群:使用数据库复制等技术组建集群,实现读写分离、备份等;提高系统性能、可用性。
5).缓存:对常用的数据进行缓存。提高系统性能。
6).备份:主从库,快照,热备,异地备份等;提高系统可用性
7).架构:
LVS+keepalived
+Java/PHP/Python
+mysql/mongodb
+memcached/redis
+centos
+nginx/apache
+sphinx/solr
+Gearman+Munin+TFS等等
8).并发中数据一致性问题,必要的自动复查、数据库锁的合理利用

Leave a comment