您的位置:首页 > 运维架构 > Apache

Apache服务器的基本配置

2017-03-13 21:55 232 查看
1. 安装Apache软件包:httpd
2.开启httpd服务
#netstat -tnl |grep :80 (查看是否有80端口,有则启动成功)
3.设置apache服务器开机后自动运行
4.测试:在Linux下用elinks(软件包elinks)或firefox浏览器测试;在Windows下用IE:http://192.168.2.1。
测试页:/etc/httpd/conf.d/welcome.conf

Apache服务器的配置文件:
#vim /etc/httpd/conf/httpd.conf
-------------------------------------------------------------------------------------------------------------------------
ServerRoot:用于指定Apache服务器运行的根目录,此目录不能改。Apache服务器开启之后,
会在这个目录下工作。

MaxClients:指定同时能访问服务器的客户机数量。

DocumentRoot:服务器共享文件的起始位置,即默认网站的根目录。默认网站的根目录为:
DocumentRoot “/var/www/html”。
将网站上传到到网站根目录下,网站的内容就都访问到了。
DirectoryIndex:默认网站主页

AddDefaultCharset UTF-8 默认编码方式

Listen:服务器监听的端口,默认80端口。

ServerAdmin:设置管理员的信箱。当服务器出现问题时,在客户机出错信息上会显示管理员的
信箱,这时客户机就会利用此信箱地址给管理员发邮件,告知管理员维护。
------------------------------------------------------------------------------------------------------------------------------------------------

Apache服务器的高级配置(一)

虚拟主机:
虚拟主机:利用虚拟主机可以实现在一台服务器上实现多个Web站点,

一、配置基于IP的虚拟主机:
注:在一台服务器上配置多个IP地址的方法有两种:

①安装多块物理网卡,对每块网卡配置不同的IP地址。

②在一块网卡上绑定多个IP地址。

ifconfig eth0 172.18.211.9/24
ifconfig eth0:1 172.18.211.10/24

<VirtualHost172.18.211.9:80>
DocumentRoot /var/www/bj
</VirtualHost>

<VirtualHost172.18.211.10:80>
DocumentRoot /var/www/sh
</VirtualHost>

二、基于端口的虚拟主机:

Listen 80
Listen 8080

<VirtualHost*:80>
DocumentRoot/var/www/bj
ServerName172.18.211.9:80
</VirtualHost>

<VirtualHost*:8080>
DocumentRoot/var/www/sh
ServerName172.18.211.9:8080
</VirtualHost>

三、配置基于域名的虚拟主机:

基于域名的虚拟主机:即配置多个域名指向同一个IP地址,访问不同域名时访问的是同一主机上的不同网站。
实现过程:
①配置DNS,实现对www.bj.com www.sh.com的解析

②#vim /etc/httpd/conf/httpd.conf

----------------------------------------------------------
NameVirtualHost *:80

<VirtualHost*:80>
DocumentRoot/var/www/bh
ServerName www.bj.com
</VirtualHost>

<VirtualHost*:80>
DocumentRoot/var/www/sh
ServerName www.sh.com
</VirtualHost>
----------------------------------------------------------
认证授权和访问控制

ip访问控制:

目录控制语句以<Directory 目录名>开头;以</Directory>结束。

先允许后拒绝,以最后一次匹配到为准,默认拒绝所有:Order allow,deny

先拒绝后允许,以最后一次匹配到为准,默认允许所有:Order deny,allow

AllowOverride None:不允许覆盖,即不允许从根目录向子目录覆盖。即默认情况下拒绝从根目录下向子目录访问,如果要看根目录下的一个子目录,必须先打开子目录的访问权限。

Order allow,deny:访问控制的顺序,先匹配允许,再匹配拒绝,默认拒绝。
Allow from all:表示允许任何地址访问。
Allow from 172.18.49.0/24
Deny from 172.18.49.102

用户身份认证授权
主要参数
Authtype 是认证类型 Basic apache自带的基本认证
Authname 认证名字,是提示你输入密码的对话框的提示语
Authuserfile 是存放认证用户的文件
require user 用户名允许指定的一个或多个用户访问,如果认证文件里面还有其他用户,还是不能访问
require valid-user 所有认证文件里面的用户都可以访问
require group 组名 授权给一个组,较少用

