apache web服务器
Posted 别人放弃,我努力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache web服务器相关的知识,希望对你有一定的参考价值。
一、安装 apache2.4.23
新版本的 httpd-2.4 新增以下特性;
新增模块;
mod_proxy_fcgi(可提供 fcgi 代理)
mod_ratelimit(限制用户带宽)
mod_request(请求模块,对请求做过滤)
mod_remoteip(匹配客户端的 IP 地址)
对于基于 IP 的访问控制做了修改,不再支持 allow,deny,order 机制,而是统一使用 require 进行
还新增以下几条新特性;
1、MPM 支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能;
--enable-mpms-shared=all --with-mpm=event
2、支持 event
3、支持异步读写
4、在每个模块及每个目录上指定日志级别
5、增强版的表达式分析器
6、每请求配置:,
7、毫秒级别的 keepalive timeout
8、基于 FQDN 的虚拟主机不再需要 NameVirtualHost 指令
9、支持使用自定义变量
安装环境:操作系统:Centos7.2,关闭 selinux
检查 httpd 包是否安装,如查安装则卸载
[root@www ~]# rpm -q httpd
1、安装 apache2.4.23
下载源码包:
httpd-2.4.23.tar.gz
apr-1.5.2.tar.gz
apr-util-1.5.4.tar.gz
zlib-1.2.8.tar.gz pcre-8.39.tar.gz
注:apr(Apache Portable Runtime)Apache 可移植运行库,它是一个对操作系统调用的抽 象库,用来实现 Apache 内部组件对操作系统的使用,提高系统的可移植性。
安装 openssl
安装 apache2.4.23 时提示 openssl 版本过低,centos7 自带版本 openssl-1.0.1e
下载 openssl(先装)
yum install openssl-devel.x86_64
安装 apr 和 apr-util
[root@www ~]# tar zxf apr-1.5.2.tar.gz
[root@www ~]# cd apr-1.5.2/
[root@www apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@www apr-1.5.2]# make && make install
[root@www ~]# tar zxf apr-util-1.5.4.tar.gz
[root@www ~]# cd apr-util-1.5.4/
[root@www apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@www apr-util-1.5.4]# make && make install
安装 zlib
[root@www ~]# tar zxf zlib-1.2.8.tar.gz
[root@www ~]# cd zlib-1.2.8/
[root@www zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@www zlib-1.2.8]# make && make install
安装 pcre
[root@www ~]# tar zxf pcre-8.39.tar.gz
[root@www ~]# cd pcre-8.39/
[root@www pcre-8.39]# ./configure --prefix=/usr/local/pcre
[root@www pcre-8.39]# make && make install
[root@www ~]# mv /usr/bin/openssl /usr/bin/openssl.1.0.1e
[root@www ~]# ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
安装 apache2.4.23
[root@www ~]# tar zxf httpd-2.4.23.tar.gz
[root@www ~]# cd httpd-2.4.23/
[root@www httpd-2.4.23]# ./configure --prefix=/usr/local/http-2.4.23 --enable-so --enable-cgi --enable-cgid --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite --with-pcre=/usr/local/pcre --with-z=/usr/local/zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-mpm=event --enable-proxy --enable-proxy-fcgi --enable-expires --enable-deflate
相关参数解释:
--enable-so:支持动态共享模块(即打开 DSO 支持)
--enable-rewrite:支持 url 重写
--enable-ssl:支持 ssl --with-ssl=/usr/local/openssl:指定 ssl 安装位置
--enable-cgi:启用 cgi --enable-cgid:MPM 使用的是 event 或 worker 要启用 cgid
--enable-modules=most:明确指明要静态编译到 httpd 二进制文件的模块,为 空格分隔的模块名列表、all 或者 most,all 表示包含所有模块,most 表示包含大部分常用模 块
--enable-mods-shared=most:明确指明要以 DSO 方式编译的模块,为空格分隔 的模块名列表、all 或者 most,all 表示包含所有模 块,most 表示包含大部分模块
--enable-mpms-shared=all:启用 MPM 所有支持的模式,这样 event、worker、prefork 就会以 模块化的方式安装,要用哪个就在 httpd.conf 里配置就好了。
--with-mpm=event:指定启用的 mpm 模式,默认使用 enevt 模式,在 apache 的早期版本 2.0 默认 prefork,2.2 版本是 worker,2.4 版本是 event.
--with-pcre=/usr/local/pcre:支持 pcre
--with-z=/usr/local/zlib:使用 zlib 压缩库
--with-apr=/usr/local/apr:指定 apr 的安装路径
--with-apr-util=/usr/local/apr-util:指定 apr-util 的安装路径
--enable-expires:激活彧通过配置文件控制 HTTP 的“Expires:”和“Cache-Control:”头内容,即 对网站图片、js、css 等内容,提供客户端浏览器缓存的设置。这个是 apache 调优的一个重 要选项之一。
--enable-deflate:提供对内容的压缩传输编码支持,一般是 html、js、css 等内容的站点。使 用此参数会打打提高传输速度,提升访问者访问的体验。在生产环境中,这是 apache 调优 的一个重要选项之一。
[root@www httpd-2.4.23]# make && make install
优化 http 程序执行路径
[root@www httpd-2.4.23]# ln -s /usr/local/http-2.4.23/bin/* /usr/local/bin/
修改配置文件 httpd.conf,设置其中的 ServerName 值 (在vim /usr/local/http-2.4.23/conf)
例如:ServerName www.benet.com
开启 apache 服务器:
# /usr/local/http-2.4.23/bin/apachectl start
开机后自动启动
[root@www httpd-2.4.23]# cp /usr/local/http-2.4.23/bin/apachectl /etc/init.d/httpd
编辑 /etc/init.d/httpd 文件,在首行 #!/bin/sh 下面加入这行:
[root@www httpd-2.4.23]# vi /etc/init.d/httpd
# chkconfig: 35 85 15 (在 3 和 5 启动模式下的--启动优先级)
将 Apache 加入开机自动启动:
[root@www httpd-2.4.23]# chkconfig --add httpd
[root@www httpd-2.4.23]# chkconfig httpd on
启动编译好的 Apache 2.4.23:
[root@www httpd-2.4.23]# service httpd start
[root@www httpd-2.4.23]# netstat -anplt | grep 80
tcp6 0 0 :::80 :::* LISTEN 4807/httpd
客户端测试访问(注意防火墙)
二、Apache 的优化配置:
apache 所运行的硬件环境都是对性能影响最大的因素,即使不能对硬件进行升级,也最好 给 apache 一个单独的主机以免受到其他应用的干扰。各个硬件指标中,对性能影响最大的 是内存,对于静态内容(图片、javascript 文件、css 文件等),它决定了 apache 可以缓存多 少内容,它缓存的内容越多,在硬盘上读取内容的机会就越少,大内存可以极大提高静态站 点的速度;对动态高负载站点来说,每个请求保存的时间更多一些,apache 的 mpm 模块会 为每个请求派生出相应的进程或线程分别处理,而进程或线程的数量与内存的消耗近似成正 比,因此增大内存对提高动态站点的负载和运行速度也极为有利 其次是硬盘的速度,静态站点尤为突出,apache 不断的在读取文件并发送给相应的请求, 硬盘的读写是极其频繁的;动态站点也要不断的加载 web 程序(php 等),一个请求甚至要读 取十几个文件才能处理完成,因此尽可能的提高硬盘速度和质量对提高 apache 的性能是有 积极意义的。
最后是 cpu 和网络,cpu 影响的是 web 程序执行速度,网络影响流量大小。
1、apache 的工作模式:
Apache HTTP 服务器被设计为一个强大的、灵活的能够在多种平台以及不同环境下工作的服 务器。这种模块化的设计就叫做“多进程处理模块”(Multi-Processing Module,MPM),也叫 做工作模式。 Prefork 模式(一个非线程型的) : 其主要工作方式是:当 Apache 服务器启动后,mpm_prefork 模块会预先创建多个子进程(默 认为 5 个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork 模块再将 请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将 超过预先创建的子进程数时,mpm_prefork 模块就会创建新的子进程来处理额外的请求。 Apache 总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户 端的请求就不需要在接收后等候子进程的产生。 由于在 mpm_prefork 模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他 两种模块而言较多。不过 mpm_prefork 模块的优点在于它的每个子进程都会独立处理对应 的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork 在效率上 要比 Worker 要高,但是内存使用大得多不擅长处理高并发的场景。 Apache 在 prefork 工作模式下影响性能的重要参数说明
Apache 在 prefork 工作模式下影响性能的重要参数说明
# prefork MPM
<IfModule mpm_prefork_module> StartServers 5
#apache 启动时候默认开始的子进程数 MinSpareServers 5
#最小的闲置子进程数 MaxSpareServers 10
#最大的闲置子进程数 MaxRequestWorkers 250
#MaxRequestWorkers 设置了允许同时的最大接入请求数量。任何超过
MaxRequestWorkers 限制的请求将进入等候队列,在 apache2.3.1 以前的版本
MaxRequestWorkers 被称为 MaxClients,旧的名字仍旧被支持。
MaxConnectionsPerChild 500
注 4:查看 Apache 加载的模块
[root@www ~]#apachectl -t -D DUMP_MODULES
或
[root@www ~]# apachectl -M
或
[root@www ~]# apachectl –l (小写 L,只显示静态模块)
3.重启 httpd 服务
Worker 模式(多线程多进程):
和 prefork 模式相比,worker 使用了多进程和多线程的混合模式,worker 模式也同样会先预 派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会 被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间, 因此,内存的占用会减少一些,在高并发的场景下会比 prefork 有更多可用的线程,表现会 更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是 多个线程出现问题,也只是影响 Apache 的一部分,而不是全部。由于用到多进程多线程, 需要考虑到线程的安全了,在使用 keep-alive 长连接的时候,某个线程会一直被占用,即使 中间没有请求,需要等待到超时才会被释放(该问题在 prefork 模式下也存在) 总的来说,prefork 方式速度要稍高于 worker,然而它需要的 cpu 和 memory 资源也稍多于 woker。
Apache 在 worker 工作模式下影响性能的重要参数说明
# worker MPM
<IfModule mpm_worker_module>
StartServers 3
#apache 启动时候默认开始的子进程数
MinSpareThreads 75
#最小空闲数量的工作线程
MaxSpareThreads 250
#最大空闲数量的工作线程
ThreadsPerChild 25
#每个子进程产生的线程数量
MaxRequestWorkers 400
#与 prefork 模式相同
MaxConnectionsPerChild 0
#与 prefork 模式相同
注 4:进程与线程的区别
线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程 有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是.
(4)二者均可并发执行.
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对 应用的并发性。
进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程 序的运行效率。
Event 模式:
这是 Apache 最新的工作模式,是 worker 模式的变种,它把服务进程从连接中分离出来,一 worker 模式不同的是在于它解决了 keep-alive 长连接的时候占用线程资源被浪费的问题,在 event 工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请
求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并 发场景下的请求处理。event 模式不能很好的支持 https 的访问(HTTP 认证相关的问题)。
3、开启 apache 的 Gzip(deflate)功能
gzip 可以极大的加速网站,有时压缩比率高到 80%,最少都有 40%以上,还是相当不错的。
在 Apache2 之后的版本,模块名不叫 gzip,而叫 mod_deflate
未使用 Gzip
如果要开启 deflate 的话,一定要打开下面二个模块 (进主配:vim /etc/http/conf/httpd.conf)
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
设置压缩比率,取值范围在 1(最低) 到 9(最高)之间,不建议设置太高,虽然有很高的压缩率, 但是占用更多的 CPU 资源.
mod_deflate 模块检查及安装
[root@www ~]# /usr/local/http-2.4.23/bin/apachectl -M | grep deflate
deflate_module (shared)
如果没有安装:
a.编译时安装方法
编译的时候跟上--enable-deflate即可实现安装
b.DSO 方式安装
[root@www ~]# cd /root/httpd-2.4.23/modules/filters/ #切到 apache 源码包 mod_deflate 所在 的目录下
# /usr/local/http-2.4.23/bin/apxs -c -i -a mod_deflate.c #以 dso 的方式编译安装到 apache 中 # /usr/local/http2.2/bin/apxs -c -i -a /root/httpd-2.2.17/modules/metadata/mod_headers.c#以 dso 的方式编译安装到 apache 中 如果报错:
原因是缺少 zlib-devel 的安装包,装上就可以了。
[root@www filters]# ll /usr/local/http-2.4.23/modules/mod_deflate.so
#检查 mod_deflate 是 否安装,成功安装这里会显示出该文件
-rwxr-xr-x. 1 root root 98144 Oct 22 23:14 /usr/local/http-2.4.23/modules/mod_deflate.so
apxs 命令参数说明:
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的 modules 目 录中。
-a 此选项自动增加一个 LoadModule 行到 httpd.conf 文件中,以启用此模块,或者,如果 此行已经存在,则启用之。
-c 此选项表示需要执行编译操作。 如果重启的时候出现错误
需要在 LoadModule deflate_module modules/mod_deflate.so 的前面加载 zlib.so
这里需要注意的是 LoadModule deflate_module 需要放在 LoadModule php5_module 之后
LoadFile /usr/lib/libz.so(x64 系统中该库文件位于/usr/lib64 目录下,可以软链接到/usr/lib 下 或者就在 LoadModule deflate_module modules/mod_deflate.so 这行的上一行添加 LoadFile /usr/lib64/libz.so 即可
重新启动 httpd:
# /usr/local/http2.4.23/bin/apachectl graceful #优雅启动 httpd 服务
修改 Apache 配置文件开启 gzip 压缩传输:()
http.conf 修改、增加配置参数
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
打开 httpd.conf 后,先将上面两行配置前面的#号去掉,这样 apache 就会启用这两个模块, 其中 mod_deflate 是压缩模块,就是对要传输到客户端的代码进行 gzip 压缩;mod_headers 模块的作用是告诉浏览器页面使用了 gzip 压缩,如果不开启 mod_headers 那么浏览器就会 对 gzip 压缩过的页面进行下载,而无法正常显示。 在 httpd.conf 中加入以下代码,可以加到任何空白地方,不了解 apache 的话,如果担心加 错地方,就放到 http.conf 文件的最后一行
<IfModule mod_deflate.c>
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
#AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript application/x- httpd- php
#AddOutputFilterByType DEFLATE image/*
AddOutputFilterByType DEFLATE text/*
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript
application/javascript application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
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|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
</IfModule>
修改完成后保存退出并重启 httpd 服务 使用谷歌浏览器测试访问,
如下图显示结果:(提示:在访问测试页之前按 F12 键)
4、配置 mod_expires 模块
这个非常有用的优化,mod_expires 可以减少 20-30%左右的重复请求,让重复的用户对指定 的页面请求结果都 CACHE 在本地,根本不向服务器发出请求。但要注意更新快的文件不要 这么做。
这个模块控制服务器应答时的 Expires 头内容和 Cache-Control 头的 max-age 指令。有效期 (expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。 未启用 expire 的效果:
[root@www htdocs]# curl -I 192.168.31.83
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 15:52:37 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT
ETag: "8c9f-53f8a01b18080"
Accept-Ranges: bytes
Content-Length: 35999
Vary: Accept-Encoding
Content-Type: image/png
启用 expire 缓存:
mod_expires 的安装配置:
启用 expires_module
LoadModule expires_module modules/mod_expires.so
然后添加 Expires 配置规则
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "now plus 1 month"
ExpiresByType application/x-javascript "now plus 5 day"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/png "access plus 1 minute"
ExpiresByType application/x-shockwave-flash "access plus 1 month"
ExpiresDefault "now plus 0 minute"
</IfModule
验证:
[root@www htdocs]# curl -I 192.168.31.83
HTTP/1.1 200 OK
Date: Tue, 25 Oct 2016 16:00:57 GMT
Server: Apache/2.4.23 (Unix)
Last-Modified: Sun, 23 Oct 2016 15:34:10 GMT
ETag: "8c9f-53f8a01b18080"
Accept-Ranges: bytes
Content-Length: 35999
Cache-Control: max-age=60
Expires: Tue, 25 Oct 2016 16:01:57 GMT
Vary: Accept-Encoding
Content-Type: image/png
4、Apache 禁止目录遍历
将 Options Indexes FollowSymLinks 中的 Indexes 去掉,就可以禁止 Apache 显示该目录结构。
Indexes 的作用就是当该目录下没有 index.html 文件时,就显示目录结构。
1、主配置中启用 httpd-default.conf
Include conf/extra/httpd-default.conf
2、修改 httpd-default.conf
文件:/usr/local/http-2.4.23/conf/extra/httpd-default.conf
找到
ServerTokens Full
ServerSignature On
改成
ServerTokens Prod
ServerSignature off
重启 apache 测试
6、Apache 日志切割
为什么要分割日志 随着网站的访问越来越大,WebServer 产生的日志文件也会越来越大,如果不对日志进行分 割,那么只能一次将大的日志(如 Apache 的日志)整个删除,这样也丢失了很多对网站比较 宝贵的信息,因为这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等, 因此管理好这些海量的日志对网站的意义是很大的。
方法 1:使用 rotatelogs(apache 自带的工具)每隔一天记录一个日志
辑 Apache 的主配置文件,更改内容如下:
注释掉如下两行
ErrorLog logs/error_log
CustomLog logs/access_log common
然后添加如下两行
ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
注:其中 86400 为轮转的时间单位为秒
验证:查看 logs 目录下的日志文件
[root@www ~]# ls /usr/local/http-2.4.23/logs/ (如果没有的稍等,有缓存)
access_20161026.log access_log deflate_log.log error_20161026.log error_log httpd.pid
由于 apache 自带的日志轮询工具 rotatelogs,据说在进行日志切割时容易丢日志,因此我们 通常使用 cronolog 进行日志轮询。
方法 2、使用 cronolog 为每一天建立一个新的日志
安装 cronolog 程序
下载 cronolog
[root@www ~]# tar zxf cronolog-1.6.2.tar.gz
[root@www ~]# cd cronolog-1.6.2/
[root@www cronolog-1.6.2]# ./configure && make && make install
主配置文件中的使用方法
ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"
CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined
如果 Apache 中有多个虚拟主机,最好每个虚拟主机中放置一个这样的代码,并将日志文件 名改成不同的名字。
扩展:
这个保证了每天一个文件夹文件夹下每个小时产生一个 log CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined
按天轮询(生产环境常见用法,推荐使用): CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined
按小时轮询(生产环境较常见用法): CustomLog "|/usr/local/sbin/cronolog logs /access_www_ %Y%m%d%H.log" combined
验证:查看 logs 目录下的日志文件
[root@www ~]# ls /usr/local/http-2.4.23/logs/
access-20161026.log access_log deflate_log.log error-20161026.log error_log httpd.pid
注意:
这两个管道日志文件程序还有一点不同之处是使用 cronolog 时如果日志是放在某个不存 在的路径则会自动创建目录,而使用 rotatelogs 时不能自动创建,这一点要特别注意
7、配置防盗链
有时候,你的网站莫名其妙的访问量变大,不要高兴的太早,有可能是被别人盗链了。 举个例子:比如你搭了个 discuz 论坛,里面有些热点图片、视频;然后别人将他网站上访问 图片的地址重定向到你的 discuz 上,这样他的服务器就可以空闲出来了;也就是说别人访问 他网站的图片视频,消耗的确是你服务器的资源; 解决这个问题的方法是配置下防盗链,让外来的盗不了链;
方法 1:Apache 防盗链的第一种实现方法,可以用 rewrite 实现。
首先要确认 Apache 的 rewrite module 可用:
[root@www ~]# apachectl -M | grep rewrite
rewrite_module (shared)
打开 httpd.conf,确保有这么一行配置:
LoadModule rewrite_module modules/mod_rewrite.so
然后在找到自己网站对应的配置的地方(如在主配置文件中或虚拟主机中),
加入下列代码: ServerName www.benet.com
#防盗链配置
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://benet.com/.*$ [NC]
RewriteRule .*\\.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png[R,NC,L]
防盗链配置的说明:
如果访问不了 把域名改为ip
先要在htdoce里放入两张图片:
<img src="1.jpg">
<img src="2.jpg">
然后再打开一台:安装apache
第一台:
三、fcgi 模式编译安装 LAMP+xcache
php 的工作模式:
php 在 lamp 环境下共有三种工作模式:CGI 模式、apache 模块、FastCGI 模式。
CGI 模式下 运行 PHP,性能不是很好。作为 apache 的模块方式运行,在以前的课程中编译安装 lamp 已 经介绍过了。
FastCGI 的方式和 apache 模块的不同点在于:
FastCGI 方式 PHP 是一处独立的 进程,所有 PHP 子进程都由 PHP 的一个叫作 php-fpm 的组件负责管理;而 apache 模块化方 式运行的 PHP,则是 apache 负责调用 PHP 完成工作。PHP 的 FastCGI 方式性能要比 apache 模块化方式强很多,今天我们以 FastCGI 方式编译安装 lamp。 FastCGI 工作机制: 首先客户端发起请求,请求分为 2 种,一种是静态请求它可以直接由 Apache 直接响应返回; 另一种是动态的请求,如其中包含中 php 或者 Perl 这种脚本解释性语言,则由 Apache 服务 器通过fastcgi协议调用php服务器执行并返回给Apache由Apache返回解释执行后的结果, 如果这个过程中涉及到对数据的操作,此时 php 服务器还会还会通过 mysql 协议调用 mysql 服务器。
编译环境及各软件版本:(三台初始环境)web、php、mysql
主机规划
至少 3 台主机,操作系统都是 centos7.2.网段在 192.168.197.0/24 网关 192.168.197.2
分配如下: 1 台 httpd 服务器(192.168.31.83)
1 台 php 服务器(192.168.31.141)
1 台 mysql 服务器(192.168.31.225)
编译安装 LAMP
编译安装 apache(请参考前面 apache 的安装)
编译安装 mysql(请参考 mysql 安装)
FastCGI 方式安装 php
1、解决依赖关系 [root@phpserver ~]# yum -y install libxml2-devel lzip2-devel libcurl-devel openssl-devel bzip2-devel
安装 libmcrypt
[root@phpserver ~]# tar zxf libmcrypt-2.5.7.tar.gz
[root@phpserver ~]# cd libmcrypt-2.5.7/
[root@phpserver libmcrypt-2.5.7]# ./configure --prefix=/usr/local/libmcrypt && make && make install
2、编译安装 php
[root@phpserver ~]# tar zxf php-5.6.27.tar.gz
[root@phpserver ~]# cd php-5.6.27/
[root@phpserver php-5.6.27]# ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-openssl --enable-fpm --enable-sockets --enable-sysvshm --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --with-mhash --with-mcrypt=/usr/local/libmcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2--enable-maintainer-zts
[root@phpserver php-5.6.27]# make && make install
3、提供 php 配置文件
[root@phpserver php-5.6.27]# cp php.ini-production /etc /php.ini
4、为 php-fpm 提供脚本
[root@phpserver php-5.6.27]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@phpserver php-5.6.27]# chmod +x /etc/init.d/php-fpm
[root@phpserver php-5.6.27]# chkconfig --add php-fpm
[root@phpserver php-5.6.27]# chkconfig php-fpm on
5、提供 php-fpm 配置文件并编辑:
# cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf
[root@phpserver ~]# vi /usr/local/php5.6/etc/php-fpm.conf
修改内容如下:
pid = run/php-fpm.pid
listen = 192.168.31.141:9000(phpip)
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
启动 php-fpm 服务:
[root@phpserver ~]# service php-fpm start
Starting php-fpm done
[root@phpserver ~]# netstat -anpt | grep php-fpm
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN
25456/php-fpm: mast
[root@phpserver ~]# firewall-cmd --permanent --add-port=9000/tcp success
[root@phpserver ~]# firewall-cmd --reload Success
在该主机上新建虚拟主机目录用于存放网页文件
[root@phpserver ~]# mkdir -p /var/www/benet
至此 php 安装配置完毕,下面配置 apache 通过 fastcgi 协议调用 php
6、配置 apache(切换到 apache 主机上操作)
在 Apache2.4 以后已经专门有一个模块针对 FastCGI 的实现,此模块为 mod_proxy_fcgi.so, 它其实是作为 mod_proxy.so 模块的扩充,因此,这两个模块都要加载
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
[root@www ~]# apachectl -M | grep proxy
proxy_module (shared)
proxy_fcgi_module (shared)
建立一个目录作为虚拟主机的家目录
[root@www ~]# mkdir -p /var/www/benet
编辑主配置文件 httpd.conf,开启虚拟主机
启用 Include conf/extra/httpd-vhosts.conf
同时定位 AddType;添加下面两行:让 apache 能识别 php 格式的页面
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
并且定位至 DirectoryIndex:支持 php 格式的主页
DirectoryIndex index.php index.html #添加 index.php
配置虚拟主机支持使用 fcgi
[root@www ~]# vi /usr/local/http-2.4.23/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@benet.com
DocumentRoot "/var/www/benet"
ServerName www.benet.com
ServerAlias benet.com
ErrorLog "logs/benet.com-error_log"
CustomLog "logs/benet.com-access_log" common
ProxyRequests Off
ProxyPassMatch ^/(.*\\.php(/.*)?)$ fcgi://192.168.31.141:9000/var/www/benet/$1
<Directory "/var/www/benet">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
三方模块支持 PHP-FPM 实现。
测试 LAMP 环境:
在 mysql 主机上创建用于 php 服务器连接的 mysql 账户
mysql> grant all on *.* to testuser@\'%\' identified by \'123456’;
注意防火墙要允许 mysql 连接。
在 php 服务器上的/var/www/benet 目录下创建.php 的测试页:
[root@phpserver ~]# cat /var/www/benet/index.php
<?php
phpinfo();
?>
[root@phpserver ~]# cat /var/www/benet/test1.php
<?php
$link=mysql_connect(\'192.168.31.225\',\'testuser\',\'123456\');
if ($link)echo "connection success......";
mysql_close();
?>
测试访问 php 测试页:
看到上面两个测试页说明 apache、php、mysql 之间可以协同工作了。
7、压力测试
网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压 情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。 性能测试工具目前最常见的有以下几种:ab、http_load、webbench、siege。今天我们专门 来介绍 ab。
ab 是 apache 自带的压力测试工具。ab 非常实用,它不仅可以对 apache 服务器进行网站访 问压力测试,也可以对或其它类型的服务器进行压力测试。比如 nginx、tomcat、IIS 等。 下面我们开始介绍有关 ab 命令的使用:
查看 ab 是否安装成功,可以切换到上述目录下,使用 ab –V 命令进行检测。
如下: [root@www ~]# /usr/local/http-2.4.23/bin/ab -V
This is ApacheBench, Version 2.3 <$Revision: 1748469 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
如果 ab –V 命令出错,可以 exporexport LD_LIBRARY_PATH="/usr/local/openssl/lib/", 就可以了。
8、CentOS7.2 下安装 php加速软件 Xcache(在 php 主机上完成下面的操作)
说明:
php 安装目录:/usr/local/php5.6
php.ini 配置文件路径:/etc/php.ini
php 网页根目录:/var/www/benet
1)安装 xcache
wget http://xcache.lighttpd.net/pub/Releases/3.2.0/xcache-3.2.0.tar.gz #下载
[root@phpserver ~]# tar zxf xcache-3.2.0.tar.gz #解压
[root@phpserver ~]# cd xcache-3.2.0/ #进入安装目录
[root@phpserver xcache-3.2.0]# /usr/local/php5.6/bin/phpize#用 phpize 生成 configure 配置文 件
[root@phpserver xcache-3.2.0]# ./configure --enable-xcache --enable-xcache-coverager --enable-xcache-optimizer --with-php-config=/usr/local/php5.6/bin/php-config #配置
[root@phpserver xcache-3.2.0]# make && make install #编译、安装
Installing shared extensions: /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/
安装完成之后,出现下面的界面,记住以下路径,后面会用到
/usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/
2)创建 xcache 缓存文件
# touch /tmp/xcache
# chmod 777 /tmp/xcache
3)拷贝 xcache 后台管理程序到网站根目录
[root@phpserver xcache-3.2.0]# cp -r htdocs/ /var/www/benet/xcache
4)配置 php 支持 xcache
vi / etc/php.ini #编辑配置文件,在最后一行添加以下内容
[xcache-common]
extension = /usr/local/php5.6/lib/php/extensions/no-debug-zts-20131226/xcache.so(这是上面的路径)
[xcache.admin]
xcache.admin.enable_auth = Off
[xcache]
xcache.shm_scheme ="mmap"
xcache.size=60M
xcache.count =1
xcache.slots =8K
xcache.ttl=0
xcache.gc_interval =0
xcache.var_size=64M
xcache.var_count =1
xcache.var_slots =8K
xcache.var_ttl=0
xcache.var_maxttl=0
xcache.var_gc_interval =300
xcache.test =Off
xcache.readonly_protection = Off
xcache.mmap_path ="/tmp/xcache"
xcache.coredump_directory =""
xcache.cacher =On
xcache.stat=On xcache.optimizer =Off
[xcache.coverager]
xcache.coverager =On
xcache.coveragedump_directory =""
将 xcache 目录拷贝到 apache 主机的网页文档目录下
[root@phpserver ~]# scp -r /var/www/benet/xcache/ root@192.168.31.83:/var/www/benet/
6)测试 service php-fpm restart #重启 php-fpm
浏览器打开网站根目录下面的 xcache
http://http://192.168.31.83/xcache 可以看到如下页面: (httpdip)
至此,Linux 下安装 php 加速软件 Xcache 教程完成
查看 xcache 的命中率:
9、部署 bbs 论坛
Discuz 的程序文件解压,并且将 upload 中所有文件放置到网站目录(php 服务器的操作)
#unzip Discuz_7.0.0_FULL_SC_UTF8.zip -d discus
# mv Discuz/upload/ /var/www/benet/bbs
设置 php-fpm 的服务用户为下面文件的属主或者对其设置写权限,否则安装时会报错
#cd /var/www/benet/bbs
#chown -R nobody config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/
#chmod -R 777 uc_server/data/
修改 php.ini 文件
short_open_tag = On
service php-fpm restart(重启)
web 服务器也需要有静态文件(apache 服务器上操作)
#unzip Discuz_7.0.0_FULL_SC_UTF8.zip -d discus
# mv Discuz/upload/ /var/www/benet/bbs
设置 httpd 的服务用户对指定文件也需要有写权限
#cd /var/www/benet/bbs
#chown -R daemon config.inc.php attachments/ forumdata/ uc_client/data/cache/ templates/
在数据库服务器上创建 bbs 数据库及授权帐户
mysql> create database bbsdb;
Query OK, 1 row affected (0.01 sec)
mysql> grant all on bbsdb.* to runbbs@\'%\' identified by \'123\';
Query OK, 0 rows affected, 1 warning (0.03 sec)
置完成之后,输入 httd://192.168.31.83/bbs/install 即可安装
填写数据库的相关信息,添加数据库服务器的地址和 MariaDB 创建的数据库和用户密码,而 后在设置 bbs 的管理员帐号密码就可以继续安装了。 剩下的根据提示安装即可。
出现上面这种情况是由于 php 服务器安装了 discuz 之后导致程序发生变化从而导致动态服 务器和静态服务器的程序不一致,只需要手动把 bbs 服务器的文件和 web 服务器进行一次 同步即可,如果想实现自动同步,需要使用其他服务,如 initory+rsync、sersync 等工具。
#scp -r /var/www/benet/bbs/* root@192.168.31.83:/var/www/benet/bbs/
动态服务器和静态服务器同步文件之后,再次访问 bbs 的网址就正常了。
以上是关于apache web服务器的主要内容,如果未能解决你的问题,请参考以下文章