web服务器apache理论、实践详解 ,TCP/IP

一、tcp/ip协议

TCP标志位,有6种标示:SYN(synchronous建立联机) ,ACK(acknowledgement 确认) ,PSH(push传送),FIN(finish结束) ,RST(reset重置), URG(urgent紧急)

Sequence number(顺序号码) ,Acknowledge number(确认号码),在上面我们已经详细说明!下图是工作原理图:

三次握手:

第一次握手:建立连接时,主机A发送SYN包(syn=m)到服务器,并进入SYN_SEND状态,等待主机B确认

第二次握手:主机B收到SYN包,必须确认主机A的SYN(ACK=m+1),同时自己也发送一个SYN包(SYN=n),即SYN+ACK包,此时主机B进入SYN_RECV状态

第三次握手:主机A收到主机B的SYN+ACK包,向主机B发送确认包ACK(ACK=n+1),此包发送完毕,主机A和主机B进入ESTABLISHED状态,完成三次握手

四次断开:

当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求

主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1

由主机B端再提出反方向的关闭请求,将FIN置1

主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束

二、http请求模型和工作模式

上 图是http的请求模式,http的工作模式有三种:prefork、worker、event,下面介绍prefork和worker的工作模 式,prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块,并 且对于那些线程调试困难的平台而言,它也更容易调试一些。perfork模式原理图


worker 模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器 上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起”死掉”.由于线程共享内存空间,所以一个程序在运行时必须被系统识别为”每 个线程都是安全的”。下面是worker的工作原理图:

总的来说,prefork方式速度要稍高于worker,然而它需要的cpu和memory资源也稍多于woker。

查看现使用的工作模式:

apachectl -l

三、http报文首部组成

http报文首部包括:包括请求首部和响应首部

一般都包括:起始行,首部:可以有多个,主体

request首部:

起始行:请求方法 请求资源的路径 使用http的版本

首部:可以有多个

请求的主体部分:

response首部:

起始行协议版本号 状态码 原因短语

首部:可以有多个

请求的主体部分:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@stu2~]# telnet 172.16.0.1 80
Trying172.16.0.1...
Connectedto 172.16.0.1.
Escapecharacter is '^]'.
#下面是请求首部
GET/centos6.repo http/1.1
Host:172.16.0.1
#下面是响应首部部分
HTTP/1.1200 OK           
Date:Sat, 24 Aug 2013 03:06:48 GMT
Server:Apache/2.2.15 (CentOS)
Last-Modified:Sat, 17 Aug 2013 10:06:13 GMT
ETag:"20de6-12d-4e421db6ce2c1"
Accept-Ranges:bytes
Content-Length:301
Connection:close
Content-Type:text/plain; charset=UTF-8
#下面是响应主体部分
[base]
name=CentOS$releasever $basearch on local server 172.10.0.1
baseurl=http://172.16.0.1/cobbler/ks_mirror/centos-6.4-$basearch/
gpgcheck=0
[epel]
name=FedoraEPEL for CentOS$releasever $basearch on local server 172.16.0.1
baseurl=http://172.16.0.1/fedora-epel/$releasever/$basearch/
gpgcheck=0
Connectionclosed by foreign host.


web服务器软件httpd

