每天我们都要访问各种各样的网站,提供这些网站服务的web程序就是httpd软件,它是http协议的实现,是由Apache基金会维护的一个项目,http在互联网中有着举足轻重的地位,接下来,下面我就将依次介绍httpd的配置文件选项、httpd实现虚拟主机、httpd基于ssl做https、以及httpd的用户访问。
httpd的配置文件选项解析:
ServerRoot "/etc/httpd" :httpd服务的根目录
Timeout 60 :默认响应时间
KeepAlive Off:保持持久连接,即,连接请求时不断开,默认为Off。
MaxKeepAliveRequests 100 :持久连接时,最大的请求数。
KeepAliveTimeout 15:持久连接的响应时间,到达时间后,连接被断开。
prefork:
<IfModule prefork.c>
StartServers 8 #服务启动时开启的进程数
MinSpareServers 5 #最小的空闲进程数
MaxSpareServers 20 #最大的空闲进程数
ServerLimit 256 #为MaxClient最多启动多少个进程数
MaxClients 256 #客户端同时允许处理的最大的进程数,并发连接数,小于上面的数
MaxRequestsPerChild 4000 #每个进程允许处理的最大的请求数,处理完后,进程结束。
</IfModule>
work:
<IfModule worker.c>
StartServers 4 #服务启动时,开启多少个进程
MaxClients 300 #最大的连接数,即并发数
MinSpareThreads 25 #最小的空闲线程数
MaxSpareThreads 75 #最大的空闲线程数
ThreadsPerChild 25 #每个进程可以启动多少个线程数
MaxRequestsPerChild 0 #每个线程最大可以处理的请求数,0表示无限制
</IfModule>
监听的地址和端口:
Listen [IP]:PORT
系统默认为Listen 80,监听在80端口,没有地址表示监听所有地址
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
其实还不止这些,我只列出部分,表示可以动态装载的模块
Include conf.d/*.conf:httpd服务的配置文件包含/etc/httpd/conf.d下所有以.conf结尾的配置文件
User apache
Group apache
httpd服务启动后,切换到apache用户,apache组
DocumentRoot "/var/www/html"
这里表示的是站点的根目录,rpm包安装的都在此处
用户访问控制有关:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory />:这里表示的是一个容器
Options后面的参数有:
Indexes :如果服务器目录下没有主页时,默认显示该目录中所有文件
All:所有目录属性都有效,为默认选项
None:所有目录属性都无效,只能浏览
FollowSymLinks:允许符号链接,如果存在这点,用户可能会访问到站点根目录之外的目录
ExecCGI:表示这个目录下,允许执行CGI程序
AllowOverride后面的参数有:
All:是访问文件可以覆盖系统配置
None:服务器忽略访问文件的配置
FileInfo:允许访问文件中可以使用AddType等参数
AuthConfig:允许访问控制文件使用AuthName和AuthType对用户的访问做策略
Limit:允许对访问目录的主机的IP地址和主机名做限制
Order allow,deny
Allow from all
allow是允许,deny表示拒绝
Order指定了两者的顺序
Allow from all:表示允许所有主机连接
以上的允许或拒绝后跟的可以是IP地址、网络。
httpd的日志有两种:
分别是访问日志和错误日志
错误日志:
ErrorLog logs/error_log #定义了错误日志存放的位置
LogLevel warn:定义错误日志的级别
访问日志:以下是格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
日志信息中的变量:
%h:表示客户端主机地址IP
%l:表示远程登录名,一般情况下为-
%u:表示在认证时,所要输入的用户名,无认证情况下为-
%t:表示服务器在接收到客户端请求的时间
%r:表示一个请求报文其实的行
%>s:表示客户端发出请求后,所得到的状态码
%b:这是响应报文的长度,默认为byte
%{HEADER_NAME}i:记录指定首部对应的值
虚拟主机的配置信息:
NameVirtualHost *:80
启用虚拟主机时,要将此处的#去掉,这个只在httpd2.2上有
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /www/docs/dummy-host.example.com
ServerName dummy-host.example.com
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
以上用<VirtualHost>这个容器封装起来了虚拟主机的各种配置,*号可以是IP地址,*表示监听所用
ServerAdmin:填写管理员的邮箱地址,在web无法提供服务时显示出来
DocumentRoot:这里定义了这个虚拟主机所在的目录
ServerName:服务名称,如果基于主机名的话,各个虚拟主机应该不一致
ErrorLog:错误日志的存放位置
CustomLog:访问日志的存放位置及定义的格式
httpd服务搭建:
1、基于CGI脚本实现动态页面的展示
CGI的规范:
Content-Type:text/html
<pre> #封装标签
</pre>
它在httpd的配置文件上,是这样的:
ScriptAlias /cig-bin “/var/www/cgi-bin”
我们可以利用我们学过的bash写一个CGI脚本,实现动态内容的展示
#vim cgi.sh #!/bin/bash #This is a cgi scritp used in bash cat << EOF Content-Type: text/html <pre> <h1><font color=#0000FF> The time of now is:</font> <font color=#FFD306>$(date) </font></h1> <h2><font color=#FF0000> Next show you the status of apache! </font> </h2> Next show you status about apache: $(ps aux | grep httpd ) <meta http-equiv="refresh" content="6";url="#" /> </pre> EOF
然后,我们在浏览器上输入:IP/cgi-bin/cgi.sh
显示效果如下所示:
注意:这当中不能有特权指令,因为httpd执行的用户是apache,是非特权用户
基于用户做访问控制
用户的认证方式:
基本认证:基于明文的,basic
摘要认证:基于密钥的,digest
基于这种认证的用户并不是系统上的用户,而是虚拟的用户,
所谓的虚拟用户是用于某种服务或某种资源的凭证,这里是访问httpd资源的虚拟用户。
可以指定一个文本文件:用户名是明文的,密码是加密的隐藏文件(.htpasswd)
认证和授权
authentication provider:账号和密码的存储机制;
在httpd中简称为:authn
authorization provider:授权提供者
在httpd中简称为:
没有基于表单的认证时,可以做基于站点的认证
authn:存放用户的名和密码
authz:存放的是用户可以访问的资源权限
以下为一案例:
创建要被认证的站点
[root@localhost ~]# cd /var/www/html/ [root@localhost html]# mkdir boss [root@localhost html]# cd boss/ [root@localhost boss]# vim index.html <h1>This is the boss area</h1>
更改配置文件,添加内容如下所示:
<Directory “/var/www/html/boss”> Options none AllowOverride AuthConfig #做认证相关配置 AuthType Basic #支持明文,一般浏览器不支持加密 AuthName “Boss place” #认证前输出的提示信息 AuthBasicProvider file #默认为file,可有可无的 AuthUserFile /etc/httpd/conf/.htpasswd #认证文件存放的位置 Require user boss #允许哪个用户登入,也可以为valid-user(合理的用户) </Directory>
创建认证文件
默认情况下,httpd自带了一个这样的工具:htpasswd
常用选项:
-c:如果文件不存在,则创建,一般是第一次使用时添加
-m:以md5的形式编码存储用户的密码信息
#htpasswd�Cc �Cm /etc/httpd/conf/.htpasswd tom #cat/etc/httpd/conf.d/.htpasswd boss:$apr1$hkWjvT/U$F/YsSneENADpkG7iHl6Eb0
通过浏览器进行验证:
输入用户名boss和密码之后
这样基于用户的身份认证的实验就算成功了
虚拟主机
一个服务器只提供一个站点的服务器称之为主服务器,虚拟主机是一台物理主机可以提供多个站点
区分不同的虚拟主机:虚拟主机间使用不同的访问路径
基于端口:一般都是基于80端口,有冲突
基于IP:可行,但是IP地址紧缺
基于主机名:是现在用的比较多的一种虚拟主机方式
1、使用虚拟主机的前提,取消主服务器
注释主服务的站点提供路径:DocumentRoot
2、定义虚拟主机
<VirtualHostIP:PORT>
ServerName
DocumentRoot
ServerAlias
ErrorLog
CustomLog
</VirtualHost >
可以出现多次,定义多个虚拟主机
注意:httpd2.2特性,要启动基于主机名的虚拟主机要启用NameVirtualHost IP:PORT
案例:
1、基于端口上的虚拟主机,分别为80和8080
在配置文件中添加:Listen 8080监听8080端口
一定要注释掉DocumentRoot,否则实验不会成功
<VirtualHost 172.16.30.10:80>
ServerName www.365lsy.com
DocumentRoot “/web/host1/”
</VirtualHost >
<VirtualHost 172.16.30.10:8080>
ServerName www.365lsy.com
DocumentRoot “/web/host2/”
</VirtualHost >
创建上面的目录,分别在目录里添加主页
[root@localhost boss]# mkdir -pv /web/host{1,2} [root@localhost web]# cd /web/host1 [root@localhost host1]# vim index.html <h1>This is WEB 1</h1> [root@localhost host1]# cd ../host2 [root@localhost host2]# vim index.html <h1>This is WEB 2</h1>
做语法检查httpd�Ct或service httpd configtest
注意:如果后面直接检测是不会成功的,因为不能解析,所以,我们可以搭建一个DNS服务器或是把主机的hosts文件更改一下。
在hosts文件中加一条如:172.16.30.10 www.365lsy.com
启动服务后,在浏览器里检测:
2、基于两个地址上做虚拟主机:172.16.30.10和172.16.30.20
[root@localhost ~]# ifconfig eth0:0 172.16.30.20
更改配置文件
<VirtualHost 172.16.30.10:80>
ServerName www.365lsy.com
DocumentRoot “/web/host1/”
</VirtualHost >
<VirtualHost172.16.30.20:80>
ServerName www.365lsy.com
DocumentRoot “/web/host2/”
</VirtualHost >
然后在浏览器中输入ip地址做验证:
3、基于主机名的虚拟主机:www.365lsy.com和mail.365lsy.com
<VirtualHost 172.16.30.10:80>
ServerName www.365lsy.com
DocumentRoot “/web/host1/”
</VirtualHost >
<VirtualHost172.16.30.10:80>
ServerName mail.365lsy.com
DocumentRoot “/web/host2/”
</VirtualHost >
为了实验能成功完成,我们也要更改一下hosts文件,加上一条
172.16.30.10 mail.365lsy.com
验证配置文件后,重启服务
用浏览器验证虚拟主机是否能够被解析
httpd基于SSL做https
http协议:文本编码
可以用telnet向服务器发起请求
由于这种传输是明文的,所以对于数据传输来说,是不安全的,在应用层和之间添加了半层SSL,应用程序可以用也可以不用。
rpm包安装的httpd程序,要使用ssl需要安装一个模块:mod_ssl
SSL会话是基于IP建立的,主机名只是在验证用户信息时,起了作用,如果有多台虚拟主机时,只能有一个台主机用SSL会话,所以,每个IP仅能够创建一个SSL会话。
步骤如下所示:
1、 安装mod_ssl
2、 为服务器端生成私钥,并为其提供证书
3、 配置实用https的虚拟主机
[root@localhost ~]# yum install -y mod_ssl
查看配置文件
在/etc/httpd/conf.d/下
访问日志为TransferLog Logs/ssl_access_log
重要的一个:
SSLCertificateFile 服务器端的证书文件
SSLCertificateKeyFile服务器端的私钥文件,解密客户端发过来加密的数据
<VirtualHost _defualt_:443>可以更改IP:PORT
建立CA服务器
[root@localhost ~]#(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自签证书
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HA Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:magedu Organizational Unit Name (eg, section) []:ops Common Name (eg, your name or your server's hostname) []:www.365lsy.com Email Address []:[email protected]
准备文件
[root@localhost ~]#cd /etc/pki/CA [root@localhost ~]#touch serialindex.txt [root@localhost ~]#echo 01 >serial
为httpd建立私钥和证书
[root@localhost ~]#mkdir /etc/httpd/ssl [root@localhost ~]#cd /etd/httpd/ssl [root@localhost ~]#(umask 077;openssl genrsa -out httpd.key 2048)
生成请求
[root@localhost ~]#openssl req -new -key httpd.key -out httpd.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HA Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:magedu Organizational Unit Name (eg, section) []:ops Common Name (eg, your name or your server's hostname) []:mail.365lsy.com Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
签署证书
[root@localhost ~]#openssl ca -in httpd.csr -out httpd.crt -days 365
更改ssl对应的配置文件
[root@localhost ~]#cd/etc/httpd/conf.d/ [root@localhost ~]#vim ssl.conf #更改下面的内容 SSLCertificateFile /etc/httpd/ssl/httpd.crt SSLCertificateKeyFile /etc/httpd/ssl/httpd.key DocumentRoot "/web/host1" ServerName www.365lsy.com:443
更改配置文件之后,重启服务
在浏览器里输入:https://www.365lsy.com
下载证书,改名为.crt后缀,安装证书在本地
关闭浏览器后,再次输入https://www.365lsy.com
实验成功,是通过https访问的
总结,到此处,我们的httpd2.2的讲解就结束了,下一次,我们将讲解httpd源代码的编译安装