Web服务基础以及Http应用

 

 

 

 

一、Centos7系统下实现httpd-2.2的安装,并分别实现prefork、worker、event等几种工作方式

1.apache的工种模式

 1.1 prefork 模式

prefork:多进程模型,每个进程响应一个请求,一个主进程负责生成N个子进程及回收子进程,创建套接字,接收请求,并将其派发给某子进程进行处理,每个子进程处理一个请求即使没有用户请求也会预先生成几个空闲进程,随时等待用于响应用户请求,最大空闲进程数不能超过1024个。

 

优点:适合于没有线程安全库,需要避免线程兼容性问题的系统。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。

缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

 

相关配置:

httpd.conf的配置方式:

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   1000
</IfModule>

StartServers

# 服务器启动时建立的子进程数量,prefork默认是5,

MinSpareServers 

#空闲子进程的最小数量,默认5;如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。

MaxSpareServers 

#空闲子进程的最大数量,默认10;如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程会杀死多余的子进程。次参数也不需要设置太大,如果你将其设置比MinSpareServers 小,Apache会自动将其修改为MinSpareServers +1的数量。

MaxRequestWorkers

#限定服务器同一时间内客户端最大接入的请求数量,默认是256;任何超过了MaxRequestWorkers限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务,如果要增大这个数值,必须先增大ServerLimit。在Apache2.3.1版本之前这参数MaxRequestWorkers被称为MaxClients。

MaxConnectionsPerChild 

#每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。

建议设置为非零,原因:

(1).能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。 

(2).给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。

 

 

1.2 worker模式

worker:多进程多线程模型,每线程处理一个用户请求,一个主进程负责生成多个子进程,每个子进程生成多个线程,主进程负责创建套接字,接收请求,并将其派发给某子进程进行处理,每个线程负责响应用户请求。并发响应数量:m*n(m:子进程数量,n:每个子进程所能创建的最大线程数量).

优点:线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发,高流量的场景下会比prefork有更多可用的线程,表现会更优秀一些

缺点:如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。

相关配置:

httpd.conf的配置方式:

<IfModule mpm_worker_module>
    StartServers             3
ServerLimit 16
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   1000
</IfModule>

StartServers

#服务器启动时建立的子进程数量,在workers模式下默认是3.

ServerLimit

#系统配置的最大进程数量

MinSpareThreads

#空闲子进程的最小数量,默认75

MaxSpareThreads

#空闲子进程的最大数量,默认250

ThreadsPerChild  

#每个子进程产生的线程数量,默认是64

MaxRequestWorkers /MaxClients

#限定服务器同一时间内客户端最大接入的请求数量.

MaxConnectionsPerChild

#每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。

建议设置为非零,原因:

1).能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。 

2).给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。

 

Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild 值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时 也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。

 

 

1.3 event 模式

event:事件驱动模型,多进程模型,每个进程响应多个请求,一个主进程负责生成子进程,创建套接字,接收请求,并将其派发给某子进程进行处理,每个子进程基于事件驱动机制直接响应多个请求。
并发响应数量:m*n(m:子进程数量,n:每个子进程响应的请求数量)
在httpd-2.2中未对event给出配置模版,并且只是测试功能,不建议使用。

优点:不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题(HTTP的Keepalive方式能减少TCP连接数量和网络负载),在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理

2.安装httpd服务

1.安装依赖包zlib-devel

