一、主配置文件的格式
1、/etc/httpd/conf/httpd.conf
格式:Directive Value
配置参数|指令 值
注意:
配置参数|指令 字符不区分大小写
指令有可能区分大小写,有些指令可以重复出现多次,取其值的和
2、配置文件分三段
### Section 1: Global Environment 全局配置
### Section 2: 'Main' server configuration 中心主机配置:用于仅提供一个站点时
### Section 3: Virtual Hosts 虚拟主机配置:用于提供多个站点时
中心主机和虚拟主机不能同时启用:默认启用的中心主机(经测试可以)
配置文件语法测试:
# service httpd configtest
或: # httpd -t
注意:
绝大多数配置修改后,可通过service httpd reload来使其生效
如果修改了ip和port,必须重启服务才能生效
二、常用的配置选项
1、监听的套接字
Listen [IP:]port # httpd的配置文件中指定都使用完整的单词,首字母大写
1)IP省略时表示监听本机上所有可用的ip地址
2)Listen指令可以出现多次,用于指明多个不同的监听端口或套接字
Listen 172.16.100.11:80
Listen 172.16.100.11:8080
2、持久连接
连接建立后,每个连接资源获取结束不会断开连接,而继续等待其它资源请求并完成传输,那
如何断开?
数量限制:如100
时间限制:如30s
劣势:对并发访问量较大的服务器,开持久连接会使后面的有些请求得不到响应:
改进:简短,httpd-2.4支持毫秒级的KeepAliveTimeout,
非持久连接:每个资源都是单独通过专用的连接进行获取
KeepAlive off|on
MaxKeepAliveRequests 100 #获取了100个资源后就断开
KeepAliveTimeout 15 # 超时时间,超出就断开
测试:
# telnet server 80
GET /URL HTTP/1.1
Host:serverip
使用telnet测试KeppAlive的效果:
[[email protected] ~]# cd /var/www/html [[email protected] html]# vim index.html [[email protected] html]# cat index.html This is First Page! [[email protected] ~]# curl http://192.168.10.4 This is First Page!
KeepAlive off时:
[[email protected] conf]# telnet 192.168.10.4 80 Trying 192.168.10.4... Connected to 192.168.10.4. Escape character is '^]'. GET /index.html http/1.1 #指定URL时一定要用/,否则找不到 Host:192.168.10.4 HTTP/1.1 200 OK Date: Fri, 13 Jan 2017 02:14:24 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Fri, 13 Jan 2017 01:32:07 GMT ETag: "101547-14-545efcd4ef200" Accept-Ranges: bytes Content-Length: 20 Connection: close #一个事务完成后,连接即断开 Content-Type: text/html; charset=UTF-8 This is First Page! Connection closed by foreign host. [[email protected] conf]#
KeepAlive on时:
[[email protected] conf]# telnet 192.168.10.4 80 Trying 192.168.10.4... Connected to 192.168.10.4. Escape character is '^]'. GET /index.html http/1.1 Host:192.168.10.4 HTTP/1.1 200 OK Date: Fri, 13 Jan 2017 02:25:40 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Fri, 13 Jan 2017 01:32:07 GMT ETag: "101547-14-545efcd4ef200" Accept-Ranges: bytes Content-Length: 20 Content-Type: text/html; charset=UTF-8 This is First Page! GET #连接没有断开,可以继续请求 This is First Page! Connection closed by foreign host.
3、MPM
MPM:多路处理模块
并发请求响应的不同实现
prefork,worker,event
httpd-2.2不支持同时编译多个不同的MPM
rpm安装的httpd-2.2提供了三个文件分别用于实现提供对不同的MPM的支持
查看httpd的工作模式:# ps aux|grep httpd
默认为/usr/sbin/httpd,其为prefork;
[[email protected] conf]# ps aux|grep httpd root 1581 0.0 2.0 233260 10148 ? Ss 10:05 0:00 /usr/sbin/httpd apache 1620 0.0 1.0 233260 5328 ? S 10:24 0:00 /usr/sbin/httpd apache 1621 0.0 1.2 233260 5996 ? S 10:24 0:00 /usr/sbin/httpd apache 1622 0.0 1.2 233260 5988 ? S 10:24 0:00 /usr/sbin/httpd apache 1623 0.0 1.2 233260 5992 ? S 10:24 0:00 /usr/sbin/httpd apache 1624 0.0 1.0 233260 5332 ? S 10:24 0:00 /usr/sbin/httpd apache 1625 0.0 1.0 233260 5328 ? S 10:24 0:00 /usr/sbin/httpd apache 1626 0.0 1.0 233260 5328 ? S 10:24 0:00 /usr/sbin/httpd apache 1627 0.0 1.0 233260 5328 ? S 10:24 0:00 /usr/sbin/httpd root 1635 0.0 0.1 103244 856 pts/1 S+ 10:34 0:00 grep httpd
查看模块列表:
httpd -l:查看静态编译的模块
httpd -M:列出所有已模块,包括静态编译和DSO模块
[[email protected] conf]# httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c
更换支持不同的MPM的主程序:
# vi /etc/sysconfig/httpd启用变量:
HTTPD=/usr/sbin/httpd.work|httpd.event
再重启httpd服务
[[email protected] httpd]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ] [[email protected] httpd]# ps aux|grep httpd root 2059 0.0 0.7 175940 3852 ? Ss 10:40 0:00 /usr/sbin/httpd.worker apache 2061 0.0 0.6 520200 3248 ? Sl 10:40 0:00 /usr/sbin/httpd.worker apache 2063 0.0 0.6 520200 3232 ? Sl 10:40 0:00 /usr/sbin/httpd.worker apache 2064 0.0 0.6 520200 3236 ? Sl 10:40 0:00 /usr/sbin/httpd.worker root 2174 0.0 0.1 103244 856 pts/0 S+ 10:40 0:00 grep httpd
MPM的配置详解:
## Server-Pool Size Regulation (MPM specific) ## # prefork MPM # StartServers: number of server processes to start # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # ServerLimit: maximum value for MaxClients for the lifetime of the server # MaxClients: maximum number of server processes allowed to start # MaxRequestsPerChild: maximum number of requests a server process serves <IfModule prefork.c> #判断prefork.c模块是否存在,存在则这个容器中的配置有效,否则无效 StartServers 8 # 默认启动的工作进程数 MinSpareServers 5 # 最少空闲进程数 MaxSpareServers 20 # 最大空闲进程数 ServerLimit 256 # 最大活动子进程数,最大值为20000,如果需要更大,需要修改源码参数再重新编译 MaxClients 256 # 客户端并发请求的最大数=serverlimit * 线程数,超过MaxClients限制的任何连接尝试将排队 MaxRequestsPerChild 4000 # 每个子进程在生命周期内所能够响应的最大请求数,0表示不限定 </IfModule> # worker MPM # StartServers: initial number of server processes to start # MaxClients: maximum number of simultaneous client connections # MinSpareThreads: minimum number of worker threads which are kept spare # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadsPerChild: constant number of worker threads in each server process # MaxRequestsPerChild: maximum number of requests a server process serves <IfModule worker.c> StartServers 4 # 默认启动的工作进程数 MaxClients 300 # 客户端并发请求的最大数 MinSpareThreads 25 # 最小空闲线程数 MaxSpareThreads 75 # 最大空闲线程数 ThreadsPerChild 25 # 每个子进程可生成的线程数 MaxRequestsPerChild 0 # 每个子进程在生命周期内所能够响应的最大请求数,0表示不限定 </IfModule> #
注意:
ServerLimit 要放在 MaxClients 前面!
如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。
4、DSO 动态共享对象
配置模块加载:
LoadModule <module_name> <module_path>
模块路径:可使用相对路径,相对于ServerRoot指令指向的位置而言
注意:建议使用service httpd reload重新装载配置文件
5、配置站点根目录
DocumentRoot /path/to/somewhere # 指定站点根目录
DocumentRoot "/var/www/html"
但是/var/www/html目录下的页面文件,并非就一定能访问,可以使用Direcory容器来指定路径的访问属性:
<Direcotry "/path/to/somewhere">
Options
<Direcoty>
Direcotry的容器可以出现多次,指定多个路径的访问属性
6、配置页面访问属性
1)配置的方式有两种
文件系统路径:
<Directory [~] "/PATH/TO/SOMEDIR"> # 支持正则表达式,但尽量不用,速度慢
Options....
</Diretory>
URL路径:
<Location [~] "URL">
Options...
</Location>
限制单个文件:
<File [~] "">
Options....
</File>
支持正则表达式(这种方式匹配正则速度快):
<LocationMatch "">|<DirectoryMatch "">|<FileMatch "">
Options...
<LocationMatch>
如果要配置其属性的URL能映射到某具体文件系统路径,则建议使用<Directory>
2)Options详解
Options:选项(页面访问属性)
Indexes:缺少指定的默认主页面时,允许将目录中的所有文件已列表形式返回给用户,危险
FollowsymLinks:允许跟随符号链接所指向的原始文件,危险
None:所有的属性都不启用
All:所有的属性都启用
ExecCGI:允许使用mod_cgi模块执行CGI脚本
Includes:允许使用mod_include模块实现服务器端包含(SSI)
IncludesNOEXEC:允许包含但不允许执行脚本
MultiViews:允许使用mod_negotiation实现内容协商
SymLinksIfOwnerMatch:在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号连接所指向的原始文件
7、基于主机(来源地址)访问控制
也是使用Direcotry容器来定义,Direcotry容器分为2段:
一段配置页面访问属性,一段配置访问控制
<Direcotry "/path/to/somewhere">
Options
AllowOverride
Order
Allow
Deny
<Direcotry>
1)Options 页面访问属性
上面已经学习了
2)基于来源地址访问控制
常用的指定:
AllowOverride None|All|AuthConfig|Limit
下面的选项是否被禁用,不禁用|禁用,如果禁用则下面的配置无效,被所使用的配置覆盖
Order:检查次序
Allow:允许
Deny:拒绝
常用指令的参数:
Order Allow,Deny:只有明确Allow的来源地址才允许访问,其它的均为Deny(白名单)
Order Deny,Allow:只有明确Deny的来源地址才允许访问,其它的均为Allow(黑名单)
Allow from:允许访问的来源地址
Deny from:拒绝访问的来源地址
from后可跟上的地址格式:
IP地址:如:192.168.10.3
网络地址:如:192.168.10.0/24
all:所有的,默认
注意:最终匹配法则
如果列表中有多条Allow和Deny语句就把所有语句定义的加起来
如果一个IP在Allow和Deny中都没有定义那么就使用默认的,Order Allow,Deny默认是Deny
如果一个IP在Allow和Den中都有定义那么就使用默认的,Order Deny,Allow默认是Allow
例子:
该httpd服务器有2个IP地址,分别为:
[[email protected] ~]# hostname -I 192.168.10.4 192.168.100.5
修改配置文件为:
</Directory> # # UserDir: The name of the directory that is appended onto a user's home # directory if a ~user request is received. # http://httpd.apache.org/docs/2.2/mod/core.html#options # for more information. # #Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Order allow,deny Allow from 192.168.10.0/24 </Directory>
例子:
1)移除站点的首页,访问首页看是否还会列出站点内的所有文件
[[email protected] html]# mv index.html index.html.bak [[email protected] html]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
2)使用192.168.10.4访问
8、定义默认主页面
DirectoryIndex index.html index.html.var
自左而右,找到首次匹配到的文件,就将其作为默认主页面返回
9、用户目录
如果让每个用户都可以创建个人站点:http://Server_IP/~Username/
userdir disablied 禁止 建议禁止,安全
如果允许的话可以使用:userdir public_html
public_html是用户家目录下的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问
前提:用户的家目录得赋予运行httpd进程的用户拥有执行权限
setfacl -m u:apache:x ~Username
例子:
<IfModule mod_userdir.c> # # UserDir is disabled by default since it can confirm the presence # of a username on the system (depending on home directory # permissions). # UserDir public_html # # To enable requests to /~user/ to serve the user's public_html # directory, remove the "UserDir disabled" line above, and uncomment # the following line instead: # #UserDir public_html </IfModule>
使用xj用户,在家目录下创建站点文件:
[[email protected] conf]# useradd xj [[email protected] conf]# su - xj [[email protected] ~]$ [[email protected] ~]$ ls [[email protected] ~]$ mkdir public_html [[email protected] ~]$ cd public_html [[email protected] public_html]$ ls [[email protected] public_html]$ vim index.html [[email protected] public_html]$ cat index.html xj's Home [[email protected] public_html]$
用户的家目录得赋予运行httpd进程的用户拥有执行权限:
[[email protected] public_html]$ exit logout [[email protected] conf]# cd ~xj [[email protected] xj]# ls public_html [[email protected] xj]# ls -l total 4 drwxrwxr-x 2 xj xj 4096 Jan 13 12:47 public_html [[email protected] xj]# ls -ld .. drwxr-xr-x. 3 root root 4096 Jan 13 12:43 .. [[email protected] xj]# [[email protected] xj]# cd [[email protected] ~]# [[email protected] ~]# cd /home [[email protected] home]# ls -l total 4 drwx------ 5 xj xj 4096 Jan 13 12:48 xj [[email protected] home]# ls -l xj total 4 drwxrwxr-x 2 xj xj 4096 Jan 13 12:47 public_html [[email protected] home]# ls -l xj/public_html/index.html -rw-rw-r-- 1 xj xj 10 Jan 13 12:47 xj/public_html/index.html [[email protected] home]# cd xj/public_html/ [[email protected] public_html]# setfacl -m u:apache:x /home/hadoop/ setfacl: /home/hadoop/: No such file or directory [[email protected] public_html]# setfacl -m u:apache:x /home/xj [[email protected] public_html]# getfacl /home/xj getfacl: Removing leading '/' from absolute path names # file: home/xj # owner: xj # group: xj user::rwx user:apache:--x group::--- mask::--x other::--- [[email protected] public_html]#
10、配置日志功能
日志文件目录:/var/log/httpd/
access.log
error.log
错误日志:
Errorlog logs/error_log
Loglevel warn
访问日志:要自定义日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Customlog logs/access_log combined
[[email protected] httpd]# tail -1 /var/log/httpd/access_log 192.168.10.10 - - [13/Jan/2017:12:50:39 +0800] "GET /~xj/ HTTP/1.1" 200 10 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36"
combined 为此格式的名称,方面后面可直接调用
%h:客户端地址
%l:远程登录名,客户端用户通过identd登录时使用的名称,一般为-(空)
%u:用户认证登录的名字,无登录机制一般为-
%t:收到客户端请求时的时间
\":显示引号本身,而不作为引用符号
%r:请求报文首行
<method> <url> <version>
%>s:响应状态状态码
%b:响应报文的大小,单位为字节,不包含首部信息
%{Refer}i:记录Http首部Referer对应的值:即访问入口,从哪个页面跳转至此页面 “-”表示直接访问,
%{User-Agent}i:记录http首部User-Aget对应的值,即浏览器类型
%{Forba}i:请求首部报文中内容对应的值
详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html
11、路径别名
Alias /alias/ "/path/to/some_directory/"
表示访问http://Server_IP/alias/时,其页面文件来自于/path/to/some_directory/这个路径
例子:
在配置文件中配置了:Alias /bbs/ "/bbs/test/"
[[email protected] conf]# mkdir -pv /bbs/test [[email protected] conf]# cd /bbs/test [[email protected] test]# vim test.html [[email protected] test]# cat test.html Test Page
就跟FTP的虚拟目录一样的
注意:
前面的目录最后加“/",后面的目录也一定要加,前面不加,后面的也一定不要加,要保持一致
12、设定默认字符集
AddDefaultCharset UTF-8
指定默认的字符集
常用字符集:GBK,GB2312,GBK18030
13、CGI脚本路径别名
CGI:Common Gateway Interface 通过网关接口,是一种协议
使WEB可以跟一个应用程序进行通信,从通信环境中获得结果
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
Alias就是URL-->FileSystem Directory
httpd服务在识别文件的类型是靠后缀名或文件内容的,如果识别不了,浏览器将提示下载该文件。
如果我想将脚本的执行结果返回给客户端将怎么做呢?
使用CGI,CGI的工作机制:
当用户请求的文件只一个脚本时,内核将文件加载至用户空间,通过CGI交给该脚本的执行环境,
执行环境将执行结果返回给httpd,httpd再返回给用户
CGI是不安全的,很多程序的实现,要求具有SUID或SGID权限;现在web站点一般都不用,很早以前mail服务可能还会使用,实现起来简便
现在开发动态网站,脚本和前端通信时都不基于CGI了,比如php使用SAPI,python使用UWSGI
实现CGI功能的模块:
mod_alias #使用Alias功能
mod_cgi #实现CGI协议
ScriptAlias /URL/ "/path/to/somewhere/"
somewhere下的文件要有执行权限
也可以在Direcotry容器中使用ExecCGI属性定义实现
例子:使用bash脚本通过CGI,将脚本的执行结果返回给用户
#使用配置文件中默认ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"配置 [[email protected] ~]# [[email protected] ~]# cd /var/www/ [[email protected] www]# ls cgi-bin error html icons [[email protected] www]# cd cgi-bin/ [[email protected] cgi-bin]# ls [[email protected] cgi-bin]# vim test.sh [[email protected] cgi-bin]# cat test.sh #!/bin/bash # cat << EOF Content-Type: text/html <pre> The time is : `date`. </pre> EOF [[email protected] cgi-bin]# chmod +x test.sh [[email protected] cgi-bin]# ./test.sh Content-Type: text/html #脚本的执行结果第一行一定得为这个,才符合CGI的规范 #这里一定得使用空白行,否则执行不了,报500 <pre> The time is : Fri Jan 13 23:50:42 CST 2017. </pre> [[email protected] cgi-bin]#
14、基于用户的访问控制(表单认证)
虚拟用户:非系统用户,只是为了访问某个服务的资源所使用的认证标志
质询:WWW-Authenticate
服务器用401状态拒绝客户端请求,说明需要用户提供用户名和密码,弹出对话框:
认证:Authorization:客户端用户填入帐号密码后再次发请求至服务器,认证通过,则请求授权
认证时httpd服务器上的帐号和密码保存在哪?
文件,不安全,不易管理
Idap:轻量级目录服务访问协议
SQLDB:
dbm:
认证类型(auth):
basic:基本认证,帐号和密码明文发送
digest:摘要认证,hash编程之后发送,大多数浏览器不支持
认证提供者(authentication provider):帐号和密码的存放位置,默认是文件;authn
授权机制(authorization):根据什么进行授权(根据用户还是组什么的授权)
安全域:需要用户认证后方能访问的路径,应该有其名称,用户向用户通知此认证的原因等
案例:认证机制的实现
基于文件,做基本认证,根据用户和组进行授权
1)定义安全域
<Directory "/var/www/html/fin">
Options None
AllowOverride AuthConfig
AuthType Basic 使用基本认证
AuthName "Private Area" 质询时的标题(提示信息)
AuthBasicProvider file # 不写也可以,默认使用的就是文件
AuthUserFile /etc/http/conf/.htpasswd 认证文件的存放位置
Require valid-user 可访问的用户:所有位于AuthUserFile文件中定义的用户都允许登录
</Directory>
Require另一种实现方式:Require user tom jerry...:仅允许user1,user2等出现AuthUserFile文件中定义的特定几个用户登录
2)提供用户的帐号文件
使用htpsswd命令用于维护此文件
[[email protected] ~]# rpm -ql httpd-tools /usr/bin/ab /usr/bin/htdbm /usr/bin/htdigest /usr/bin/htpasswd /usr/bin/logresolve /usr/share/doc/httpd-tools-2.2.15 [[email protected] ~]# htpasswd --help Usage: htpasswd [-cmdpsD] passwordfile username htpasswd -b[cmdpsD] passwordfile username password htpasswd -n[mdps] username htpasswd -nb[mdps] username password -c Create a new file. -n Don't update file; display results on stdout. -m Force MD5 encryption of the password. -d Force CRYPT encryption of the password (default). -p Do not encrypt the password (plaintext). -s Force SHA encryption of the password. -b Use the password from the command line rather than prompting for it. -D Delete the specified user. On Windows, NetWare and TPF systems the '-m' flag is used by default. On all other systems, the '-p' flag will probably not work.
htpasswd
-c 创建认证文件,后续创建其它用户时,不需要加-c,加了会重新创建认证文件并覆盖原文件
-s 以sha格式加密存放
-m MD5格式加密存放
-b 批量模式
-D 删除用户
htpasswd -c -m /etc/httpd/conf/.htpasswd tom
[[email protected] conf]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom New password: Re-type new password: Adding password for user tom [[email protected] conf]# ls -a . .. .htpasswd httpd.conf magic [[email protected] conf]# cat .htpasswd tom:$apr1$c5.gBsiS$0mTbCKvwApYJDqFsl/xAE0
3)基于组认证
<Directory "/www/htdocs/fin">
Options None
AllowOverride AuthConfig
AuthType Basic 使用基本认证
AuthName "Private Area" 质询时标题
AuthUserFile /etc/http/conf/.htpasswd
AuthGroupFile /etc/http/conf/.htgroup
Require group GroupName 可访问的组
</Directory>
组文件的格式:(手动创建)
每行定义一个组
先创建用户,再创建组
组名1:用户1 用户2 用户3
15、虚拟主机
一个物理服务器可以服务于多个站点,每个站点可通过一个或多个虚拟主机来实现
httpd三种类型的虚拟主机:
基于IP(代价昂贵)
基于PORT(很少用)
基于FQDN(最常用),在httpd-2.2版本中需要启用NameVirtualHost *:80
注意:启用虚拟主机得先关闭“main server" 中心主机
#经测试不关闭也可以,但如果80端口被虚拟主机占用了,那么中心主机访问不了,需要在配置文件中监听多个端口(有没被虚拟主机占用的端口)即可,即虚拟主机的优先级更高
方法:注释DocumentRoot指令即可
定义虚拟主机的方法:
<VirtualHost "IP:port">
ServerName (不基于主机名做虚拟主机时可不写)
ServerAlias (可不写)
DocumentRoot (一定要写)
<Directory "">
Options
</Directory>
</VirtualHost>
注意:
大多数可用全局或‘main’server中的指令,都可以定义有Virtualhost中
配置所使用的IP和PORT都要是已经被监听的
虚拟主机可以创建多个
中心主机、基于IP、基于端口、基于FQDN都可以混用
下面的实验环境是没有注销中心主机,也没有修改中心主机的配置:
添加监听8080端口:
#Listen 12.34.56.78:80 Listen 80 Listen 8080
1)基于ip的虚拟主机
<VirtualHost 192.168.10.5:80> DocumentRoot "/web/a.com/html" </VirtualHost>
2)基于端口
<VirtualHost 192.168.10.4:8080> DocumentRoot "/web/a.com/html" </VirtualHost>
3)换用IP和PORT
<VirtualHost 192.168.100.5:8080> DocumentRoot "/web/a.com/html" </VirtualHost>
4)基于FQDN
<VirtualHost *:80> ServerName www.a.com DocumentRoot "/web/a.com/html" </VirtualHost>
测试中我们发现中心主机和基于IP,PORT,FQDN都可以混用:
<VirtualHost *:8080> ServerName www.a.com DocumentRoot "/web/a.com/html" </VirtualHost>
额外经常用于每个虚拟主机的配置有:
ErrorLog
CustomLog
<Director>
<Location>
ServerAlias
16、https协议的实现
http over ssl = https
http 文本格式
https 二进制格式
ssl:v3 Secure Socket Layer
tls:v1 Transport Layer Security
http:文本协议,80/tcp
https:二进制格式的协议,443/tcp
ssl会话的简化过程:
1、tcp三次握手建立虚连接
2、ssl会话协商
1)客户端发送可供选择的加密方式(tcp第三次握手时)
2)服务器端发送证书和选定的加密方式给客户端
3)证书验证
如果信任给其发证书的CA:
a、验证证书的合法性,用CA的公钥解密证书上的数字签名
b、验证证书的内容的合法性,
c、检查证书的有限期限
d、证书是否已被吊销
e、证书中拥有者的名字,与访问的目标主机要一致
4)客户端生成临时会话**(对称**),并使用服务器端的公钥加密此数据发送给服务器,完成**交换
5)服务器用此**加密用户请求的资源,响应给客户端
注意:ssl会话是基于IP地址创建,不支持基于FQDN的虚拟主机;所以单IP的主机上,仅可以使用一个https虚拟主机
案例:基于mod_ssl模块实现对ssl的支持
1)为服务器申请数字证书
通过私有CA获取证书:
1)创建私有CA
2)在服务器创建证书签署请求
3)CA签证
2)配置httpd支持使用ssl,及使用的证书
# yum -y install mod_ssl
[[email protected] conf]# rpm -ql mod_ssl /etc/httpd/conf.d/ssl.conf /usr/lib64/httpd/modules/mod_ssl.so /var/cache/mod_ssl /var/cache/mod_ssl/scache.dir /var/cache/mod_ssl/scache.pag /var/cache/mod_ssl/scache.sem
3)编辑配置文件:/etc/httpd/conf.d/ssl.conf配置使用ssl的虚拟主机:
启用 DocunmentRoot
启用 ServerName
配置证书和私钥:
SSLCertificatFile 证书文件
SSLCertificatKeyFile **文件(私钥)
4)重启httpd服务
5)测试
在客户端导入CA的公钥就没有此警告信息了。
CLI: openssl s_client -connect 验证的服务器地址:端口(443) [-cert 自己的证书路径] -CAfile CA证书的路径
16、URL Rewrite:URL重写
httpd的URL重写功能很强大,也很复杂,但直接在httpd上直接配置URL重写很少,httpd一般作为后端服务器,通常都是在前端的反向代理器上配置URL重写,所以到学习nginx时,再学习配置URL重写
17、服务器内置的status页面
mod_status模块可以让管理员查看服务器的执行状态,它通过一个HTML页面展示了当前服务器的统计数据。
这些数据通常包括但不限于:
(1) 处于工作状态的worker进程数;
(2) 空闲状态的worker进程数;
(3) 每个worker的状态,包括此worker已经响应的请求数,及由此worker发送的内容的字节数;
(4) 当前服务器总共发送的字节数;
(5) 服务器自上次启动或重启以来至当前的时长;
(6) 平均每秒钟响应的请求数、平均每秒钟发送的字节数、平均每个请求所请求内容的字节数;
查看是否装载了该模块:
[[email protected] html]# httpd -M|grep status status_module (shared) Syntax OK
内生的status信息,且此信息可以通过 web予以显示
处理器:是当文件被调用时,Apache内部的表示形式,一般每种文件类型都有自己的隐式处理器
显示的定义使用的处理器:SetHandler
启用status页面只要取消注释和定义访问控制即可:
<Location /server-status>
SetHandler server-status
# Order deny,allow
# All from all
</Location>
此信息不应该让别人看见,建议做用户认证
服务器版本信息,
服务器安装时间
服务器当前时间,
服务器重启时间(最近一次启动(或重新加载配置文件的的时间)
父服务器生成时间:重新加载一次配置文件即+1
服务器运行时间
各工作进程状态:
总共256个工作进程 _:空闲表示等待连接,S:表示启动,R:表示读取客户端请求
W:正在发送响应报文,K:表示长连接,D:DNS查询,.:没有启动的工作进程
已启动的各工作进程的PID及状态
转载于:https://blog.51cto.com/xiexiaojun/1649683