vim/etc/httpd/conf/httpd.conf
-------------------------------------------
<VitrualHost172.18.211.100>
DocumentRoot /www/bj
<Directory/www/bj>认证的目录
AuthType Basic 认证的方法:密码
AuthNamePassword!登录框的提示
AuthUserFile /etc/httpd/webpasswd 验证的文件
require user tom 认证的要求(密码文件里只有tom可以登录)(require valid-user密码文件中所有存在的用户都可以登录)
</Directory>
</VitrualHost>
--------------------------------------------
htpasswd -c /etc/httpd/webpasswd tom 创建/etc/httpd/webpasswd并且将tom加入验证文件,为tom设置密码
htpasswd /etc/httpd/webpasswd jack 将jack加入验证文件,为jack设置密码

源码包安装httpd
软件 编写编译链接运行 安装

一、配yum
1.挂光驱 mount /dev/sr0/media
2.vim/etc/yum.repo.d/bj.repo
-----------------------------
[local]
name = bj
baseurl = file:///media 软件路径
gpgcheck = 0 不做软件包验证
enable =1 启用
-----------------------------
二、安装FTP服务器上传httpd源码包
yum -y install vsftpd
getenforce 0设置SELinnux为警告模式
useradd tom -s/sbin/nologin 创建用户tom,限制tom不能登录到系统
上传httpd源码包

三、安装编译软件gcc make
yum-y install gcc make

四、编译安装
tar -xvf httpd.....解包
cd httpd....
./configure && make && make install 编译安装源码包
五、测试
源码包安装默认

网站根目录/usr/local/apache2/htdocs/

主页 index.html

主配置文件/usr/local/apache2/conf/httpd.conf

启动服务 /usr/local/apache2/bin/apachectl start

六、配置虚拟主机(同前)
配置DNS 实现正确解析

配置基于域名的虚拟主机,方法同前

DocumentRoot "/usr/local/apache-2.2.6/htdocs"

#设置WEB文档根目录的默认属性

<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>

#设置DocumentRoot指定目录的属性

<Directory "/usr/local/apache-2.2.6/htdocs">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

#设置默认目录资源列表文件

<IfModule dir_module>
DirectoryIndex index.html
</IfModule>

#拒绝对.ht开头文件的访问,以保护.htaccess文件

<FilesMatch "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch>

<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 combined
</IfModule>

#设定默认CGI脚本目录及别名

ScriptAlias /cgi-bin/ "/usr/local/apache-2.2.6/cgi-bin/"

#在以线程式MPM(worker)运行的Apache中设置用来与CGI守护进程通信的套接字文件名前缀

<IfModule cgid_module>
Scriptsock logs/cgisock
</IfModule>
#设定默认CGI脚本目录的属性

<Directory "/usr/local/apache-2.2.6/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

#设定默认MIME内容类型
DefaultType text/plain
<IfModule mime_module>

##指定MIME类型映射文件
TypesConfig conf/mime.types

#增加.Z .tgz的类型映射
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>

#启用内存映射
EnableMMAP on
##使用操作系统内核的sendfile支持来将文件发送到客户端
EnableSendfile on
#指定多路处理模块(MPM)配置文件并将其附加到主配置文件
Include conf/extra/httpd-mpm.conf
#指定多语言错误应答配置文件并将其附加到主配置文件
Include conf/extra/httpd-multilang-errordoc.conf
#指定目录列表配置文件并将其附加到主配置文件
#Include conf/extra/httpd-autoindex.conf
#指定语言配置文件并将其附加到主配置文件
Include conf/extra/httpd-languages.conf
#指定用户主目录配置文件并将其附加到主配置文件
#Include conf/extra/httpd-userdir.conf
#指定用于服务器信息和状态显示的配置文件并将其附加到主配置文件
#Include conf/extra/httpd-info.conf
#指定提供Apache文档访问的配置文件并将其附加到配置文件
#Include conf/extra/httpd-manual.conf
#指定DAV配置文件并将其附加到主配置文件
#Include conf/extra/httpd-dav.conf
#指定与Apache服务自身相关的配置文件并将其附加到主配置文件
Include conf/extra/httpd-default.conf
#指定mod_deflate压缩模块配置文件并将其附加到主配置文件
Include conf/extra/httpd-deflate.conf
#指定mod_expires模块配置文件并将其附加到主配置文件
Include conf/extra/httpd-expires.conf
##指定虚拟主机配置文件并将其附加到主配置文件
#Include conf/extra/httpd-vhosts.conf
#指定SSL配置文件并将其附加到主配置文件
Include conf/extra/httpd-ssl.conf
##SSL默认配置
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

