httpd 基础

 

http(1)

开启httpd服务,注意selinux 和防火墙设置。出现错误查看系统日志和http错误日志。

进程间通信:IPC socket:套接字 IP:PORT

Client <--> Server
    Server: listen
    Client:

    IP:PORT <--> IP:PORT

IANA: 
    0-1023:永久地分配给固定的应用使用,80/http, 21/ftp, 25/smtp, 110/pop3, 143/imap4;仅root有权限使用,特权端口;
    1024-41951:注册端口,但不严格,3306/mysql, 11211/memcached, 
    41952+:客户端程序使用的随机端口,动态端口,或称为私有端口;
        /proc/sys/net/ipv4/ip_local_port_range

BSD Socket API:
    SOCK_STREAM, SOCK_DGRAM, SOCK_RAW

    地址格式:
        IPv4: AF_INET
        IPv6: AF_INET6
        Unix_Sock:AF_UNIX

http协议: 应用层协议:超文本传输 http/0.9 http/1.0:cache, MIME MIME: multipurpose internet mail extensions http/1.1:缓存功能,条件式请求; speedy: SPDY http/2.0:

html:
    <html>
        <head>
            <title>MageEdu</title>
        </head>
        <body>

        </body>
    </html>

    css, js, images, ...

    major/minor:
        images/
            images/jpeg, images/png, images/gif, ...
        text/
            text/plain, text/html, text/js, ...
        application/
        ...

http协议的实现:
    开源实现:httpd(apache), nginx, lighttpd, ...

C/S:
    C: browser, user agent, 
        chrome, ie, firefox, safari, opera, ...
        elinks, curl, wget, ...
    S:httpd(apache), nginx, lighttpd, ...

    通信模型:
        请求/响应
        stateless, cookie, ...

一次完整的Http请求处理过程:
    (1) 建立或处理连接请求;
    (2) 接收请求;
    (3) 解析请求,处理请求;
    (4) 加载用户请求的资源;
    (5) 构建响应报文;
    (6) 发送响应报文;
    (7) 记录访问于日志中;

web资源:
    URL: 统一资源定位符;
        scheme://host[:port]/URL
            URL的根通常要映射为文件系统上的某路径;
                DocumentRoot  /var/www/html/
                    /index.html --> /var/www/html/index.html
                    /admin/index.html --> /var/www/html/admin/index.html
                    /images/logo.jpg --> /var/www/html/images/logo.jpg

                Alias /images/  /data/imgs/
                    /images/logo.jpg --> /data/imgs/logo.jpg
                    /images/a/3.gif --> /data/imgs/a/3.gif

事务:request/response
    request:
        <method> <url> <version>
        HEADERS

        <body>

    response:
        <version> <status> <reason-phrase>
        HEADERS

        <body>


    HEADERS:
        name: value
        name: value

    <method>:GET,HEAD,POST, PUT, DELETE, OPTIONS, TRACE, ...

    <status>:
        1xx:
        2xx: 成功响应
        3xx: 重定向响应
        4xx: 客户端错误
        5xx: 服务端错误

httpd:

http://httpd.apache.org

httpd: a patchy server, apache
ASF: Apache Software Foundation

http://www.netcraft.com

httpd特性:
    高度模块化设计:core  modules + standard modules  + 3rd party modules
    DSO: Dynamic Shared Object
    MPM: multipath process modules 
        prefork:process
            每进程响应一个请求; 
        worker: thread
            每线程响应一个请求;
        event: thread
            每进程响应多个请求; 
    丰富功能:
        CGI:动态网站;
        虚拟主机:IP,PORT,ServerName
        反向代理:http, fcgi, wsgi, ajp, ...
        负载均衡:
        ...

版本:
    httpd程序版本:
        httpd-1.x
        httpd-2.0
        httpd-2.2
        httpd-2.4

