【apache调优】1
多域名配置
https://www.cnblogs.com/liuxinfei/p/6228569.html
nginx多域名配置
https://www.cnblogs.com/gentsir/p/8220078.html
1. 源码编译安装apache
将httpd-2.4.28.tar.gz 上传到Linux系统中
tar zxvf httpd-2.4.28.tar.gz -C /usr/local/src/
2.
vi /usr/local/src/httpd-2.4.28/include/ap_release.h 40 #define AP_SERVER_BASEVENDOR "Apache Software Foundation" 41 #define AP_SERVER_BASEPROJECT "Apache HTTP Server" 42 #define AP_SERVER_BASEPRODUCT "Apache" 44 #define AP_SERVER_MAJORVERSION_NUMBER 2 45 #define AP_SERVER_MINORVERSION_NUMBER 4 46 #define AP_SERVER_PATCHLEVEL_NUMBER 27 47 #define AP_SERVER_DEVBUILD_BOOLEAN 0 为: #define AP_SERVER_BASEVENDOR "xuegod" #define AP_SERVER_BASEPROJECT " web server" #define AP_SERVER_BASEPRODUCT " XWS" #define AP_SERVER_MAJORVERSION_NUMBER 8 #define AP_SERVER_MINORVERSION_NUMBER 1 #define AP_SERVER_PATCHLEVEL_NUMBER 2 #define AP_SERVER_DEVBUILD_BOOLEAN 3
注释:
#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
#define AP_SERVER_BASEPROJECT "Apache HTTP Server" #服务的项目名称
#define AP_SERVER_BASEPRODUCT "Apache" #服务的产品名
#define AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本号
#define AP_SERVER_MINORVERSION_NUMBER 4 #小版本号
#define AP_SERVER_PATCHLEVEL_NUMBER 6 #补丁级别
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #
3.
envnt模式编译安装过程
apr-1.5.2.tar.gz apr-util-1.5.4.tar.gz httpd-2.4.28.tar.gz 1. 源码编译安装apache 将httpd-2.4.28.tar.gz 上传到Linux系统中 yum install apr-util apr-util-devel apr apr-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel gcc cmake gcc-c++ -y #少包会报错 yum install lrzsz -y tar xvzf apr-1.5.2.tar.gz cd apr-1.5.2 ./configure --prefix=/usr/local/apr make make install tar xf apr-util-1.5.4.tar.gz ls cd apr-util-1.5.4 ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr make make install tar zxvf httpd-2.4.28.tar.gz -C /usr/local/src/ envnt模式需要编译安装apr cd /usr/local/src/httpd-2.4.28 ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --enable-deflate --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event [root@xuegod63 httpd-2.4.28]# ./configure --prefix=/usr/local/apache --enable-so --enable-rewrite --enable-ssl --enable-deflate --enable-expires [root@xuegod63 httpd-2.4.28]# make -j 4 [root@xuegod63 httpd-2.4.28]# make install cp /usr/local/apache/bin/apachectl /etc/init.d/apachectl vi /usr/local/apache/conf/httpd.conf #不配置路径默认的配置文件 vi /etc/httpd/httpd.conf #配置路径后的配置文件 ServerName localhost:80 #启动前修改不然报错 启动apache: /etc/init.d/apachectl start iptables -F
cd /usr/local/src/httpd-2.4.28 [root@xuegod63 httpd-2.4.28]# yum install apr-util apr-util-devel apr apr-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel gcc cmake gcc-c++ -y #gcc 记得安装不然编辑报错 [root@xuegod63 httpd-2.4.28]# ./configure --prefix=/usr/local/apache --enable-so --enable-rewrite --enable-ssl --enable-deflate --enable-expires [root@xuegod63 httpd-2.4.28]# make -j 4 [root@xuegod63 httpd-2.4.28]# make install [root@xuegod63 httpd-2.4.28]# cp /usr/local/apache/bin/apachectl /etc/init.d/apachectl vi /usr/local/apache/conf/httpd.conf ServerName lcalhost:80 #启动前修改不然报错
启动apache:
/etc/init.d/apachectl start
iptables -F
4.
[root@xuegod63 ~]# curl -I 192.168.1.63 #看不到apache版本相关内容了
HTTP/1.1 200 OK
Date: Sat, 29 Aug 2015 09:43:44 GMT
Server: XWS/8.1.2-dev (Unix) mod_ssl/8.1.2-dev OpenSSL/1.0.0-fips
再次隐藏系统类型和模块的版本号
接下来再次修改:
vi /usr/local/apache/conf/httpd.conf 改:488 #Include conf/extra/httpd-default.conf 为: Include conf/extra/httpd-default.conf 2)打开httpd-default.conf文件,修改如下两个地方 [root@xuegod63 ~]# vi /usr/local/apache/conf/extra/httpd-default.conf 改: 55 ServerTokens Full 65 ServerSignature On 为: ServerTokens Prod #不显示服务器操作系统类型 令牌 ServerSignature Off #如果就是off,不用修改,签名
让apache配置文件生效的方法:
方法1:重启服务: restart #这是粗人行为, 会中断正在进行的连接
方法2:不重启服务,重新加载配置文件 ,reload是nginx,这里不能使用
/etc/init.d/apachectl graceful
测试:
[root@xuegod63 ~]# curl -I 192.168.1.63
HTTP/1.1 200 OK
Date: Thu, 14 Jan 2016 02:31:24 GMT
Server: XWS
5.让apache开机启动,还要再在apachectl文件的头部的注释中加两条命令。
vi /etc/init.d/apachectl #在第1行,插入以下红色内容 #!/bin/sh # chkconfig: 2345 64 36 # description: apache
设置开机自动启动:
[root@xuegod63 apache2.4-xuegod]# chkconfig --add apachectl [root@xuegod63 apache2.4-xuegod]# chkconfig --list apachectl [root@xuegod63 apache2.4-xuegod]# reboot #重启系统后,查看apache已经开机启动了 [root@xuegod63 ~]# iptables -F #清空规则 [root@xuegod63 ~]# netstat -antup | grep 80 tcp 0 0 192.168.1.63:33964 192.168.1.63:80 TIME_WAIT - tcp6 0 0 :::80 :::* LISTEN 1139/httpd
[root@xuegod63 ~]# useradd -M -s /sbin/nologin apache #创建apache用户 -M不建立用户目录 [root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf 改: 165 User daemon 166 Group daemon 为: 165 User apache 166 Group apache [root@xuegod63 ~]# /etc/init.d/apachectl graceful
apache目录及文件权限设置, 不能给777权限
chown apache:apache /usr/local/apache/htdocs/ -R
[root@xuegod63 ~]# chown root:root /usr/local/apache/logs/ -R
注:由于apache日志的记录是由apache的主进程进行操作的,而apache的主进程又是root用户启动的,所以这样不影响日志的输出。这也是日志记录的最安全的方法。
7 使用cronolog分割apache日志
[root@xuegod63~]#yum install epel-release -y [root@xuegod63~]#yum install cronolog -y 16.1.8 配置apache使用cronolog [root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf 将配置文件中的CustomLog和ErrorLog替换 改: 324 CustomLog "logs/access_log" common 为: 324 CustomLog "|/usr/sbin/cronolog /usr/local/apache/logs/access_%Y%m%d.log" combined 改:295 ErrorLog "logs/error_log" 为:295 ErrorLog "|/usr/sbin/cronolog /usr/local/apache/logs/error_%Y%m%d.log"
更多日志格式参考:
按天轮询(生产环境常见用法,推荐使用):
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
按小时轮询(生产环境较常见用法):
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_ %Y%m%d%H.log" combined
8. 错误页面优雅显示
方法一:
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf #在根目录的标签中添加以下红色标记内容。
221 <Directory "/usr/local/apache/htdocs"> #在这行下面添加如下内容:
222 ErrorDocument 404 /404.html #浏览器上有时候不能正常跳转 全网址可以正常跳转
[root@xuegod63 ~]# echo "404 go to home" > /usr/local/apache/htdocs/404.html
第二种方法:遇到404错误后,直接跳转到一个http链接上
[root@xuegod63 ~]# vim /usr/local/apache/conf/httpd.conf
改: 222 ErrorDocument 404 /404.html
为: ErrorDocument 404 http://www.xuegod.cn #将404错误跳转到http://www.xuegod.cn页面上
[root@xuegod63 ~]# /etc/init.d/apachectl restart
9.
启用压缩模块mod_deflate
[root@xuegod63 src]# /usr/local/apache/bin/apachectl -M | grep deflate
deflate_module (static) #弹出此种结果,则为编译安装时装的
[root@xuegod63 src]# /usr/local/apache2/bin/apachectl -M | grep deflate
deflate_module (shared) #弹出此种结果,则为DSO方式安装的
安装了的话,就可以直接进行压缩配置了,如果没有安装,下面为安装方法
a)编译时安装方法
编译的时候跟上--enable-deflate即可实现安装
b)DSO方式安装。
扩展:DSO: Dynamic shared object动态共享对象 。DSO模块可以在编译服务器之后编译,也可以用Apache扩展工具(apxs)编译并增加
使用DSO方式安装,/usr/local/apache2.4-xuegod/bin/apxs后跟的参数详解
-c 此选项表明需要执行编译操作。
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录。
-a 此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
[root@xuegod63 apache2.4-xuegod]# cd /usr/local/src/httpd-2.4.28/modules/filters/ [root@xuegod63 filters]# /usr/local/apache/bin/apxs -c -i -a /usr/local/src/httpd-2.4.28/modules/filters/mod_deflate.c 报错-bash: /usr/local/apache/bin/apxs: /replace/with/path/to/perl/interpreter: bad interpreter: No such file or directory yum install perl perl-devel vi /usr/local/apache/bin/apxs 改 /replace/with/path/to/perl/interpreter 为 #!/usr/bin/perl -w
#以dso的方式编译安装到apache中
[root@xuegod63 filters]# ll /usr/local/apache/modules/mod_deflate.so
#成功安装这里会显示出该文件mod_deflate.so
查看是否安装了模块:
[root@xuegod63 filters]# /usr/local/apache/bin/apachectl -M | grep deflate
报错:
httpd: Syntax error on line 105 of /usr/local/apache/conf/httpd.conf: Cannot load modules/mod_deflate.so into server: /usr/local/apache/modules/mod_deflate.so:
undefined symbol: inflat
在: 105 LoadModule deflate_module modules/mod_deflate.so 在上面一行,插入以下内容:LoadFile /usr/lib64/libz.so
vi /usr/local/apache/conf/httpd.conf LoadFile /usr/lib64/libz.so LoadModule deflate_module modules/mod_deflate.so
[root@xuegod63 filters]# /usr/local/apache/bin/apachectl -M | grep deflate
deflate_module (shared) #可以看出来已经加载
1、配置压缩参数
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf #确认下面这一行是打开的。默认是打开的。
105 LoadModule deflate_module modules/mod_deflate.so #此行解锁后再进行下面操作,不然下面的操作会报错。
[root@xuegod63 ~]# vim /usr/local/apache/conf/httpd.conf #在以下内容后,插入:
169 </IfModule> 之后添加以下内容: <Ifmodule mod_deflate.c> DeflateCompressionLevel 9 SetOutputFilter DEFLATE DeflateFilterNote Input instream DeflateFilterNote Output outstream DeflateFilterNote Ratio ratio AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript </Ifmodule>
注:
1、如果是虚拟机,需要在<VirtualHost*:80></VirtualHost>中添加配置即可实现压缩
2、图片和视频本身就是压缩格式,一般不需要压缩的。有些小图片和视频压缩后还会变大。
总结:我们在企业生产环境中时,在启用mod_deflate时,一定要注意,对于太小的文件和某些格式的图片不要对它们进行压缩,有可能越压越大。
扩展:AddOutputFilterByTypeDEFLATE后跟的所有的压缩文件类型,后期可以参照选择。
text/plain text/html text/php text/xml text/css text/javascript
application/xhtml+xml application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php
image/svg+xml image/gif image/png image/jpe image/swf image/jpeg image/bmp
16.2.5 mod_expires: 设置网页缓存时间
[root@xuegod63 ~]# /usr/local/apache/bin/apachectl -M | grep expires
expires_module (static) #此种结果为编译安装时装的
[root@xuegod63 ~]# /usr/local/apache/bin/apachectl -M | grep expires
expires_module (shared) #此种结果为DSO方式安装的
a)编译方式安装
编译的时候跟上--enable-expires即可实现安装
b)DSO方式安装
[root@xuegod63 htdocs]# cd /usr/local/src/httpd-2.4.28/modules/metadata/ #切到apache源码包mod_expires所在的目录下
[root@xuegod63 metadata]# ls mod_expires.c
mod_expires.c
#以dso的方式编译安装到apache中
[root@xuegod63 metadata]# /usr/local/apache/bin/apxs -c -i -a /usr/local/src/httpd-2.4.28/modules/metadata/mod_expires.c
#检查mod_deflate是否安装,成功安装这里会显示出该文件
[root@xuegod63 metadata]# ll /usr/local/apache/modules/mod_expires.so
2、配置缓存参数
注意如果我们是编译安装时已经编译进去的,要先解锁以下行,再进行下面操作,不然会报错。
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf #确认这一行是开启的。
113 LoadModule expires_module modules/mod_expires.so
缓存的用法有3种,分别问对全局,对目录,对虚拟主机。
1、对全局
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf #在最后添加以下内容:
在169 </IfModule> 下面插入以下内容: <IfModule mod_expires.c> ExpiresActive on ExpiresDefault "access plus 12 month" ExpiresByType text/html "access plus 12 months" ExpiresByType text/css "access plus 12 months" ExpiresByType image/gif "access plus 12 months" ExpiresByType image/jpeg "access plus 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>
重启服务:
[root@xuegod63 ~]# /etc/init.d/apachectl restart
2、对目录
对目录的配置就是在apache主配置文件中<Directory></Directory>标签内,最后加入如下参数即可
[root@xuegod63 ~]# vim /usr/local/apache/conf/httpd.conf
133 <Directory "/usr/local/apache/htdocs">
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 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>
</Directory>
c)对虚拟主机
对虚拟主机的配置就是在apache的虚拟主机配置文件httpd-vhost.conf中添加如下参数即可
[root@xuegod63 ~]# vim /usr/local/apache/conf/httpd.conf
<VirtualHost *:80>
ServerAdmin 888@qq.com
DocumentRoot "/www/html"
ServerName www.sunsky.pw
ServerAlias sunsky.pw
CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined
ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 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>
</VirtualHost>
[root@xuegod63 metadata]# cd /usr/local/apache2.4-xuegod/htdocs
[root@xuegod63 htdocs]# rz #上传一张图片a.jpg 到apache的网站目录下
注:天猫解决被缓存文件及时更新的方法:对缓存的对象改名
虽然缓存的设置有如下优点
1.缩短服务的响应时间
2.减轻服务器负担
3.减少网络带宽使用量,降低企业成本
但是他的缺点也是显而易见的,由于使用了缓存设置,导致被缓存的内容更新了,但是客户看到的却还是旧的。
如何解决被缓存文件及时更新这个问题呢?
第一种:缩短缓存时间例如:1天,不彻底牺牲性能
第二种:对缓存的对象改名。
16 开启长连接功能
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf
改: 511 #Include conf/extra/httpd-default.conf
为:511 Include conf/extra/httpd-default.conf #这一步,一般情况,需要修改,因为前面我们已经开启了这个选项
[root@xuegod63 htdocs]# vi /usr/local/apache/conf/extra/httpd-default.conf 修改: 改:16 KeepAlive Off 为:16 KeepAlive On #如果已经为On,开启长链接功能。那么就不需要再开启了 改:29 KeepAliveTimeout 5 为:29 KeepAliveTimeout 30 23 MaxKeepAliveRequests 100 10 Timeout 60
16.3.2 案例分析:
假设 KeepAlive 的超时时间为 10 秒钟,服务器每秒处理 50 个独立用户访问,那么系统中Apache的总进程数就是 10 * 50 = 500 个,如果一个进程占用 4M 内存,那么总共会消耗2G内存
,所以可以看出,在这种配置中,相当消耗内存,但好处是系统只处理了 50次 TCP 的握手和关闭操作。
如果关闭 KeepAlive,如果还是每秒50个用户访问,如果用户每秒的并发请求数为3个,那么 Apache 的总进程数就是 50 * 3 = 150 个,如果还是每个进程占用 4M 内存,那么总的内存消耗
为600M,这种配置能节省大量内存,但是,系统处理了 150 次 TCP 的握手和关闭的操作,因此又会多消耗一些 CPU 资源。
注:1、如果内存和CPU都足够,开启和关闭KeepAlive对性能影响不大。2、如果考虑服务器压力,如果同一个客户端对服务器会经常访问,建议开启KeepAlive。
实战经验: 公司mysql数据库经常使用CPU达到230%,正常吗? 服务器是4核的。
1、登陆IDC机房查看服务器流量图,流量正常,排除故障与流量无关。
2、为了快速解决问题,可以先直接重启mysql服务后,再查sysql进程CPU使用率依旧高居不下。
3.登陆mysql数据库,执行show processlist;查看当前正在执行的sql语句,发现几个表出现“sending data”状态,sql执行时间过长。
4、通知开发人员检查这几个表有没有增加索引,让开发查看一下。
5、 在mysql配置文件my.cnf中增加以下参数:tmp_table_size=300M和query_cache_size=1024M希望通过增加临时表及查询缓存大小来解决问题,增加这两个参数后,发现CPU占用率有所下降
,有一定效果,但还是超过100%。网站打开依旧缓慢。
6、继续登陆mysql,执行show index from tablename,查询出现“sending data”的几个表,发现果然没有增加索引。
7、执行增加索引的语句,把出现“sending data”的几个表全部加上索引。
ALTER TABLE table_name ADD INDEX index_name (column_list) #增加普通索引
ALTER TABLE table_name ADD UNIQUE (column_list) #增加唯一性索引
ALTER TABLE table_name ADD PRIMARY KEY (column_list) #增加主键索引
注:Primary key和UNIQUE KEY区别
1,Primary key的1个或多个列必须为NOT NULL,如果列为NULL,在增加PRIMARY KEY时,列自动更改为NOT NULL。而UNIQUE KEY 对列没有此要求
2,一个表只能有一个PRIMARY KEY,但可以有多个UNIQUE KEY
总结:重启mysql服务后,mysql进程的CPU占用率恢复正常,网站正常登陆,至此故障得到解决。通知同事验证。后期工作中,可以和开发人员说一下,需要大量查询的表中一定要加索引。

浙公网安备 33010602011771号