1
2
3
4
5
6
7
8
[root@stu2~]# rpm -ql httpd #查看安装httpd软件包生成的列表
#下面是几个比较重要的
/etc/httpd#运行目录
/etc/httpd/conf/httpd.conf#主配置文件
/etc/httpd/conf.d/*.conf#扩展配置文件
/etc/rc.d/init.d/httpd#服务脚本
/var/www/cgi-bin# CGI脚本路径
/var/www/html#网页文件目录

启动httpd服务提供主页面进行验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@stu2~]# service httpd restart
Stoppinghttpd:                                           [  OK  ]
Startinghttpd:                                            [ OK  ]
提供默认主页面:index.html
#cd/var/www/html
#vimindex.html
        

Helloworld

Studyhard


四、详解httpd的工作属性

在主配置文件/etc/httpd/conf/httpd.conf中配置文件的构成:

1
2
3
4
[root@stu2conf]# grep "Section" httpd.conf
###Section 1: Global Environment #全局配置:对主服务器或虚拟机都有效,且有些功能是服务器自身工作属性;
###Section 2: 'Main' server configuration #对主服务器的配置
###Section 3: Virtual Hosts #对虚拟主机及属性定义

需要注意的是:指令不区分字符大小写,但约定俗成的习惯:单词的首字母使用大写;指令的值很有可能区分大小写;有些指令可以重使用多次; 而且要特别注意的是主服务器和虚拟主机不能同时启用

配置文件语法测试

#service httpd configtest或者# httpd –t

大多数配置修改后,使用service httpd reload即能生效;而修改监听的地址和端口通常需要重启服务

1.配置监听的地址和端口

Listen[IP:]PORT

可以是http监听在不同的端口修改配置文件

Listen 80 #默认监听的端口

Listen172.16.2.1:8080 #新添加的监听的地址和端口

2、配置所选用的MPM的属性

1
2
3
4
5
6
7
8
9
10
11
12
[root@stu2conf]# httpd –l #查看核心模块
Compiledin modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c
[root@stu2conf]# httpd  -t -D DUMP_MODULES #查看扩展模块,只列了一小部分
LoadedModules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)

要想配置使用编译进不同MPM的httpd,编辑/etc/sysconfig/httpd配置文件,定义如下行:

1
2
3
4
5
6
7
8
9
10
11
[root@stu2conf]# vim /etc/sysconfig/httpd
#HTTPD=/usr/sbin/httpd.worker#将其改为启动项
[root@stu2conf]# service httpd restart
Stoppinghttpd:                                           [  OK  ]
Startinghttpd:                                           [  OK  ]
[root@stu2conf]# ps aux | grep httpd
root      3361 0.0  0.3 184360  4036 ?       Ss   13:41   0:00 /usr/sbin/httpd.worker
apache    3364 0.0  0.5 528620  5332 ?       Sl   13:41   0:00 /usr/sbin/httpd.worker
apache    3368 0.0  0.5 528620  5340 ?        Sl  13:41   0:00/usr/sbin/httpd.worker
apache    3369 0.0  0.5 528620  5332 ?       Sl   13:41   0:00 /usr/sbin/httpd.worker
root      3478 0.0  0.0 103244   832 pts/0   S+   13:41   0:00 grep httpd

3、配置服务器支持keep-alived

在配置文件/etc/httpd/conf/httpd.conf中将

KeepAliveOff改为KeepAlive On

KeepAliveTimeout15#定义保持连接的超时时间

MaxKeepAliveRequests100 #保持连接时的最大请求资源数量

4、配置站点根目录

1
2
3
4
5
6
7
#mkdir–pv /website/htdocs
#cd/website/htdocs
#touchtest.txt
编辑test.txt在里面写上test page然后修改配置文件
DocumentRoot"/website/htdocs"
#httpd–t
#servicehttpd restart

5、配置页面文件访问属性

1
2
3
4
5
6
7
8
9
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
                      Indexes: 是否允许索引页面文件,建议关闭;
                      FollowSynLinks: 是否跟随软链接文件;
                      ExecCGI:是否允许执行CGI脚本

6、访问控制

基于客户端访 Order

定义allow和deny哪个为默认法则;写在后面的为默认法则:写在前面的指令没有显式定义的即受后面的指令控制

Order allow,deny

Deny from 172.16.100.177

 Allowfrom 172.16.0.0/16表示允许172.16.0.0/16这个网段客户访问,但不允许172.16.100.177这个主机访问

7、定义默认主页面:

          DirectoryIndex     index.php index.jsp index.html

8、路径别名

当前的根文件路径  DocumentRoot"/web/htdocs"

假 如我们访问的路径为http://www.magedu.com/images/logo.gif 就相当于访问的路径为/web/htdocs/images/logo.gif,现在我们可以为images设置一个路径别名,这个别名可以完全不在 /web/htdocs目录下,假如为/www/static则我们访问的资源相当于/www/static/logo.gif

#mkdir–pv /website/htdocs/images

#cd/website/htdocs/images/

#vimindex.html添加上/website/htdocs/images/index.html

然后修改配置文件在定义路径别名的区段添加上一行

Alias/images/ "/www/static/"

重新加载后进行访问:

9.脚本别名

在主配置文件中找到定义脚本别名的区域添加一行

ScriptAlias/cgi-bin/ "/website/cgi-bin/"

1
2
3
4
5
6
7
8
9
10
11
12
#mkdir–pv /website/cgi-bin/
#vim/website/cgi-bin/test.sh
#!/bin/bash
cat<< EOF
Content-Type:text/html
							
Thehostname is:`/bin/hostname`
Thetime is:`date`
EOF
#chmod+x /website/cgi-bin/test.sh
#bash–n /website/cgi-bin/test.sh

重新加载后进行访问

10、基于用户访问控制

首先建立用户帐号文件

htpasswd -c-m /path/to/password_file USERNAME

第一次添加用户需要使用-c选项,以后在创建用户密码不需要在加-c选项,否则会覆盖之前创建的用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#touch/etc/httpd/conf/.htpass
[root@stu2~]# cat /etc/httpd/conf/.htpass
hailian:$apr1$3zZsobQO$VjmRke86PTKV1158/uStl/
centos:$apr1$Zye7Kzwy$hZNFUgPBBPNI4lm08bzsZ.
gentoo:$apr1$lFHVwghN$fyL5YpBJbFtdhzprJ/gn61
DocumentRoot"/website/htdocs/"
        Options Indexes
        AuthType Basic
        AllowOverride AuthConfig
        AuthName "Only for employee"
        AuthUserFile /etc/httpd/conf/.htpass
        Require valid-user

11、虚拟主机

注意的是虚拟主机和主服务器不能同时使用:关闭主服务器,注释主服务器的DocumentRoot即可;

启用NameVirtualHost 172.16.2.1:80

监听的端口添加一行Listen 8080

基于端口号的虚拟主机

基于ip的虚拟主机

基于主机名的虚拟主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
配置:
        ServerName www.a.com
        DocumentRoot "/web/host1"
        CustomLog"/var/log/httpd/host1_access_log" combined
        ServerName www.b.org
        DocumentRoot "/web/host2"
        CustomLog"/var/log/httpd/host2_access_log" combined
        
        Options None
        AllowOverride AuthConfig
        AuthName "Host2 is private."
        AuthType Basic
        AuthUserFile /etc/httpd/conf/.htpass
        Require valid-user
        
        ServerName www.c.net
        DocumentRoot "/web/host3"
        CustomLog "/var/log/httpd/host3_access_log"combined
        ServerName www.d.gov
        DocumentRoot "/web/host4"
        CustomLog"/var/log/httpd/host4_access_log" common

12、httpd status

确保这个模块LoadModule status_module modules/mod_status.so是装载的,以为status这个功能是依赖于此模块的

#定义了访问status的URL路径,可以修改

SetHandlerserver-status#表示启动处理器,其名称是不能修改

当然也可以将ExtendedStatus On开启,可以看到更为详细的服务器状态,没有需要时建议关闭

服务器的这些状态信息一般是不允许任何人随意查看的,因此可以定义其访问控制机制,默认是基于Ip的,也可以基于用户的,操作如下

1
2
3
4
5
6
7
8
9
10
    SetHandler server-status
#       AllowOverride AuthConfig #若不启动基于ip的这项不需要
        AuthName "Status"
        AuthType Basic
        AuthUserFile/etc/httpd/conf/.statuspass
        Require valid-user
#    Order deny,allow
#    Deny from all
#    Allow from .example.com

然后创建用户

1
2
3
4
5
[root@stu2conf]# touch .statuspass
[root@stu2conf]# htpasswd -c -m .statuspass status
Newpassword:
Re-type newpassword:
Addingpassword for user status

13.https的创建

要想基于ssl回话,则需要装载一个ssl模块叫mod_ssl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@stu2conf]# yum install mod_ssl
[root@stu2conf]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf#ssl.conf中定义了装载的模块,监听的端口,定义的默认虚拟主机等相关信息,是被我们的主配置文件所装载的
/usr/lib64/httpd/modules/mod_ssl.so#装载的mod_ssl.so模块
#下面是为ssl回话提供缓存机制的
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem
[root@stu2conf]# ls -l /etc/httpd/
total 8
drwxr-xr-x.2 root root 4096 Aug 24 04:07 conf
drwxr-xr-x.2 root root 4096 Aug 24 04:08 conf.d
lrwxrwxrwx.1 root root   19 Aug 10 08:38 logs ->../../var/log/httpd
lrwxrwxrwx.1 root root   29 Aug 10 08:38 modules-> ../../usr/lib64/httpd/modules
lrwxrwxrwx.1 root root   19 Aug 10 08:38 run ->../../var/run/httpd

自建CA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[root@stu2CA]# cd private/
[root@stu2private]# (umask 077;openssl genrsa -out cakey.pem 2048)
GeneratingRSA private key, 2048 bit long modulus
...................+++
......+++
e is 65537(0x10001)
[root@stu2private]# cd ..
[root@stu2CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3656
You areabout to be asked to enter information that will be incorporated
into yourcertificate request.
What youare about to enter is what is called a Distinguished Name or a DN.
There arequite a few fields but you can leave some blank
For somefields there will be a default value,
If youenter '.', the field will be left blank.
-----
CountryName (2 letter code) [XX]:CN
State orProvince Name (full name) []:henan
LocalityName (eg, city) [Default City]:zhengzhou
OrganizationName (eg, company) [Default Company Ltd]:apachessl
OrganizationalUnit Name (eg, section) []:tech
Common Name(eg, your name or your server's hostname) []:www.magedu.com
EmailAddress []:
[root@stu2CA]# ls
cacert.pem  certs crl  newcerts  private
[root@stu2CA]# touch serial index.txt
[root@stu2CA]# echo 01 > serial
[root@stu2CA]# ls
cacert.pem  certs crl  index.txt  newcerts private  serial
 [root@stu2 ssl]# (umask 077;openssl genrsa-out httpd.key 2048)
GeneratingRSA private key, 2048 bit long modulus
..........+++
.......................+++
eis 65537 (0x10001)
[root@stu2ssl]# openssl req -new -key httpd.key -out httpd.csr -days 3656
Youare about to be asked to enter information that will be incorporated
intoyour certificate request.
Whatyou are about to enter is what is called a Distinguished Name or a DN.
Thereare quite a few fields but you can leave some blank
Forsome fields there will be a default value,
Ifyou enter '.', the field will be left blank.
-----
CountryName (2 letter code) [XX]:CN
Stateor Province Name (full name) []:henan
LocalityName (eg, city) [Default City]:zhengzhou
OrganizationName (eg, company) [Default Company Ltd]:apachessl
OrganizationalUnit Name (eg, section) []:tech
CommonName (eg, your name or your server's hostname) []:www.hailian.com
EmailAddress []:
Pleaseenter the following 'extra' attributes
tobe sent with your certificate request
Achallenge password []:
Anoptional company name []:
[root@stu2ssl]# ls
httpd.csr  httpd.key
[root@stu2ssl]# openssl ca -in httpd.csr -out httpd.crt -days 3656
Usingconfiguration from /etc/pki/tls/openssl.cnf
Checkthat the request matches the signature
Signatureok
CertificateDetails:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Aug 23 20:54:06 2013GMT
            Not After : Aug 27 20:54:06 2023 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = henan
            organizationName          = apachessl
            organizationalUnitName    = tech
            commonName                = www.hailian.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
               42:E4:0D:53:42:1C:E4:B3:9E:DE:87:4D:D7:46:D8:C3:EB:6B:32:4E
            X509v3 Authority Key Identifier:
               keyid:C7:08:F5:87:6E:E3:7E:AA:21:6F:0A:C2:42:07:3B:18:7A:B7:5F:55
Certificateis to be certified until Aug 27 20:54:06 2023 GMT (3656 days)
Signthe certificate? [y/n]:y
1out of 1 certificate requests certified, commit? [y/n]y
Writeout database with 1 new entries
DataBase Updated

修改ssl.conf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DocumentRoot"/web/host1"
ServerNamewww.hailian.com
SSLCertificateFile/etc/httpd/conf/ssl/httpd.crt
SSLCertificateKeyFile/etc/httpd/conf/ssl/httpd.key
修改httpd.conf文件
        ServerName www.hailian.com
        DocumentRoot "/web/host1"
        CustomLog"/var/log/httpd/host1_access_log" combined
[root@stu2conf]# openssl s_client -connect www.hailian.com:443 -CAfile/etc/pki/CA/cacet.pem #测试命令
#下面是结果的一部分
SSL-Session:
    Protocol : TLSv1
    Cipher   : DHE-RSA-AES256-SHA
    Session-ID:F268D4B1566E7CE699A92A5C41896CADFB080D74FEB692F9C02F7D251CC8280F
    Session-ID-ctx:
    Master-Key:18C80412E148C25FC046F7592EE137A71156059E97F1238442ADCBC39D413B8A47EBCF4DBEBBD6075FF471149E1291

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值