zoukankan      html  css  js  c++  java
  • HTTP-常用配置


    前言

    这篇主要介绍HTTP服务程序环境

    可能有一些介绍不到,博主能力有限,欢迎大神来纠正改进

    HTTP协议从http/0.9到如今的http/2.0中间发生了很大的改变,现在主流的事http/1.1

    image

    在很多面试当主就会问起http协议各个版本的不同之处,这里就不介绍它们之间的区别了,有想要了解的可以百度下,面试的时候看下

    HTTP工作机制:
    http请求:http request
    http响应:http response
    一次http事务:请求<-->响应

    在上篇中基本简单说了下https://www.cnblogs.com/xsuid/p/9451811.html

    http服务器程序:
           httpd apache
           nginx
           lighttpd

    Httpd介绍

    httpd:

    20世纪90年代初,国家超级计算机应用中心NCSA开发

    特性:

    高度模块化:core + modules

    DSO: Dynamic Shared Object 动态加/卸载

    MPM:multi-processing module多路处理模块

    MPM工作模式

    prefork:

    1、多进程I/O模型,每个进程响应一个请求,默认模型

    2、个主进程:生成和回收n个子进程,创建套接字,不响应请求

    3、多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个

    如图:

    image

    worker:

    1、复用的多进程I/O模型,多进程多线程,IIS使用此模型

    2、一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

    如图:

    image

    event:

    1、事件驱动模型(worker模型的变种)

    2、一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

    如图:

    image

    备注:MPM模式也是面试中常问的问题

    HTTP安装

    版本

    CentOS 6:默认2.2版本(官方以停止支持)

    CentOS 7:默认2.4版本

    安装方式

    rpm:centos发行版,稳定,建议使用
    编译:定制或特殊需求

    备注:后面会介绍编译安装----


    HTTP-CentOS 7程序环境

    新版本2.4特性

    MPM支持运行为DSO机制;以模块形式按需加载

    event MPM生产环境可用

    异步读写机制

    支持每模块及每目录的单独日志级别定义

    每请求相关的专用配置

    增强版的表达式分析式

    毫秒级持久连接时长定义

    基于FQDN的虚拟主机不需要NameVirutalHost指令

    新指令,AllowOverrideList

    支持用户自定义变量

    更低的内存消耗

    配置文件:

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


    检查配置语法:

    httpd –t
    service httpd configtest

    模块相关的配置文件:

    /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 -l

    查看静态编译及动态装载的模块

    httpd –M

    动态模块加载:不需重启即生效

    动态模块路径
    /usr/lib64/httpd/modules

    image


    Httpd 2.4常见配置

    备注:在这我用两台主机进行实验,分别是:192.168.43.57、192.168.43.67,57当http服务器,67当客户端,首先yum安装HTTP服务器


    1、版本号修改

    备注:要是别人查询到你的网站事用http那个版本,是不是不好,容易利用版本漏洞进行攻击,所以让他不显示版本号

    1、首先得有个主页,在这我就随便创建个index.httml

    echo /var/www/html/index.html > /var/www/html/index.html

    2、我们先来看一下没有进行版本设置时候得情况,在67主机上

    curl -I 192.168.43.57

    image

    版本信息一目了然

    3、在服务器端(57)隐藏版本信息设置

    cd /etc/httpd/conf.d/
    vim texe.conf

    备注:写在主配置文件里也可,推荐写在以上目录下,方便来管理,主配置文件中标记了/conf.d/目录,写在/conf.d/目录下得配置优先生效

    ServerTokens Prod
    # 写入
    systemctl restart httpd
    systemctl reload httpd
    #重启服务最好用reload

    4、再次测试验证

    image

    OK

    2、修改监听的IP和Port

    1) 省略IP表示为本机所有IP

    2) Listen指令至少一个,可重复出现多次

    示例:

    Listen 192.168.1.100:8080

    Lsten 80

    3、持久连接

    Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接
    断开条件:数量限制:100

           时间限制:以秒为单位, httpd-2.4 支持毫秒级

    副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应

    折衷:使用较短的持久连接时间

    设置:

    KeepAlive On|Off
    KeepAliveTimeout 15
    MaxKeepAliveRequests 100

    测试:

    telnet 192.168.43.57 80

    image

    4、切换使用的MPM-开启100个线程

    1、编辑

    vim /etc/httpd/conf.modules.d/00-mpm.conf

    image

    2、重读配置文件或重启服务

    systemctl reload httpd
    systemctl restart httpd

    3、查看确认

    httpd –M |grep mpm
    重启服务生效
    pstree -p|grep httpd 查看进程和线程

    备注:

    1)设置进程为100个,在我们

    image

    StartServers   100
    

    2)重启服务并查看

    systemctl reload httpd
    ps aux


    5、定义HTTP主目录

    1、默认得主目录在

    /var/www/html/

    2、更改主目录

    1)首先创建目录

    mkdir /data/website -pv

    2)创建index.html首页

    echo /data/website/index.html > /data/website/index.html

    3)设置配置文件

    vim /etc/httpd/conf.d/texe.conf

    image

    DocumentRoot "/data/website"
    <Directory "/data/website">
    Require all granted
    </Directory>

    4)重启服务

    5)测试

    image

    注意:SELinux和iptables的状态


    6、定义站点主页面

    默认是找index.html文件最为主页得,也可更改把以下代码加入texe.conf配置文件就可

    DirectoryIndex index.php 
    # 值可以是多个。找步到第一个找第二个


    7、基于IP的访问控制:

    1、conf结尾的文件只能特定IP才能访问(如只允许192.168.43.67)

    <FilesMatch ".+.(conf|ini)$">
    <RequireAny>                                                                                                                  
    Require all denied ##拒绝所有
    require ip 192.168.43.67 ##只允许
    </RequireAny>
    </FilesMatch>

    2、重启服务

    备注:

    加上这项

    options indexes
    

    说明要是这个网站主页面访问不了就显示目录下所有文件列表


    也可限定目录只对特定用户访问

    <location /admin> ##URL路径
    <RequireAny>
    Require all denied
    require ip 192.168.31.6
    </RequireAny>
    </location>


    8、自定义日志格式

    日志类型:

    访问日志
    错误日志

    错误日志:

    路径:ErrorLog logs/error_log(这是相对路径基于/etc/httpd/)

    推荐设置为:LogLevel warn(级别,从警报级别开始记录)

    LogLevel 可选值:

    debug, info, notice, warn,error

    crit, alert, emerg

    备注:最往后严重性越高

    访问日志

    1、定义日志格式:

    LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" testlog

    备注:根据环境需求来定义

    2、使用日志格式:

    CustomLog "logs/access_log" testlog

    参考帮助:
    http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

    man 3 strftime
    

    9、设定默认字符集

    AddDefaultCharset UTF-8
    中文字符集:GBK, GB2312, GB18030

    10、定义路径别名

    意思是说:

    当用户访问192.168.43.57/data目录时,出现的数据不在website/data目录下,其实是在/website/app/stud目录下

    实现方式:

    Alias /data  /app/stud

    备注:别忘了授权文件夹

    <Directory "/app/stud">
    Require all granted
    </Directory>

    重启服务


    11、实现身份验证

    说明:只有经过验证的用户才能访问某个目录

    认证方式两种:

    basic:明文
    digest:消息摘要认证,兼容性差

    安全域:

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

    用户的账号和密码

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

    存储:文本文件,SQL数据库,ldap目录存储,nis等

    备注:用虚拟用户来访问特定的目录,虚拟账号可以放到文件里或数据库里

    方法一

    说明:我们针对admin目录来访问

    1、修改配置文件:

    vim /etc/httpd/conf.d/test.conf
    
    <Directory /data/website/admin>
    AuthType Basic ##验证方式
    AuthName "Secure login" ##加的一段话,只要经过验证的用户才能访问
    AuthUserFile "/etc/httpd/conf.d/.htpasswd" ##存放位置加‘.’是隐藏改目录,要是目录不存在,就创建出来
    Require user bob  ##希望所访问的用户                                                                                                 
    </Directory>

    2、创建用户

    htpasswd -c /etc/httpd/conf.d/.htpasswd alice
    htpasswd   /etc/httpd/conf.d/.htpasswd bob
    htpasswd   /etc/httpd/conf.d/.htpasswd jack
    

    备注:第一次创建用户必须加“-c”之后就不需要加了

    3、重启服务

    方法二

    1、在要设置权限的目录下创建一个文件存放验证信息

    vim /data/website/admin/.htaccess
    AuthType Basic
    AuthName "Secure login"
    AuthUserFile "/etc/httpd/conf.d/.htpasswd"
    Require user bob 

    2、编辑配置文件

    vim /etc/httpd/conf.d/test.conf
    <Directory /data/website/admin>
    AllowOverride authconfig #允许覆盖                                                                                                  
    </Directory>

    3、重启服务

    基于组验证

    示例:
    <Directory "/www/htdocs/admin">
     Options None
     AllowOverride None
     AuthType Basic
     AuthName "Administator private"
     AuthUserFile "/etc/httpd/conf.d/.htpasswd"
     AuthGroupFile "/etc/httpd/conf.d/.htgroup"
     Require group g1
    </Directory>
    

    创建用户

    和上面创建方法一样

    给用户分组

    image

    备注:

    在/etc/httpd/conf.d目录下创建

    ctrl+D结束

    备注:

    远程客户端和用户验证的控制

    Satisfy ALL|Any

    ALL 客户机IP和用户验证都需要通过才可以

    Any客户机IP和用户验证,有一个满足即可


    12、ServerSignature On | Off | EMail

    说明:

    当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息

    如果不对外显示这些信息,就可以将这个参数设置为Off

    设置为Email,将显示ServerAdmin 的Email提示


    13、status页面

    说明:

    用来判断服务器的状态

    依赖于这个模块

    httpd -M |grep status_module

    1、编辑配置文件

    <Location /status>
    SetHandler server-status
    Order allow,deny
    Allow from 172.18
    </Location>

    2、重启服务

    3、测试

    192.168.43.57/status

    14、虚拟主机

    说明:在一台物理机上实现多个网站

    有三种实现方式:

    基于ip:为每个虚拟主机准备至少一个ip地址

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

    基于FQDN:为每个虚拟主机使用至少一个FQDN

    备注:假如有三台虚拟主机分别是“www.a.com、www.b.comwww.c.com” 分别在web1、web2、web3文件夹中

    准备

    1)首先创建三个文件夹

    mkdir /data/web{1,2,3}
    

    2)创建三个主页

    echo /data/web1 > /data/web1/index.html
    echo /data/web2 > /data/web2/index.html
    echo /data/web3 > /data/web3/index.html

    基于端口实现

    分别对应8001、8002、8003

    1、编辑配置文件

    vim /etc/httpd/conf.d/texe.conf


    listen 8001  #端口
    listen 8002  #
    listen 8003  #
    <virtualhost *:8001> #定义
    documentroot /data/web1 #主站点
    servername www.a.com 
    <directory /data/web1> #定义授权
    require all granted # 都授权
    </directory>
    </virtualhost>
    
    <virtualhost *:8002>
    documentroot /data/web2
    servername www.b.com
    <directory /data/web2>
    require all granted
    </directory>
    </virtualhost>
    
    <virtualhost *:8003>                                                                                                          
    documentroot /data/web3
    servername www.c.com
    <directory /data/web3>
    require all granted
    </directory>
    </virtualhost>

    2、重启服务

    3、测试

    image

    基于IP地址实现

    1、在物理机上增加三个IP地址

    ip a a 192.168.43.101/24 dev ens33
    ip a a 192.168.43.102/24 dev ens33
    ip a a 192.168.43.103/24 dev ens33
    

    2、修改配置文件

    vim /etc/httpd/conf.d/texe.conf


    <virtualhost 192.168.31.101:80>
    documentroot /data/web1
    servername www.a.com
    <directory /data/web1>
    require all granted
    </directory>
    </virtualhost>
    
    <virtualhost 192.168.31.102:80>
    documentroot /data/web2
    servername www.b.com
    <directory /data/web2>
    require all granted
    </directory>
    </virtualhost>
    
    <virtualhost 192.168.31.103:80>
    documentroot /data/web3
    servername www.c.com
    <directory /data/web3>
    require all granted
    </directory>
    </virtualhost>

    3、重启服务并测试

    image

    基于FQDN(主机头)实现

    说明:想要主机名访问必须使用DNS解析或hosts文件解析

    在这我们写到hosts文件中

    vim /etc/hosts

    image

    1、编辑配置文件

    vim /etc/httpd/conf.d/texe.conf


    <virtualhost *:80>
    documentroot /data/web2
    servername www.b.com
    <directory /data/web2>
    require all granted
    </directory>
    ErrorLog "logs/b_error_log" #错误日志分开
    CustomLog "logs/b_access_log" combined #访问日志分开
    </virtualhost>
    
    <virtualhost *:80>
    documentroot /data/web3
    servername www.c.com
    <directory /data/web3>
    require all granted
    </directory>
    ErrorLog "logs/c_error_log"
    CustomLog "logs/c_access_log" combined
    </virtualhost>
    
    <virtualhost *:80>
    documentroot /data/web1
    servername www.a.com 
    ServerAlias  a.com *.a.com #别名也就是泛域名
    <directory /data/web1>
    require all granted
    </directory>
    ErrorLog "logs/a_error_log"
    CustomLog "logs/a_access_log" combined
    </virtualhost>

    2、重启服务并测试

    image

    备注:如果用IP地址访问,那么配置文件中谁靠前谁就是默认地址


    15、实现https加密访问

    说明:要是你的网站涉及到“¥”那么就必须加https加密访问

    生产中是向CA机构花钱申请的,在这里我们自己搭建一个CA服务器,我们用67当CA服务器

    1、CA服务器端(67)安装yum包

    yum install mod_ssl

    2、httpd服务器申请证书

    cd /etc/pki/CA
    

    1)生成私钥

    (umask 077;openssl genrsa -out private/cakey.pem 2048)

    2)自签名

    openssl req -new -x509 -key private/cakey.pem -out cacert.pem

    3)CA主机创建目录

    touch index.txt
    echo 01 > serial
    #存放序列号

    4)在57HTTP服务器主机创建目录来存放证书与私钥并生产自己的私钥

    cd /etc/httpd/conf.d/
    # 在这个目录下创建存放目录
    mkdir ssl
    
    [root@centos7_05 ssl]# (umask 077;openssl genrsa -out heepd.key 2048)
    

    5)57HTTP主机生成请求

    openssl req -new -key heepd.key -out httpd.csr
    

    image

    6)CA服务器给HTTP颁发证书

    备注:把57主机生成的申请文件scp传送给CA主机

    scp httpd.csr 192.168.43.67:/etc/pki/CA/

    CA给HTTP签名

    openssl ca -in httpd.csr -out certs/httpd.csr
    #颁发证书

    7)把HTTP的证书和CA的证书传送到(57)HTTP服务器

    scp certs/httpd.csr cacert.pem 192.168.43.57:/etc/httpd/conf.d/ssl/

    8)修改ssl.cof配置文件

    [root@centos7_05 conf.d]# vim ssl.conf

    image

    9)重启服务测试

    image

    image

    image

    16、http跳转到https

    说明:当我们输入 “www.a.com” 自动跳转到”https://www.a.com

    1、修改配置文件

    [root@centos7_05 conf.d]# vim texe.conf


    RewriteEngine on  #启动这个引擎
    rewritecond %{SERVER_PORT} !^443 #条件跳转--如果不是443的时候我就进行跳转
    RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #这是跳转规则
    

    2、重启测试

    image

    17、使用mod_deflate模块压缩页面优化传输速度

    适用场景:

    (1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持

    (2) 压缩适于压缩的资源,例如文本文件

    1、编辑配置文件

    vim /etc/httpd/conf.d/texe2.conf
    


    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    DeflateCompressionLevel 9
    SetOutputFilter DEFLATE
    

    2、重启测试


    http协议常用的状态码

    200: 成功,请求数据通过响应报文的entity-body部分发送;OK

    301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently

    302: 响应报文Location指明资源临时新位置 Moved Temporarily

    304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified

    401: 需要输入账号和密码认证方能访问资源;Unauthorized

    403: 请求被禁止;Forbidden

    404: 服务器无法找到客户端请求的资源;Not Found

    500: 服务器内部错误;Internal Server Error

    502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway

    503 – 服务不可用,临时服务器维护或过载,服务器无法处理请求

    504 – 网关超时


    结语:后续更精彩

  • 相关阅读:
    如何查看IIS版本
    11.Vue安装Axios及使用
    11.Vue安装Axios及使用
    解决vuex刷新页面就恢复初始化的方法之一
    解决vuex刷新页面就恢复初始化的方法之一
    从零开始学 Web 之 Vue.js(四)Vue的Ajax请求和跨域
    从零开始学 Web 之 Vue.js(四)Vue的Ajax请求和跨域
    vue $http请求服务
    vue项目打包后字体文件路径出错的解决办法
    类和对象系列教材 (六)- Java中的传参祥解
  • 原文地址:https://www.cnblogs.com/xsuid/p/9456028.html
Copyright © 2011-2022 走看看