您的位置:首页 > 理论基础 > 计算机网络

18、HTTP基本操作及源码编译安装 学习笔记

2017-10-19 11:35 661 查看
HTTPHyper Text Transfer Protocol超文本传输协议
HTMLHyper Text Mark-up Language超文本标记语言
URIUniform Resource Identifier统一资源提示符
URLUniform Resource Locator统一资源定位符

http协议的版本:
http0.9只能传输html文档,1991年
http1.0支持多媒体数据的处理,保持连接。有缓存功能
http1.1支持更多的请求方法,更加精细的缓存控制,持久连接

MIME:Multipurpose Internet Mail Extensions多用途互联网邮件扩展
base64:将二进制数据编码成文本发送,并能够让接受方还原回原来的格式

MIME:多媒体类型
major/minor
HTMLtext/html
ASCIItext/plagin
JPEGimage/jpeg
GIFimage/gif
QuickTime(流媒体)video/quicktime

HTTP事务:一次请求以与其对应的响应
HTTP方法:GET、PUT、HEAD、POST、DELETE

HTTP请求:request
HTTP请求报文
报文格式:
<method><request-url><version>
<headers>
<entity-body>

HTTP响应:response
HTTP响应报文
报文格式:
<version><status><reason-phrase>
<headers>
<entity-body>

<method>请求方法,希望服务器端执行的动作,如GET、HEAD、POST等
<request-url>请求的资源,可以是相对路径,也可以是完整的URL
<version>协议版本,格式HTTP/<major>.<minor>,如http/1.0
<headers>HTTP首部
<status>状态码
<reason-phrase>原因短语,数字状态码易读信息
<entity-body>主体部分

http协议:是一种stateless(无状态)协议一次HTTP事务结束后,链接自行断开
加速方式:并行请求、持久连接

HTTP的请求方法:GET、HEAD、POST、PUT、DELETE、OPTIONS、TRACE
扩展方法:LOCK、MKCOL、COPY、MOVE

GET请求获取一个资源,需要服务器发送
HEAD跟GET相似,但其不需要服务发送资源而仅传回响应首部
POST支持HTML表单提交,表单中有用户填入的数据,这些数据会发送到服务器端,由服务器存储至某位置(例如发送处理程序)
PUT与GET相反,向服务写入文档,如发布系统
DELETE请求删除URL指向的资源
OPTIONS探测服务器端对某资源所支持的请求方法
TRACE追踪请求资源要经过的防火墙、代理或网关等

响应报文代码
1XX:信息性状态码
2XX:成功状态码
200:OK
201:(已创建)请求成功并且服务器创建了新的资源
3XX:重定向状态码
301:Moved Permanebtly 永久重定向,在响应报文中使用首部“Location:URL”指定资源现在所在的位置
302:Found 临时重定向,在响应报文中使用首部“Location:URL”指定临时资源位置
304:Not Modified,条件式请求中使用
4XX:客户端的错误
403:Forbidden,请求被服务器拒绝
404:Not Found,服务器无法找到请求的URL
405:Method Not Allowed,不允许使用此方法请求响应的URL
5XX:服务器类的错误
500:Internal Server Error,服务器内部错误
502:Bad Gateway:代理服务器从上游收到一条伪响应
503:Service Unavailable,服务器此时无法提供服务,但将来可能可用

HTTP首部
通用首部:请求和响应都可以使用的
请求首部:请求报文使用
响应首部:响应报文使用
实体首部:用于指定实体属性
扩展首部:非标准首部,可能是由程序开发者创建的,例如X-Forward-For

通用首部:
Connection定义C/S之间关于请求/响应的有关选项,对于http/1.0,Connection为keep-alive
Via显示了报文经过的中间节点
Cache-Control缓存指示,通过指定首部字段Cache-Control,就能操作缓存的工作机制
Pragma只用在客户端发送的请求中,所有的中间服务器不返回缓存的资源