[root@localhost CA]#  yum install zlib-devel
已加载插件:fastestmirror, langpacks
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
base                                                                                                                                         | 3.6 kB  00:00:00     
extras                                                                                                                                       | 3.4 kB  00:00:00     
mysql-connectors-community                                                                                                                   | 2.5 kB  00:00:00     
mysql-tools-community                                                                                                                        | 2.5 kB  00:00:00     
mysql57-community                                                                                                                            | 2.5 kB  00:00:00     
updates                                                                                                                                      | 3.4 kB  00:00:00     
(1/4): updates/7/x86_64/primary_db                                                                                                           | 1.3 MB  00:00:09     
(2/4): mysql-connectors-community/x86_64/primary_db                                                                                          |  32 kB  00:00:15     
(3/4): mysql-tools-community/x86_64/primary_db                                                                                               |  51 kB  00:00:16     
(4/4): mysql57-community/x86_64/primary_db                                                                                                   | 170 kB  00:00:18     
Loading mirror speeds from cached hostfile
 * base: mirror.jdcloud.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com

2.安装开发环境包组

yum groupinstall "Development Tools" "ServerPlatform Development" -y
Loaded plugins: fastestmirror
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
base                                                                                                                 | 3.6 kB  00:00:00     
epel                                                                                                                 | 4.7 kB  00:00:00     
extras                                                                                                               | 3.4 kB  00:00:00     
updates                                                                                                              | 3.4 kB  00:00:00     
(1/3): updates/7/x86_64/primary_db                                                                                   | 1.3 MB  00:00:00     
(2/3): epel/x86_64/updateinfo                                                                                        | 950 kB  00:00:00     
(3/3): epel/x86_64/primary_db                                                                                        | 6.6 MB  00:00:00     
Determining fastest mirrors
Warning: group ServerPlatform Development does not exist.
Resolving Dependencies
--> Running transaction check
---> Package autoconf.noarch 0:2.69-11.el7 will be installed
--> Processing Dependency: perl(Data::Dumper) for package: autoconf-2.69-11.el7.noarch
---> Package automake.noarch 0:1.13.4-3.el7 will be installed
--> Processing Dependency: perl(Thread::Queue) for package: automake-1.13.4-3.el7.noarch
--> Processing Dependency: perl(TAP::Parser) for package: automake-1.13.4-3.el7.noarch
---> Package bison.x86_64 0:3.0.4-2.el7 will be installed
---> Package byacc.x86_64 0:1.9.20130304-3.el7 will be installed
---> Package cscope.x86_64 0:15.8-10.el7 will be installed
--> Processing Dependency: emacs-filesystem for package: cscope-15.8-10.el7.x86_64
---> Package ctags.x86_64 0:5.8-13.el7 will be installed
---> Package diffstat.x86_64 0:1.57-4.el7 will be installed
---> Package doxygen.x86_64 1:1.8.5-3.el7 will be installed
---> Package elfutils.x86_64 0:0.172-2.el7 will be installed




