http服务器程序:

      httpd(apache)

      nginx

      lighttpd

     

      应用程序服务器:

           IIS: .net

           tomcat:.jsp

      可访问网址:

      httpd的安装和使用:

           ASF:apache software foundation

                 httpd:apache

                       a patchy server =apache

httpd的特性:

      高度模块化:core + modules

      DSO:dynamic shared object

      MPM:Multipath processing Modules(多路处理模块)

           prefork:多进程模型,每个进程响应一个请求;

一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;

                 N个子进程:每个子进程处理一个请求;

                 工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;

           Worker:多进程多线程模型,每线程处理一个用户请求;

一个主进程:负责生成子进程;负责创建套接字;负责接受请求,并将其派发给某子进程进行处理;

                 多个子进程:每个子进程负责生成多个线程;

                 每个线程:负责响应用户请求;

                 并发响应数量:m*n

                      m:子进程数量

                      n:每个子进程所能创建的最大线程数量;

           event:时间驱动模型,多进程模型,每个进程响应多个请求;

一个主进程:负责生成子进程;负责创建套接字;负责接受请求,并将其派发给某子进程进行处理;

                 子进程:基于时间驱动机制直接响应多个请求;

httpd的程序版本;http://httpd.apache.org/

      httpd 1.3:官方已经停止维护;

      httpd 2.0

      httpd 2.2:一本centos6上httpd预装版本;

      httpd 2.4:目前最新稳定版;

httpd的功能特性:

      CGI:common gateway interface

      虚拟主机:IP,PORT,FQDN

      反向代理

      负载均衡

      路径别名

      丰富的用户认证机制

           basic

           digest

      支持第三方模块

      ……

安装httpd:

      Rpm包:centos发行版中直接提供;

      编译安装:定制新功能,或其他原因;

Centos6:httpd2.2