请求首部:
Cilent-IP 请求端I地址
Host请求的主机名和端口号,虚拟主机环境下用于不同的虚拟主机
Referer指明了请求当前资源的原始资源的URL
User-Agent用户代理,使用什么工具发出的请求

Accept首部:用户标明客户自己更倾向于支持使用的能力
Accept指明服务器能发送的媒体类型
Accept-Charset支持使用的字符集
Accept-Encoding支持使用的编码方式
Accept-Language支持使用的语言

条件请求首部:
Expect客户端使用首部字段Except来告知服务器,期望出现的某种指定行为
If-Modified-Since是否在指定的时间以来修改过此资源
If-None-Match该字段值得实体标记值与请求资源的ETag不一致时,它就告知服务器处理该请求

跟安全相关的请求首部:
Authorication客户端提交给服务端的认证数据,如账号和密码
Cookie客户端发送给服务器端身份标识
Cookie2客户端发送给服务器端身份标识

响应首部:
Age响应持续的时间
Server向客户端标明服务器程序名称和版本

协商首部:
Accept-Ranges对当前资源来讲,服务器所能够接受的范围类型
Vary首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端

跟安全相关的响应首部
Set-Cookie服务器端在某客户端第一次请求时发给的令牌
Set-Cookie2服务器端在某客户端第一次请求时发给的令牌
WWW-Authenication质询,即要求客户端提供账号和密码

实体首部:
Location资源的新位置
Allow允许对此资源使用的请求方法

内容首部:
Content-Encoding告知客户端服务器对实体的主体部分选用的内容编码方式
Content-Language告知客户端,实体主体使用的自然语言
Content-Length表明了实体主体部分的大小
Content-type说明了实体主体内对象的媒体类型,该字段用type/subtype形式赋值
Content-Range针对范围请求,返回响应时使用的首部字段,能告知客户端作为相应返回的实体的哪个部分符合范围请求
Content-Location给出与报文主体返回资源对应的URI

缓存首部:
ETag实体标签
Expires过期标签
Last-Modified上一次的修改时间

一个Web请求的基本过程
建立连接
接收请求
处理请求
访问资源
构建响应
发送响应
记录日志

Web服务器的输入输出结构
单线程I/O结构
多线程I/O结构
复用的I/O结构(一个进程响应多个请求)
复用多线程I/O结构:多个线程,每个线程响应多个请求

httpd:高度模块化
core+modules
DSO:Dynamic Shared Object 动态模块对象
MPM:Multipath Processing Module,多道处理模块,非一个模块,而是对一种特性的称谓
prefork一个进程一个请求(预先创建好),
worker一个进程多个线程,一个线程一个请求
event一个进程响应多个请求,不生成线程
event-driven事件驱动,主要目的在于实现单线程响应多个请求

http版本
http-1.3
http-2.0
http-2.2,不支持event
http-2.4

httpd的功能特性:
路径别名:alias
用户认证:authentication
虚拟主机:virtual host
反向代理:
负载均衡:
用户站点:
CGI:Common Gateway Interface

安装httpd
yum -y install httpd