Total                                                                                                        44 MB/s |  89 MB  00:00:02     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : libgcc-4.8.5-36.el7.x86_64                                                                                              1/82 
  Updating   : libstdc++-4.8.5-36.el7.x86_64                                                                                           2/82 
  Updating   : elfutils-libelf-0.172-2.el7.x86_64                                                                                      3/82 
  Updating   : rpm-4.11.3-35.el7.x86_64                                                                                                4/82 
  Updating   : rpm-libs-4.11.3-35.el7.x86_64                                                                                           5/82 
  Updating   : rpm-build-libs-4.11.3-35.el7.x86_64                                                                                     6/82 
  Installing : libquadmath-4.8.5-36.el7.x86_64                                                                                         7/82 
  Updating   : libgomp-4.8.5-36.el7.x86_64                                                                                             8/82 
  Updating   : gettext-libs-0.19.8.1-2.el7.x86_64                                                                                      9/82 
  Installing : boost-system-1.53.0-27.el7.x86_64                                                                                      10/82 
  Installing : unzip-6.0-19.el7.x86_64                                                                                                11/82 
  Installing : 1:perl-Error-0.17020-2.el7.noarch                                                                                      12/82 
  Installing : perl-Thread-Queue-3.02-2.el7.noarch                                                                                    13/82 
  Installing : boost-thread-1.53.0-27.el7.x86_64                                                                                      14/82 
  Updating   : gettext-0.19.8.1-2.el7.x86_64                                                                                          15/82 
  Installing : libgfortran-4.8.5-36.el7.x86_64                                                                                        16/82 
  Installing : libdwarf-20130207-4.el7.x86_64                                                                                         17/82 
  Installing : boost-date-time-1.53.0-27.el7.x86_64                                                                                   18/82 
  Installing : dyninst-9.3.1-2.el7.x86_64                                                                                             19/82 
  Installing : systemtap-runtime-3.3-3.el7.x86_64                                                                                     20/82 
  Installing : libstdc++-devel-4.8.5-36.el7.x86_64                                                                                    21/82 
  Installing : gdb-7.6.1-114.el7.x86_64                                                                                               22/82 
  Installing : pakchois-0.4-10.el7.x86_64                                                                                             23/82 
  Installing : neon-0.30.0-3.el7.x86_64                                                                                               24/82 
  Installing : subversion-libs-1.7.14-14.el7.x86_64                                                                                   25/82 
  Installing : gettext-common-devel-0.19.8.1-2.el7.noarch                                                                             26/82 
  Installing : perl-TermReadKey-2.30-20.el7.x86_64                                                                                    27/82 
  Installing : rsync-3.1.2-4.el7.x86_64                                                                                               28/82 
  Installing : git-1.8.3.1-20.el7.x86_64                                                                                              29/82 
  Installing : perl-Git-1.8.3.1-20.el7.noarch                                                                                         30/82 
  Installing : gettext-devel-0.19.8.1-2.el7.x86_64                                                                                    31/82 
  Installing : perl-Data-Dumper-2.145-3.el7.x86_64                                                                                    32/82 
  Installing : autoconf-2.69-11.el7.noarch                                                                                            33/82 
  Installing : bzip2-1.0.6-13.el7.x86_64                                                                                              34/82 
  Updating   : cpp-4.8.5-36.el7.x86_64                                                                                                35/82 
  Updating   : gcc-4.8.5-36.el7.x86_64                                                                                                36/82 
  Installing : libquadmath-devel-4.8.5-36.el7.x86_64                                                                                  37/82 
  Installing : kernel-debug-devel-3.10.0-957.1.3.el7.x86_64                                                                           38/82 
  Installing : perl-Test-Harness-3.28-3.el7.noarch                                                                                    39/82

3.下载源码包及依赖包并解压

[root@localhost CA]# wget http://archive.apache.org/dist/httpd/httpd-2.2.32.tar.gz
--2019-01-25 09:51:14--  http://archive.apache.org/dist/httpd/httpd-2.2.32.tar.gz
正在解析主机 archive.apache.org (archive.apache.org)... 163.172.17.199
正在连接 archive.apache.org (archive.apache.org)|163.172.17.199|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:7684420 (7.3M) [application/x-gzip]
正在保存至: “httpd-2.2.32.tar.gz”

100%[==========================================================================================================================>] 7,684,420    496KB/s 用时 43s    

2019-01-25 09:52:03 (174 KB/s) - 已保存 “httpd-2.2.32.tar.gz” [7684420/7684420])

[root@localhost CA]# ls
cacert.pem  certs  crl  httpd-2.2.32.tar.gz  index.txt  index.txt.attr  index.txt.old  newcerts  private  serial  serial.old
您在 /var/spool/mail/root 中有新邮件
[root@localhost CA]# tar -xzxf httpd-2.2.32.tar.gz
[root@localhost CA]# cd httpd-2.2.32
[root@localhost httpd-2.2.32]# ls 

其中编译安装http的一些参数

一些参数的解析:
--prefix:安装路径

--sysconfdir:指定配置文件路径

--enable-so:DSO兼容,DSO=Dynamic Shared Object,动态共享对象,可实现模块动态生效

--enable-deflate:支持压缩功能;需要zlib-devel包支持