#配置多路处理模块(MPM) httpd-mpm.conf
首先说一下原理:
prefork模式
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工作方式类似于Apache 1.3。它适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将
每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。
这个MPM具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存
超出物理内存的大小。
worker模式
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进
程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。
控制这个MPM的最重要的指令是,控制每个子进程允许建立的线程数的ThreadsPerChild指令,和控制允许建立的总线程数的MaxClients指令

#设置prefork多路处理模块
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit    8000
MaxClients 8000
MaxRequestsPerChild 0
</IfModule>
StartServers:设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
MinSpareServers:设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于 MinSpareServers ,那么Apache将以最大每秒一个的
速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。
MaxSpareServers:设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数
。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers 小,Apache将会自动将其修改成"MinSpareServers+1"。
ServerLimit:服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和MaxClients一样。修改此指令的值必须
完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
MaxClients:用于伺服客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是256,如果要提高这个值必须同时提高
ServerLimit的值。笔者建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
MaxRequestsPerChild:设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程
将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏无限进行而耗尽内存;
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
如果设置为非零值,建议设为10000-30000之间的一个值。
公式:MaxClients<=ServerLimit

#设置worker多路处理模块
<IfModule mpm_worker_module>
StartServers 5
ServerLimit 20
ThreadLimit 200
MaxClients 4000
MinSpareThreads 25
MaxSpareThreads 250
ThreadsPerChild 200
MaxRequestsPerChild 0
</IfModule>
StartServers:设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
ServerLimit:服务器允许配置的进程数上限。只有在你需要将MaxClients和ThreadsPerChild设置成需要超过默认值16个子进程的时候才需要使用这个指令。不要将该指令的值设
置的比MaxClients 和ThreadsPerChild需要的子进程数量高。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。
ThreadLimit:设置每个子进程可配置的线程数ThreadsPerChild上限,该指令的值应当和ThreadsPerChild可能达到的最大值保持一致。修改此指令的值必须完全停止服务后再启动
才能生效,以restart方式重启动将不会生效。
MaxClients:用于伺服客户端请求的最大接入请求数量(最大线程数)。任何超过MaxClients限制的请求都将进入等候队列。默认值是"400",16 (ServerLimit)乘以25
(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加 ServerLimit的值。笔者建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动
态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
MinSpareThreads:最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads:设置最大空闲线程数。默认值是"250"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线程。
MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和。
ThreadsPerChild:每个子进程建立的线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。每个子进程所拥有的所有线程的总数要足够大,以便可以处理
可能的请求高峰。
MaxRequestsPerChild:设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程
将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏无限进行而耗尽内存;
给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
如果设置为非零值,建议设为10000-30000之间的一个值。
公式:
ThreadLimit >= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild 必须是ThreadsPerChild的倍数
MaxSpareThreads >= MinSpareThreads+ThreadsPerChild
#配置Apache服务器默认设置 httpd-default.conf 备注:这个文件要打开
Timeout 300
Timeout定义客户程序和服务器连接的超时间隔,超过这个时间间隔(秒)后服务器将断开与客户机的连接。
KeepAlive Off
在HTTP 1.0中,一次连接只能作传输一次HTTP请求,而KeepAlive参数用于支持HTTP 1.1版本的一次连接、多次传输功能,这样就可以在一次连接中传递多个HTTP请求。虽然只有较新的浏览器才支持这个功能,但还是打开使用这个选项。
MaxKeepAliveRequests 100
MaxKeepAliveRequests为一次连接可以进行的HTTP请求的最大请求次数。将其值设为0将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。
KeepAliveTimeout 5
KeepAliveTimeout测试一次连接中的多次请求传输之间的时间,如果服务器已经完成了一次请求,但一直没有接收到客户程序的下一次请求,在间隔超过了这个参数设置的值之后,服务器就断开连接。
UseCanonicalName Off
AccessFileName .htaccess
ServerTokens Prod
ServerSignature Off
HostnameLookups Off

Timeout:设置服务器在断定请求失败前等待的秒数。默认值300。
KeepAlive:设置是否启用HTTP持久链接,On 代表打开,Off 代表关闭。如果用于同一页面包含大量静态文件的应用,设置为On,以提高性能;如果用于主要为动态页面的应用,
设置为Off,以节约内存资源;如果服务器前跑有squid或者其它七层设备,设置为On。
MaxKeepAliveRequests:限制当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。笔者建议将此值设为100-500之间的一个值,以确保最优
的服务器性能。
KeepAliveTimeout:设置持久链接中服务器在两次请求之间等待的秒数。对于高负荷服务器来说,KeepAliveTimeout值较大会导致一些性能方面的问题:超时值越大,与空闲客户
端保持连接的进程就越多。
UseCanonicalName:配置服务器如何确定它自己的域名,可选值为On | Off | DNS。DNS用于为大量基于IP的虚拟主机支持那些古董级的不提供"Host:"头的浏览器使用。笔者建议
设置为Off。
AccessFileName:设置分布式配置文件的名字,默认为.htaccess。如果为某个目录启用了分布式配置文件功能,那么在向客户端返回其中的文档时,服务器将在这个文档所在的各
级目录中查找此配置文件,因此会带来性能问题,笔者建议关闭分布式配置文件功能。
ServerTokens:控制服务器回应给客户端的"Server:"应答头是否包含关于服务器操作系统类型和编译进的模块描述信息,同时还控制着 ServerSignature指令的显示内容。可选值
为Full | OS | Minor | Minimal | Major | Prod。笔者建议设置为显示最少信息的Prod。
ServerSignature:配置服务器生成页面的页脚,可选值为On | Off | EMail。采用On会简单的增加一行关于服务器版本和正在伺服的虚拟主机的ServerName,而EMail设置会额外
创建一个指向 ServerAdmin的"mailto:"部分。建议使用默认值Off。
HostnameLookups:设置是否启用对客户端IP的DNS查找,可选值为On | Off | Double。DNS查询会造成明显的时间消耗,建议设置为Off。

#配置mod_deflate压缩模块 httpd-deflate.conf
mod_deflate模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。
编辑mod_deflate压缩模块设置文件:

<IfModule mod_deflate.c>
DeflateMemLevel 9
DeflateWindowSize 15
DeflateBufferSize 8096
DeflateCompressionLevel 8
## 调试时去掉下面5行前的注释符,用以记录压缩日志
#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio
#LogFormat '"%r" %b %{outstream}n/%{instream}n (%{ratio}n%%) "%{User-agent}i"' deflate
#CustomLog logs/deflate_log deflate
## 插入DEFLATE过滤器,以启用输出压缩
 SetOutputFilter DEFLATE
 ## Netscape 4.x 有一些问题,仅压缩txt/html类型
BrowserMatch ^Mozilla/4 gzip-only-text/html
 ## Netscape 4.06-4.08不能处理任何压缩内容,不进行压缩
BrowserMatch ^Mozilla/4.0[678] no-gzip
## MSIE 会伪装成 Netscape ,但是事实上它没有问题
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
## 设置图片、mp3、压缩格式文件等不需要进行压缩内容
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
## 确保代理不会发送错误的内容
Header append Vary User-Agent env=!dont-vary
</IfModule>

DeflateMemLevel:指定zlib在压缩时最多可以使用多少内存,取值范围在1到9之间。
DeflateWindowSize:定义zlib压缩窗口(compression window)的大小,取值范围在1到15之间,通常窗口越大压缩效果越好。
DeflateBufferSize:定义zlib一次压缩的片断的字节数,默认为8096。
DeflateCompressionLevel:设定压缩程度,越高的压缩程度就会有越好的压缩效果,同时也意味着占用越多的CPU资源。取值范围在 1(最低压缩率) 到 9(最高压缩率)之间,如果
不设置此指令,默认为zlib的默认值。
DeflateFilterNote:在日志中放置压缩率标记。
语法为:DeflateFilterNote type notename
notename就表示这个压缩率标记的名字,你可以为了某种统计目的将这个标记的名字添加到访问日志中。
type指定notename标记所记录的数据类型:Input,在标记中存储过滤器输入流的字节数;Output,在标记中存储过滤器输出流的字节数;Ratio,在标记中存储过滤器的压缩比(输
出/输入*100),这是type的默认值。
SetOutputFilter:设置用于在服务器应答发送到客户端之前使用的过滤器。如果多于一个过滤器,必须按照处理内容的顺序用分号(;)分隔。
BrowserMatch:基于User-Agent头有条件地设置环境变量。
SetEnvIfNoCase:根据大小写无关的客户端请求属性设置环境变量。
Headers:配置HTTP应答头。这个指令可以替换、合并、删除HTTP应答头。应答头紧跟在内容处理器和输出过滤器完工之后生成,这时候才能对头进行修改。

#配置mod_expires模块
这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。这些
HTTP头向客户端表明了文档的有效性和持久性。如果有缓存,文档就可以从缓存(除已经过期)而不是从服务器读取。接着,客户端考察缓存中的副本,看看是否过期或者失效,以
决定是否必须从服务器获得更新。
编辑mod_expires设置文件:httpd-expires.conf

## mod_expires设置文件
<IfModule mod_expires.c>
ExpiresActive on
  ExpiresDefault A300
ExpiresByType text/html A300
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType text/css A2592000
ExpiresByType text/js A2592000
ExpiresByType text/javascript A2592000
ExpiresByType application/x-javascript A2592000
</IfModule>

ExpiresActive:对其作用范围内的文档启用或禁用产生Expires和Cache-Control头的功能。若设置为 Off 则不会为其作用范围内的任何文档生成Expires和Cache-Control头(除非
被更低一层的规则改写,比如.htaccess文件)。若设置为 On 则会按照ExpiresByType和ExpiresDefault指令定义的标准为其作用范围内的文档生成Expires和Cache-Control 头。
注意,这个指令并不保证Expires或Cache-Control头一定会产生。如果定义的标准不规范,将不会产生这两个头,其效果是好像从未设置过这个指令一样。
ExpiresByType:为指定MIME类型的文档配置Expires头的值。
语法为:ExpiresByType MIME-type <code>seconds
seconds参数设置了添加到基准时间以构造有效期限的秒数。Cache-Control: max-age的计算方法是从有效期减去当前请求时间并转化为秒数。
基准时刻可以是源文件的最后修改时刻或者客户端对源文件的访问时刻,至于使用那一个则由<code>指定。"M"表示源文件的最后修改时刻,"A"表示客户端对源文件的访问时刻。
需要注意的是<code>和seconds之间没有空格。如果使用"M",所有当前缓存中的文档副本都将在同一时刻过期,这个可能对定期更新的URL(比如位于同一位置的每周通告)很有好处
。如果使用"A",则每个客户端所得到的有效期是不一样的,这个可能对那些几乎不更新的图片文件很有好处,特别是对于一组都引用了相同图片的相关文档。
ExpiresDefault:设置其作用范围内的所有文档的默认有效期的计算方法,它可以被ExpiresByType指令基于MIME类型被改写。
语法为:ExpiresDefault <code>seconds
<code>seconds同ExpiresByType一致。
#最后配置一下虚拟主机 httpd-vhost.conf
#这里重点介绍一下基于多端口的配置
NameVirtualHost *:81
NameVirtualHost *:82
NameVirtualHost *:83

<VirtualHost *:81>
ServerAdmin jafy@jafy00.com
DocumentRoot /www1
ServerName www.jafy00.com
ErrorLog logs/www1-error.log
CustomLog logs/www1-access_log common
</VirtualHost>

<VirtualHost *:82>
<Directory "/www2" >
Options FollowSymLinks
#Deny from all
Allow from all
</Directory>
ServerAdmin jafy@jafy00.com
DocumentRoot /www2
ServerName www.jafy00.com
DirectoryIndex index.php index.html
ErrorLog logs/www2-error.log
CustomLog logs/www2-access_log combined
</VirtualHost>

下面介绍几个常用的apache命令:
/usr/local/apache2/bin/apachectl -M 查看常见的模块(包括动态和静态)

/usr/local/apache2/bin/apachectl -l 查看加载的静态模块

/usr/local/apache2/bin/apachectl -t 检查配置文件有无语法错误

/usr/local/apache2/bin/apachectl graceful 加载配置文件,但不重启

/usr/local/apache2/bin/apachectl start/restart/stop 启动/重启/停止apache服务

下列的配置在apache2.2.31版本实测。
一、用户认证
有些时候访问网站下的一些页面时,需要用户认证。
编辑虚拟主机的配置文件:

vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

写入:

<Directory /data/www/abc> #/data/www/abc为将要访问的页面的目录
AllowOverride AuthConfig
AuthName "cct"
AuthType Basic
AuthUserFile /data/.htpasswd #指定存放用户名和密码的文件
require valid-user
</Directory>

保存退出,生成密码文件
htpasswd -c /data/.htpasswd cct #指定用户名为cct,输入自己设定的密码

/usr/local/apache2/bin/apachectl graceful 加载配置

二、默认虚拟主机
有些时候,为了web服务安全性,我们需要设置默认的虚拟主机。
编辑虚拟主机的配置文件:

<VirtualHost *:80>
DocumentRoot "/tmp/111" #该目录可以不存在
ServerName 111.com
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/data/www"
ServerName www.test.com
ServerAlias www.aaa.com
</VirtualHost>

将这段设定放在虚拟主机配置的最上面。除了已作过设置的域名(aaa、test)外,其余访问的域名均跳转到/tmp/111下。
三、rewrite规则
下列代码均写在<IfModule mod_rewrite.c>模块下
1.域名301跳转
web服务可能会用到多个域名,域名有主有次,输入次域名会自动跳转到主域名进行访问。设定为301永久跳转,302是暂时跳转。

编辑虚拟主机的配置文件:
写入:
<IfModule mod_rewrite.c>
RewriteEngine on #打开rewrite功能
RewriteCond %{HTTP_HOST} ^www.aaa.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.bbb.com$
RewriteRule ^/(.*)$ http://www.test.com/$1 [R=301,L]
</IfModule>

调用了rewrite模块,RewriteCond是跳转条件,RewriteRule是跳转规则。

2.禁止指定user_agent

RewriteCond %{HTTP_USER_AGENT} ^.*curl.* [NC,OR] #禁止curl和chrome浏览器访问
RewriteCond %{HTTP_USER_AGENT} ^.*chrome.* [NC] #NC是不区分大小写的意思
RewriteRule .* - [F] #为禁止的意思

3.通过rewrite限制某个目录
RewriteCond %{REQUEST_URI} ^.*/tmp/.* [NC] #禁止访问tmp目录
RewriteRule .* - [F]

4.rewrite规则
1) [R=301](force redirect) 强制外部重定向
2) [F]禁用URL,返回403HTTP状态码。
3)[NC](no case) 不区分大小写
4) [OR] 或者
变量:
%{HTTP_USER_AGENT} 表示:访问的user_agent
%{HTTP_HOST} 表示:当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“/”
%{REQUEST_URI} 表示:表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,
www.123.com/xiang/1.html 黑字表示HOST,绿色部分表示URI