程序环境:

      配置文件:

           /etc/httpd/conf/httpd.conf

           

           /etc/httpd/conf.d/*.conf

          

      服务脚本:

           /etc/rc.d/init.d/httpd

      主程序文件:

           /usr/sbin/httpd

           /usr/sbin/httpd.event

           /usr/sbin/httpd.worker

      日志文件:

           /var/log/httpd:

                 access_log:访问日志

                 error_log:错误日志

      站点文档:

           /var/www/html

      模块文件路径:

           /usr/lib64/httpd/modules

      服务控制和启动:

           chkconfig httpd  on|off

           service  {start|stop|restart|status|configtest|reload}httpd

centos7:httpd2.4

      程序环境:

           配置文件:

                 /etc/httpd/conf/httpd.conf

                 /etc/httpd/conf.d/*.conf

                 模块相关的配置文件:/etc/httpd/conf.modules.d/*.conf

           systemd unit file

                 /usr/lib/systemd/system/httpd.service

           主程序文件:

                 /usr/sbin/httpd

                       httpd-2.4支持MPM的动态切换;

           日志文件:

                 /var/log/httpd:

                      access_log:访问日志

                       error_log:错误日志

           站点文档:

                 /var/www/html

           模块文件路径:

                 /usr/lib64/httpd/modules   

           服务控制:

                 systemctl  enable|disable  httpd.service

                 systemctl  {start|stop|restart|status}  httpd.service

httpd-2.2的常用配置

      主配置文件:/etc/httpd/conf/httpd.conf

           ### Section 1:Global Encronment(全局环境变量)

           ### Section 2:“Main”server configuration 

           ### Section 3:Virtual Hosts;

      配置格式:

           directive value

                 directive:不区分字符大小写;

                 value:为路径时,是否区分大小写,取决于文件系统;

  常用配置:

1.     修改监听的IP和PORT;

Listen[IP:]PORT

1)    省略IP表示为0.0.0.0;

2)    Listen指令可重复出现多次;

Listen 80

Listen 8080

3)    修改监听socket,重启服务进程方可生效;

2.     持久连续

PersistentConnection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它的资源请求的进行;

  如何断开?

        数量限制;

        时间限制

 

        副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常的响应;

        折中:使用较短的持久连接时长,以及较少的请求数量;

  KeepAlive On|Off

  KeepAliveTimeout    15

  MaxKeepAliveRequests    100

  

测试:

  telnet WEB_SERVER_IP  PORT

  GET /URL  HTTP/1.1

  Host:WEB_SERVER_IP

  

  Note:15s不请求将会自动退出;

3.     MPM

httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;centos6的rpm包为此专门提供了三个应用程序文件,httpd(prefork),httpd.worker,httpd.event,分别用于实现不同的MPM机制的支持;确认现在使用的是哪个程序文件的方法:

  ps aux | grep httpd

  

  可以看出现在使用的是prefork文件。

默认使用的为/usr/sbin/httpd,其为prefork的MPM模块;

  查看httpd程序的模块列表:

        查看静态编译的模块:

              #httpd –l

              

        持卡看静态编译及动态编译的模块:

              #httpd –M

              

更换使用httpd程序,以支持其他的MPM机制:

  /etc/sysconfig/httpd

        HTTPD=/usr/sbin/httpd.{worker,event}

  

  编辑图中红框部分,将#删掉,保存退出重启服务,进程使用了httpd.worker文件;

  

Note:必须重启服务,配置才能生效;

 

MPM配置:

  prefork的配置:

        

        <IfModule prefork.c>

StartServers       8      服务启动后默认开启的进程数;

MinSpareServers    5     最小空闲服务器进程,保存备用;

MaxSpareServers   20    最大空闲服务器进程,保存备用;

ServerLimit      256           最大活动进程数,一般此项会大于并发数;

MaxClients       256         最大并发数,最大数量的工作线程;

MaxRequestsPerChild  4000 每个子进程在生命周期内所能够服务的最大请求个数;

</IfModule>

           Worker的配置:

                 

                 <IfModule worker.c>

StartServers         4        服务启动后默认开启的进程数;

MaxClients         300      最大并发数,最大数量的工作线程;

MinSpareThreads     25     最小空闲进程,保存备用;

MaxSpareThreads     75    最大空闲进程,保存备用;

ThreadsPerChild     25 每个进程可生产的线程数;

MaxRequestsPerChild  0 每个子进程在生命周期内所能够服务的最大请求个数,0代表不限制;

</IfModule>

4.     DSO

配置指定实现模块加载;

  LoadModule <mod_name> <mod_path>

  

  模块文件路径可使用相对路径:

        相对于ServerRoot(默认/etc/httpd)

5.     定义’Main’server的文档页面路径

DocumentRoot  “”

文档路径映射:

  DocumentRoot指向的路径为URL路径的起始位置

        其相当于站点URL的根路径;

              (FileSystem)/web/host1/index.html  -->(URL)/index.html

  

我们可以自定义网页文件站点,并不一定把网页文件放在/var/www/html目录下;

1)    修改配置文件,把下图中路径都改为现在定义的路径;

2)    创建相关文件及目录;

3)    重新加载配置文件,测试;

     

6.     站点访问控制常见机制;

可基于两种机制指明对哪些资源进行何种访问控制;

  文件系统路径:

        <Directory  "">

        ...

        </Directory>

       

        <File "">

        ...

        </File>

       

        <FileMatch  "PATTERN">

        ...

        </FileMatch>

  URL路径:

        <Location  "">

        ...

        </Location>

       

        <LocationMatch "">

        ...

        </LocationMatch>

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

1)    Options

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

         Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;

         FollowSymLinks:允许跟踪符号链接文件所指向的源文件;

         None

         All

2)    AllowOverride

与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;

   All

   None

3)    order和allow、deny

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

         order allow,deny(设置白名单)

         order deny,allow(设置黑名单)

Allow from

Deny from

              

      示例:

1)    设置白名单;

2)    测试,在192.168.19.134主机上测试,不能访问了;

7.     定义默认主页面;

DirectoryIndex   index.html   index.html.var

8.     定义路径别名;

格式:

  Alias /URL/  “/PATH/TO/SOMEDIR/”

 

DocumentRoot“/www/htdocs”

 

        /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm

Alias/download/  “/rpms/pub/”

 

        /rpms/pub/bash-4.4.2-3.el6.x86_64.rpm

示例:

1)    编辑配置文件,定义别名;

2)    创建相关文件及目录

3)    测试;

9.     设定默认字符集;

AddDefaultCharset    UTF-8

10.日志设定

日志类型:访问日志 和 错误日志

 

错误日志:

ErrorLog   logs/error_log

LogLevel   warn

  Possible values include: debug, info, notice,warn, error, crit, alert, emerg.

访问日志:

  LogFormat “%h %l %u %t \”%r\”%>s  %b  \”%{Referer}i\” \”%{User-Agent}i\”” combined

  

  CustomLog logs/access_log  combined

  

  LogFormat  format  strings

       

 

        %h:客户端ip地址;

        %l:Remote User,通常为一个减号(“-”);

     %u:Remote user(fromauth;may be bogus if return status(%s)is 401);非为登录访问时,其为一个“-”号

%t:服务器收到的请求时的时间;

%r:First line ofrequest,即表示请求报文的首行;记录了此次请求的方法,URL以及协议版本;

%>s:响应状态码;

%b:响应报文的大小,单位是字节;不包括响应报文的http首部;

%{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;

%{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;

           示例:在192.168.19.134主机上访问192.168.19.128,在19.128主机上查看日志;

                 

11.基于用户的访问控制;

认证质询:

  www-authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;

认证:

  Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;

 

  认证方式有两种;

        Basic:明文

        Digest:消息摘要认证;

安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;

用户的账号和密码存放在何处?

  虚拟账号:仅用于访问某服务时用到的认证标识;

 

  存储:

        文本文件;

        SQL数据库;

        ldap目录存储;

 

basic认证配置示例:

1)    定义安全域

<Directory “”>

         Options None

         AllowOverride   None

AuthType  Basic

AuthName “String”

AuthUserFile  “PATH/TO/HTTPD_USER_PASSWD_FILE”

Require user  username1  username2 …

</Directory>

 

允许账号文件中的所有用户登录访问:

         Require valid-user

2)    提供账号和密码存储(文本文件)

使用专用命令完成此类文件的创建及用户管理

         htpasswd  [options] /PATH/TO/HTTPD_PASSWD_FILE  username

              -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;

              -m:md5格式加密;

              -s:sha格式加密;

              -D:删除指定用户

      另外:基于组账号进行认证;

  • 定义安全域

           <Directory "">

                 Options None

                 AllowOverride None

                 AuthType Basic

                 AuthName "String“

                 AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"

                 AuthGroupFile"/PATH/TO/HTTPD_GROUP_FILE"

                 Require  group grpname1  grpname2 ...

           </Directory>

  • 创建用户账号和组账号文件;

                 组文件:每一行定义一个组

                      GRP_NAME: username1  username2 ...

           示例:基于用户认证;

1)    创建用户账号文件,添加用户;

2)    编辑配置文件,添加安全域;

3)    测试,要求输入密码;

4)    输入用户名及密码,能进入;

           示例2:基于组认证;

1)    在上面示例的基础上再创建个用户;

2)    创建组文件,将tom和obama为一个组;

3)    在上一示例的基础上修改配置文件;

4)    检查错误并测试;

浏览器访问测试如下,输入jerry账号不能访问:

输入tom或obama账号可以访问;

12.虚拟主机

站点标识:socket

  IP相同,但端口不同;

  IP不同,但端口均为默认端口;

  FQDN不同:

        请求报文中首部;

        Host

有三种实现方案:

  基于ip:

        为每个虚拟主机准备至少一个ip地址;

  基于port:

        为每个虚拟主机使用至少一个独立的port;

  基于FQDN:

        为每个虚拟主机使用至少一个FQDN;

注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用“main”主机;

  禁用方法:注释中心主机的DocumentRoot指令即可;

 

虚拟主机的配置方法;

  <VirtualHost  IP:PORT>

        ServerName  FQDN

        DocumentRoot  “”

  </VirtualHost>

 

  其它可用指令:

        ServerAlias:虚拟主机的别名:可多次使用;

        ErrorLog

        CustomLog

        <Directory “”>

        …

        </Directory>

        Alias

        …

基于IP虚拟主机示例:

1)    注释DocumentRoot指令选项;

2)    编辑虚拟主机配置文件;

3)    创建相关目录及文件;

创建相关文件;

4)    添加ip地址;

5)    测试;

测试192.168.19.128;

测试192.168.19.129;

测试192.168.19.131;

          

基于端口的虚拟主机:以下在以上配置的基础上进行修改;

1)    修改监听端口;

2)    修改虚拟主机配置文件;

3)    配置文件保存退出后,重启服务;

4)    在192.168.19.134主机上测试;

测试192.168.19.128:80端口(默认80);

测试192.168.19.128:808端口;

测试192.168.19.128:8080端口;

Note:修改完配置文件后必须保存退出,然后重启服务;这样测试才会有效;

 

           基于FQDN的虚拟主机:

1)    修改配置文件;

2)    重载服务

3)    在测试主机上修改添加hosts文件;

4)    测试;

访问

访问

访问

13.Status页面;

LoadModule  status_module modules/mod_status.so

 

<Location  /server-status>

  SetHandler server-status

  Order allow,deny

  Allow from 192.168.19

</Location>

1)    编辑配置文件;

2)    重启服务;

3)    测试;