--enable-headers:提供允许对HTTP请求头的控制

--enable-rewrite:提供基于URL规则的重写功能

--with-mpm:设置默认启用的MPM模式,{prefork|worker|event}

--with-apr:apr安装路径

--with-apr-util:apr-util安装的路径

--with-included-apr:由于我的CENTOS 是 64bit的,在编译配置中并没有指定 --with-included-apr的具体引用路径,导致找不到相应的库文件,而 --with-included-apr 默认是查找/usr/lib下的库文件,而,正确的引用应该是/usr/lib64下的

按照以上方式即可实现prefork和event两种方式(默认为prefork方式)

./configure --prefix=/usr/local/apache2/ --sysconfdir=/etc/httpd --with-mpm=prefork
./configure --prefix=/usr/local/apache2/ --sysconfdir=/etc/httpd --with-mpm=event

prefork: 预先创建进程,两级进程模型,父进程负责创建子进程,每个子进程响应一个用户请求
worker:父进程管理子进程,子进程通过线程响应用户请求,每线程处理一个用户请求
event:两级模型,父进程管理子进程,子进程通过event-driver机制直接响应n个请求

 

设定环境变量与systemd

      我们编译安装的http并不受systemd的管理,所以我们需要自己创建unit文件

[root@localhost httpd]# cat /lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启动服务与验证

[root@localhost httpd]# systemctl start httpd
[root@localhost httpd]#  systemctl daemon-reload
[root@localhost httpd]# systemctl start httpd.service
[root@localhost httpd]# ss -tan
State      Recv-Q Send-Q                                     Local Address:Port                                                    Peer Address:Port              
LISTEN     0      128                                                    *:111                                                                *:*                  
LISTEN     0      5                                          192.168.122.1:53                                                                 *:*                  
LISTEN     0      128                                                    *:22                                                                 *:*                  
LISTEN     0      128                                            127.0.0.1:631                                                                *:*                  
LISTEN     0      100                                            127.0.0.1:25                                                                 *:*                  
ESTAB      0      0                                          10.35.128.248:22                                                     10.35.128.234:3656               
LISTEN     0      80                                                    :::3306                                                              :::*                  
LISTEN     0      128                                                   :::111                                                               :::*                  
LISTEN     0      128                                                   :::80                                                                :::*                  
LISTEN     0      128                                                   :::22                                                                :::*                  
LISTEN     0      128                                                  ::1:631                                                               :::*                  
LISTEN     0      100                                                  ::1:25                                                                :::*                  
[root@localhost httpd]# httpd -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
[root@localhost httpd]#  ps aux |grep httpd
root     12251  0.0  0.1 221920  4972 ?        Ss   10:06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   12263  0.0  0.0 224004  3088 ?        S    10:06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   12264  0.0  0.0 224004  3088 ?        S    10:06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   12265  0.0  0.0 224004  3088 ?        S    10:06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   12266  0.0  0.0 224004  3088 ?        S    10:06   0:00 /usr/sbin/httpd -DFOREGROUND
apache   12267  0.0  0.0 224004  3088 ?        S    10:06   0:00 /usr/sbin/httpd -DFOREGROUND
root     12433  0.0  0.0 112668   960 pts/0    S+   10:08   0:00 grep --color=auto httpd

 

如果我们在安装的时候想转变模式可以在./configuer后面加上--with-mpm=prefork|worker|events如果是安装后想改变模式我们只需要修改配置文件

vim /etc/httpd/conf.modules.d/00-mpm.conf
 
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
 
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
 
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
#LoadModule mpm_event_module modules/mod_mpm_event.so

 

二、简述request报文请求方法和状态响应码

1.method

GET:从服务器获取一个资源;
HEAD:只从服务器获取文档的响应首部;
POST:向服务器发送要处理的数据;
PUT:将请求的主体部分存储在服务器上;
DELETE:请求删除服务器上指定的文档;
TRACE:追踪请求到达服务器中间经过的代理服务器;
OPTIONS:请求服务器返回对指定资源支持使用的请求方法;
 