四、日志切割与管理

web服务器出现大量的访问日志和错误日志,所以我们要对日志进行切割,方便管理人员的查询。一些并不重要的记录,我们可以规定日志中不显示这些。

首先我们先将虚拟主机配置文件里的日志记录打开,日志的路径在
/usr/local/apache2/logs下

ErrorLog "logs/test.com-error_log" #错误日志

CustomLog "logs/test.com-access_log" common #common是日志类型

在apache的主配置文件里我们可以看到日志的相关格式规定

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

%h 是来源ip

%u 访问的user

%t时间

%r 动作

有些时候一些用户使用代理服务器,这里的%h会显示代理ip,在%h后面加上%{X-FORWARDED-FOR}i 即显示真实ip。

1.日志切割

修改虚拟主机的access log的定义:
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/test.com-access_%Y%m%d_log 86400" combined #%Y%m%d规定年月日; 86400秒即为一天切割。

2.不记录指定文件类型的日志
ErrorLog "logs/test.com-error_log"
SetEnvIf Request_URI ".*\.gif$" image-request #对gif文件做一个标记 image-request,也可以写成abc
SetEnvIf Request_URI ".*\.jpg$" image-request #setenvif要和customlog写在一起
SetEnvIf Request_URI ".*\.png$" image-request
SetEnvIf Request_URI ".*\.bmp$" image-request
SetEnvIf Request_URI ".*\.swf$" image-request
SetEnvIf Request_URI ".*\.js$" image-request
SetEnvIf Request_URI ".*\.css$" image-request
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/test.com-access_%Y%m%d_log 86400" combined env=!image-request #不记录做过标记的文件
注意:SetEnvIf要和customlog写在一起,中间不要有分隔。
五、配置静态缓存
对于图片,html,css,javascripts等,让客户端缓存,让访问时不需要去服务器上访问,提高用户体验,需要提前确认是否支持mod_expires.c模块
<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 hours"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
六、配置防盗链
防止其他的网站大量使用自己网站里的一些图片,流量跑的是自己的网站,造成带宽的浪费。防止图片被盗用。
在虚拟主机的配置文件里加上:
SetEnvIfNoCase Referer "^http://.*\.test\.com" local_ref #给网址做标注
<filesmatch "\.(txt|png|gif|doc|mp3|zip|rar|jpg|css|js)"> #规定一下哪些类型的文件
Order Allow,Deny #禁止引用
Allow from env=local_ref #允许local_ref引用
</filesmatch>
七、访问控制
我们可以针对某些目录进行访问控制,禁止一些IP地址的访问
<Directory "/data/www">
AllowOverride None
Options None
Order allow,deny
Allow from all
deny from 192.168.206.1 #该IP地址为禁止访问的ip地址
</Directory>
还有一种以URI做限制访问
<filesmatch "(.*)admin(.*)">
Order allow,deny
Allow from all
Deny from 192.168.206.1
</filesmatch>
所有uri中包括admin的都进行ip访问限制
八、apache禁止解析php
多用在在网络安全方面,比如:某些目录上传文件,避免上传的有***,针对某些路径禁止解析php。
编辑虚拟主机的配置文件,加入:
<Directory /data/www/data> #对data目录进行php解析限制。
php_admin_flag engine off #将php解析引擎关闭
<filesmatch "(.*)php"> #匹配
Order deny,allow
Deny from all #禁止解析所有,若不加filesmatch,只是将engine off,在浏览器访问该文件时, 会将php文件下载下来,这样不好
</filesmatch>
</Directory>

