HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
http请求由三部分组成,分别是:请求行、消息报头、请求正文1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
在接收和解释请求消息后,服务器返回一个HTTP响应消息。HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
1、状态行格式如下:
HTTP-Version Status-Code Reason-Phrase;
HTTP/1.1 200 ok
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
HTTP服务器配置文件常用选项说明:
1、安装所需rpm包
yum list all *httpd*
yum install httpd
2、安装完成后,可以直接启动服务,但有时会出现一个提示:
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
可以修改配置文件中的ServerName来避免出现这个错误;
3、配置文件在/etc/httpd/conf/和/etc/httpd/conf.d/*.conf
主配置文件是:/etc/httpd/conf/httpd.conf
### Section 1: Global Environment
ServerRoot "/etc/httpd" 定义配置文件所在的目录
PidFile run/httpd.pid 定义pidfile的位置,相对于/etc/httpd/;
KeepAlive Off是否开启持久连接;
MaxKeepAliveRequests 100 当开启keepalive时,允许一个会话发送过来的最多的请求;
KeepAliveTimeout 15 同一个会话的两个请求的间隔,超过15秒就断开。
apache2主要的优势就是对多处理器的支持更好,在编译时同过使用--with-mpm选项来决定apache的工作模式。如果知道当前的apache使用什么工作机制,可以通过httpd -l命令列出apache的所有模块,就可以知道其工作方式:
prefork:如果httpd -l列出prefork.c,则需要对下面的段进行配置:
# prefork MPM
<IfModule prefork.c>
StartServers 8 ;启动apache时启动的httpd进程个数。
MinSpareServers 5;服务器保持的最小空闲进程数。
MaxSpareServers 20;服务器保持的最大空闲进程数。
ServerLimit 256;最多可以启动多少进程个数。
MaxClients 256;允许最多客户端的个数
MaxRequestsPerChild 4000;每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
</IfModule>
在prefork工作模式下,服务器启动后起动8个httpd进程(加父进程共9个,通过ps -ax|grep httpd命令可以看到)。当有用户连接时,apache会使用一个空闲进程为该连接服务,同时父进程会fork一个子进程。直到内存中的空闲进程达到MaxSpareServers。该模式是为了兼容一些旧版本的程序。
worker模式下,是由线程来监听客户的连接。当有新客户连接时,由其中的一个空闲线程接受连接。服务器在启动时启动四个进程,每个进程产生的线程数是固定的(ThreadsPerChild决定),因此启动时有100个线程。当100个线程不够用时,服务器自动fork一个进程,再产生25个线程。
# worker MPM
<IfModule worker.c>
StartServers 4;启动apache时启动的httpd进程个数。
MaxClients 300;最大并发连接数。
MinSpareThreads 25;服务器保持的最小空闲线程数。
MaxSpareThreads 75 ;服务器保持的最大空闲线程数。
ThreadsPerChild 25;每个子进程的产生的线程数。
MaxRequestsPerChild 0;每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
</IfModule>
#Listen 12.34.56.78:80
Listen 80 定义监听端口,可以定义多行;无IP表示所有IP;
# Dynamic Shared Object (DSO) Support
服务启动时需要加载的模块;
Include conf.d/*.conf ;配置文件也包含conf.d/*.conf;
User apache 服务运行时的身份;
Group apache
### Section 2: 'Main' server configuration
ServerAdmin root@localhost;当网站出现错误时,显示的管理员邮箱;
ServerName www.test.com:80;主机名
DocumentRoot "/var/www/html" 网页文件存放目录
<Directory />
Options FollowSymLinks ;
AllowOverride None
</Directory>
<Directory "/var/www/html"> ; 跟DocumentRoot相同
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
<IfModule mod_userdir.c> ;用户主页设置。
UserDir disabled
#UserDir public_html
</IfModule>
可以这样设置
UserDir enabled
UserDir disabled root tom
也可以这样设置:
UserDir disabled
UserDir enabled jack
DirectoryIndex index.html index.html.var 网站默认主页
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
CustomLog logs/access_log combined
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#
# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
AddDefaultCharset UTF-8 ; 默认字符集
# Allow server status reports generated by mod_status,
# with the URL of http://servername/server-status
# Change the ".example.com" to match your domain to enable.
#
#<Location /server-status> ;可以通过http://hostname/server-status来获取服务器状态信息
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .example.com
#</Location>
### Section 3: Virtual Hosts虚拟主机部分:虚拟主机和真实主机不能共存,如果启用虚拟主机,则关闭真实主机
#NameVirtualHost *:80
#<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>
旧版本在/etc/httpd/conf.d/ssl.conf,新版的2.4.4版本在/etc/httpd/extra/httpd-ssl.conf
<VirtualHost _default_:443>定义虚拟主机
LoadModule ssl_module modules/mod_ssl.so;加载ssl模块
Listen 443https默认端口
# General setup for the virtual host, inherited from global configuration
#DocumentRoot "/var/www/html"
#ServerName www.example.com:443
# Use separate log files for the SSL virtual host; note that LogLevel
# is not inherited from httpd.conf.
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on;ssl引擎开启
# SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect. Disable SSLv2 access by default:
SSLProtocol all -SSLv2;ssl协议支持
# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A new
# certificate can be generated using the genkey(1) command.
#网站服务器自身证书位置;
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
#网站服务器私钥位置;
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
</VirtualHost>
配置实例:
1、修改网站根目录;
DocumentRoot "/tmp/siteA/"
2、设置目录属性:
<Directory "/tmp/siteA">
Options All -Indexes ; 不提供Indexes功能:其他的有
AllowOverride None
Order deny,allow
Deny from all
Allow from 172.16.0.0/16
</Directory>
3、基于用户的访问属性;例如:
基于基本的用户名密码;用户密码明文传输,不安全;
<Directory "/tmp/siteA/authorized/">
AuthType Basic
AuthName "Authorized users only!"
AuthUserFile /etc/httpd/.htpasswd
AllowOverride AuthConfig
require user jack
Order deny,allow
Deny from all
Allow from 172.16.254.81
Satisfy any
#Satisfy 选项:同时使用Allow和Require时的访问策略时,参数可以设置为 All 或 Any,默认是all,当同时限制IP和用户名:密码时,all表示所有条件都满足,any表示IP或用户名:密码匹配即可 。
</Directory>
基于散列的用户认证:
首先把LoadModule auth_basic_module modules/mod_auth_basic.so注释掉;
使用htdigest -c /etc/httpd/digest.users "Digest auth" UserName;
注意:“htdigest命令使用时需添加“Digest auth” 此名与AuthName相同;
<Directory "/tmp/siteA/digestauth/">
AuthType Digest
AuthName "Digest auth"
AllowOverride AuthConfig
require user tom
Order deny,allow
Deny from all
Allow from 172.16.254.81
Satisfy any
AuthDigestProvider file
AuthUserFile /etc/httpd/digest.users
</Directory>
4、userdir;
useradd jack
mkdir /home/jack/public_html
echo "This is jack's homepage." > index.html
chmod o+x /home/jack
修改
<IfModule mod_userdir.c>
UserDir disabled
UserDir enable jack ; 可以单独为某个用户开启,当然也可以只禁用某个用户;
UserDir public_html
</IfModule>
通过http://172.16.1.3/~jack/访问
5、路径别名;
添加:
Alias /pics/ "/tmp/abc/"
然后:
mkdir /tmp/abc/
echo "This is Alias ." > /tmp/abc/index.html
6、脚本路径别名;
添加Scripts-Alias
ScriptAlias /cgi-bin/ "/tmp/cgi-bin/"
然后
mkdir /tmp/cgi-bin
vi /tmp/cgi-bin/date.sh
#!/bin/bash
cat << EOF
<pre>
The Current time is : `date`
</pre>
EOF
7、基于端口的虚拟主机:
将第二部分中的DocumentRoot注释掉;
配置实例:
<VirtualHost 172.16.1.1:80>
ServerAdmin [email protected]
DocumentRoot /tmp/siteA
ServerName www1.magedu.com
CustomLog /tmp/logs/siteA_access combined
ErrorLog /tmp/logs/siteA_error
</VirtualHost>
<VirtualHost 172.16.1.1:8080>
ServerAdmin [email protected]
DocumentRoot /tmp/siteB
ServerName www2.magedu.com
CustomLog /tmp/logs/siteB_access combined
ErrorLog /tmp/logs/siteB_error
</VirtualHost>
基于IP地址的虚拟主机:
将第二部分中的DocumentRoot注释掉;
<VirtualHost 172.16.1.1:80>
ServerAdmin [email protected]
DocumentRoot /tmp/siteA
ServerName www1.magedu.com
CustomLog /tmp/logs/siteA_access combined
ErrorLog /tmp/logs/siteA_error
</VirtualHost>
<VirtualHost 172.16.1.10:80>
ServerAdmin [email protected]
DocumentRoot /tmp/siteB
ServerName www2.magedu.com
CustomLog /tmp/logs/siteB_access combined
ErrorLog /tmp/logs/siteB_error
</VirtualHost>
基于主机头的虚拟主机:
将第二部分中的DocumentRoot注释掉;
启用NameVirtualHost 172.16.1.1:80
<VirtualHost 172.16.1.1:80>
ServerAdmin [email protected]
DocumentRoot /tmp/siteA
ServerName www.a.com
CustomLog /tmp/siteA/logs/access_log combined
ErrorLog /tmp/siteA/logs/error_log
</VirtualHost>
<VirtualHost 172.16.1.1:80>
ServerAdmin [email protected]
DocumentRoot /tmp/siteB
ServerName www.b.net
CustomLog /tmp/siteB/logs/access_log combined
ErrorLog /tmp/siteB/logs/error_log
</VirtualHost>
HTTPS相关配置:
安装mod_ssl
https首先要有CA颁发的证书,(本例中CA和http服务器为同一台服务器)
一、CA的建立过程:
1、建立证书服务器所需的文件
按照CA的配置文件/etc/pki/tls/openssl.cnf里描述的完善建立CA的文件,
cd /etc/pki/CA
echo '01' > serial
touch index.txt
2、生成证书服务器私钥:
(umask 077; openssl genrsa -out private/cacert.key 2048)
3、自签证书生成:
openssl req -new -x509 -key private/cacert.key -out cacert.pem -days 3650
二、为网站申请证书。
1、生成网站服务器私钥;
(umask 077;openssl genrsa -out httpd.key 1024)
2、生成证书申请;
openssl req -new -key httpd.key -out httpd.csr
3、证书服务器签署证书
openssl ca -in httpd.csr -out httpd.crt -days 3650
4、修改配置文件中证书存放路径:
vi /etc/httpd/conf.d/ssl.conf
SSLCertificateFile ;网站证书存放位置
SSLCertificateKeyFile ;网站私钥存放位置
5、重启服务
service httpd restart
6、客户端测试
客户端安装ca服务器证书:输入https访问网站即可。