2.status(状态码)

200: 成功,请求的所有数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置; Found
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway
 

3.version:HTTPD的版本号

HTTP/<major>.<minor>,由主版本和次版本号组成

 

4.headers:首部

http的每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值),首部的分类:通用首部,请求首部,响应首部,实体首部,扩展首部等等,
格式为:Name: Value,常见的首部格式如下:

4.1.通用首部:
 

Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点
Cache-Control:控制缓存
Pragma: no-cache.相当于Cache-Control: no-cache

4.2.请求首部:

Accept:通过服务器自己可接受的媒体类型;
Accept-Charset:浏览器指明自己接收的字符集
Accept-Encoding:接受编码格式,如gzip
Accept-Language:接受的语言
Client-IP: 客户端ip地址
Host: 请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源;
User-Agent:客户端代理

   4.2.1条件式请求首部:
 

Expect:服务器指明该实体什么时候过期.
 If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改
 If-Unmodified-Since:自从指定的时间之后,请求的资源是否没有修改
 If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的
 If-Match:Etag没改变,才执行请求

4.2.2安全请求首部:

Authorization:向服务器发送认证信息,如账号和密码
Cookie: 客户端向服务器发送cookie

4.2.3代理请求首部:
Proxy-Authorization: 向代理服务器认证

 

4.3.响应首部:

4.3.1.信息性首部:
Age:响应持续时长,即资源的有效期;
Server:服务器程序软件名称和版本;

4.3.2.协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型;
Vary:服务器查看的其它首部列表;值会发生变化时就放在此首部;

 

4.3.3.安全响应首部:

Set-Cookie:向客户端设置cookie;用来标识客户端身份;
Set-Cookie2: 向客户端设置cookie版本2的信息;
WWW-Authenticate:来自服务器的对客户端的质询认证表单;当客户端请求资源时,资源要求认证;

 

4.4.实体首部:提供实体内容的大量信息

4.4.1.跟内容格式相关:
Allow: 列出对此实体可使用的请求方法;
Location:告诉客户端真正的实体位于何处,在重定向时使用,响应码为301或302;
Content-Encoding: 内容的编码格式;
Content-Language: 内容使用的语言;
Content-Length: 主体的长度;
Content-Location: 实体真正所处位置;
Content-Type:主体的对象类型;如多媒体的类型等;
Content-Range:在整个资源中此实体表示的字节范围;

4.4.2跟缓存相关:
ETag:资源实体的扩展标签;基于标签做请求时使用;
Expires:实体内容的过期时间;
Last-Modified:最后一次修改的时间;此时间只是推算出来的,可能不准确;

 

三、详细描述httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例

httpd的虚拟主机就是在一台主机上基于IP,端口,FQDN来虚拟出不同的主机,就像一台主机上运行了多个网站一样。

1.基于IP地址

创建虚拟主机地址
ifconfig enp6s0:1 10.35.128.231 netmask 255.255.255.0
ifconfig enp6s0:2 10.35.128.232 netmask 255.255.255.0
#创建2个虚拟主机的目录
[root@localhost ~]# mkdir /www/html/{ilinux,iunix}
#编辑虚拟httpd站点主页面
[root@localhost ~]# vim /www/html/ilinux/index.html
<h1>ilinux</h1>
[root@localhost ~]# vim /www/html/iunix/index.html
<h1>iunix</h1>
#编辑httpd虚拟主机配置文件
[root@localhost ~]# vim /etc/httpd/conf.d/virtualhost.conf
Servername www.virtual1.io
        DocumentRoot "/www/html/virtual1"
     <Directory "/www/html/virtual1">
        Options None
        AllowOverride None
        Require all granted
     </Directory>
        Customlog "logs/ilinux_access_log" combined