为了防止别人盗用或者下载我们网站上的资源比如图片,音乐,视频等等,占用我们的带宽,我们可以配置防盗链。
1.编辑虚拟主机配置文件:
[root@CentOS6 logs]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
2.加入如下内容:
……
<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 image/css "now plus 2 hours"
ExpiresByType application/x-javascript "now plus 2 hours"
ExpiresByType application/x-shockwave-flash "now plus 2 hours"
ExpiresDefault "now plus 0 min"
</IfModule>
SetEnvIfNoCase Referer "^http://.*\.test\.com" local_ref
SetEnvIfNoCase Referer ".*\.friends.com\.com" local_ref
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png|js|css)">
Order Allow,Deny
Allow from env=local_ref
</filesmatch>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.mydiscuz.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.others.com$
RewriteRule ^/(.*)$ http://www.test.com/$1 [R=301,L]
</IfModule>
……
注:白名单中的域名可以引用我们的资源,一定要将自己放入白名单!!!
3.检查没错就重启
[root@CentOS6 logs]# apachectl -t
Syntax OK
[root@CentOS6 logs]# apachectl graceful
现在未经授权的盗用都被禁止了。

一、基础配置
实验环境:Centos6.8
Apache版本:2.2.15
一、基本配置
1、安装httpd

yum install -y httpd
2、编辑配置文件/etc/httpd/conf/httpd.conf