服务脚本/etc/rc.d/init.d/httpd
脚本配置文件/etc/sysconfig/httpd
运行目录/etc/httpd
主配置文件/etc/httpd/conf/httpd.conf
扩展配置/etc/httpd/conf.d/*.conf
文档根目录/var/www/html
CGI/var/www/cgi-bin/

Docroot:文档根目录

配置文件:
/etc/httpd/conf/httpd.conf
配置参数 值
配置指令不区分字符大小写
值有可能区分大小写
有些指令可以重复出现多次

配置文件格式
全局配置
主机配置用于仅提供一个站点时
虚拟主机配置用于提供多个站点时

配置文件语法测试
service httpd configtest
httpd -t

绝大多数配置修改后,可以用过service httpd reload 来生效,如果修改了监听的地址或端口,必须重启服务才能生效

1.监听套接字
Listen [IP:]port
此指令可以出现多次,用于指定监听多个不同的套接字
Listen 80
Listen 172.16.100.7:8080

2.配置使用Keepalive
KeepAlive {On|Off}
KeepAliveTimeout 2超时时间
MaxKeepAliveRequests 50 最大连接
未设置keepalive时,一次HTTP事务结束后,链接自行断开。设置keepalive后,超时时间和最大连接只要任一个达到最大值,链接自行断开

设置keepalive前(访问完立即自行断开)
[root@localhost ~]# telnet 192.168.130.121 80
Trying 192.168.130.121...
Connected to 192.168.130.121.
Escape character is '^]'.
GET /index.html HTTP/1.0
HOST:192.168.130.121

HTTP/1.1 200 OK
Date: Wed, 20 Sep 2017 02:04:32 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 20 Sep 2017 02:04:10 GMT
ETag: "a09cd-72-55995643f9126"
Accept-Ranges: bytes
Content-Length: 114
Connection: close
Content-Type: text/html; charset=UTF-8

<html>
<head>
<title>httpd学习</title>
</head>
<body>
<h1>kaiyuandiantang.blog.51cto.com</h1>
</body>
</html>
Connection closed by foreign host.

设置keepalive后(超时时间和最大连接只要任一个达到最大值,链接自行断开)

[root@localhost html]# telnet 192.168.130.121 80
Trying 192.168.130.121...
Connected to 192.168.130.121.
Escape character is '^]'.
GET /index.html HTTP/1.1
HOST:192.168.130.121

HTTP/1.1 200 OK
Date: Wed, 20 Sep 2017 02:07:31 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 20 Sep 2017 02:04:10 GMT
ETag: "a09cd-72-55995643f9126"
Accept-Ranges: bytes
Content-Length: 114
Content-Type: text/html; charset=UTF-8

<html>
<head>
<title>httpd学习</title>
</head>
<body>
<h1>kaiyuandiantang.blog.51cto.com</h1>
</body>
</html>

Connection closed by foreign host.

3.MPM(多道处理模块)
httpd -l 查看编译进内核的模块
想使用不同的机制,修改配置文件即可 /etc/syconfig/httpd文件

 <IfModule preforck.c> 判断模块是否存在
StartServers 8 默认启动的工作进程数
MinSpareServers 5 最少空闲进程数
MaxSpareServers 20 最大空闲进程数
ServerLimit 256 最大活动进程数
MaxClients 256最大并发连接数,最多允许发起的连接请求的个数
MaxRequestsPerChild 4000每个子进程在生命周期内最大允许服务的最多请求个数
</IfModule>

<IfModule worker.c>
StartServers 4启动的子进程的个数
MaxClients 300最大并发连接数,最多允许发起的连接请求的个数
MinSpareThreads 25最少空闲线程数
MaxSpareThreads 75最大空闲线程数
ThreadsPerChild 25每个子进程生成的线程数
MaxRequestsPerChild 0 每个子进程在声明周期内最大允许服务的最多请求个数
</IfModule>

preforck工作机制
[root@localhost html]# ps -elfH | grep httpd
0 S root 25835 25683 0 80 0 - 25817 pipe_w 10:16 pts/2 00:00:00 grep httpd
1 S root 25809 1 0 80 0 - 43848 poll_s 10:06 ? 00:00:00 /usr/sbin/httpd
5 S apache 25811 25809 0 80 0 - 43881 inet_c 10:06 ? 00:00:00 /usr/sbin/httpd
5 S apache 25812 25809 0 80 0 - 43881 inet_c 10:06 ? 00:00:00 /usr/sbin/httpd
5 S apache 25813 25809 0 80 0 - 43848 inet_c 10:06 ? 00:00:00 /usr/sbin/httpd
5 S apache 25814 25809 0 80 0 - 43848 inet_c 10:06 ? 00:00:00 /usr/sbin/httpd
5 S apache 25815 25809 0 80 0 - 43848 inet_c 10:06 ? 00:00:00 /usr/sbin/httpd
5 S apache 25816 25809 0 80 0 - 43848 inet_c 10:06 ? 00:00:00 /usr/sbin/httpd
5 S apache 25817 25809 0 80 0 - 43848 inet_c 10:06 ? 00:00:00 /usr/sbin/httpd
5 S apache 25818 25809 0 80 0 - 43848 inet_c 10:06 ? 00:00:00 /usr/sbin/httpd
[root@localhost html]#

worker工作机制
[root@localhost html]# ps -elfH | grep httpd
0 S root 26106 25683 0 80 0 - 25817 pipe_w 10:18 pts/2 00:00:00 grep httpd
1 S root 25991 1 0 80 0 - 43900 poll_s 10:18 ? 00:00:00 /usr/sbin/httpd.worker
5 S apache 25993 25991 0 80 0 - 129965 pipe_w 10:18 ? 00:00:00 /usr/sbin/httpd.worker
5 S apache 25994 25991 0 80 0 - 146349 pipe_w 10:18 ? 00:00:00 /usr/sbin/httpd.worker
5 S apache 25997 25991 0 80 0 - 146349 pipe_w 10:18 ? 00:00:00 /usr/sbin/httpd.worker
[root@localhost html]#

4、DSO模块的加载方式
LoadModule module_name /path/to/module
如果使用相对路径,则对于ServerRoot所定义的位置而言
LoadMoudule php5_module /usr/lib64/httpd/modules/php.so
让服务重载配置文件方能生效

httpd -m 列出与加载到所有DSO模块与非DOS模块
取消 注释掉即可

5、配置站点根目录
DocumentRoot /path/to/somewhere

6、页面访问属性
<Direcotry "/path/to/somewhere">
Options 选项
Indexes缺少指定的默认页面时,允许将目录中的所有文件以列表形式返回给用户:危险:慎用
FollowsymLinks允许跟随符号链接所指向的原始文件
None所有都不启用
All所有的都启用
ExecCGI允许使用mod_cgi模块执行CGI脚本
Includes允许使用mod_include模块实现服务器端包含(SSI)
IncludesNOEXEC允许包含但不允许执行脚本
MultiViews允许使用mod_negotiation实现内容协商
SymLinksIfOwnerMatch在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号连接所指向的原始文件
AllowOverride
</Direcotry>
可以使用正则表达式,使用~

7.基于主机的访问控制
<Direcotry "/path/to/somewhere">
Options
AllowOverrideNone 不禁用下面
orderallow,deny没有允许的都拒绝
orderdeny,allow没有拒绝的都允许
Allow from允许来至指定主机访问
Deny from拒绝来至指定主机访问
</Direcotry>

如果都匹配或都不匹配时以默认为准
否则则以匹配到的为准
Allow from
Deny from
IP,Network Address
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0

8.定义默认主页面
DirectoryIndex 依次查找

9.用户目录
如果期望让每个用户都可以创建个人站点:http://Server_IP/~Username/
userdir disablied禁止用户目录
userdir public_html启用用户目录
public_html是用户家目录下的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问
用户的家目录得赋予进行httpd进程的用户拥有执行权限
setfacl -m u:apache:x /home/Username

修改配置文件
userdir public_html
service httpd restart

创建用户及目录
useradd test
mkdir /home/test/public_html

修改权限
setfacl -m u:apache:x /home/test

测试 http://192.168.130.121/~test
10、配置日志功能
/var/log/http/
access.log访问日志,其需要记录的内容需要自定义
error.log错误日志

访问日志:
CustomLog "/path/to/log_file" LogFormat
LogFormat定义日志格式
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
%h客户端地址
%l远程的登录名,通常为-
%u认证时的远程用户名,通常为-
%t接收到的请求时的时间,为标准英文格式时间+时区
\"转义,显示""
%r请求报文的起始行
%>s响应状态码
%b以字节响应报文的长度,不包含http报文
%{Header_Name}i记录指定请求报文首部的内容(value)
%u请求的URL

详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

11、路径别名
Alias /alias/ "/path/to/somewhere"
意味着访问http://Server_IP/alias时,其页面文件来自于/path/to/somewhere中

12、指定默认的字符集
AddDefaultCharset

13.脚本路径别名(CGI接口)
URL-->FileSystem Directory
CGI:Common Gateway Interface(通用网关接口)使WEB可以跟一个应用程序进行通信,从通信环境中获得结果。
CGI是不安全的,在第一行写入"echo “Content-Type:text/html"
mod_alias,mod_cgi
ScriptAlias /URL/ "/path/to/somewhere" somewhere下的文件可以被执行,也可以在目录中实现

[root@localhost ~]# cat /var/www/cgi-bin/test
#!/bin/bash

cat << EOF
Content-Type:text/html

<pre>
<h1> The hostname is : `hostname`.</h1>
The time is : `date`.
</pre>
EOF
[root@localhost ~]#
[root@localhost ~]# cd /var/www/cgi-bin/
[root@localhost cgi-bin]# chmod +x test
http://192.168.130.121/cgi-bin/test
14.基于用户的访问控制
虚拟用户:不是系统用户,只是为了获取某种资源类型的一种虚拟的用户
文件/etc/httpd/conf/.htpasswd
SQL数据库
dbm
ldap轻量级目录访问协议
认证类型(auth):
basic基本认证,账号和密码明文发送
digest摘要认证,hash编码之后发送
认证提供者(authentication provider):账号和密码的存放位置
授权机制(authorization)根据什么进行授权

案例:基于文件,做基本认证根据用户和组进行授权
1、编辑配置文件,为需要认证的目录配置认证机制
<Directory "/www/htdocs/fin">A
options None
AllowOverride AuthConfig 使用认证配置
AuthType Basic 使用基本认证
AuthName "Private Area" 质询时标题
AuthUserFile /etc/http/conf/.htpasswd 密码的存放位置
Require vaild-user 可访问的用户
</Directory>

2、使用htpsswd命令生成认证库
htpasswd
-c 创建密码,创建第一个用户时使用
htpasswd -c -m /etc/http/conf/.htpasswd tom
-m MD5格式存放
-b 批量模式
-D 删除用户

3、基于组认证
<Directory "/www/htdocs/fin">
options None
AllowOverride AuthConfig使用认证配置
AuthType Basic 使用基本认证
AuthName "Private Area" 质询时标题
AuthgroupFile /etc/http/conf/.htpasswd 密码的存放位置
Require group GroupName 可访问的用户
</Directory>

先创建用户,在创建组
组文件:
组名:用户1 用户2 用户3

15.虚拟主机
一个物理服务器提供多个站点;使用虚拟主机得先取消中心主机
基于不同的IP实现不同的虚拟主机
变化IP
基于不同的port实现不同的虚拟主机
变化port
基于不同主机名实现不同的虚拟主机
变化ServerName的值
通过请求报文中的HOST来实现不同的虚拟主机访问
<VirtualHost IP:port>
SeverName
DocumentRoot ""
<Directory "">
</Directory>
ServerAlias
ServerAdmin
</VirtualHost>
将全局中的DocumentRoot""注释掉

基于IP实现虚拟主机
<VirtualHost 192.168.130.121:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>
<VirtualHost 192.168.130.122:80>
ServerName www.b.com
DocumentRoot "/var/www/html/b.com"
</VirtualHost>

基于端口实现虚拟主机
Listen 80
Listen 8080
<VirtualHost 192.168.130.121:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>
<VirtualHost 192.168.130.121:8080>
ServerName www.b.com
DocumentRoot "/var/www/html/b.com"
</VirtualHost>

基于主机名实现虚拟主机
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>
<VirtualHost *:80>
ServerName www.b.com
DocumentRoot "/var/www/html/b.com"
</VirtualHost>
<VirtualHost *:80>
ServerName www.c.com
DocumentRoot "/var/www/html/c.com"
</VirtualHost>

16.https协议
x509.3证书格式
证书格式的版本号
证书序列号
证书签名算法
证书颁发者
有效期
持有者的名称
持有者的公钥
CA的ID
持有者的ID
其他扩展信息
基本约束
证书策略
密钥的使用限制
CA签名
ssl握手要完成的工作
交换协议版本号
选择一个双方都支持的加密方式
对两端实现身份验证
密钥交换
http文本协议 80/tcp
https二进制格式的协议 443/tcp

SSL会话基于IP地址进行:不支持在基于主机名的虚拟主机上实现

客户端验证服务器端证书时:
日期检查:证书是否在有效期内
证书颁发者的可信度
证书的签名检测
持有者的身份检测

可以在/etc/pki/tls/certs
openssl s_client
-connet:验证的地址:端口
-CAfile:CA证书的路径

httpd:基于mod_ssl模块实现对ssl的支持
1)、安装httpd
yum -y install httpd

2)、准备好服务器的私钥和证书

用openssl实现私有CA:

生成密钥对儿:
cd /etc/pki/CA
(umask 077; openssl genrsa -out private/cakey.pem 2048)
如果想查看公钥:
openssl rsa -in private/cakey.pem -pubout -text

生成自签证书:
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655

创建需要的文件:
touch index.txt serial crlnumber

用openssl实现证书申请:

在主机上生成密钥,保存至应用此证书的服务的配置文件目录下, 例如:
mkdir /etc/httpd/ssl
cd /etc/httpd/ssl
(umask 077; openssl genrsa -out httpd.key 1024)

生成证书签署请求:
openssl req -new -key httpd.key -out httpd.csr

将请求文件发往CA;

CA签署证书:
签署:
openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days DAYS

将证书传回请求者

吊销证书:
openssl ca -revoke /path/to/somefile.crt

3)、安装mod_ssl模块
yum -y install mod_ssl

4)、配置/etc/httpd/conf.d/ssl.conf
配置实用ssl的虚拟主机
ServerName
DocunmentRoot
配置证书和私钥
SSLCertificatFile 证书文件
SSLCertificatKeyFile 密钥文件

DocumentRoot "/var/www/html"
ServerName www.kaiyuandiantang.com:443
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

5)、重启httpd服务
httpd -t
service httpd restart
6)、测试
openssl s_client -connet验证的地址:端口 -CAfile CA证书的路径

openssl s_client -connect 192.168.130.121:443 -CAfile /etc/pki/CA/cacert.pem
https://www.kaiyuandiantang.com
17、使用mod_deflate模块压缩页面优化传输速度,可以写为一行,也可以写多行,默认为gzip

SetOutputFilter DEFLATE

# mod_deflate configuration
<IfModule mod_deflate.c>

# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

# Level of compression (Highest 9 - Lowest 1)默认为6
DeflateCompressionLevel 9

# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

</IfModule>

18、资源限定
软限制:可以超出的限制,但仅能超出一定时长
硬限制:绝对不能超出的限制
ulimit:只能修改软限制
-n
:显示或限制能打开的最大的文件句柄数,
-u
:所能够打开的最大进程数
如果修改硬限制
/etc/security/limits.conf,扩展配置etc/security/limits.d/*.conf
对谁进行限定 类型 要限定的选项 值

apache hard nofile65535
apache hard nproc30000

19、ab工具的初步使用
-c 模拟的并发数
-n 模拟的总请求数
一般并发数应该小于等于请求数
http_load webbench seige(只做参考)
tcp_copy

20、httpd-2.4 编译安装
依赖于更高版本的apr和apr-util。apr全称为apache portable runtime

(1) 解决依赖关系
# yum -y install pcre-devel expat-devel
# yum -y groupinstall

(2) 编译安装apr-1.5.2
# tar xf apr-1.5.2.tar.bz2
# cd apr-1.5.2
# ./configure --prefix=/usr/local/apr
# make && make install

(3) 编译安装apr-util-1.5.4
# tar xf apr-util-1.5.4.tar.bz2
# cd apr-util-1.5.4
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
# make && make install

httpd-2.4新特性:
1) MPM支持在运行时装载;
--enable-mpms-shared=all --with-mpm=event
2) 支持event
3) 异步读写
4) 在每模块及每目录上指定日志级别
5) 每请求配置;<If>, <Elseif>
6) 增强版的表达式分析器
7) 毫秒级的keepalive timeout
8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令
9) 支持使用自定义变量

新增了一些模块:mod_proxy_fcgi, mod_ratelimit, mod_request, mod_remoteip

对于基于IP的访问控制做了修改,不再支持使用order, allow, deny这些机制;而是统一使用require进行

(4) httpd编译安装
# tar xf httpd-2.4.27.tar.bz2
# cd httpd-2.4.27
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=event
# make && make install

(5)测试
# cd /usr/local/apache/bin
# ./apachectl start

(6)服务启动脚本

[root@localhost ~]# cat /etc/init.d/httpd
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: The Apache HTTP Server is an efficient and extensible \
# server implementing the current HTTP standards.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd/httpd.pid
#
### BEGIN INIT INFO
# Provides: httpd
# Required-Start: $local_fs $remote_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Should-Start: distcache
# Short-Description: start and stop Apache HTTP Server
# Description: The Apache HTTP Server is an extensible server
# implementing the current HTTP standards.
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi

# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=/usr/local/apache/bin/httpd
prog=httpd
pidfile=/var/run/httpd.pid
lockfile=/var/lock/subsys/httpd
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}

# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shutdown
# when not running is also a failure. So we just do it the way init scripts
# are expected to behave here.
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}

# When stopping httpd, a delay (of default 10 second) is required
# before SIGKILLing the httpd parent; this gives enough time for the
# httpd parent to SIGKILL any errant children.
stop() {
status -p ${pidfile} $httpd > /dev/null
if [[ $? = 0 ]]; then
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
else
echo -n $"Stopping $prog: "
success
fi
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=6
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
# Force LSB behaviour from killproc
LSB=1 killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
if [ $RETVAL -eq 7 ]; then
failure $"httpd shutdown"
fi
fi
echo
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart|try-restart)
if status -p ${pidfile} $httpd >&/dev/null; then
stop
start
fi
;;
force-reload|reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
RETVAL=2
esac

exit $RETVAL
[root@localhost ~]#

[root@localhost ~]# cat /etc/httpd24/httpd.conf | grep ^PidFile
PidFile "/var/run/httpd.pid"
[root@localhost ~]# chkconfig --add httpd
[root@localhost ~]# chkconfig httpd on

后续的配置:
1) 导出头文件
# ln -sv /usr/local/apache/include /usr/include/httpd

2) 导出库文件

# ldconfig

# ldconfig -p

3) 导出man手册

4) 输出二进制程序
# vim /etc/profile.d/httpd.sh
export PATH=/usr/local/apache/bin:$PATH

练习:配置CGI、虚拟主机、https、mod_deflate、mod_status;

基于IP访问控制:
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny

控制某主机的访问:
Require ip IPADDR
Require not ip IPADDR
IPADDR:
单个IP地址, 例如172.16.100.7
Network/Netmask, 例如172.16.0.0/255.255.0.0
Network/Length, 例如172.16.0.0/16
Net: 172.16

Require ip 172.16.0.0/16

Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN:具体的主机
DOMAIN: 域名, 例如.kaiyuandiantang.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息