</VirtualHost>

<VirtualHost 10.35.128.232:80>
Servername www.virtual2.io
        DocumentRoot "/www/html/virtual2"
     <Directory "/www/html/virtual2">
        Options None
        AllowOverride None
        Require all granted
     </Directory>
        Customlog "logs/ilinux_access_log" combined
</VirtualHost>
#检查配置文件语法
    httpd -t
Syntax OK
#重启HTTPD服务
systemctl restart httpd.service
[root@localhost conf.d]# curl http://10.35.128.231
this is virtual1
[root@localhost conf.d]# curl http://10.35.128.232
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
                <title>Apache HTTP Server Test Page powered by CentOS</title>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">


 

2.基于端口号

#添加监听端口
 vi  /etc/httpd/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 80
Listen 8081

#修改配置
[root@localhost conf.d]# vim /etc/httpd/conf.d/virturalhost.conf
<VirtualHost 10.35.128.248:80>
Servername www.virtual1.io
        DocumentRoot "/www/html/virtual1"
     <Directory "/www/html/virtual1">
        Options None
        AllowOverride None
        Require all granted
     </Directory>
        Customlog "logs/ilinux_access_log" combined
</VirtualHost>

<VirtualHost 10.35.128.248:8180>
Servername www.virtual2.io
        DocumentRoot "/www/html/virtual2"
     <Directory "/www/html/virtual2">
        Options None
        AllowOverride None
        Require all granted
     </Directory>
        Customlog "logs/ilinux_access_log" combined
</VirtualHost> 

3.基于主机域名

10.35.128.231 www.virtual1.io

10.35.128.2321 www.virtual2.io

4.站点路径访问控制

可基于来源地址或者基于账号两种访问控制机制;定义的方式有两种:
文件系统路径:<Directory ""> ... </Directory>
URL路径:<Location ""> ... </Location>

<Directory>中“基于源地址”实现访问控制:

3.4.1Options后跟1个或多个以空白字符分隔的“选项”列表;

Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;作为下载站点时才使用;否则,不使用此选项;

FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
None:都禁止;
All:都允许;
Includes:允许启用服务器包含;
SymLinksifOwnerMatch:比FollowSymLinks在限制上更为严格的机制;表示只有原文件的属主和链接文件的属主相同时,才允许跟踪;
ExecCGI:允许执行cgi脚本;
MultiViews:允许执行内容协商;非常消耗资源且不太安全;

3.4.2 AllowOverride:

与访问控制相关的哪些指令可以放在.htaccess文件(每个目录即网站目录下都可以有一个,指令放在此文件中表示当前目录下的配置文件都无效,所在目录下的这个隐藏文件生效)中;
All: 所有指令都可放在这个隐藏文件中;
None:这个隐藏文件中什么指令都不放;或给个指定列表,文件信息、根认证相关的信息,限制可放进这个隐藏文件中;会使网站资源解析时性能影响非常大;


3.4.3http-2.2中基于IP地址的访问控制是利用Allow和Deny来实现的;

order:定义生效次序;写在后面的表示默认法则;如:

 <Directory  "/PATH/TO/FILE">
          Options Indexes FollowSymLinks
          AllowOverride None
          Order allow, deny
          Allow  from  IP | NetAddr
          Deny  from  IP | NetAddr
      </Directory>

httpd-2.4中基于Ip地址访问的控制是利用Require实现,如:

 <Directory  "/PATH/TO/FILE">
         AllowOverride none
         Options none
         <RequireAll>
            Require ip IP | NetAddr #允许访问的IP或网段
            Require not ip IP | NetAddr #拒绝访问的Ip或网段
         </RequireAll>
      </Directory>

#修改虚拟主机配置文件

Listen 8180
<VirtualHost 10.35.128.248:8180>
Servername www.virtual2.io
        DocumentRoot "/www/html/virtual2"
     <Directory "/www/html/virtual2">
        Options None
        AllowOverride None

 Require all granted
     </Directory>
        Customlog "logs/ilinux_access_log" combined