vim /etc/httpd/conf/httpd.conf

ServerTokens OS # 服务器相应主机头信息时,显示apache版本和操作系统名称
ServerRoot "/etc/httpd" #指定服务器主配置文件和日志文件的位置
Timeout 60 #在指定时间内没有收到或发出任何数据则断开连接,单位为秒
KeepAlive On #是否启用长连接
MaxKeepAliveRequests 100 #当启用长连接时,一次连接最多能相应的请求数量
KeepAliveTimeout 15 #启用长连接时,指定一次连接中相邻两个请求的最大时间间隔,超过这个时间则会断开连接

<IfModule prefork.c> #使用prefork工作模型
StartServers 8 #刚开启时启动的守护进程数量
MinSpareServers 5 #设置最少空闲进程,当空闲进程少于规定时会创建新的进程
MaxSpareServers 20 #设置最多空闲进程,当空闲进程多于规定时会删除一些
ServerLimit 256 #设置服务器允许最大的同时连接数
MaxClients 256 #设置同一时间允许的最大客户端连接数
MaxRequestsPerChild 4000 #设置每个子进程能处理的最大连接数量
</IfModule>

DirectoryIndex index.html index.html.var #设置网站默认文档
Include conf.d/*.conf #将指定文件包含进来
User apache #设置运行apache服务的用户
Group apache #设置运行apache服务的组
ServerAdmin root@localhost #设置管理员的邮箱,当apache服务有问题时会发邮件通知管理员
DocumentRoot "/var/www/html" #设置存放网页的根目录位置

#设置特定目录的属性
<Directory "/var/www/html">
Options FollowSymLinks #FllowSymLinks:允许访问符号链接的文件,即能访问不在本目录内的文件
indexes: 在目录中找不到DirectoryIndex中指定的文件时会生成当前目录的文件列表
MultiViews: 如果客户端请求的路径可能对应多种类型的文件,那么服务器将根据客户端请求的具体情况自动选择一个最匹配客户端要求的文件。例如,在服务器站点的file文件夹下中存在名为hello.jpg和hello.html的两个文件,此时用户输入tttp://localhost/file/hello,如果在file文件夹下并没有hello子目录,那么服务器将会尝试在file文件夹下查找形如hello.*的文件,然后根据用户请求的具体情况返回最匹配要求的hello.jpg或者hello.html。
AllowOverride None #不去读取.htaccess配置文件的内容
Order allow,deny #先执行allow访问控制规则,再执行deny
Allow from all #放行所有
</Directory>

HostnameLookups Off #设置服务器记录客户端的IP地址还是主机名,当off时记录IP,为On时记录主机名
ErrorLog logs/error_log #设置错误日志保存位置
3、启动httpd服务

service httpd start

二、实现用户认证和授权
1、创建认证口令文件,并添加用户lzs,密码为123456和用户zsgg,密码为zsgg,密码用md5加密

htpasswd -cm /var/www/html/passwd/test lzs 123456
htpasswd -m /var/www/html/passwd/test zsgg zsgg
2、修改认证口令文件的所有者为apache

chown apache.apache /var/www/html/passwd/test
3、编辑/etc/httpd/conf/httpd.conf

<Directory "/var/www/html">
AllowOverride AuthConfig #启用认证
AuthType basic #设置认证方式
AuthName “ 请输入用户名密码” #设置提示信息
AuthUserFile /var/www/passwd/test #指定认证口令文件
require valid-user #设置认证口令文件中的所有用户都能访问
</Directory>

三、虚拟目录
编辑/etc/httpd/conf/httpd.conf
1
Alias /lzs “/var/www/lzs/”
在客户端输入http://x.x.x.x/lzs即可访问到服务器/var/www/lzs目录

四、虚拟主机
前提:配置虚拟主机时需将DocumentRoot “/var/www/html” 注释掉
4.1、基于IP地址的虚拟主机

<VirtualHost 192.168.0.1:80>
ServerAdmin root@lzs.com
DocumentRoot /www/html/www1.lzs.com
ServerName www1.lzs.com
ErrorLog logs/www1.lzs.com-error_log
CustomLog logs/www1.lzs.com-access_log common
</VirtualHost>
<VirtualHost 192.168.0.2:80>
ServerAdmin root@lzs.com
DocumentRoot /www/html/www2.lzs.com
ServerName www2.lzs.com
ErrorLog logs/www2.lzs.com-error_log
CustomLog logs/www2.lzs.com-access_log common
</VirtualHost>
4.2、基于端口的虚拟主机

<VirtualHost 192.168.0.1:80>
ServerAdmin root@lzs.com
DocumentRoot /www/html/www1.lzs.com
ServerName www1.lzs.com
ErrorLog logs/www1.lzs.com-error_log
CustomLog logs/www1.lzs.com-access_log common
</VirtualHost>
<VirtualHost 192.168.0.1:8080>
ServerAdmin root@lzs.com
DocumentRoot /www/html/www2.lzs.com
ServerName www2.lzs.com
ErrorLog logs/www2.lzs.com-error_log
CustomLog logs/www2.lzs.com-access_log common
</VirtualHost>
4.3、基于域名的虚拟主机
1、配置好DNS服务器,使多个域名能解析到同个ip地址上
2、编辑/etc/httpd/conf/httpd.conf

NameVirtualHost 192.168.0.1:80 #启用基于域名的虚拟主机
<VirtualHost 192.168.0.1:80>
ServerAdmin root@lzs.com
DocumentRoot /www/html/www1.lzs.com
ServerName www1.lzs.com
ErrorLog logs/www1.lzs.com-error_log
CustomLog logs/www1.lzs.com-access_log common
</VirtualHost>
<VirtualHost 192.168.0.1:80>
ServerAdmin root@lzs.com
DocumentRoot /www/html/www2.lzs.com
ServerName www2.lzs.com
ErrorLog logs/www2.lzs.com-error_log
CustomLog logs/www2.lzs.com-access_log common
</VirtualHost>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息