安装使用httpd:
    base
    epel

    程序环境:
        主程序文件:
            /usr/sbin/httpd
        模块文件:
            /usr/lib64/httpd/modules/*.so
        主配置文件:
            /etc/httpd/conf/httpd.conf
            /etc/httpd/conf.d/*.conf
            /etc/httpd/conf.modules.d/*.conf 
        站点文档路径:
            /var/www/html
        日志文件路径:
            /var/log/httpd/
                access_log:访问日志
                error_log:错误日志
        Unit File:
            /usr/lib/systemd/system/httpd.service
        自带脚本:
            /usr/sbin/apachectl

        systemctl start httpd.service
        systemctl enable httpd.service 

         ~]# ss -tnlp | grep ":80\>"

回顾: http协议: C/S:

    事务:request/response
        start line
        HEADERS

        <BODY>

        request:
            <method> <url> < version>
            HEADERS

            <BODY>

        response:
            <version> <status> <reason-phrase>
            HEADERS

            <body>

httpd:
    httpd-2.2
    httpd-2.4

    MPM:
        prefork:每进程响应一个请求;
        worker:每线程响应一个请求; 
        event:每进程响应多个请求;

httpd(2)

httpd-2.4的基础配置

配置文件:
    /etc/httpd/conf/httpd.conf
    /etc/httpd/conf.d/*.conf
    /etc/httpd/conf.modules.d/*.conf

配置文件:
    DIRECTIVE VALUE
        DIRECTIVE: 不区分字符大小写;例如ServerRoot;
        VALUE:除了文件系统路径,大多数也不区分字符大小写;

    配置修改完成后:
        (1) 测试语法;
        (2) 让服务程序重载配置文件:
            ~]# service httpd reload
            ~]# systemctl  reload  httpd.service 

    注意:不是所有修改都是重载就能生效,又时候需要重启服务。
        不到万不得已,不要重启服务。!!!!尤其是线上的服务。

常见配置修改

1、监听的地址和端口 Listen [ip:]port Listen可重复使用多数;默认监听本地可用的所有地址;

2、保持连接 persistent connection:tcp连接建立后,资源获取完成之后不会断开连接,而是继续等待请求其它资源; 如何断开? 数量限制 时间限制

        KeepAlive On|Off
        MaxKeepAliveRequests 100
        KeepAliveTimeout 10
    两个阈值,限制次数或时间,那个先到期都断开。默认开启保持连接

    创建文件/etc/httpd/conf.d/keeplive.conf
        KeepAlive Off
    即是关闭该功能。

浏览器默认每域名开启2线程或4线程。所以站点页面内容量大,加载会慢,所以有网站会使用多个域名。

3、DSO httpd命令: -t -D DUMPMODULES : show all loaded modules -M : a synonym for -t -D DUMPMODULES显示已经加载的模块

    LoadModule  mod_name  modules/mod_file_name

    相对路径:
        相对于ServerRoot指令的值来说;/etc/httpd/

            [root@centos7 ~]# ls /etc/httpd/ -l
            total 8
            drwxr-xr-x. 2 root root   57 Oct  8 10:11 conf
            drwxr-xr-x. 2 root root 4096 Sep 11 15:14 conf.d
            drwxr-xr-x. 2 root root 4096 Oct  8 16:43 conf.modules.d
            lrwxrwxrwx. 1 root root   19 Sep 11 15:12 logs -> ../../var/log/httpd
            lrwxrwxrwx. 1 root root   29 Sep 11 15:12 modules -> ../../usr/lib64/httpd/modules
            lrwxrwxrwx. 1 root root   10 Sep 11 15:12 run -> /run/httpd


            模块之间存在依赖关系。关闭模块时应注意~!

        [root@centos7 ~]# ls /etc/httpd/conf.modules.d/              
        00-base.conf  00-mpm.conf    00-systemd.conf
        00-dav.conf   00-proxy.conf  01-cgi.conf
        00-lua.conf   00-ssl.conf    10-fcgid.conf
00-base.conf只需要注释掉相应的模块,再systemctl reload httpd 即可取消某模块加载。

或修改配置文件语法 LoadModule  mod_name  modules/mod_file_name

2.4使用  Include conf.modules.d/*.conf
模块都配置在上目录中。当然也可以直接配置在主配置文件中。

[root@centos7 ~]# ll /etc/httpd/conf.modules.d/
total 28
-rw-r--r--. 1 root root 3739 Nov 19  2015 00-base.conf ###基本模块
-rw-r--r--. 1 root root  139 Nov 19  2015 00-dav.conf
-rw-r--r--. 1 root root   41 Nov 19  2015 00-lua.conf
-rw-r--r--. 1 root root  742 Nov 19  2015 00-mpm.conf  ###mpm配置模块
-rw-r--r--. 1 root root  957 Nov 19  2015 00-proxy.conf  ##代理
-rw-r--r--. 1 root root   88 Nov 19  2015 00-systemd.conf
-rw-r--r--. 1 root root  451 Nov 19  2015 01-cgi.conf  ###CGI功能模块

以后有需要可以自己创建配置文件放到该目录下。

4、定义站点主页:

DirectoryIndex filename1 filename2 ...
定义主页文件,可以定义多个。

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

/var/www/html/   目录下或其子目录下有index.html文件,如果不只当访问的那个网页,直接访问该主页。

5、Main Server相关配置

(1) DocumentRoot
    站点文档根路径;
DocumentRoot "/var/www/html"

定义了中心服务器的网页放置那个路径下。

(2) ServerName
    服务器名称;
#ServerName www.example.com:80

默认是被注释掉的。服务器会反向解析主机地址到主机名。把反解析(hosts文件或DNS)的结果,与本机主机名(hostname)不一致会报错。防止报错,可直接修改该参数。取消注释,修改为正确的主机名。

站点文档访问授权及众多服务特性的配置:

默认httpd要对路径做授权,否则都不允许访问。 放置在一个容器中进行控制。 <> … </>

(1)基于文件系统路径:

    <Directory "/PATH/TO/DIR">
    ... 
    </Directory>

    <DirectoryMatch ~ "正则表达式">
    ...
    </DirectoryMatch>

    <File ""> 定义单个文件的访问授权
    ...
    </File>
    ...         还有很多种访问控制方式。

例如禁止访问根

<Directory />
    AllowOverride none
    Require all denied
</Directory>

(2)基于URL进行:

<Location "URL">
...
</Location>

<LocationMatch ~ "URL_PATTERN"> 使用正则表达式
...
</LocationMatch>

(3) Options 定义服务方式

Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews

None
All

常用选项

Indexes:索引(除非是下载站,否则都是拒绝的)
FollowSymLinks:允许跟踪符号链接 网页文件是链接过来的。不在/var/www/html路径下。(默认是不允许的。)
ExecCGI:允许执行CGI脚本

(4) AllowOverride

httpd的访问控制配置,允许每目录单独进行;在每个目录下建立一个.htaccess文件;
AllowOverride表示是否允许目录中的.htaccess文件中的配置来覆盖当前<>...</>配置段中的配置;

Options FileInfo AuthConfig Limit

All
None

一般而言,为了性能使用none,否者文件被访问时,将从起始路径开始检查.htaccess文件。

(5) 基于源地址的访问控制 允许所有地址访问:Require all granted 拒绝所有地址访问:Require all denied

<RequireAll>

</RequireAll>

基于IP控制:
    Require ip ADDRESS 允许
    Require not ip ADDRESS 禁止
    ADDRESS: 
        ip
        network:
            10.1.0.0/255.255.0.0
            10.1.0.0/16
            10.1

基于主机名控制:
    Require host HOSTNAME
    Require not host HOSTNAME
        HOSTNAME:
            FQDN
            DOMAIN.TLD

示例 除了10.0.0.1的所有主机都允许访问

<RequireAll>
    Require not ip 10.0.0.1
    Require all granted                 
</RequireAll>

违规的主机访问会记录到日志。

6、User/Group 定义httpd服务运行身份

User apache
Group apache

7、路径别名

Alias  /URL/  /PATH/TO/SOME_DIR/

在Alias命令段加入即可 但是需要给加入的目录授权,否者不能访问。2.4需要给目录显示授权。

Alias /furmo/ /websit/bbs/
<Directory "/websit/bbs">
    AllowOverride none
    Require all granted
    Options None
</Directory>

修改配置文件需要检查配置。

8、httpd-manual

    # yum -y install httpd-manual
    安装后重载服务
    配置文件:conf.d/manual.conf

        [root@centos7 ~]# cat /etc/httpd/conf.
        conf.d/         conf.modules.d/ 
        [root@centos7 ~]# cat /etc/httpd/conf.d/manual.conf 
        #
        # This configuration file allows the manual to be accessed at 
        # http://localhost/manual/
        #
        AliasMatch ^/manual(?:/(?:de|en|fr|ja|ko|ru))?(/.*)?$ "/usr/share/httpd/manual$1"

        <Directory "/usr/share/httpd/manual">
            Options Indexes
            AllowOverride None
            Require all granted
        </Directory>

    http://host/manual/

注意:这里使用的是别名匹配机制。也是别名。

9、status page 显示httpd服务当前工作状态的页面。是自动生成的。

通过stauts模块扩展实现的。 status_module httpd -M 查看是否加载了该模块

创建一个配置文件,/etc/httpd/conf.d/stauts.conf

    <Location /status>
        SetHandler server-status   ###使用SetHandler 调用模块生成页面。
        Require all granted
    </Location>

基于url要是使用location授权

10、日志设定 两类日志

    错误日志:
        ErrorLog  "/var/log/httpd/error_log"
        LogLevel warn

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

    访问日志:
        LogFormat "FORMAT_STRINGS" LOG_FORMAT_NAME 
        CustomLog  "/PATH/TO/LOG_FILE"  LOG_FORMAT_NAME

format_strings:
        %h:Remote hostname. Will log the IP address if HostnameLookups is set to Off, which is the default.
        %l:Remote logname (from identd, if supplied).  无有效值时,使用“-”表示;
        %u: Remote user if the request was authenticated. May be bogus if return status (%s) is 401 (unauthorized). http协议认证时由客户端输入的用户名;
        %t:Time the request was received, in the format [18/Sep/2011:19:18:28 -0400]. 
        %r:First line of request.
        %>s:Status. For requests that have been internally redirected, this is the status of the original request. Use %>s for the final status.
        %b:Size of response in bytes, excluding HTTP headers.
        %{VARNAME}i:记录由VARNAME所表示的请求报文首部的值,例如%{Referer}i,则表示记录请求报文中Referer首部的值;

可以定制记录的日志格式。

11、虚拟主机

    主机标识方式:
        IP不同   ip资源不足,费用大。需要多个公网ip
        PORT不同  不同端口造成访问困难。

        ServerName: 这个比较常用
            在请求报文的首部,有一项内容标识要访问的主机

配置格式

使用<VirtualHost>容器进行配置。最需要的配置是server name 和document root两项

    <VirtualHost IP:PORT>
        ServerName      
        DocumentRoot
        <Directory "">
            ...
            Require all granted
        </DIrective>
        ErrorLog
        CustomLog
    </VirtualHost>

    httpd-2.2中使用基于ServerName的虚拟主机时,需要先取消中心主机,要使用专用配置指令 
        NameVirtualHost IP:PORT
        2.4配置中部需要此配置。也不需要取消中心主机,才能启动虚拟主机。

使用不同方式配置虚拟主机需要注意
    ip方式配置,ip不能重复
    端口方式配置,端口不能重复
    server name方式,主机名不能相同(FQDN)
不同虚拟机的配置尽量放到不同配置文件中。便于管理配置。
注意:可以混合使用,比如前两个事端口方式配置,最后一个使用ip方式配置。

示例

        <VirtualHost 10.1.0.68:80>
            ServerName www1.magedu.com
            DocumentRoot "/vhosts/www1"
            <Directory "/vhosts/www1">
                Options None
                AllowOverride None
                Require all granted
            </Directory>
        </VirtualHost>

        <VirtualHost 10.1.0.68:8080>
            ServerName www2.magedu.com
            DocumentRoot "/vhosts/www2"
            <Directory "/vhosts/www2">
                Options None
                AllowOverride None
                Require all granted
            </Directory>
        </VirtualHost>

        <VirtualHost 10.1.0.69:80>
            ServerName www3.magedu.com
            DocumentRoot "/vhosts/www3"
            <Directory "/vhosts/www3">
                Options None
                AllowOverride None
                Require all granted
            </Directory>
        </VirtualHost>

如果全部使用servername配置虚拟主机

测试时使用域名测试,如果使用本机测试,修改本机的hosts文件,使用links访问三个域名即可实现三个虚拟主机访问。

测试结果

[root@centos7 ~]# curl http://www1.magedu.com
w1
[root@centos7 ~]# curl http://www2.magedu.com
w2
[root@centos7 ~]# curl http://www3.magedu.com
w3
[root@centos7 ~]#

虚拟机配置文件

  oot@centos7 ~]# vim /etc/httpd/conf.d/virtualhost.conf
▽
<VirtualHost 192.168.136.129:80>
        ServerName www1.magedu.com
        DocumentRoot "/websit/www1"
        <Directory "/websit/www1">
                Options None
                AllowOverride None
                Require all granted
        </Directory>
</VirtualHost>

<VirtualHost 192.168.136.129:80>
        ServerName www2.magedu.com
        DocumentRoot "/websit/www2"
        <Directory "/websit/www2">
                Options None
                AllowOverride None
                Require all granted
        </Directory>
</VirtualHost>


<VirtualHost 192.168.136.129:80>
        ServerName www3.magedu.com
        DocumentRoot "/websit/www3"
        <Directory "/websit/www3">
                Options None
                AllowOverride None
                Require all granted
        </Directory>
</VirtualHost>

虚拟主机默认访问第一个虚拟主机(如果没有指定访问那个具体的主机) 也可以定义一个默认虚拟主机

<VirtualHost default:80>

12、基于用户的访问控制

    Require user USERLIST 
    Require group GRPLIST

    虚拟用户:
        确定访问服务器某个服务的用户身份,用户为虚拟用户。

    认证方式:
        basic
        digest 需要浏览器支持

    http协议认证过程 :
        认证质询:
            WWW-Authencate:响应码为401,拒绝客户端请求,并说明用户需要输入正确的账号和密码之后方可访问;

    认证:
            Authorization:客户端填入账号和密码,再次发送请求报文;认证通过,服务器发送响应内容;

    <Directory "">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "STRING"
        AuthUserFile ""
        Require user USER1 USER2 ...
    </Directory>
        也可以使用Require valid-user 文件中全部用户
    账号文件生成工具htpasswd
        htpasswd [options] "/PATH/TO/HT_PASSWD_FILE" username
            -c:创建此文件;
            -m:md5加密密码存放;
            -s:sha加密
            -D: 删除指定用户 

        [root@centos7 ~]# cat /etc/httpd/conf/.www1passwd 
        tom:$apr1$dWA1eyPX$BCWKMy3K2KAdvThSMNk/a/
        jerry:$apr1$fUXrpG9t$8Aj7wNwAnSXzj7gaONa0M1

        [root@centos7 ~]# tree /websit/www1/
        /websit/www1/
        ├── admin
        │   └── index.html
        └── index.html


        <VirtualHost *:80>
            ServerName www1.magedu.com
            DocumentRoot "/vhosts/www1"
            <Directory "/vhosts/www1">
                Options None
                AllowOverride None
                Require all granted
            </Directory>

            <Directory "/vhosts/www1/admin">
                Options None
                AllowOverride None
                AuthType Basic
                AuthName "Admin Area, Enter your name/pass"
                AuthUserFile "/etc/httpd/conf/.htpasswd"
                    Require valid-user
            </Directory>

            ErrorLog "logs/www1-error_log"
            CustomLog "logs/www1-access_log" combined
            </VirtualHost>

        Require的使用方式:
            (1) Require valid-user
            (2) Require user USER1 USER2 ... 指定用户

基于组进行认证:

            <Directory "/vhosts/www1/admin">
                Options None
                AllowOverride None
                AuthType Basic
                AuthName "Admin Area, Enter your name/pass"   ###该内容随便写 (会在将来提示输入用户名和密码的窗口上显示)
                AuthUserFile "/etc/httpd/conf/.htpasswd"
                AuthGroupFile "/etc/httpd/conf/.htgroup"
                Require group GRPNAME1 GRPNAME 2
            </Directory>        

        创建组账号文件:
            每行定义一个组
            group_name: user1 user2 ...

任何要进程要读取数据,就要与之对应的数据载体(方式)有对应的交互接口。 文件系统–系统调用 mysql–要能读取mysql套接字,支持mysql协议。

获取任何数据,就要有与之对应的实现,库,协议,驱动…

练习:(1) 基于主机名实现三个虚拟主机
        (2) 每虚拟主机使用独立的访问日志和错误日志
        (3) 第三个虚拟主机的/admin要进行用户访问认证 
        (4) 在第二个虚拟主机上提供/status;
        (5) 在第三个虚拟主机提供路径别名/bbs,访问其它文件系统路径;
        (6) 尝试使用混合类型的虚拟主机:
        基于IP,PORT和ServerName

练习2:使用脚本实现基于主机名的虚拟主机按需创建;
    每虚拟使用单独的配置文件;
    脚本可接受参数,参数虚拟主机名称;

是否创建虚拟主机 是 输入主机名 检查/etc/httpd/conf.d/目录下是否有重名的。

指定主机doucumentroot 是否使用认证 是 创建用户名和密码文件

自动创建目录并授权配置认证

是否创建路劲别名 是 提示输入别名 输入目标路径

创建配置文件到/etc/httpd/conf.d/NAME-vhost.conf

创建脚本文件。创建配置文件

原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/56556

(0)
yywyyw
上一篇 2016-11-01
下一篇 2016-11-01

相关推荐

  • 马哥教育网络班22期+第2周课程练习

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及相关示例演示。     文件管理类命令有:cp,mv,rm     1. cp:copy           使用方法:      &nbs…

    Linux干货 2016-08-22
  • vim 的使用简介

    linux day 8 使用vi和vim的三种主要模式 移动光标,进入插入模式 改变、删除、复制文本 撤销改变 搜索文档 vim寄存器 可视化和多窗口 vim帮助 vi: Visual Interface,文本编辑器 文本:ASCII, Unicode 文本编辑种类: 行编辑器: sed 全屏编辑器:nano, vi vim-Vi Improved 其他编辑…

    Linux干货 2016-08-15
  • N24_jerry 第十二周作业

    1、请描述一次完整的http请求处理过程; 简介 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同样有标准的格式。无论是什么客户端或者是什么服务端,大家只要按照HTTP的协议标准…

    Linux干货 2017-03-22
  • Linux第七周小结

    1、创建一个10G分区,并格式为ext4文件系统 a) 要求其block大小为2048,预留空间百分比为2,卷标为MYDATA,默认挂载属性包含acl; b) 挂载至/data/madata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; 2、创建一个大小为1G的swap分区,并创建好文件系统,并启用之 3、写一个脚本 a)&…

    2017-08-13
  • CPU 处理器架构知识

    CPU处理器架构: 主要有ARM、X86/Atom、MIPS、PowerPC,其中ARM在智能手机上面一枝独秀;其中ARM/MIPS/PowerPC均是基于精简指令集机器处理器的架构;X86则是基于复杂指令集的架构,Atom是x86或者是x86指令集的精简版。 Android在支持各种处理器的现状: ARM+Android 最早发展、完善的支持,主要在手机市…

    Linux干货 2015-08-03
  • Trap命令简介

     Trap命令简介     一、基本概念  trap是一个shell内建命令,它用来在脚本中指定信号如何处理。比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl +C不退出程序,那么就得使用trap命令来指定一下SIGINT的处…

    Linux干货 2015-05-11