</VirtualHost>

 

 

5.基于用户的访问控制:

 

对于网站中的一些资源,需要只对特定的用户开放,可以通过用户的访问控制来实现.有质询和认证两种方式.
质询:服务器用401响应码拒绝客户端请求,并说明要求客户端提供账号和密码
认证:客户端用户填入账号和密码后再次发送请求报文,认证通过时,则服务器发送响应的资源.有basic基本认证和digest摘要认证两种.这里以basic认证做实验.
basic认证的配置格式如下:

<Directory "/somepath/to/file">  # 需要访问控制的文件路径
    Options None
    AllowOverride None
    AuthType Basic   # 认证方式
    AuthName "String“   #认证提示信息
    AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"   #认证用户的文件路径
    Require  user  username1  username2 ...   #允许访问的用户
</Directory>
#  Require  valid-user  表示允许所有AuthUserFile 文件中所以的账号
#  AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"  基于用户组做访问控制
#  Require  group  grpname1  grpname2 ... 同上



###
登陆使用的账号为虚拟账号而非系统的账号,而且httpd是明文传输的,所以使用htpasswd命令来创建账号文件格式如下:
htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 
        -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
        -m:md5格式加密
        -s: sha格式加密
        -D:删除指定用户

配置文件

#创建密码账户和允许访问的用户
htpasswd -c /tmp/text.users tom
#把存放密码的文件移动到httpd目录下,且保存为隐藏文件
[root@localhost ~]# mv /tmp/text.users /etc/httpd/conf.d/.htpasswd



Listen 8180
<VirtualHost 10.35.128.248:8180>
Servername www.virtual2.io
        DocumentRoot "/www/html/virtual2"
     <Directory "/www/html/virtual2">
        Options None
        AllowOverride None
    Options None
        AllowOverride None
        AuthType Basic
        AuthName "please enter the user"
        AuthUserFile "/etc/httpd/conf.d/.htpasswd"
        Require user tom 
     </Directory>
        Customlog "logs/ilinux_access_log" combined
</VirtualHost>


 

持久连接相关:

Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行;但是总归要断开,如何断开?可以通过对连接数量和时间限制来控制;比如:限制100个连接,超过100个后会断开最先的连接;限制连接60秒后没有进行任何操作则断开;

  • 缺点:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
  • 折衷的改进办法:使用较短的持久连接时长,以及较少的请求数量;
  • 持久连接的相关参数

 

KeepAlive Off|On                           #关闭或打开持久连接
MaxKeepAliveRequserts 100         #最大持久连接请求数量
KeepAliveTimeout 15                    #连接时长,单位秒;httpd-2.4支持毫秒

 

示例

telnet WEB_SERVER_IP PORT
GET  /URL  HTTP/1.1
Host:WEB_SERVER_IP
实例:
[root@wujunjie6 ~]# vim /etc/httpd/conf.d/keepalive.conf
keepalive  On
KeepAliveTimeout  15
MaxKeepAliveRequests  100
[root@wujunjie6 ~]# netstat -tnl|grep 23     #监听23端口
tcp        0      0 :::23                       :::*                        LISTEN    
[root@wujunjie6 ~]# telnet 10.35.128.248 80
Trying 10.35.128.248...
Connected to 10.35.128.248.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host:192.168.32.129

HTTP/1.1 200 OK
Date: Thu, 18 Oct 2018 08:32:38 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 18 Oct 2018 07:21:11 GMT
ETag: "2009e1-8-5787ba1a3e6d8"
Accept-Ranges: bytes
Content-Length: 8
Content-Type: text/html; charset=UTF-8

2112312

Connection closed by foreign host.   #这里不会立刻断开,会等到最大连接数或连接时长到达才会断开
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值