### --- 查看方式:
http -V | grep -i "server mpm"
### --- 指定方式:
~~~ 在编译时,此选项中指定:--with-pmp=xxx
### --- 配置文件位置:
~~~ 源码安装: PREFIX/etc/httpd.conf(主配置文件)
~~~ PREFIX/etc/extra/*.conf(子配置文件)
~~~ rpm包安装: /etc/httpd/conf/httpd.conf
### --- 网页文件位置:
~~~ 源码包安装: PREFIX/htdocs/
~~~ rpm包安装: /var/www/html
### --- 日志文件位置:
~~~ 源码包安装: PREFIX/logs/
~~~ rpm包安装: /var/log/httpd/
### --- 注意:Apache配置文件严格区分大小写
~~~ 针对主机环境的基本配置参数
ServerRoot /usr/loca/apache2 // Apache主目录
Listen :80 // 监听端口
LoadModule php7 // 加载的相关模块
User //
Group // 用户和组
ServerAdmin // 管理员邮箱
ServerName // 服务器名(没有域名解析时,使用临时解析,默认不开启)
Errorlog "logs/error_log" // 服务器错误日志
CustomLog "logs/access_log" common // 访问记录日志
DirectoryIndex index.html index.php // 默认网页文件名,优先级顺序
Include etc/extra/httpd-vhosts.conf // 自配置文件中内容也会加载生效
### --- 主页目录及权限
DocmentRoot "/usr/local/apache2/htdocs" // 网页文件存放目录(默认)
// 定义指定目录的权限
Options Indexes FollowSymLinks
None // 没有任何额外权限
All // 所有权限(除去MultiViews以外)
Indexes // 浏览权限(当此目录下没有默认网页文件时,显示目录内容)
FollowSymLinks // 准许软连接到其他目录
MultiViews // 准许文件名泛匹配(需要手动开启模块有有效negotiation)
AllowOverride None // 定义是否允许目录下.htaccess文件中的权限生效
None // .htaccess中权限不生效
All // 文件中所有权限都生效
AuthConfig // 文件中,只有网页认证的权限生效
Require all granted(denied) // 访问控制列表
// 此标签用来指定访问到指定目录时自动加载那个页面we年
DirectoryIndex index.php index.html // 可以写多个,但是有优先级之分
附录二:Apache实验
一、apache的目录别名
### --- 实验环境:建议使用之前搭建好的lamp环境进行测试
~~~ 当Apache接收请求时,在默认情况下会将DocumentRoot目录中的文件送到客户端,
~~~ 如果想将某一不在DocumentRoot目录中的文件共享到网站上,
~~~ 并希望将它们留在本来位置而不需要进行移动的话,
~~~ 处理这种情况可以通过建立别名的方式将URL执行特定的目录。
~~~ 编辑主配置文件
vim /usr/loca/apache2/conf/httpd.conf
Include etc/extra/httpd-autoindex.conf // 去掉注释,开启调用子配置文件
### --- 编辑子配置文件
vim /usr/lcoal/apache2/conf/extra/httpd-autoindex.conf
alias /iscons/ "/usr/local/apache2/icons/" // 结构:别名“真实目录” #真实目录的结尾有/. 否则报错
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
### --- apache的用户认证
~~~ 有时候,我们需要给一些特殊的访问设置一个用户认证机制,增加安全,
~~~ 比如我们的个人网站,一般都是有一个管理后台的,虽然管理后台本身就有密码,
~~~ 但我们为了更加安全,可以再设置一层用户身份认证。
### --- 编辑配置文件
vim /usr/lcoa/apache2/etc/httpd.conf
~~~ 在需要进行登录认证的目录标签中加入如下配置:
// 声明被保护目录
Options Indexes FollowSymLinks
AllowOverride All // 开启权限认证文件.htaccess
Require all granted
### --- 在指定目录下创建权限文件
~~~ 切换到/usr/local/apache2/htdocs/admin创建.htaccess 文件,并添加下面的内容
vim .htaccess
AuthName "Welcome to atyanqi" // 提示信息
AuthType basic // 加密类型
AuthUserFile /usr/loca/apache2/htdocs/admin/apache.passwd // 密码文件,文件名自定义(使用绝对路径)
require valid-user // 允许密码文件中所有用户访问
### --- 建立密码文件,加入允许访问的用户,(此用户和系统用户无关)
~~~ 注意:htpasswd该命令是httpd的命令,需要绝对路径
htpasswwd -c /sr/local/apache2/htdocs/admin/apache.passwd test1 // -c 建立密码文件,只有添加一个用户时,才能-c
htpasswd -m /usr/loca/apache2/htdocs/admin/apache.paasswd test2 // -m 再添加更多用户时,使用-m参数
### --- 重启Apache服务
~~~ 先检查配置是否正确,然后通过浏览器输入要访问的资源时就会提示输入密码了。
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
### --- 虚拟主机(重点)
~~~ 虚拟主机,也叫“王占空间“,
~~~ 就是把一台运行在互联网上的物理服务器划分成多个”虚拟“服务器,
~~~ 虚拟机主机技术极大的促进了网站技术的应用和普及,
~~~ 同时虚拟主机的租用服务也成了网络时代的一种新型经济技术。
### --- 虚拟主机的分类
~~~ 基于IP的虚拟主机:一台服务器,多个IP,搭建多个网站
~~~ 基于端口的虚拟主机:一台服务器,一个IP,搭建多个网站,每个网站使用不同的端口访问
~~~ 基于域名的虚拟主机:一台服务器,一个IP,搭建多个网站,每个网站使用不同的域名访问
### --- 域名解析:准备两个域名
~~~ 使用本地hosts文件进行解析
www.yanqiv1.com
www.yanqiv2.com
### --- 网站主页目录规划
~~~ 在/htdocs/目录下分别创建yanqivip1和yanqiv2两个目录,
~~~ 并且新建目录内创建index.html文件(分别写不一样的内容)
### --- 修改主配置文件开启文件关联
vim /usr/local/apache2/etc/httd.conf
Include etc/extra/httpd-vhosts.conf // 此行取消注释
### --- 编辑子配置文件,编写虚拟主机标签
vim /usr/local/apache2/etc/extra/httpd-vhosts.conf // 添加以下内容,有几个虚拟主机就写机组(添加之前先把原先存在的示例删除掉)
Options Indexes FollowSymLiniks
AllowOverride None
Require all granted
#目录权限标签根据需要自行添加
// 虚拟主机标签
ServerAdmin [email protected] // 管理员邮箱
DocumentRoot "/usr/local/apache2/htdocs/yanqiv1" // 网站主目录
ServerName www.yanqiv1.com // 完整域名
ErrorLog "logs/sina-error_log" // 错误日志
CustomLog "logs/yanqiv1-access_log" common // 访问日志
### --- 重启服务,验证结果
~~~ #Windows下:
~~~ 浏览器输入两个不同的域名验证网页内容(提前修改windows的hosts文件)
~~~ #Linux下:
~~~ 通过elinks/curl命令验证:elinks/curl URL地址(提前修该linux的hosts文件)
### --- 域名跳转
~~~ 一个网站难免会有多个域名,而多个域名总得有一个主次,
~~~ 比如我的网站可以用两个域名访问:www.yanqiv1.com和www.yanqiv2.com
~~~ 但大家发现不管我用那个域名访问,
~~~ 最终都会跳转到www.yanqi.com上来,这个行为就叫做域名的跳转,
~~~ 状态码:301是永久跳转,万丈上一定要是和值为301,这样对搜索引擎是比较友好的。
~~~ 实验条件
~~~ 虚拟主机能正常访问
~~~ 打开主配置文件开启重写模块
LoadModule rewrite_module modules/mod_rwewrite.so // 取消注释
### --- 实验步骤:
~~~ 修改虚拟主机配置文件
vim */extra/httpd-vhosts.conf
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
### --- 创建匹配文件
vim */.htaccess // 在指定的网站目录下创建文件,并添加如下内容
RewriteEngine on // 开启rewrite功能
RewriteCondition %{HTTP_HOST} ^wwww.yanqi.com // 把以www.yanqi.com 开头的内容赋值给HTTP_HOST变量
RewriteRule ^(.*)$ http://www.yanqi.com/$1 [R=permanent,L]
# ^(.*)$指带客户端要访问的资源
# $1 把 .* 所指代的内容赋值到$1变量中
# R=permanent 永久重定向 = 301
# L 指定该规则为最后一条生效的规则,以后的不在生效
### --- 重启服务器并测试
~~~ 通过上述测试,
~~~ 发现无论是yanqiv1或yanqiv2最终都是访问到www.yanqi.com域名上来则试验成功
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
附录四:
一、Apache+openssl实现https(重点)
### --- Apache+openssl实现https(重点)
~~~ HTTPS(全称:Hypertext Transfer Protocol Secure,
~~~ 超文本传输协议)是以安全为目标的HTTP通道,简单讲是HTTP的安全版,
~~~ 即HTTP下加入SSl层,用于安全的HTTP数据传输,这个系统被内置浏览器中,
~~~ 提供身份验证与加密通讯方法,
~~~ 现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
### --- 准备工作
~~~ 检查Apache是否支持SSL,检查相应模块是否安装,若安装则将模块启用
~~~ 模块存放目录:/usrl/local/apache2/modules
~~~ 检查是否启用,apachectl -M
### --- CA证书申请:
~~~ #注意1:生成完秘钥和证书文件后,将文件存放在Apache的安装目录下的cert目录下
~~~ #注意2:在生产环境中必须要在https证书厂商注册(否则浏览器不识别)
openssl genrsa-out ca.key 1024 // 建立服务器私钥,生成RSA秘钥
openssl req -new -key ca.key -out atyanqi.csr // 需要一次输入国家/地区/城市/组织/组织单位/Email等信息,最重要的是有一个common name,可以写你的名字或者域名,如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报,生成的csr文件交给CA签名后形成服务端自己的证书
openssl x509 -req -days 365 -in atyanqi.csr -signkey ca.key -out atyanqi.crt // 使用CA服务器签发证书,设置证书的有效期等信息
### --- 配置文件修改:
~~~ 调用ssl模块,并启用ssl独立配置文件
vim /usr/local/apache2/etc/httpd.con
LoadModule ssl_module modules/mod_ssl.so // 取消注释
Include etc/extra/httpd-ssl.conf // 取消注释
~~~ 修改conf/extra/httpd-ssl.conf配置文件,调用证书等文件
SSLProtocol all -SSLv2 -SSLv3 // 添加SSL协议支持协议,去掉不安全的协议
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM // 修改加密套件
SSLHonorCipherOrder on
SSLCertificateFile cert/atyanqi.crt // 证书公钥配置(签字的)
SSLCertificateKeyFile cert/ca.key // 证书私钥配置
~~~ 修改主配置文件,添加虚拟主机
#DocumentRoot目录位置要和httpd.conf里面的一致
DocumentRoot "/usr/local/apache2/htdocs"
ServerName localhost:443
SSLCertificateFile cert/ca.key
SSLCertificateChainFile cert/atyanqi.crt
### --- 验证结果
apachectl -t // 检查配置文件语法
apachectl restart // 重启Apache,并测试是否可以使用https访问
~~~ #报错信息:
~~~ AH00526:Syntax error on line 78 of /usr/local/apache2/etc/extra/httpd-ssl.conf:
SSLSessionCache:'shmcb' session cache not supported (known names:).Maybe you need to load the appropriate socache module (mod_socache_shmcb?)
~~~ #解决方案:
~~~ 要么不调用此模块,要么让调用的模块加载上。
### --- 强制跳转https
~~~ 有些时候为了安全,网站不允许使用http访问,仅允许使用https访问,
~~~ 目的是为了更加安全在http部分目录权限标签中添加以下内容
~~~ 在做后面实现时为了更加方便理解,我们可以先把https关闭掉,
~~~ 需要关闭:跳转&虚拟主机&ssl配置文件调用
……
RewriteEngine on // 开启转发规则
RewriteCondition %{SERVER_PORT} !^443$ // 检查访问端口只要目标不是443的
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L] // 全部使用https重新访问
### --- Apache日志切割
~~~ 我们没访问一次网站,那么就会记录若干条日志,如果日志不去管理,
~~~ 时间长了日志文件会越来越大,如何避免产生大的日志文件?
~~~ 其实Apache有相关的配置,使用日志按照我们的需求进行归档,
~~~ 比如每天一个新日志,或者每小时一个新的日志
### --- 首先简单设置日志的路径名称
~~~ ErrorLOG是错误日志,CustomLog是访问日志,|就是管道符,
~~~ 意思是把产生的日志交给rotatelog这个工具,
~~~ 而这个工具就是Apache自带的切割日志的工具,
~~~ -l 的作用是校对准时区为UTC,也就是北京时间,86400,单位是秒,
~~~ 正好是一天,那么日志会每天切割一次,
~~~ 而最后面的combined为日志的格式,在httpd.conf中有意义。
### --- 编辑配置文件
vim /usr/local/apache2/etc/httpd.conf
~~~ #编辑添加如下内容:
ErrorLog "logs/error.log"
CustomLog "Logs/access.log" combined
~~~ #指定了日志存放在/usr/local/apache2/logs目录下分别为error.log和access.log,combined为日志显示的格式,日志格式可以参考配置文件httpd.conf中格式的指定,如下:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b common
### --- 设置Apache日志分割
### --- 同样编辑配置文件httpd.conf
~~~ #注意1:以上仅为两条命令(一条错误日志,一条访问日志,路径太长写不开
~~~ #注意:若开启了https,则需要修改http-ssl.conf配置文件中的日志记录条目
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d.log 86400" combined
### --- 不记录指定文件类型的日志
~~~ 如果一个网站访问量特别大,那么访问日志就会很多,
~~~ 但有一些访问日志其实是可以忽略掉的,比如网站的一些图片,
~~~ 还有js、css等静态对象,而这些文件的访问往往是巨大的,
~~~ 而且即使记录这些日志也没有什么用,那么如何忽略不记录这些日志呢?
### --- 配置日志不寄了图片的访问
~~~ 说明:在原来的访问日志配置基础上,增加了一些image-request的定义,
~~~ 比如把gif/jpg/bmp/swf/js/css等结尾的全标记为image-request,
~~~ 然后在配置日志后加一个标记env=!image-request,表示取反。
vim /usr/local/apache2/conf/httpd.conf
#相关配置为:
SetEnvIf Request_URL "\.gif$" image-request
SetEnvIf Request_URL "\.ipg$" image-request
SetEnvIf Request_URL "\.png$" image-request
SetEnvIf Request_URL "\.bmp$" image-request
SetEnvIf Request_URL "\.swf$" image-request
SetEnvIf Request_URL "\.js$" image-request
SetEnvIf Request_URL "\.css$" image-request
CustomLog "|/usr/local ... _%Y%md.log 86400" combined env=!image-request
### --- Apache配置静态缓存
~~~ 所说的静态文件是指图片/js/css等文件,用户访问一个站点,
~~~ 其实大多数元素都是图片/js/css等,
~~~ 这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,
~~~ 目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,
~~~ 提高快乐用户体验,但这些静态文件总不能一直缓存,它总有一些时效性,
~~~ 那么就得设置这个过期时间
### --- 配置静态缓存
vim /usr/local/apache2/conf/httpd.conf
// 此模块默认未开启,请手动启用
ExpiresActive on
ExpiresByType image/gif "access puls 1 days"
ExpiresByType image/jpeg "access plus 24 hours"
ExpiresByType image/png "access plus 25 hours"
ExpiresByType test/css "access plus 2 hours"
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"
#或者使用mod_headers模块实现,该模块默认启用
# htm,html,txt类的文件缓存为一个小时
header set cache-control "max-age=3600"
#css,js,swf 类的文件缓存一个星期
header set cache-control "max-age=604800"
#jpg,gif,jpeg,png,ico,flv,pdf等文件缓存一年
header set cache-control "max-age=29030400"
~~~ 说明:这里的时间单位可以days,hours甚至是min,两种不同的方法,
~~~ 上面使用的是mod_expires,而下面用的是mod_headers,要想使用这些模块,
~~~ 必须要事先已经支持,如何查看是否支持,使用命令
/usr/local/apache2/bin/apachectl -M
### --- 重启服务器并验证
/usr/local/apache2/bin/apachectl -t
/usr/local/apache2/bin/apachectl stop
/usr/local/apache2/bin/apachectl start
### --- 验证
curl -x127.0.0.1:80 'http://www.yanqi.com/image/a.jpg' -I
HTTP/1.1 200 OK
Date: Wed, 26 Oct 2016 03:51:26 GMT
Server: Apache/2.2.31 (Unix) PHP/5.5.38
Last-Modufied:Tue,31 May 2016 03:08:36 GMT
ETag: "46891b-16b-5341ab0597500"
Accept-Ranges: bytes
Content-Length: 363
Cache-Control: max-age=86400
ExpiresL Thu, 27 Oct 2016 03:51:26 GMT
Content-Type: image/jpg
### --- 禁止解析PHP
~~~ 某个目录下禁止解析PHP,这个很有作用,我们做网站安全的时候,这个用的很多,
~~~ 比如某些目录可以上传文件,为了避免上传的有木马,所以我们禁止这个目录下面的访问解析PHP
### --- 配置静止解析PHP
php_admin_flag engine off
Order deny,allow
Deny from all