精华内容
下载资源
问答
  • 数据中心承载着大量的应用业务,每逢重大节日或者访问洪峰的到来都需要做各种保障,以防出现突发事件,对应用造成影响。...所以一年时间下来,数据中心需要保障的大大小小事件的确不少,而且每次服务保...

    数据中心承载着大量的应用业务,每逢重大节日或者访问洪峰的到来都需要做各种保障,以防出现突发事件,对应用造成影响。比如:互联网电商的双11大促销,高中考网站的报名,APEC等重要事件等等,这些事件有的是时间节点特别重要,尽量不要出问题,有的是访问数据中心流量压力特别大,尽量不要出问题。所以一年时间下来,数据中心需要保障的大大小小事件的确不少,而且每次服务保障任务侧重点也有不同,如何做好这些保障工作,考验着数据中心的运维服务能力水平。本文着重介绍做数据中心服务保障工作需要依据五个原则,下面将逐条讲述一些原则,通过这些原则将服务保障工作做好。

    首先,数据中心要对每次需要保障的业务弄得清清楚楚,抓住痛点,解决痛点。如果是大型的节假日,这时考验的是数据中心整体业务的稳定性,尤其是节假日哪些应用访问量会增大,要提前做预案,根据往年积累的经验积极应对。如果往年系统出现了这样那样的问题,一定在这次的服务保障之前消除掉隐患。如果是电商促销,就要关注集中时间内访问用户的数量,模拟大规模数量的访问用户,看系统是否可以承受,这时就要关注计算、带宽这些资源是否足够,可能不足的地方要及时补全。一个数据中心可能承载了数百个甚至上千各种应用,要明确哪些是需要服务故障的,哪些是重要的,哪些是次要的,应用的重要性要有分级。在不同的活动中,不同的应用重要性是有变化的,要及时进行调整,将重要力量投入到关键节点的保障上来。

    其次,数据中心的设计和运维的人员要坐到一起,共同讨论保障事宜。业务运维的人要深入理解数据中心的系统架构,从全局的视角去对待服务保障工作。数据中心的规模和应用有大有小,投入上必要有差异。如果一个数据中心仅有数十台的服务器和小型网络设备,没有必要对整体服务保障大动干戈,准备一些备用端口和设备,万一关键时刻出了问题,及时恢复业务就可以了,不需要将过多的资源和精力投入到服务保障上来。数据中心做服务保障也要综合考虑,资金和人力也是需要衡量的重要方便,要用最少的投入得到最好的效果。掌握整体架构,对服务保障非常重要,避免各种应急方案在关键时刻失效,要尽可能将可能的突发情况考虑完全。数据中心要建立实时的监控体系,建设服务依赖的降级系统,建设具有冗余能力的架构体系,从整体架构层面做服务保障,这样可以避免将精力投入到某个特定环节中,而忽略了整体,而且架构层面一定具有冗余性,以便在出现突发情况时,有备份方案可选,将应用切割到备用系统上来,避免出现应用中断的情况。如果在服务保障期间,仍出现了较严重的应用中断事件,那服务保障工作就是彻底的失败。

    第三,要丰富服务保障工具,现在的数据中心应用业务越来越复杂,简单地靠PING、TRACERT等命令有时也很难判断问题,尤其是应用层面的问题,所以有必要引入一些排查和监控的工具。正所谓“巧妇难为无米之炊”,工欲做其事,必先利其器,手上需要有一些独门“暗器”,在关键时候能发挥效用。现在工具已经从纯手工,经历工具化、系统化,直至容器化和弹性调度上,什么Scribe、Wtool等免费监控的管理工具都可以派上用场,要善于使用这些工具,通过这些工具对数据中心运行各种数据参数进行分析,服务保障才更有效。

    第四,要关注新技术。每一次的服务保障都是发现数据中心隐患和弱点的最好时机,有时甚至要在服务保障之前做演练,以便能提前暴露隐患,及时进行纠正。当遇到一些困难时,要看是否有些新技术可以很好解决。现在数据中心的技术更新换代很快,这些新技术都是应对数据中心发展过程中遇到的新情况,当自己的数据中心也遇到这些问题时不妨考虑引入一些新技术解决问题。数据中心是当今信息技术发展的写照,不能墨守陈规,需改变的时候就是要做出改变。引进新的技术,不仅让自己的数据中心有耳目一新的感觉,也可以提升数据中心的应用处理能力。当然,引入这些新技术时也要保留谨慎,特别新的不成熟的技术要充分考虑引入风险,是否适得其反。在引入新技术的道路上,不能一下子步子迈得太大,要小碎步地快速向前跑,最终利用新技术的优势解决数据中心面临的各种问题。

    最后,数据中心要做服务保障需要投入大量人力,有时单靠数据中心自己有些力不从心,毕竟有很多系统和设备都不是数据中心运维的人员所能掌握的,这时可以按照事情的重要性,请一些专门提供第三方服务的专业公司人员来数据中心做服务保障。这些服务公司有着丰富的服务保障经验,将任务交由这些公司来做,花钱省心,而且万一出了什么差错,还可以获得一些补偿。数据中心还可以将系统或设备厂商的人请来做服务保障,数据中心每年采购大量的设备,有时还会购买原厂人员服务,这些在服务保障时都可以用上。所做这些虽然投入的资金和人力会多一些,但在应对突发事情的处理能力上将大为提高。数据中心应该将各种内外部资源都充分利用上,做好服务保障工作。

    以上介绍的是数据中心服务保障的五个原则,依据这五个原则指导服务保障的实际工作,将大大提升服务保障的质量。数据中心上的应用在特定时段特别重要,关键时刻不能掉链子,必须依仗这五个原则,切实做好服务保障工作。

    本文转自d1net(转载)

    展开全文
  • 紧密关联的事物应该放在一起,每个服务是针对一个单一职责的业务能力的封装,专注做好一件事情。 轻量级的通信方式--同步RESTful能让服务间的通信变得标准化并且无状态;异步(消息队列/发布订阅) 避免在服务...
    微服务面面观

    微服务基本

    单体应用

    单体应用的优点?

    --易于开发
    --易于测试
    --易于部署

    存在的问题:

    --代码耦合,开发维护困难,提交代码频繁出现大量冲突
    --主要业务和次要业务耦合,无法针对不同模块进行针对性优化
    --单点容错率低,并发能力差,无法水平扩展
    --技术选型成本高  
    --交付周期长,小功能要积累到大版本才能上线,上线开总监级别大会

    微服务和SOA

    微服务:架构本质是带自身特点的面向服务的分布式架构模式。

    SOA(Service Oriented Architecture):“面向服务的架构”:他是一种设计方法,其中包含多个服务, 服务之间通过相互依赖最终提供一系列的功能。

    SOA特点

    -- 有序(站在系统的角度,把原先散乱、无规划的系统间的网状结构,梳理成 规整、可治理的系统间星形结构)
    -- 复用(站在功能的角度,把业务逻辑抽象成 可复用、可组装的服务)
    -- 高效(站在企业的角度,把企业职能抽象成 可复用、可组装的服务)

    微服务和SOA区别:

    功能SOA微服务
    组件大小大块业务逻辑(粗粒度)单独、小块业务逻辑(细粒度)
    耦合通常松耦合总是松耦合

    管理

    着重中央管理去中心化
    通信轻量级通信企业服务总线(ESB)充当服务之间通信的角色

                                               

    微服务解决的问题

    快速迭代

    --提交代码频繁出现大量冲突

    --小功能要积累到大版本才能上线,上线开总监级别大会

    高并发

    --横向扩展流程复杂,主要业务和次要业务耦合

    --熔断降级全靠if-else

    • 如果核心业务流程和边角业务流程在同一个进程中,就需要使用大量的if-else语句,根据下发的配置来判断是否熔断或者降级,这会使得配置异常复杂,难以维护。

    • 如果核心业务和边角业务分成两个进程,就可以使用标准的熔断降级策略,配置在某种情况下,放弃对另一个进程的调用,可以进行统一的维护。

    微服务的设计原则、特征

    微服务体系结构由轻量级、松散耦合的服务集合组成。每个服务都实现了单个业务功能。理想情况下,这些服务应该是具有足够的内聚性,可以独立地开发、测试、发布、部署、扩展、集成和维护

    1. AKF拆分原则:以业务为中心

    AKF扩展立方体,是一个AKF公司的技术专家抽象总结的应用扩展的三个维度,理论上按照这三个扩展模式,可以将一个单体系统进行无限扩展。

    • Y轴(功能)——关注应用中功能划分,基于不同的业务拆分
    • X轴(水平扩展)——关注水平扩展,也就是“加机器解决问题”
    • Z轴(数据区分)——关注服务和数据的优先级划分,如按地域划分

    拆分后,每个服务代表了特定的业务逻辑、围绕业务组织团队、能快速的响应业务的变化。每个微服务也都可以动态的进行x轴和z轴的扩展,并适应云环境下的自动化部署;

    2.高内聚低耦合、轻量级无状态通信原则

    • 关注微服务的范围,而不是一味的把服务做小。一个服务的大小应该等于满足某个特定业务能力所需要的大小。紧密关联的事物应该放在一起,每个服务是针对一个单一职责的业务能力的封装,专注做好一件事情。
    • 轻量级的通信方式--同步RESTful能让服务间的通信变得标准化并且无状态;异步(消息队列/发布订阅)
    • 避免在服务与服务之间共享数据库,避免产生频繁的跨库查询,避免产生频繁的分布式事务。

    依据此,可实现单一职责、轻量级的通信方式、数据独立的效果

     3. 去中心化、 高度自治原则
    -- 能独立的开发、部署、发布,进程独立,独立的代码库、流水线

    4. 弹性设计原则

    设计可容错的系统,设计具有自我保护能力的系统
    -- 具有自我保护能力、可容错 (Netfilix 提供了一个比较好的解决方案,具体的应对措施包括:网络超时/限制请求的次数/断路器模式/提供回滚等)

    5. 日志与监控原则

    聚合你的日志,聚合你的数据,从而当你遇到问题时,可以深入分析原因。
    --日志聚合,监控与警告

    开源产品ELK可以用于日志的收集,聚合,展现,并提供搜索功能,基于一定条件,触发邮件警告。

    Spring boot admin也可以用于服务可用性的监控, hystrix除了提供熔断器机制外,它还收集了一些请求的基本信息(比如请求响应时间,访问计算,错误统计等),并提供现成的dashboard将信息可视化。

    6. 自动化原则

    在微服务架构下,面临如下挑战:

    • 分布式系统
    • 多服务,多实例
    • 手动测试,部署,发布太消耗时间
    • 反馈周期太长

    传统的手工运维方式必然要被淘汰,微服务的实施是有一定的先决条件:那就是自动化,当服务规模化后需要更多自动化标准化的手段来提升效能和降低成本。
    --微服务是松耦合的,微服务架构模式使得持续化部署成为可能。持续集成、持续交付

    参考链接:

    https://www.jianshu.com/p/4e582616d565

    https://yq.aliyun.com/articles/666604

    https://www.servicemesher.com/blog/design-patterns-for-microservices/

    https://yq.aliyun.com/articles/618043

    https://isdxh.com/86.html

    微服务的优缺点

    优点:

    强模块化边界
    可独立部署
    技术多样性

    缺点:

    服务拆分复杂性
    分布式复杂性
    最终一致性(分布式事务)
    测试、运维复杂性

    微服务拆分

    微服务拆分原则

    1. 单一职责
    2. 服务依赖 (避免循环依赖)
    3. 服务自治(服务划分应考虑让团队参与服务整个生命周期)
    4. 服务拆分最多三层,两次调用
    5. 规范化工程名(见文只意)
    6. 接口数据定义严禁内嵌,透传
    7. 接口应该实现幂等
    8. 将串行调用改为并行调用,或者异步化

    服务划分的合理性

    服务的业务范围,是否破坏服务依赖原则,是否满足单一职责

    服务所属团队的规模

    服务能否独立交付

    微服务的设计模式

    链式设计模式(按照数据流向就行数据拆分)
    --先后调用多个服务,产生一个经过合并的响应给客户
    --在整个链式调用完成之前,客户端会一直阻塞
    --服务调用链不宜过长,以免客户端长时间等待

    聚合器(API Gateway\BFF\边缘服务Edge Service)

    异步消息传递

    --同步请求会造成阻塞, 可以选择使用消息队列代替同步请求/响应:

    事件溯源模式

    --采用已事件为中心的方法保存业务实体

    物化视图模式

    --多个服务的常用的聚合数据,生成视图,方便查询

    CQRS模式(读写分离)

    服务治理


    微服务出现了什么问题?

    1. 服务越来越多,需要管理每个服务的地址
    2. 调用关系错综复杂,难以理清依赖关系
    3. 服务过多,服务状态难以管理,无法根据服务情况动态管理


    服务治理要做什么

    • 服务治理就是对服务复杂度膨胀问题的管控及管理。

    服务的线上的治理

    --服务限流

    --集群容错

    --服务降级、熔断

    --故障定界定位

    --容量规划
    --资源治理
    --线上生命周期管理

    服务的线下的治理

    项目管理、版本管理、测试、运维

    架构管理
    --异常处理、旧版本兼容


    开发管理
    --代码质量

    测试管理
    --测试覆盖度


    构建调测能力
    协同管理治理

    服务限流

    漏桶算法及令牌桶算法
    集群限流的情况要更复杂一些,首先在各个微服务节点上要有一个计数器,对单位时间片内的调用进行计数,算出这个时间片的总调用量和预先定义的限流阈值进行比对,计算出一个限流比例

    服务降级、熔断

    服务降级与熔断

    • 联系
    1. 目的很一致,都是从可用性可靠性着想,为防止系统的整体缓慢甚至崩溃,采用的技术手段;
    2. 最终表现类似,对于两者来说,最终让用户体验到的是某些功能暂时不可达或不可用;
    3. 粒度一般都是服务级别,当然,业界也有不少更细粒度的做法,比如做到数据持久层(允许查询,不允许增删改);
    4. 自治性要求很高,熔断模式一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,开关预置、配置中心都是必要手段;
    • 区别
    1. 触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;
    2. 管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分),而降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始)
    3. 实现方式不太一样,这个区别后面会单独来说;

    服务降级手段:

    • 容错降级
      • 我们常说的熔断,本质上也是容错降级策略的一种,只不过它比一般容错降级提供了更为丰富的容错托底策略,支持半开降级及全开降级模式
    • 静态返回值降级
    • Mock 降级
    • 备用服务降级

    故障定界定位

    调用链本质上也是基于日志,只不过它比常规的日志更重视日志之间的关系。在一个请求刚发起的时候,调用链会赋予它一个跟踪号(traceID),这个跟踪号会随着请求穿越不同的网络节点,并随着日志落盘,日志被收集后,可以根据 traceID 来对日志做聚合,找到所有的关联日志,并按顺序排序,就能构建出这个请求跨网络的调用链,它能详细描述请求的整个生命周期的状况。


    分布一致性

    强一致性、弱一致性、最终一致性

    CAP理论

    一致性(C:Consistency)
    可用性(A:Availability)
    分区容错性(P:Partition tolerance)

    • CA    放弃分区容错性,加强一致性和可用性,其实就是传统的单机数据库的选择
    • AP    放弃一致性(这里说的一致性是强一致性),追求分区容错性和可用性,这是很多分布式系统设计时的选择,例如很多NoSQL系统就是如此
    • CP    放弃可用性,追求一致性和分区容错性,基本不会选择,网络问题会直接让整个系统不可用

    C A 满足的情况下,P不能满足的原因:
           数据同步(C)需要时间,也要正常的时间内响应(A),那么机器数量就要少,所以P就不满足
            
    CP 满足的情况下,A不能满足的原因:
                数据同步(C)需要时间, 机器数量也多(P),但是同步数据需要时间,所以不能再正常时间内响应,所以A就不满足

    AP 满足的情况下,C不能满足的原因:
                机器数量也多(P),正常的时间内响应(A),那么数据就不能及时同步到其他节点,所以C不满足

    BASE理论

    BASE理论是对CAP中一致性和可用性权衡的结果

    Basically Available(基本可用)

    • 基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性


    Soft state(软状态)

    • 软状态指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时

    Eventually consistent(最终一致性)

    • 最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

    服务注册与发现

    服务注册中心本质上是为了解耦服务提供者和服务消费者。

    对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。
    因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。

    注册中心选择:

    Zookeeper:CP设计,保证了一致性,集群搭建的时候,某个节点失效,则会进行选举行的leader,或者半数以上节点不可用,则无法提供服务,因此可用性没法满足

    Eureka:AP原则,无主从节点,一个节点挂了,自动切换其他节点可以使用,去中心化

    注册中心分类

    应用内:直接集成到应用中,依赖于应用自身完成服务的注册与发现,最典型的是Netflix提供的Eureka、nacos

    应用外:把应用当成黑盒,通过应用外的某种机制将服务注册到注册中心,最小化对应用的侵入性,HashiCorp的Consul

    Consul强一致性(C)带来的是:

    服务注册相比Eureka会稍慢一些。因为Consul的raft协议要求必须过半数的节点都写入成功才认为注册成功
    Leader挂掉时,重新选举期间整个consul不可用。

    保证了强一致性但牺牲了可用性。

    Eureka保证高可用(A)和最终一致性:

    服务注册相对要快,因为不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功
    当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性。
    其他方面,eureka就是个servlet程序,跑在servlet容器中; Consul则是go编写而成。

    Nacos = Spring Cloud注册中心 + Spring Cloud配置中心。

    服务优雅上下线

    -- 停止服务前先截断服务的流量
    --注册中心通知所有服务干掉下线实例
    --处理完手头事务后停止

    Eureka 中服务下线的几种方式

    1、直接停掉服务

    根据默认的策略,如果在一定的时间内,客户端没有向注册中心发送续约请求,那么注册中心就会将该实例从注册中心移除,但是有缺陷,因为服务直接停掉后,实例仍然会在注册中心存在一小段时间(90s),也有可能注册中心直接认为你的服务down掉,但是实例仍然存在于注册中心

    2、通过注册中心接口强制下线

    为了让注册中心马上知道服务要下线, 可以向eureka 注册中心发送delete 请求

    // 注册中心zone

    eureka:
      client:
        serviceUrl:
          defaultZone

    发送一个delete 请求

    格式为 /eureka/apps/{application.name}/


    http://你的注册中心zone/apps/你的实例名称/你的实例地址加端口


    实例名称就是Application,地址加端口就是Status的右边

    值得注意的是,Eureka客户端每隔一段时间(默认30秒)会发送一次心跳到注册中心续约。如果通过这种方式下线了一个服务,而没有及时停掉的话,该服务很快又会回到服务列表中。

    所以,可以先停掉服务,再发送请求将其从列表中移除。

    3、客户端主动下线

    // 客户端(SpringBoot应用)可以通过如下代码主动通知注册中心下线
    DiscoveryManager.getInstance().shutdownComponent();

    @RestController
    public class HelloController {
        @Autowired
        private DiscoveryClient client;
     
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        public String index() {
            java.util.List<ServiceInstance> instances = client.getInstances("hello-service");       
            return "Hello World";
        }
        
        @RequestMapping(value = "/offline", method = RequestMethod.GET)
        public void offLine(){
        	DiscoveryManager.getInstance().shutdownComponent();
        }   
    }

    更多参考:

    Spring Cloud : 如何优雅下线微服务?

    Eureka:常见问题总结

    反向代理与负载均衡

    Nginx通过反向代理可以实现服务的负载均衡,避免了服务器单节点故障,把请求按照一定的策略转发到不同的服务器上,达到负载的效果。

    常用的负载均衡策略有

    1、轮询
    将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

    2、加权轮询

    给配置高、负载低的机器配置更高的权重,让其处理更多的请求


    3、ip_hash(源地址哈希法)
    根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。

    4、随机

    5、least_conn(最小连接数法)
    动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求

    服务网关

    客户端访问这些后端的多个微服务,遇到的问题?

    --每个业务都会需要鉴权、限流、权限校验等逻辑
    --每上线一个新的服务,都需要运维参与,申请域名、配置Nginx等,当上线、下线服务器时,同样也需要运维参与,另外采用域名这种方式,对于环境的隔离也不太友好
    --后端每个微服务可能是由不同语言编写的、采用了不同的协议,比如HTTP、Dubbo、GRPC等,但是你不可能要求客户端去适配这么多种协议
    --后期如果需要对微服务进行重构的话,也会变的非常麻烦,需要客户端配合你一起进行改造

    网关做的不仅仅只是简单的转发,也会针对流量做一些扩展,比如鉴权、限流、权限、熔断、协议转换、错误码统一、缓存、日志、监控、告警等

    服务网关关注:

    API注册
    --(业务方如何接入网关?Swagger的注解、手动录入)

    协议转换

    服务发现

    服务调用

    缓存
    -- 一些重复的请求,可以在网关层直接处理,而不用打到业务线,降低业务方的压力

    限流
    --令牌桶等方案。还需要考虑根据什么限流,比如是IP、接口、用户维度、还是请求参数中的某些值,这里可以采用表达式,相对比较灵活

    日志
    --提供一个统一的traceId方便关联所有的日志,可以将这个traceId置于响应头中,方便排查问题。

    优雅下线

    --Nginx自身是支持健康监测机制的,如果检测到某一个节点已经挂掉了,就会把这个节点摘掉,
    对于应用正常下线,需要结合发布系统,首先进行逻辑下线,然后对后续Nginx的健康监测请求直接返回失败(比如直接返回500),然后等待一段时间(根据Nginx配置决定),然后再将应用实际下线掉。

    服务网关不足

    目前的网关还是中心化的架构,所有的请求都需要走一次网关

    目前比较流行的ServiceMesh,采用去中心化的方案,将网关的逻辑下沉到sidecar中,sidecar和应用部署到同一个节点,并接管应用流入、流出的流量,这样大促时,只需要对相关的业务压测,并针对性扩容即可,另外升级也会更平滑,

    中心化的网关,即使灰度发布,但是理论上所有业务方的流量都会流入到新版本的网关,如果出了问题,会影响到所有的业务,

    但这种去中心化的方式,可以先针对非核心业务升级,观察一段时间没问题后,再全量推上线。另外ServiceMesh的方案,对于多语言支持也更友好。


    分布式事务

    具体参考:微服务:分布式事务

    --事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作
    -- 要么什么都不做,要么做全套(All or Nothing)

    事务的ACID属性

    --原子性(Atomicity)要么全部完成,要么全部不完成
    --一致性(Consistency)在事务开始之前和事务结束以后,数据库数据的一致性约束没有被破坏
    --隔离性(Isolation)数据库允许多个并发事务同时对数据进行读写和修改的能力
    --持久性(Durability) 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

    分布式事务的实现方案

    二阶段提交协议(Two-phase Commit,即2PC)

    阶段1:准备阶段
    阶段2:提交阶段

    2PC方案实现起来简单,实际项目中使用比较少,主要因为以下问题:

    性能问题 :

    所有参与者在事务提交阶段处于同步阻塞状态,占用系统资源,容易导致性能瓶颈。

    可靠性问题 :

    如果协调者存在单点故障问题,如果协调者出现故障,参与者将一直处于锁定状态。

    数据一致性问题:

    在阶段2中,如果发生局部网络问题,一部分事务参与者收到了提交消息,另一部分事务参与者没收到提交消息,那么就导致了节点之间数据的不一致。

    3PC(三阶段提交)
    --与二阶段提交不同的是,引入超时机制

    阶段1:canCommit 检查是否可以提交

    阶段2:preCommit 执行事务操作

    阶段3:do Commit 该阶段进行真正的事务提交

    方案总结

    优点

    相比二阶段提交,三阶段贴近降低了阻塞范围,在等待超时后协调者或参与者会中断事务。避免了协调者单点问题,阶段3中协调者出现问题时,参与者会继续提交事务。

    缺点

    数据不一致问题依然存在,当在参与者收到preCommit请求后等待do commite指令时,此时如果协调者请求中断事务,而协调者无法与参与者正常通信,会导致参与者继续提交事务,造成数据不一致。

    TCC (Try-Confirm-Cancel)事务 —— 最终一致性
     
    --Try操作作为一阶段,负责资源的检查和预留。
    --Confirm操作作为二阶段提交操作,执行真正的业务。
    --Cancel是预留资源的取消。


    TCC事务机制相对于传统事务机制(X/Open XA),TCC事务机制相比于上面介绍的XA事务机制,有以下优点:

    性能提升: 具体业务来实现控制资源锁的粒度变小,不会锁定整个资源。

    数据最终一致性: 基于Confirm和Cancel的幂等性,保证事务最终完成确认或者取消,保证数据的一致性。

    可靠性: 解决了XA协议的协调者单点故障问题,由主业务方发起并控制整个业务活动,业务活动管理器也变成多点,引入集群。

    缺点:

    TCC的Try、Confirm和Cancel操作功能要按具体业务来实现,业务耦合度较高,提高了开发成本。

    本地消息表 —— 最终一致性

    事务主动发起方额外新建事务消息表,事务发起方处理业务和记录事务消息在本地事务中完成,轮询事务消息表的数据发送事务消息,事务被动方基于消息中间件消费事务消息表中的事务。

    这样设计可以避免”业务处理成功 + 事务消息发送失败",或"业务处理失败 + 事务消息发送成功"的棘手情况出现,保证2个系统事务的数据一致性。

    MQ事务 —— 最终一致性

    基于MQ的分布式事务方案其实是对本地消息表的封装,将本地消息表基于MQ 内部,

    相比本地消息表方案,MQ事务方案优点是:

    • 消息数据独立存储 ,降低业务系统与消息系统之间的耦合。
    • 吞吐量高

    缺点是:

    • 一次消息发送需要两次网络请求(half消息 + commit/rollback消息)
    • 业务处理服务需要实现消息状态回查接口

    Saga事务 —— 最终一致性

    每个Saga事务由一系列幂等的有序子事务(sub-transaction) Ti 组成。
    每个Ti 都有对应的幂等补偿动作Ci,补偿动作用于撤销Ti造成的结果。

    Saga事务常见的有两种不同的实现方式:

    1、命令协调(Order Orchestrator):中央协调器负责集中处理事件的决策和业务逻辑排序。
    中央协调器(Orchestrator,简称OSO)以命令/回复的方式与每项服务进行通信,全权负责告诉每个参与者该做什么以及什么时候该做什么。

    2、事件编排 (Event Choreography):没有中央协调器(没有单点风险)时,每个服务产生并观察其他服务的事件,并决定是否应采取行动。

    集群容错

    容错模式

    舱壁隔离模式

    • 微服务容器分组、线程池隔离避免一个服务拖垮整个系统

    熔断模式

    • 熔断后快速失败

    限流模式

    • 高峰期限制访问的并发量

    失败转移模式

    容错机制

    Failover 失败自动切换

    • 当出现失败,重试其它服务器,通常用于读操作(推荐使用)。 重试会带来更长延迟。

    Failfast  快速失败

    • 只发起一次调用,失败立即报错,通常用于非幂等性的写操作。 如果有机器正在重启,可能会出现调用失败 。

    Failsafe 失败安全

    • 出现异常时,直接忽略,通常用于写入审计日志等操作。 调用信息丢失 可用于生产环境 Monitor。

    Failback  失败自动恢复

    • 后台记录失败请求,定时重发。通常用于消息通知操作 不可靠,重启丢失。 可用于生产环境 Registry。

    Forking  并行调用多个服务器

    • 只要一个成功即返回,通常用于实时性要求较高的读操作。 需要浪费更多服务资源   。

    Broadcast 

    • 广播调用,所有提供逐个调用,任意一台报错则报错。通常用于更新提供方本地状态 速度慢,任意一台报错则报错 。 

    容器监控

    监控主要解决的是感知系统的状况

    为什么需要监控?

    1. --问题的定位
    2. --数据支撑(容量规划)
    3. --对服务的系统认知(扑结构,如何部署,系统之间怎样通信,系统目前是怎样的性能状况)

    要监控什么

    1. --服务概览信息:如服务名称、服务部署所在机房、主机、服务包含的API、服务相关配置信息、服务负责人、开发人员、运维人员信息等
    2. --服务性能指标:如响应实现、流量、成功、失败数、请求频率等
    3. --服务拓扑关系:服务之间的调用关系
    4. --服务调用链:服务的整个调用链监控
    5. --服务版本信息:服务版本,客户端版本等
    6. --服务治理状态:服务注册情况、服务状态、熔断等
    7. --组件内部状态:活跃线程数、处理请求数等

    幂等机制

    一个幂等操作的特点是指其任意多次执行所产生的影响均与一次执行的影响相同。

    幂等场景

    1. 网络波动:因网络波动,可能会引起重复请求
    2. 分布式消息消费:任务发布后,使用分布式消息服务来进行消费
    3. 用户重复操作:用户在使用产品时,可能会无意的触发多笔交易,甚至没有响应而有意触发多笔交易
    4. 未关闭的重试机制:因开发人员、测试人员或运维人员没有检查出来,而开启的重试机制(如Nginx重试、RPC通信重试或业务层重试等)

    幂等解决方案

    1. 全局唯一ID是一个通用方案,可以支持插入、更新、删除业务操作。
    2. Token机制的核心就是要求客户端的每次请求里必须携带一个UUID
    3. MVCC:多版本并发控制方式,操作时带上版本号:update t1 set x=y ,version=version+1 where version=xxx,优点是提升了并发响应能力,实现也简单,缺点是只适用更新接口,还是会将重复请求达到数据库,数据库压力较大
    4. 状态机机制,本质上是MVCC方式的变种:订单有多个业务状态,每次操作数据会带上一个状态,只有在上一个状态匹配的情况下会更新数据,优缺点和MVCC大同小异,但这种机制解决了插入的问题,不仅仅适用在更新接口
    展开全文
  • 随着信息技术和网络的快速发展,同时也加速了数据中心建设的发展。数据中心对于像万达这种分支机构众多的大型企业、以及垂直层级较多的政府单位来说,是信息处理的中心。随着企业IT架构的不断扩展,服务器、存储设备...

    随着信息技术和网络的快速发展,同时也加速了数据中心建设的发展。数据中心对于像万达这种分支机构众多的大型企业、以及垂直层级较多的政府单位来说,是信息处理的中心。随着企业IT架构的不断扩展,服务器、存储设备数量越来越多,加之云架构的出现和普及,数据中心的复杂程度越来越高,运维管理的复杂程度急剧攀升,一个更加稳定且高效的数据中心可以为政企的管理和发展提供强大的支持。


     

    什么是数据中心?

    什么叫数据中心?维基百科给出的定义是“数据中心是一整套复杂的设施。它不仅仅包括计算机系统和其它与之配套的设备(例如通信和存储系统),还包含冗余的数据通信连接、环境控制设备、监控设备以及各种安全装置”。


     

     一个大型的数据中心内部往往都包含了很多小系统,运维工作是围绕着这些具体的应用系统展开。保证数据中心稳定和高效的运行,使之能更好地为业务部门提供强大的支持能力,进而提高企业或政府整体的管理效益,运维管理的重要性愈发凸显。


    数据中心运维机房管理可视化

    数据中心机房管理可视化是创新的IT管理手段,通过机房、设备的三维仿真,提供直观、实时、高效、友好的可视化监控系统界面,将各个子系统清晰展现,并形成一个有机的整体,可以帮助用户轻松掌控全局,高效应对突发事件,智慧制定网络布局决策。


     

    通过3D虚拟仿真的形式对环境进行可视化呈现,包括数据中心真实展现,从园区的外部环境、楼宇到机房内部结构和独立设备均可进行立体仿真展示,并可进行任意角度的调整及场景的切换。利用可视化技术建立与实际机房完全一致的3D虚拟环境,对资产进行可视化呈现。其数据可基于资产管理数据库、CMDB、手工录入或批量导入,可以在3D场景中通过点选查询任意资产对象信息。


     

    数据中心机房管理可视化应集成环境监控系统,对机房的温湿度、电力系统的运行状态、网络设备、主机的性能、空间容量等信息进行实时监控,并通过可视化的方式实时反映系统的运行状态和报警信息。


     

    对于大范围的主干网络、城市各级数据中心、到具体的单台服务器的网络流量、资源、安全态势、设备状态等数据应进行全面监控。将可视化管理范围由园区、机房等物理设施扩展至数据中心所支撑的业务、应用、系统、流程,为IT管理者提供对整个IT系统的端到端可视化手段,并通过开放的数据接口,集成IT管理中的各个软件系统,为IT运维管理提供统一的可视化平台。


     

    数据中心机房管理可视化的优势:

    1、通过3D和2D计算机图形技术及图形化数据处理技术,将来自不同区域、不同工具的管理数据进行统一展现和管理。对于骨干网络的空间分布,逻辑拓补结构,以及具体机房的所有服务器运行态势,全部提供高效、易于理解的监管,为企业IT管理和数据中心管理提供了创新的可视化管理手段,有效解决IT架构和数据中心的管理难题。

    2、对于云架构的网络可进行可视化表达,能够实现从物理网络和虚拟网络两个视角把握整个云状态,在两个维度间互相切换并清晰标识设备的对应关系。从现实到逻辑、从全局到端口的IT和数据中心全面可视化的软件平台。

    3、设计上,能够平衡实用性和设计感,采用不同风格处理大量信息的显示,在界面元素的细微之处又增加细节元素,让整体风格简洁但不单薄。无论是图表、GIS 视图、拓补图还是仪表盘面板,都能高效率、高质量的运转,并和用户的底层系统实现低耦合的数据对接。

    4、大屏显示、多屏联动的解决方案便于客户对大范围、多区域、大量设备的网络进行全面监控。既可单屏运行,亦可多屏联动运行,还可支持一屏主控,其他多屏从动的操作情境,并且支持键鼠,触控两种交互模式。


     

    如果说一本书可以改变一个人的思维模式,那么一个新的管理方式则可能会改变一个企业的发展轨迹。优质的数据中心运维管理系统能够协助企业整合优化企业信息资源和服务、提高生产率和竞争力,是为企业创造更多价值的有力保障。想做好企业,那就定下一个小目标,先做好数据中心运维!

    展开全文
  • 鸟哥的服务器《十三》Web服务器

    千次阅读 2017-04-20 19:15:43
    4. Apache 服务的配置文件 5. Apache 服务器控制存取方式 6. Apache 服务的高级配置 7. PHP 的默认参数修改 8. 启动WWW服务于测试PHP模块 9. MySQL 的基本设定 10. 安装设置及详细操作 11. 基于openssl的https服务...

    1. 客户端访问Web服务器的几个阶段

    客户端向服务器发出Web请求
    Web 服务器与客户端机那里连接
    服务器找到文档传回客户端
    资源通过浏览器解释并显示在屏幕上

    2. HTTP报文详解

    • HTTP报文:它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文都是在客户端、服务器和代理之间流动。

    • HTTP报文的流动方向:一次HTTP请求,HTTP报文会从“客户端”流到“代理”再流到“服务器”,在服务器工作完成之后,报文又会从“服务器”流到“代理”再流到“客户端”

    • 报文的语法:所有的HTTP报文都可以分为两类,请求报文和响应报文。请求和响应报文的基本报文结构大致是相同的,只有起始行的语法有所不同。

    • 请求报文:它会向Web服务器请求一个动作
      请求报文的格式:
      起始行: < method> < request-URL> < version>
      头部: < headers>
      主体: < entity-body>

    • 响应报文:它会将请求的结果返回给客户端。
      响应报文的格式:
      起始行: < version> < status> < reason-phrase>
      头部: < headers>
      主体: < entity-body>

    • 下面是对各部分的简要描述:
      1、方式(method):客户端希望服务器对资源执行的动作,是一个单独的词,比如,GET、POST或HEAD
      2、请求URL(request-URL):要直接与服务器进行对话,只要请求URL是资源的绝对路径就可以了,服务器可以假定自己是URL的主机/端口
      3、版本(version):报文所使用的HTTP版本。其格式:HTTP/<主要版本号>.<次要版本号>
      4、状态码(status-code):状态码是三位数字,描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(比如,“成功”、“出错”等等)
      5、原因短语(reason-phrase):数字状态码的可读版本,包含行终止序列之前的所有文本。原因短语只对人类有意义,因此,尽管响应行HTTP/1.0 200 NOT OK和HTTP/1.0 200 OK中原因短语的含义不同,但同样都会被当作成功指示处理
      6、头部(header):可以有零个或多个头部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF首部是由一个空行(CRLF)结束的,表示了头部列表的结束和实体主体部分的开始
      7、实体的主体部分(entity-body):实体的主体部分包含一个由任意数据组成的数据块,并不是所有的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。

    • HTTP报文的组成部分:对报文进行描述的起始行、包含属性的头部块、可选的,包含数据的主体部分
      1、起始行:所有的HTTP报文都以一个起始行作为开始。请求报文的起始行说明了要做些什么。响应报文的起始行说明发生了什么。
      请求报文的起始行:该行包含了一个方法和一个请求的URL,还包含HTTP 的版本。
      响应报文的起始行:该行包含了响应报文使用的HTTP版本、数字状态码、原因短语。
      2、头部:HTTP首部字段向请求和响应报文中添加了一些附加信息。本质上来说,它们只是一些名/值对的列表。头部和协议配合工作,共同决定了客户端和服务器能做什么事情。
      头部的分类:

      通用头部:既可以出现在请求报文中,也可以出现在响应报文中,它提供了与报文相关的最基本的信息       
      Connection:允许客户端和服务器指定与请求/响应连接有关的选项     
      Date:提供日期和时间标志,说明报文是什么时间创建的     
      MIME-Version:给出了发送端使用的MIME版本        
      Trailer:如果报文采用了分块传输编码方式,就可以用这个首部列出位于报文拖挂部分的首部集合     
      Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式     
      Update:给出了发送端可能想要“升级”使用的新版本或协议      
      Via:显示了报文经过的中间节点(代理、网关)     
      Cache-Control:用于随报文传送缓存指示       
      
      - 请求头部:请求头部是只在请求报文中有意义的头部。用于说明是谁或什么在发送请求、请求源自何处,或者客户端的喜好及能力     
      Client-IP:提供了运行客户端的机器的IP地址      
      From:提供了客户端用户的E-mail地址      
      Host:给出了接收请求的服务器的主机名和端口号        
      Referer:提供了包含当前请求URI的文档的URL     
      UA-Color:提供了与客户端显示器的显示颜色有关的信息       
      UA-CPU:给出了客户端CPU的类型或制造商     
      UA-OS:给出了运行在客户端机器上的操作系统名称及版本        
      UA-Pixels:提供了客户端显示器的像素信息        
      User-Agent:将发起请求的应用程序名称告知服务器            
      Accept:告诉服务器能够发送哪些媒体类型      
      Accept-Charset:告诉服务器能够发送哪些字符集       
      Accept-Encoding:告诉服务器能够发送哪些编码方式     
      Accept-Language:告诉服务器能够发送哪些语言       
      TE:告诉服务器可以使用那些扩展传输编码        
      Expect:允许客户端列出某请求所要求的服务器行为      
      Range:如果服务器支持范围请求,就请求资源的指定范围        
      If-Match:如果实体标记与文档当前的实体标记相匹配,就获取这份文档        
      If-Modified-Sinec:除非在某个指定的日期之后资源被修改过,否则就限制这个请求      
      If-None-Match:如果提供的实体标记与当前文档的实体标记不相符,就获取文档      
      If-Range:允许对文档的某个范围进行条件请求       
      If-Unmodified-Since:除非在某个指定日期之后资源没有被修改过,否则就限制这个请求       
      Authorization:包含了客户端提供给服务器,以便对其自身进行认证的数据        
      Cookie:客户端用它向服务器传送数据        
      Cookie2:用来说明请求端支持的cookie版本      
      Max-Forward:在通往源端服务器的路径上,将请求转发给其他代理或网关的最大次数     
      Proxy-Authorization:这个首部在与代理进行认证时使用的        
      Proxy-Connection:这个首部是在与代理建立连接时使用的      
      
      
      
      - 响应头部:响应头部为客户端提供了一些额外信息,比如谁在发送响应、响应者的功能,甚至与响应相关的一些特殊指令     
      Age:(从最初创建开始)响应持续时间     
      Public:服务器为其资源支持的请求方法列表     
      Retry-After:如果资源不可用的话,在此日期或时间重试     
      Server:服务器应用程序软件的名称和版本      
      Title:对HTML文档来说,就是HTML文档的源端给出的标题        
      Warning:比原因短语更详细一些的警告报文     
      Accept-Ranges:对此资源来说,服务器可接受的范围类型        
      Vary:服务器会根据这些首部的内容挑选出最适合的资源版本发送给客户端     
      Proxy-Authenticate:来自代理的对客户端的质询列表       
      Set-Cookie:在客户端设置数据,以便服务器对客户端进行标识       
      Set-Cookie2:与Set-Cookie类似       
      WWW-Authenticate:来自服务器的对客户端的质询列表        
      
      
      
      - 实体首部:描述主体的长度和内容,或者资源自身        
      Allow:列出了可以对此实体执行的请求方法      
      Location:告知客户端实体实际上位于何处,用于将接收端定向到资源的位置(URL)上去       
      Content-Base:解析主体中的相对URL时使用的基础URL       
      Content-Encoding:对主体执行的任意编码方式       
      Content-Language:理解主体时最适宜使用的自然语言        
      Content-Length:主体的长度        
      Content-Location:资源实际所处的位置      
      Content-MD5:主体的MD5校验和       
      Content-Range:在整个资源中此实体表示的字节范围      
      Content-Type:这个主体的对象类型      
      ETag:与此实体相关的实体标记        
      Expires:实体不再有效,要从原始的源端再次获取实体的日期和时间      
      Last-Modified:这个实体最后一次被修改的日期和时间     
      
      - 扩展首部:规范中没有定义的新首部,开发者可以自定义一个首部的值/

      3、实体的主体部分:该部分其实就是HTTP要传输的内容,是可选的。HTTP报文可以承载很多类型的数字数据,比如,图片、视频、HTML文档电子邮件、软件应用程序等等。

    • HTTP方法:并不是每个服务器都实现了所有的方法。即使服务器实现了所有这些方法,这些方法的使用很可能也是受限的。例如,支持DELETE方法或PUT方法的服务器可能并不希望任何人都能够删除或存储资源,这些限制通常都是在服务器的配置中进行设置的。

    • 常用的HTTP方法:
      GET方法:通常用于请求服务器发送某个资源。不包含主体
      HEAD方法:与GET方法类似,但服务器在响应中只返回首部,使用HEAD方法可以,在不获取资源的情况下了解资源的情况(比如,判断其类型);通过查看响应中的状态码,看看某个对象是否存在;通过查看首部,测试资源是否被修改了;不包含主体
      POST方法:该方法是用来向服务器发送数据的,常用于HTML表单,包含主体
      PUT方法:该方法的语义就是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,如果那个URL已经存在的话,就用这个主体来替代它。包含主体
      TRACE方法:主要用于验证请求是否如愿穿过了请求/响应链,不包含主体
      OPTIONS方法:决定可以在服务器上执行那些方法,不包含主体
      DELETE方法:该方法就是请服务器删除请求URL所指定的资源,但是客户端应用程序无法保证删除操作一定会被执行,因为HTTP规范允许服务器在不通知客户端的情况下撤销请求,不包含主体

    • 扩展方法:指的是没有在HTTP/1.1规范中定义的方法,这些方法为开发者提供了一种扩展这些HTTP服务能力的手段。

    • 状态码:HTTP状态码被分成了五大类。状态码为客户端提供了一种理解事务处理结果的便捷方式。
      1、100~199(信息性状态码):HTTP/1.1向协议中引入了信息性状态码
      2、200~299(成功状态码):客户端发起请求时,这些请求通常都是成功的。服务器有一组用来表示成功的状态码,分别对应于不同类型的请求
      3、300~399(重定向状态码):重定向状态码要么告知客户端使用替代位置来访问他们所感兴趣的资源,要么就提供一个替代的响应而不是资源的内容
      4、400~499(客户端错误状态码):有时客户端会发送一些服务器无法处理的东西。浏览网页时,我们都看到过臭名昭著的404 Not Found错误码,这只是服务器在告诉我们,它对我们请求的资源一无所知
      5、500~599(服务器错误状态码):有时客户端发送了一条有效请求,服务器自身却出错了,这些会返回5xx状态码

    3. WWW 所需软件与其结构

    • 软件
      httpd:提供Apache主程序
      mysql:客户端
      mysql-server:服务器程序
      php:PHP 主程序含给 Apache 使用的模块
      php-devel:PHP的发展工具
      php-server:提供给PHP程序读取M有SQL数据库的模块

    • 配置文件

      Apache 相关:
      /etc/httpd/conf/httpd.conf 主配置文件
      /etc/httpd/conf/*.conf 很多的额外参数文件,是主配置文件的组成部分
      /usr/lib64/httpd/modules/、/etc/httpd/modules/ 外挂放置目录
      /var/www/html/ 首页放置目录
      /var/www/error / 错误信息放置目录
      /var/www/icons/ 小图标放置目录
      /var/www/cgi-bin/ 网页程序放置目录
      /var/log/httpd/ 日志文件放置目录
      /usr/sbin/apachectl 主要执行文件
      /usr/sbin/httpd 二进制执行文件
      /usr/sbin/htpasswd 密码保护

      MySQL相关:
      /etc/my.cnf 主配置文件
      /var/lib/mysql/ 文件存储

      PHP 相关:
      /etc/httpd/conf/php.conf PHP设置参数
      /etc/php.ini 主配置文件
      /usr/lib64/httpd/modules/libphp5.so 提供给Apache 的模块
      /etc/php.d/mysql.ini、/usr/lib64/php/modules/mysql.so MySQL接口
      /usr/bin/phpsize、/usr/include/php/ 加速器功能

    4. Apache 服务的配置文件

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

    [root@CentOS ~]# cd /etc/httpd
    [root@CentOS httpd]# pwd
    /etc/httpd
    [root@CentOS httpd]# ls -l
    total 8
    drwxr-xr-x. 2 root root 4096 Apr  7 03:28 conf
    drwxr-xr-x. 2 root root 4096 Apr  7 03:34 conf.d
    lrwxrwxrwx. 1 root root   19 Apr  7 03:28 logs -> ../../var/log/httpd
    lrwxrwxrwx. 1 root root   29 Apr  7 03:28 modules -> ../../usr/lib64/httpd/modules
    lrwxrwxrwx. 1 root root   19 Apr  7 03:28 run -> ../../var/run/httpd
    
    [root@CentOS ~]# vim /etc/hosts  #没有解析名时要有默认本地主机,否则报错
    127.0.0.1       localhost.localdomain   localhost
    

    /etc/httpd/conf/httpd.conf 共分为全局配置、主服务器配置、虚拟主机配置 3 部分。

    • Apache 全局配置
    全局配置相关说明
    根目录ServerRoot ” /etc/httpd” 为 Apache 的根目录。包括配置文件、记录文件及模块文件,都在该目录下
    保存父进程 IDPidFile run/httpd.pid 文件保存着 Apache 父进程的 ID
    超时时间的设定客户端超过时间没连上服务器,或者服务器没传送信息给客户端,则强制断线
    客户端同时提出多个请求的设置KeepAlive On 允许客户端同时提出多个请求
    每次联系允许的最大请求数目MaxKeepAliveRequests 50 每次联系允许的最大请求数目,数字越大效率越高,0是不限制
    用户端发出请求短线设置KeepAliveTimeout 18 表示用户端的请求如果超过18s还没有发出,则断线
    MinSpareServers/ MaxSpareServers最少/最多闲置httpd进程数
    启动时打开的httpd 进程数目StartServer 10 启动时打开的httpd进程数目为10
    限制客户端的同时最大连接数目MaxClient 200 表示客户端同时最大链接数目为200
    限制每个httpod进程可以完成的最大任务数MaxRequestsPerChild 4000 限制每个httpd 进程可以完成的最大任务数目为4000
    设置监听端口Listen 12.34.56.78 Listen 80
    加载 DSO 模块LoadModule auth_basic_module; module_mod_auth_basic.so 表示加载 DSO 模块。DSO:动态共享对象
    检测状态信息ExtendedStatus Off 用于检测状态信息
    设置工作用户和组User apache Group apache

    - 主服务器配置

    主服务器配置相关说明
    配置管理员的电子邮件地址ServerAdmin root@localhost
    设置主机名称ServerName 完整域名:端口号
    网页存放目录Document 目录路径
    根据文件内容判断文件的类型\

    5. Apache 服务器控制存取方式

    在配置文件 /etc/httpd/conf/httpd.conf 中,有4种控制存取方式:

    针对目录的 形式
    针对文件的 形式
    针对位置的 形式
    形式

    <Dirtory />
        Option FollowSymLinks
        AllowOverride None
    </Dirtory>
    
    • Option 选项
    选项说明
    ExecCGI允许所有动作,除了 MultiViews、IncludeNOEXEC及SysLinksidOwnerMatch
    FollowsSymLinks允许执行 CGI
    Includes允许 SSI
    IncludesNOEXEC允许SSI,但CGI的exec和include 除外
    Indexes允许显示文件列表
    MultiViws允许不同的显示方式,例如语言和图形
    SymLinksOwnerMatch允许符号链接到其他目录,但必须是拥有者

    - 浏览权限的设置

    1 . 分布式特定目录存取控制(.htaccess 文件控制存取)

    .htaccess 文件是一个访问控制文件,该文件主要用来配置相应目录的访问位置。
    下面看看 AllowOverride 中的配置

    AllowOverride none  
    

    .htaccess 文件文件完全被忽略,要打开该文件,可以使用如下方法

    <Dirtory />
        Option FollowSymLinks
        AllowOverride None
    </Dirtory>
    

    然后将其中的 AllowOverride None 修改为 AllowOverride AuthConfig ,修改后的配置如下

    <Dirtory />
        Option FollowSymLinks
        AllowOverride None
    </Dirtory>
    

    通过上面的设置,即可在需要进行访问控制的目录下创建一个 .htaccess 文件。文件名也可以在 http.conf 中通过 AccessFileName ToBeProteccted 进行重新设置

    位于 httpd.conf 的相应文件的AllowOverride,主要是控制.htaccess文件中允许进行的设置,其 Override 详细参数

    Override 参数描述
    ALL允许一下所有功能
    AuthConfig允许AuthDBMGroupFile、AuthDBMUserFile、AuthGroupFile、AuthName、AuthDigestRealmSeed、AuthType、AuthUserFile及Require
    FileInfo允许AddEncoding、AddLanguage、AddType、ErrorDocument及LanguagePriority
    Limit能够以主机名或者IP地址进行限制
    Options允许使用 Option
    None一下所有功能不被允许

    2 . 整体存取控制

    限制访问所有以P开头的目录

    \

    6. Apache 服务的高级配置

    • 创建虚拟目录

    创建虚拟目录可以使用 Alias 指令或 AliasMatch 指令

    使用 Alias 指令创建

    Alias 虚拟目录 真实目录

    使用 AliasMatch 指令创建虚拟目录

    AliasMatch 正则表达式 真实的本机目录

    • 设置目录权限

    创建虚拟目录并经服务器重启后,客户端暂时还是不能访问,需要使用容器来配置虚拟目录的目录权限

    <Dirtory 目录路径>  
    ......  
    </Dirtory>  
    

    例如为 /download 设置目录权限

    <Dirtory "export/public/software">
    Option Indexs MutiViews
    AllowOverride None
    Order allow,deny
    Allow from all
    </Dirtory>
    
    • 配置与管理虚拟主机

    方法一:在一台计算机上运行多台 Web 服务器,每台 Web 服务器上部署一个网站,然后为每台Web服务器指定其监听的 IP 地址与端口
    方法二:在一台 Web 服务器上部署一个网站,为每个网站指定不同的目录用于存放每个网站的文件,同时需要为不同的网站指定不同的IP地址和端口,或者指定不同的主机名称,此种方法最为常用。此时,可以把每个网站看成是一台虚拟主机

    1 . 基于IP地址的虚拟主机(IP Based)
    除了设置监听地址外,还需要使用 容器来定义虚拟主机

    <VirtualHost IP地址:[端口号] [IP地址:[端口号]] ...>
        ······
    </VirtualHost>
    

    在一台服务器上分别设置两个 Web 站点,一个是 IP地址是192.168.1.2,另一个IP地址是192.168.1.4

        [root@CentOS ~]# /sbin/ifconfig eth0:0 192.168.1.2 netmask 255.255.255.0
        # 找到 http.conf 添加内容
        <VirtualHost 192.168.1.2>                               # 绑定第一台虚拟主机IP
        ServerAdmin webmaster@testdomain.tst            # 设置管理员邮箱
        DocumentRoot /var/www/testdomain                        # 设置虚拟主机文档路径
        ServerName www.testdomain.tst                           # 设置主机名 
        ErrorLog /var/log/httpd/www.testdomain.tst/error.log    # 设置错误记录文档
        </VirtualHost>
        <VirtualHost 192.168.1.4>                               # 绑定第二台虚拟主机IP
        ServerAdmin webmaster@othertestdomain.tst           # 设置管理员邮箱
        DocumentRoot /var/www/othertestdomain.tst               # 设置虚拟主机文档路径
        ServerName www.othertestdomain.tst                      # 设置主机名 
        ErrorLog /var/log/httpd/www.othertestdomain.tst/error.log           # 设置错误记录文档
        </VirtualHost>
    

    2 . 基于主机的虚拟主机(Name Based)

    NameVirtualHost IP地址: 端口 
    

    假设IP地址是192.168.1.4的服务器,要为www.test1.tst 和www.test2.tst同时服务,则可以通过 httpd.conf 中添加内容实现

    NameVirtualHost 192.168.1.4 ; 指定绑定IP地址。如果想在服务器上所有IP地址进行绑定,可以使用*
    
    # 第一台虚拟主机配置:
    <VirtualHost *>                     
    ServerName www.test1.tst            # 设置第一个虚拟主机名
    ServerAlias test1.tst *.test1.tst   # 为了在浏览器输入test.tst也能访问
    DocumentRoot /var/www/test1         # 指定虚拟文档位置
    </VirtualHost>
    
    # 第二台虚拟主机配置
    <VirtualHost *>                     
    ServerName www.test2.tst            # 设置第一个虚拟主机名
    DocumentRoot /var/www/test2         # 指定虚拟文档位置
    </VirtualHost>
    
    • 用户认证和授权
      1 . 简介

    [root@CentOS ~]# htpasswd [-bcD] [-mdps] 密码文件名字 用户名

    参数说明
    -b用批处理方式创建用户
    -c新车间一个密码文件
    -D删除一个用户
    -m采用 MD5 加密
    -d采用 CRYPT 加密 ,这是默认值
    -p采用明文格式的密码
    -s采用 SHA 加密
    #创建一个用于 .htaccess 密码认证的用户 Neo
    [root@CentOS ~]# htpasswd -mbc .htpasswd Neo 000000
    

    2 . 指定相应的认证方式

    <Dirtory /home/clinuxer/public>
    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile /usr/local/apache/passwd/.htpasswd
    Require user clinuxer
    </Directory>
    
    摘要认证

    htdigest -c /etc/httpd/digesturefile “Infomation” ly

    匿名认证

    Anonymous userName1 userName2 …

    基于文件的认证

    AuthUserFile userFilePath
    AuthGroupFile groupFilePath

    基于数据库的认证

    3 . 具体实例

    # 创建用户
    [root@CentOS ~]# cd /hhwork/public/software
    [root@CentOS software]# /usr/bin/htpasswd -c /usr/local/apache/passwd/.htpasswd Rose
    [root@CentOS ~]# /usr/bin/htpasswd 。htpasswd apple
    # 设置该目录允许采用 .htaccess 进行身份验证
    [root@CentOS ~]# vim /etc/httpd/conf/httpd.conf
        Alias /dec/ "hhwork/public/software"
        <Directory /hhwork/public/software>
            Option Indexes MutiViews    # 允许列目录
        AllowOverride AuthConfig        # 启用用户身份验证
        Order deny,allow
        allow from all                  # 允许所有用户访问
        </Directory>
    [root@CentOS ~]# /etc/init.d/httpd restart
    # 在 /hhwork/public/software 目录下新建一个具有以下内容的 .htaccess 文件 
    [root@CentOS ~]# cd /hhwork/public/software
    [root@CentOS ~]# touch /htaccess
    [root@CentOS ~]# vim .htaccess
        AuthName "Test example"
        AuthType Basic
        AuthUserFile /usr/local/apache/passwd/.htpasswd
        require user Rose
    # 使用浏览器访问受限目录
    

    4 . 具体实例

    # 在 /usr/local/apache/passwd/ 目录下创建一个具有如下内容的 .htaccess 文件 
    allowusr: Rose stella
    # 打开 .htaccess 文件
        AuthName "Test Group Zero"
        AuthType Basic 
        AuthUserFile /usr/local/apache/passwd/.htpasswd
        AuthGroupFile /usr/local/apache/passwd/.htgroup
        Require group allowusr
    # 使用同组的 Rose 和staella 这两个用户都可以访问Apache 服务器上的访问受限的目录
    
    • 配置 SSI(服务器端包含指令)

    在配置文件 http.conf 或 .htaccess 中给 Option 指令添加 +Includes 值
    Option +includes

    可以通过两种方法实现服务器指定解析 HTML 文件

    1 . AddType text/html .shtml
    AddOutputFilter INCLUDE .shtml
    2 . chmod +x pagename.html

    • MIME 类型简介(多用途互联网邮件扩展)

    AddType Type/SubType extension
    例如为.tgz包指定MIME类型
    AddType application/x-tat.tgz

    7. PHP 的默认参数修改

    [root@CentOS ~]# cd /etc/httpd/conf.d
    [root@CentOS conf.d]# ll *.conf
    -rw-r--r--. 1 root root  295 May 21  2009 manual.conf
    -rw-r--r--. 1 root root  118 May 20  2009 mod_dnssd.conf
    -rw-r--r--. 1 root root 1796 Apr 22  2005 perl.conf
    -rw-r--r--. 1 root root  674 Nov 12  2010 php.conf
    -rw-r--r--. 1 root root 9473 Dec  8  2009 ssl.conf
    -rw-r--r--. 1 root root  352 Sep  9  2004 webalizer.conf
    -rw-r--r--. 1 root root  299 May 21  2009 welcome.conf
    -rw-r--r--. 1 root root   43 Jul 14  2009 wsgi.conf
    
    [root@CentOS conf.d]# vim /etc/httpd/conf.d/php.conf
    <IfModule prefork.c>  #根据不同的 PID 模式给予不同的 PHP 运行模块
      LoadModule php5_module modules/libphp5.so
    </IfModule>
    <IfModule worker.c>
      LoadModule php5_module modules/libphp5-zts.so
    </IfModule>
    AddHandler php5-script .php      # 所以扩展名一定是 .php 结尾 
    AddType text/html .php           #.php 结尾的文件是纯文本文档
    DirectoryIndex index.php         #首页文件名增加 index.php 
    #AddType application/x-httpd-php-source .phps
    
    [root@CentOS ~]# vim /etc/php.ini 
    register_globals = Off
    
    log_errors = On  #是否将PHP程序的错误记录起来
    ignore_repeated_error = On 
    ignore_repeated_source = On 
    
    display_errors = Off    #是否在浏览器上面显示相关错误信息
    display_startup_error = Off
    
    post_max_size = 20M   #729行#上传容量限制
    file_upload = On    
    upload_max_filesize = 16M   #878行
    memory_limit = 128M
    

    8. 启动WWW服务于测试PHP模块

    # 启动
    [root@CentOS ~]# /etc/init.d/httpd start
    Starting httpd:                                            [  OK  ]
    [root@CentOS ~]# /etc/init.d/httpd configtest
    Syntax OK
    [root@CentOS ~]# chkconfig httpd on
    或者
    [root@CentOS ~]# /usr/sbin/apachectl start #开启
    [root@CentOS ~]# /usr/sbin/apachectl stop  #关闭
    
    # 先看看 port 有没有启动
    [root@CentOS ~]# netstat -tulnp | grep 'httpd'
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3555/httpd          
    # 再看看登录文件的信息记录了什么
    [root@CentOS ~]# tail /var/log/httpd/error_log 
    [Mon Apr 17 21:28:23 2017] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
    [Mon Apr 17 21:28:23 2017] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
    [Mon Apr 17 21:28:24 2017] [notice] Digest: generating secret for digest authentication ...
    [Mon Apr 17 21:28:24 2017] [notice] Digest: done
    [Mon Apr 17 21:28:24 2017] [warn] mod_wsgi: Compiled for Python/2.6.2.
    [Mon Apr 17 21:28:24 2017] [warn] mod_wsgi: Runtime using Python/2.6.5.
    [Mon Apr 17 21:28:24 2017] [notice] Apache/2.2.15 (Unix) DAV/2 PHP/5.3.2 mod_ssl/2.2.15 OpenSSL/1.0.0-fips mod_wsgi/3.2 Python/2.6.5 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations
    

    9. MySQL 的基本设定

    #启动
    [root@CentOS ~]# /etc/init.d/mysqld start
    [root@CentOS ~]# netstat -tulnp | grep 'mysql'
    tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      3871/mysqld  
    # 测试是否能连上mysql
    [root@CentOS ~]# mysql -u root
    # 设置mysql管理员密码
    [root@CentOS ~]# mysqladmin -u root password 'your.password' #以后就需要密码了
    [root@CentOS ~]# mysql -u root -p #设置密码your.password
    Enter password: your.password
    
    mysql> grant all priviliges on kevin.* to kevin@localhost identified by 'kevinpw' ;
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | test               |
    +--------------------+
    3 rows in set (0.01 sec)
    
    mysql> select * from user where user = 'kevinuser' ;
    Empty set (0.00 sec)
    
    mysql> exit
    Bye
    
    
    # MySQL root密码遗忘紧急处理
    # 将MySQL关闭,将/var/lib/mysql/*那个目录的数据删除,然后重启MySQL,数据库会重建,密码会消失
    
    

    MySQL效率调优/etc/my.cnf

    10. 安装设置及详细操作

    [root@CentOS ~]# yum list all http*
    httpd.x86_64           2.2.15-5.el6.centos      @anaconda-CentOS-201106060106.x86_64/6.0
    httpd-manual.noarch    2.2.15-5.el6.centos      @anaconda-CentOS-201106060106.x86_64/6.0
    httpd-tools.x86_64     2.2.15-5.el6.centos      @anaconda-CentOS-201106060106.x86_64/6.0
    Available Packages
    httpd.x86_64           2.2.15-59.el6.centos     base                                    
    httpd-devel.i686       2.2.15-59.el6.centos     base                                    
    httpd-devel.x86_64     2.2.15-59.el6.centos     base                                    
    httpd-manual.noarch    2.2.15-59.el6.centos     base                                    
    httpd-tools.x86_64     2.2.15-59.el6.centos     base 
    
    [root@CentOS ~]# getenforce # 确保SELinux是禁用状态
    Enforcing
    [root@CentOS ~]# setenforce 0 #当前生效
    [root@CentOS ~]# vim /etc/sysconfig/selinux #永久有效
    或者 
    [root@CentOS ~]# vim /etc/selinux/config #与上一个是同一个文件
    SELINUX=permissive
    [root@CentOS ~]# yum install httpd
    [root@CentOS ~]#  rpm -ql httpd | less  #查看安装生成了哪些文件
    [root@CentOS ~]# netstat -tulnp | grep :80
    [root@CentOS ~]# ps aux | grep httpd
    [root@CentOS ~]# tree /etc/httpd/conf.d/
    /etc/httpd/conf.d/
    ├── manual.conf
    ├── mod_dnssd.conf
    ├── perl.conf
    ├── php.conf
    ├── README
    ├── ssl.conf
    ├── webalizer.conf
    ├── welcome.conf  #默认欢迎页面
    └── wsgi.conf
    
    0 directories, 9 files
    
    [root@CentOS ~]# mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.bak #删除首页
    [root@CentOS ~]# service httpd restart
    
    [root@CentOS ~]# vim /var/www/html/a.html #自定义首页,
    首页需要在配置文件定义默认页面
    
    [root@CentOS ~]# grep "Section" httpd.conf #主配置文件分三个部分
    ### Section 1: Global Environment
    ### Section 2: 'Main' server configuration 
    ### Section 3: Virtual Hosts
    
    [root@CentOS ~]# yum install httpd-manual #本地查看主配置文件命令帮助
    [root@CentOS ~]# vim /etc/httpd/conf.d/manual.conf #安装之后只需要在访问路径之后加上manual即可,如http://192.168.1.110/manual/
    
    #第一部分:全局变量,Global Environment
    [root@CentOS ~]# vim /etc/httpd/conf/httpd.conf 
    ServerTokens OS             #系统信息
    ServerRoot "/etc/httpd"     #根目录
    PidFile run/httpd.pid       #进程文件路径
    Timeout 60                  #接收发送连接无响应的超时时间
    KeepAlive Off               #是否使用常连接,对单个用户来说可以避免重复的三次握手过程,提高系统性能
    MaxKeepAliveRequests 100    #常连接请求数量
    KeepAliveTimeout 15         #常连接超时时间
    #知识扩展:专门的压力测试工具LoadRummer
    
    prefork (一个请求用一个进程响应)
    worker  (一个请求用一个线程响应, (启动多个进程,每个进程生成多个线程))
    event   (一个进程处理多个请求)
    
    [root@CentOS ~]# httpd -l  #列出进程编译所支持的模块
    Compiled in modules:
      core.c
      prefork.c
      http_core.c
      mod_so.c
    
    [root@CentOS ~]# rpm -ql httpd | grep bin
    /usr/sbin/apachectl
    /usr/sbin/htcacheclean
    /usr/sbin/httpd             #默认MPM的prefork模型
    /usr/sbin/httpd.event       #MPM的event模型
    /usr/sbin/httpd.worker      #MPM的worker模型
    /usr/sbin/httxt2dbm
    /usr/sbin/rotatelogs
    /usr/sbin/suexec
    /var/www/cgi-bin
    /var/www/icons/binary.gif
    /var/www/icons/binary.png
    /var/www/icons/binhex.gif
    /var/www/icons/binhex.png
    /var/www/icons/small/binary.gif
    /var/www/icons/small/binary.png
    /var/www/icons/small/binhex.gif
    /var/www/icons/small/binhex.png
    
    [root@CentOS ~]# httpd.worker -l #列出worker模型的web服务器支持的模块
    Compiled in modules:
      core.c
      worker.c
      http_core.c
      mod_so.c
    
    [root@CentOS ~]# httpd.event -l        #列出event模型的web服务器支持的模块
    Compiled in modules:
      core.c
      event.c
      http_core.c
      mod_so.c
    
    <IfModule prefork.c>        #prefork模型(容器)
    StartServers       8        #启动几个空闲进程
    MinSpareServers    5        #最少空闲进程
    MaxSpareServers   20        #最大空闲进程
    ServerLimit      256        #最大客户端数的上限数,
    MaxClients       256        #最大客户端数,必须低于最大客户端数的上限数
    MaxRequestsPerChild  4000   #每个客户端最大请求数
    </IfModule>
    
    <IfModule worker.c>         #worker模型
    StartServers         4      #启动几个空闲进程
    MaxClients         300      #最大客户端数
    MinSpareThreads     25      #最小空闲线程
    MaxSpareThreads     75      #最大空闲线程
    ThreadsPerChild     25      #一个进程生成多少个线程
    MaxRequestsPerChild  0      #每个客户端最大请求数
    </IfModule>
    
    Listen 80       #指定监听的地址和端口,
    Listen 8080     #地址可省略,可同时监听两个端口
    
    LoadModule auth_basic_module modules/mod_auth_basic.so33        #模块化
    
    Include conf.d/*.conf       #包含的配置文件
    User apache                 #指定用户和组
    Group apache
    
    # 第二部分:主服务器'Main' server configuration 
    [root@CentOS ~]# grep Section httpd.conf
    ### Section 1: Global Environment
    ### Section 2: 'Main' server configuration  #2和3不能同时配置出现
    ### Section 3: Virtual Hosts
    # 只提供一个主机
    ServerAdmin root@localhost      #服务器管理员
    ServerName www.example.com:80   #服务器名,不启用则用当前IP反向解析服务器主机名
    UseCanonicalName Off            #正式名称
    DirectoryIndex index.html index.html.var        #指定首页文件
    
    DocumentRoot "/var/www/html"    #文档根目录,首页所在目录,URL指向此路径
    <Directory "/var/www/html">     #定义路径如何被访问(容器)
        Options Indexes FollowSymLinks      #Indexes:索引根目录下所有文件(危险操作),FollowSynLinks: 允许访问符号链接指向的原文件,Includes: 允许执行服务端包含(SSI)(危险操作),ExecCGI: 允许运行CGI脚本,All: 支持所有选项
        AllowOverride None          #允许覆盖下面两项,也可以用认证配置来覆盖用户的访问请求(AuthConfig)
        Order allow,deny            #定义服务器的访问控制列表(有次序)
        Allow from all              #允许所有人访问
    </Directory>
    
    [root@CentOS ~]# httpd -M      #列出额外装载的模块
    
    # 用认证配置来覆盖用户的访问请求(AuthConfig)
    AllowOverride AuthConfig
    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile "/erc/httpd/conf/htpasswd"     #文件必须存在
    Require valid-user                          #允许所有用户访问(使用Require user kevin指定用户访问)
    [root@CentOS ~]# htpasswd -c -m /etc/httpd/conf/htpasswd kevin #第一次需要-c创建文件
    New password: 
    [root@CentOS ~]# htpasswd  -m /etc/httpd/conf/htpasswd tom
    New password: 
    [root@CentOS ~]# cat /etc/httpd/conf/htpasswd
    kevin:$apr1$Plhk95dy$FuUJfP/NXvPaQ7gi/MY5D1
    tom:$apr1$s1X7dP41$1ZbNhnjZDPVY9sAbjQ34U/
    # 再次登录发现需要输入账号密码才能登录
    
    # 用认证配置来覆盖用户的访问请求(AuthConfig)
    AllowOverride AuthConfig
    AuthType Basic
    AuthName "Restricted Files"
    AuthUserFile "/erc/httpd/conf/htpasswd"          #文件必须存在
    AuthGroupFile "/etc/http/conf/htgroup"
    Require group myusers                           #允许组内访问
    [root@CentOS ~]# cat /etc/httpd/conf/htgroup   #添加组内成员
    myusers: kevin tom  
    [root@CentOS ~]# htpasswd -c -m /etc/httpd/conf/htpasswd kevin #第一次需要-c创建文件
    New password: 
    [root@CentOS ~]# htpasswd  -m /etc/httpd/conf/htpasswd tom
    New password: 
    [root@CentOS ~]# cat /etc/httpd/conf/htpasswd
    kevin:$apr1$Plhk95dy$FuUJfP/NXvPaQ7gi/MY5D1
    tom:$apr1$s1X7dP41$1ZbNhnjZDPVY9sAbjQ34U/
    # 再次登录发现需要输入账号密码才能登录
    
    #支持个人用户家目录的网页文件(注意目录权限)
    <IfModule mod_userdir.c>
        UserDir public_html         
    </IfModule>
    [kevin@CentOS ~]$ mkdir public_html
    [kevin@CentOS ~]$ vim public_html/index.html
    [root@CentOS ~]# chmod o+x /home/kevin/  
    #此时浏览http://192.168.1.110/~kevin/ 会显示kevin的首页
    
    #定义.htaccess and .htpasswd 的访问控制权限
    <Files ~ "^\.ht">
        Order allow,deny
        Deny from all
        Satisfy All
    </Files>
    
    AccessFileName .htaccess        #定义每个目录的访问控制权限,只需要将这个文件名新建到当前子目录下(会继承),文件中写访问控制机制(Auth等)(效率低,建议注释掉)
    TypesConfig /etc/mime.types     #让httpd支持MIME(多功能互联网邮件扩展)类型的存放文件
    DefaultType text/plain          #接上,默认文本类型下的明文文本类型
    <IfModule mod_mime_magic.c>     #接上
    #   MIMEMagicFile /usr/share/magic.mime
        MIMEMagicFile conf/magic
    </IfModule>
    
    HostnameLookups Off             #日志中是否记录访问的主机名
    ErrorLog logs/error_log         #错误日志
    LogLevel warn                   #日志级别
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined   #访问日志格式,定义宏,官方手册有说明。http://192.168.1.110/manual/
    LogFormat "%h %l %u %t \"%r\" %>s %b" common        #定义宏
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    %h:远程端地址
    %l:远端主机上登录的的主机用户名
    %u:登录网站使用的用户,账号密码登录的用户名
    %t:日志产生的时间
    %r:请求报文第一行
    %>s:显示原始状态码
    %b:响应报文的大小
    %{Referer}i:首部中显示的时候内容。Referer是网页跳转的时候,从哪个网页来的,
    %{User-Agent}i:首部中的浏览器的类型
    CustomLog logs/access_log combined  #定义访问日志文件和类型,注意combined是上面一段定义的
    
    Alias /icons/ "/var/www/icons/"     #定义路径别名,路径中出现/icons/其实代表/var/www/icons/
    
    # 测试配置文件语法的正确性
    [root@CentOS ~]# httpd -t
    Syntax OK
    # 安装elinks
    [root@CentOS ~]# yum install elinks
    # 查看错误日志
    [root@CentOS ~]# tail /var/log/httpd/error_log 
    
    # 第三部分:虚拟主机Virtual Hosts
    [root@CentOS ~]# grep Section httpd.conf
    ### Section 1: Global Environment
    ### Section 2: 'Main' server configuration
    ### Section 3: Virtual Hosts        #2和3不能同时配置出现
    # 提供多个不同的站点
    虚拟主机
        基于IP
            IP1:80
            IP2:80
        基于端口
             IP:80
            IP:8080
        基于域名
            IP:80
             主机名不同
                www.magedu.com
              www.a.org
              www.b.net
    
    得先取消中心主机,注释中心主机的DocumentRoot即可。
    虚拟主机的定义:
    <VirtualHost HOST>
    …………
    </VirtualHost>
    
    基于IP,HOST的写法:
    HOST
        IP1:80
        IP2:80
    基于端口:
    HOST    
        IP:80
        IP:8080
    基于域名:
        *:80
    ServerName 不同
    
    
    #基于IP的虚拟主机:
    [root@CentOS ~]# vim /etc/httpd/conf/httpd.conf 
    #DocumentRoot "/var/www/html"
    然后添加虚拟主机配置信息即可,或者新建单独的配置文件/etc/httpd/conf.d/virtual.conf
    [root@CentOS ~]# vim /etc/httpd/conf.d/virtual.conf
    <VirtualHost 192.168.1.110:80>
            ServerName www.centos.tst
            DocumentRoot "/www/centos.tst"
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>
            ServerName www.centos2.tst
            DocumentRoot "/www/centos2.tst"
    </VirtualHost>
    [root@CentOS ~]# httpd -t
    Warning: DocumentRoot [/www/centos.tst] does not exist
    Warning: DocumentRoot [/www/centos2.tst] does not exist
    Syntax OK
    [root@CentOS ~]# mkdir -pv /www/{centos,centod2}.tst
    mkdir: created directory `/www/centos.tst'
    mkdir: created directory `/www/centod2.tst
    [root@CentOS ~]# vim /www/centos.tst/index.html
    <title>centos.tst</title>
    <h1>centos.tst</h1>
    [root@CentOS ~]# vim /www/centos2.tst/index.html
    <title>centos2.tst</title>
    <h1>centos2.tst</h1>
    [root@CentOS ~]# httpd -t      #检查语法
    Syntax OK
    
    [root@CentOS ~]# ifconfig 
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:CF:88:43  
              inet addr:192.168.1.110  Bcast:192.168.1.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:576  Metric:1
              RX packets:32114 errors:0 dropped:0 overruns:0 frame:0
              TX packets:16936 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:8406148 (8.0 MiB)  TX bytes:1748974 (1.6 MiB)
    [root@CentOS ~]# ip addr add 192.168.1.105/24 dev eth0     #添加网卡IP地址
    [root@CentOS ~]# ip addr show
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 576 qdisc pfifo_fast state UP qlen 1000
        link/ether 00:0c:29:cf:88:43 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.110/24 brd 192.168.1.255 scope global eth0
        inet 192.168.1.105/24 scope global secondary eth0
    # 访问192.168.1.110和192.168.1.105都可以打开
    
    
    #基于端口的虚拟主机:
    [root@CentOS ~]# vim /etc/httpd/conf.d/virtual.conf
    <VirtualHost 192.168.1.110:80>      #基于IP
            ServerName www.centos.tst
            DocumentRoot "/www/centos.tst"
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>      #基于IP
            ServerName www.centos2.tst
            DocumentRoot "/www/centos2.tst"
    </VirtualHost>
    <VirtualHost 192.168.1.110:8080>    #基于port
            ServerName www.centos3.tst
            DocumentRoot "/www/centos3.tst"
    </VirtualHost>
    [root@CentOS ~]# mkdir /www/centos3.tst/
    [root@CentOS ~]# vim /www/centos3.tst/index.html
    <title>centos3.tst</title>
    <h1>centos3.tst</h1>
    Listen 80                   #监听端口
    Listen 8080
    # 访问192.168.1.110和192.168.1.105和192.168.1.110:8080都可以打开
    
    
    #基于主机名的虚拟主机:(混合使用的虚拟主机)
    [root@CentOS ~]# vim /etc/httpd/conf.d/virtual.conf 
    NameVirtualHost 192.168.1.105:80
    <VirtualHost 192.168.1.110:80>
            ServerName www.centos.tst
            DocumentRoot "/www/centos.tst"
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>      #注意区别
            ServerName www.centos2.tst
            DocumentRoot "/www/centos2.tst"
    </VirtualHost>
    <VirtualHost 192.168.1.110:8080>
            ServerName www.centos3.tst
            DocumentRoot "/www/centos3.tst"
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>      #注意区别
            ServerName www.centos4.tst
            DocumentRoot "/www/centos4.tst"
    </VirtualHost>
    #修改本机(Win7)hosts文件,否则不能解析主机名C:\Windows\System32\drivers\etc\hosts
    192.168.1.105   centos4.tst
    192.168.1.110   centos2.tst
    #Win7下ping 这两个主机名发现可以ping通
    C:\Users\John>ping www.centos2.tst
    正在 Ping www.centos2.tst [192.168.1.110] 具有 32 字节的数据:
    来自 192.168.1.105 的回复: 字节=32 时间=1ms TTL=64
    
    C:\Users\John>ping www.centos4.tst
    正在 Ping www.centos4.tst [192.168.1.105] 具有 32 字节的数据:
    来自 192.168.1.105 的回复: 字节=32 时间=1ms TTL=64
    # 是用IP(192.168.1.105)访问时,那个在第一个哪个先解析(www.centos2.tst)
    
    # 现在日志信息在同一个位置
    [root@CentOS ~]# tail /var/log/httpd/error_log         #错误日志
    [root@CentOS ~]# tail /var/log/httpd/access_log    #访问日志
    
    
    # 让每个站点使用不同的日志
    [root@CentOS ~]# vim /etc/httpd/conf.d/virtual.conf 
    NameVirtualHost 192.168.1.105:80
    <VirtualHost 192.168.1.110:80>
            ServerName www.centos.tst
            DocumentRoot "/www/centos.tst"
            CustomLog /var/log/httpd/centos.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>      #注意区别
            ServerName www.centos2.tst
            DocumentRoot "/www/centos2.tst"
            CustomLog /var/log/httpd/centos2.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.110:8080>
            ServerName www.centos3.tst
            DocumentRoot "/www/centos3.tst"
            CustomLog /var/log/httpd/centos3.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>      #注意区别
            ServerName www.centos4.tst
            DocumentRoot "/www/centos4.tst"
            CustomLog /var/log/httpd/centos4.tst/access_log combined
    </VirtualHost>
    
    [root@CentOS ~]# httpd -t
    [root@CentOS ~]# tail /var/log/messages
    [root@CentOS ~]# tail /var/log/httpd/error_log 
    [root@CentOS ~]# ll -d /var/log/httpd/
    drwx------. 2 root root 4096 Mar 22 14:53 /var/log/httpd/
    [root@CentOS ~]# mkdir -pv /var/log/httpd/centos.tst/      #创建目录
    [root@CentOS ~]# mkdir -pv /var/log/httpd/centos2.tst/
    [root@CentOS ~]# mkdir -pv /var/log/httpd/centos3.tst/
    [root@CentOS ~]# mkdir -pv /var/log/httpd/centos4.tst/
    [root@CentOS ~]# service httpd restart
    [root@CentOS ~]# tree /var/log/httpd/
    /var/log/httpd/
    ├── access_log
    ├── centos2.tst
    │?? └── access_log
    ├── centos3.tst
    │?? └── access_log
    ├── centos4.tst
    │?? └── access_log
    ├── centos.tst
    │?? └── access_log
    ├── error_log
    ├── ssl_access_log
    ├── ssl_error_log
    └── ssl_request_log
    
    
    # 让www.centos4.tst 拒绝192.168.1.101 访问
    先测试用192.168.1.101打开 网页www.centos4.tst,可以访问
    [root@CentOS ~]# vim /etc/httpd/conf.d/virtual.conf
    NameVirtualHost 192.168.1.105:80
    <VirtualHost 192.168.1.110:80>
            ServerName www.centos.tst
            DocumentRoot "/www/centos.tst"
            CustomLog /var/log/httpd/centos.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>          
            ServerName www.centos2.tst
            DocumentRoot "/www/centos2.tst"
            CustomLog /var/log/httpd/centos2.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.110:8080>
            ServerName www.centos3.tst
            DocumentRoot "/www/centos3.tst"
            CustomLog /var/log/httpd/centos3.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>          
            ServerName www.centos4.tst      
            DocumentRoot "/www/centos4.tst"
            CustomLog /var/log/httpd/centos4.tst/access_log combined
            <Directory "/www/centos4.tst">  #访问控制
                    Options none
                    AllowOverride none
                    Order deny,allow
                    Deny from 192.168.1.101
            </Directory>
    </VirtualHost>
    [root@CentOS ~]# httpd -t
    Syntax OK
    # 用192.168.1.101网页登录http://www.centos4.tst/,发现被禁止
    
    
    # 让www.centos2.tst 必须通过账号密码才能访问
    [root@CentOS ~]# vim /etc/httpd/conf.d/virtual.conf
    <VirtualHost 192.168.1.110:80>
            ServerName www.centos.tst
            DocumentRoot "/www/centos.tst"
            CustomLog /var/log/httpd/centos.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>          
            ServerName www.centos2.tst      
            DocumentRoot "/www/centos2.tst"
            CustomLog /var/log/httpd/centos2.tst/access_log combined
            <Directory "/www/centos2.tst">  #身份认证
                    AllowOverride authconfig
                    AuthType basic
                    AuthName "Restrict area."
                    AuthUserFile "/etc/httpd/conf/.htpasswd"
                    Require vaild-user
            </Directory>
    </VirtualHost>
    <VirtualHost 192.168.1.110:8080>
            ServerName www.centos3.tst
            DocumentRoot "/www/centos3.tst"
            CustomLog /var/log/httpd/centos3.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>          
            ServerName www.centos4.tst
            DocumentRoot "/www/centos4.tst"
            CustomLog /var/log/httpd/centos4.tst/access_log combined
            <Directory "/www/centos4.tst">
                    Options none
                    AllowOverride none
                    Order deny,allow
      AllowOverride none
                    Order deny,allow
                    Deny from 192.168.1.101
            </Directory>
    </VirtualHost>
    [root@CentOS ~]# httpd -t
    service httpd restart httpd restart
    [root@CentOS ~]# htpasswd -c -m /etc/httpd/.htpasswd tom
    New password: 
    Re-type new password: 
    Adding password for user tom
    [root@CentOS ~]# htpasswd  -m /etc/httpd/.htpasswd kevin
    New password: 
    Re-type new password: 
    Adding password for user kevin
    [root@CentOS ~]# httpd -t
    # 网页登录192.168.1.105发现需要账号密码
    
    
    # 定义默认虚拟主机
    设定默认虚拟主机
    <VirtualHost _default_:80>
    DocumentRoot /www/default80
    # ...
    </VirtualHost>
    <VirtualHost _default_:*>
    DocumentRoot /www/default
    # ...
    </VirtualHost>
    
    [root@CentOS ~]# vim /etc/httpd/conf.d/virtual.conf
    NameVirtualHost 192.168.1.105:80 
    <VirtualHost _default_:80>          #注意此处
            ServerName default
            DocumentRoot "/www/default"
    </VirtualHost>
    <VirtualHost 192.168.1.110:80>
            ServerName www.centos.tst
            DocumentRoot "/www/centos.tst"
            CustomLog /var/log/httpd/centos.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>          
            ServerName www.centos2.tst      
            DocumentRoot "/www/centos2.tst"
            CustomLog /var/log/httpd/centos2.tst/access_log combined
            <Directory "/www/centos2.tst">  
                    AllowOverride authconfig
                    AuthType basic
                    AuthName "Restrict area."
                    AuthUserFile "/etc/httpd/conf/.htpasswd"
                    Require vaild-user
            </Directory>
    </VirtualHost>
    <VirtualHost 192.168.1.110:8080>
            ServerName www.centos3.tst
            DocumentRoot "/www/centos3.tst"
            CustomLog /var/log/httpd/centos3.tst/access_log combined
    </VirtualHost>
    <VirtualHost 192.168.1.105:80>          
            ServerName www.centos4.tst
            DocumentRoot "/www/centos4.tst"
            CustomLog /var/log/httpd/centos4.tst/access_log combined
            <Directory "/www/centos4.tst">
                    Options none
                    AllowOverride none
                    Order deny,allow
      AllowOverride none
                    Order deny,allow
                    Deny from 192.168.1.101
            </Directory>
    </VirtualHost>
    
    [root@CentOS ~]# mkdir /www/default
    [root@CentOS ~]# vim /www/default/index.html
    <title>default</title>
    <h1>default</h1>
    [root@CentOS ~]# httpd -t
    # 使用本机(Win7)访问http://192.168.1.105/时显示是默认虚拟主机
    
    # 定义本地主机(URL)
    <Location /status>              #样例
        SetHandle server-status     #调用某个文件时执行某个动作
        Order Deny,Allow
        Deny from all
        Allow from .foo .com
    </Location>
    
    [root@CentOS ~]# vim /etc/httpd/conf/httpd.conf 
    <Location /server-status>
        SetHandler server-status
        Order allow,deny
        Allow from all
    </Location>
    # 本机(Win7)访问http://192.168.1.110/server-status会显示服务器状态信息
    

    11. 基于openssl的https服务配置

    [root@CentOS ~]# yum install mod_ssl       #先安装相关模块
    [root@CentOS ~]# rpm -ql mod_ssl           #查看安装了哪些配置文件
    /etc/httpd/conf.d/ssl.conf
    /usr/lib64/httpd/modules/mod_ssl.so
    /var/cache/mod_ssl
    /var/cache/mod_ssl/scache.dir
    /var/cache/mod_ssl/scache.pag
    /var/cache/mod_ssl/scache.sem
    
    # 这里需要一台linxu主机当做 CA,启动另一个linux虚拟机,ip地址192.168.1.120
    # 要想做CA,需要生成自签证书
    [root@CentOS ~]# cd /etc/pki/CA                #生成私钥
    [root@CentOS CA]# pwd
    /etc/pki/CA
    [root@CentOS CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
    Generating RSA private key, 2048 bit long modulus
    ...............................+++
    .........+++
    e is 65537 (0x10001)
    [root@CentOS CA]# ll private/
    total 4
    -rw-------. 1 root root 1679 Apr 20 04:44 okey.pem
    [root@CentOS ~]# vim /etc/pki/tls/openssl.cnf  #编辑自签证书的默认信息
    [ req_distinguished_name ]                      #修改默认信息
    countryName                     = Country Name (2 letter code)
    countryName_default             = CN
    stateOrProvinceName             = State or Province Name (full name)
    stateOrProvinceName_default     = JiLin
    localityName                    = Locality Name (eg, city)
    localityName_default    = ChangChun
    0.organizationName              = Organization Name (eg, company)
    0.organizationName_default      = Changchun Jianzhu Xueyuan
    organizationalUnitName          = Organizational Unit Name (eg, section)
    organizationalUnitName_default  = Dianqi Xinxi Xueyuan
    
    # 给自己生成自签证书
    [root@CentOS CA]# pwd
    /etc/pki/CA
    [root@CentOS CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [CN]:
    State or Province Name (full name) [JiLin]:
    Locality Name (eg, city) [ChangChun]:
    Organization Name (eg, company) [Changchun Jianzhu Xueyuan]:
    Organizational Unit Name (eg, section) [Dianqi Xinxi Xueyuan]:
    Common Name (eg, your name or your server's hostname) []:ca.contos.tst
    Email Address []:admin@centos.tst
    
    [root@CentOS CA]# vim /etc/pki/tls/openssl.cnf
    dir             = /etc/pki/CA           #修改路径
    certs           = $dir/certs            # Where the issued certs are kept
    crl_dir         = $dir/crl              # Where the issued crl are kept
    database        = $dir/index.txt        # database index file.
    #unique_subject = no                    # Set to 'no' to allow creation of
                                            # several ctificates with same subject.
    new_certs_dir   = $dir/newcerts         # default place for new certs.
    
    certificate     = $dir/cacert.pem       # The CA certificate
    serial          = $dir/serial           # The current serial number
    crlnumber       = $dir/crlnumber        # the current crl number
                                            # must be commented out to leave a V1 CRL
    crl             = $dir/crl.pem          # The current CRL
    private_key     = $dir/private/cakey.pem# The private key
    RANDFILE        = $dir/private/.rand    # private random number file
    
    [root@CentOS CA]# touch index.txt
    [root@CentOS CA]# echo 01 > serial
    [root@CentOS CA]# ls
    cacert.pem  certs  crl  index.txt  newcerts  private  serial
    [root@CentOS CA]# 
    # CA做好了,等待签证
    
    # 返回服务器,制作签名请求文件
    [root@CentOS ~]# (umask 077; openssl genrsa 1024 > /etc/httpd/ssl/httpd.key)       #写法不同,跟上面的那个作用一样
    Generating RSA private key, 1024 bit long modulus
    ............++++++
    ...................++++++
    e is 65537 (0x10001)
    [root@CentOS ~]# ll /etc/httpd/ssl/httpd.key 
    -rw-------. 1 root root 887 Apr 20 17:15 /etc/httpd/ssl/httpd.key
    [root@CentOS ssl]# pwd
    /etc/httpd/ssl
    [root@CentOS ssl]# openssl req -new -key httpd.key -out httpd.csr
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:JiLin
    Locality Name (eg, city) [Default City]:ChangChun
    Organization Name (eg, company) [Default Company Ltd]:Changchun Jianzhu Xueyuan
    Organizational Unit Name (eg, section) []:Dianqi Xinxi Xueyuan
    Common Name (eg, your name or your server's hostname) []:www.centos4.tst        #服务器的虚拟主机的主机名
    Email Address []:
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    # 这时候需要传输这个生成的签名请求文件到CA处,否则无法验证签名
    [root@CentOS ssl]# scp httpd.csr 192.168.1.120:/tmp
    root@192.168.1.120's password: 
    httpd.csr                                                100%  704     0.7KB/s   00:00  
    
    # CA签署证书
    [root@CentOS ~]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 3650
    Using configuration from /etc/pki/tls/openssl.cnf
    Check that the request matches the signature
    Signature ok
    Certificate Details:
            Serial Number: 1 (0x1)
            Validity
                Not Before: Apr 20 09:29:57 2017 GMT
                Not After : Apr 18 09:29:57 2027 GMT
            Subject:
                countryName               = CN
                stateOrProvinceName       = JiLin
                organizationName          = Changchun Jianzhu Xueyuan
                organizationalUnitName    = Dianqi Xinxi Xueyuan
                commonName                = www.centos4.tst
            X509v3 extensions:
                X509v3 Basic Constraints: 
                    CA:FALSE
                Netscape Comment: 
                    OpenSSL Generated Certificate
                X509v3 Subject Key Identifier: 
                    F7:D8:DE:53:BE:BE:4F:BF:D3:CE:24:7C:D9:55:9A:8B:40:CB:92:1C
                X509v3 Authority Key Identifier: 
                    keyid:A1:23:25:12:32:84:B7:F5:B3:ED:48:46:30:44:D6:86:3C:BB:C6:EC
    Certificate is to be certified until Apr 18 09:29:57 2027 GMT (3650 days)
    Sign the certificate? [y/n]:y
    1 out of 1 certificate requests certified, commit? [y/n]y
    Write out database with 1 new entries
    Data Base Updated
    
    [root@CentOS ~]# cat /etc/pki/CA/index.txt
    V   270418092957Z       01  unknown /C=CN/ST=JiLin/O=Changchun Jianzhu Xueyuan/OU=Dianqi Xinxi Xueyuan/CN=www.centos4.tst
    [root@CentOS ~]# cat /etc/pki/CA/serial
    02
    
    # 服务器取得签名确认文件
    [root@CentOS ssl]# scp 192.168.1.120:/tmp/httpd.crt ./
    root@192.168.1.120's password: 
    httpd.crt                                                100% 3946     3.9KB/s   00:00    
    [root@CentOS ssl]# ls
    httpd.crt  httpd.csr  httpd.key
    
    # CA 完成最后删除操作
    [root@CentOS ~]# ls /etc/pki/CA/certs/
    [root@CentOS ~]# ls /etc/pki/CA/newcerts/  #查看签署的文件记录
    01.pem
    [root@CentOS ~]# rm -f /tmp/http*          #产出产生的临时文件
    
    # 配置让服务器可以使用此证书
    [root@CentOS ssl]# vim /etc/httpd/conf.d/ssl.conf 
    <VirtualHost 192.168.1.110:443>
    ServerName www.centos.tst
    DocumentRoot "/www/centos.tst
    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log
    LogLevel warn
    SSLEngine on            #是否启用SSL
    SSLProtocol all -SSLv2  #支持的协议
    SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES   #加密机制
    SSLCertificateFile /etc/httpd/ssl/httpd.crt         #证书文件
    SSLCertificateKeyFile /etc/httpd/ssl/httpd.key      #私钥文件
    [root@CentOS ssl]# httpd -t
    Syntax OK
    [root@CentOS ssl]# service httpd restart
    Stopping httpd:                                            [  OK  ]
    Starting httpd:                                            [  OK  ]
    [root@CentOS ssl]# netstat -tulnp | grep httpd
    tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      41390/httpd         
    tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      41390/httpd         
    tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      41390/httpd  
    # 有监听443端口
    
    # 在Win7(C:\Windows\System32\drivers\etc)的Hosts文件中修改
    192.168.1.110       www.centos.tst
    
    # 使用Win7的浏览器:https://www.centos.tst/, 出现证书不受信任
    # 解决方法:将CA的证书发送给客户端一份
    [root@CentOS ~]# cd /etc/pki/CA/       #将cacert.pem传送到Win7
    [root@CentOS CA]# pwd
    /etc/pki/CA
    
    # 在Win7中将文件改名cacert.pem --> cacert.crt
    # 将证书导入浏览器(双击安装)
    # 将所有的证书放入下列存储 --> 受信任的根证书颁发机构 --> 
    # 在浏览器的设置中中可以查看这个证书
    # 用浏览器登录https://www.centos.tst/,就不会出现警告
    
    展开全文
  • 大规模服务设计部署经验谈

    千次阅读 2009-06-26 16:13:00
    大规模服务设计部署经验谈本文中提出的最佳实践,来自于作者多年大规模服务设计和部署的经验,为设计、开发对运营友好的服务提供了一系列良好的解决方案。■ 文/James Hamilton 译/赖翥翔1 引言本文就设计和开发...
  • 如果还是不理解,那么可以举个例子:假如目前有很多人想要给我付钱,但我的服务器除了正在运行支付的服务之外,还有一些其它的服务在运行,比如搜索、定时任务和详情等等。然而这些不重要的服务就占用了JVM的不少...
  • 作为企业管理者你是否遇到以下问题 随着客服人员的流动,...要想做好客户服务得先搭建客服知识库 随着用户期望值的提升,良好的客服工作是企业的发展的重要部分,若要为顾客出示高效率、高品质的服务,除开优良的服
  •  如果还是不理解,那么可以举个栗子:假如目前有很多人想要给我付钱,但我的服务器除了正在运行支付的服务之外,还有一些其它的服务在运行,比如搜索、定时任务和详情等等。然而这些不重要的服务就...
  • 前文概述 出于好奇,我用学生优惠租了一台阿里云服务器,打算做一些Java web的开发,但是毕竟是第一次... 这篇文章,对建网站的方法思路有了全局的理解。 购买服务器新用户领取阿里云1折优惠券(老用户可以新注册账
  • 5、设置完成后,在Windows的服务管理器中重新启动SMTP服务和Microsoft Exchange Routing Engine服务。 注意:如果您设置完成,并且重新启动上述服务后,发现传递限制没有起作用,应该被限制的用户依然可 以向...
  • 微服务之服务监控稳定性

    千次阅读 2020-12-02 19:22:30
    最近一直在忙 618 大促的全链路压测 & 稳定性保障相关工作,结果 618 还未开始,生产环境就出了几次生产故障,且大多都是和系统稳定性、性能相关的 bad...业内喜欢用 SLA (服务等级协议,全称:service level a...
  • 如果你的腾讯云服务器里文件比较重要的话,那么就需要做好备份,并且多关注腾讯云控制台的CVM实例状态、站内信、邮件、微信消息以及手机短信。 一般腾讯云服务器到期后会进行提示,通过站内信、邮件及短信的方式...
  • 游戏服务器开发技术小结

    千次阅读 2017-08-08 15:28:33
    在后续项目的开发实践过程中,我们还需不断优化、完善新设计的逻辑框架,让其可用性更高、可复用性更强,相信经历咱们新项目的洗礼,新的逻辑框架能成为咱们产品中心游戏服务器开发的一把利器。 发布于  手游...
  • 服务器监控是每个互联网厂商都重视并且想要尽可能做好的事情,从数据收集、数据处理、数据可视化最终再到实时监控告警,这一系列复杂的流程可能耗费企业大量的人力和时间,以至于某些时候因为其复杂性高无法达到预期...
  • Ubuntu 服务器指南

    千次阅读 2007-07-04 17:39:00
    无论哪次对您的磁盘进行分区您都应该做好丢失磁盘上所有东西的准备,因为您可能会误操作或者在分区过程中出错,如系统掉电等。在安装中所使用的程序是相当可靠的,大多数已经用了几年,但它们执行的也是破坏性的操作...
  • ubuntu服务器入门

    千次阅读 2006-08-29 23:00:00
    无论哪次对您的磁盘进行分区您都应该做好丢失磁盘上所有东西的准备,因为您可能会误操作或者在分区过程中出错,如系统掉电等。在安装中所使用的 程序是相当可靠的,大多数已经用了几年,但它们执行的也是破坏性的...
  • Ubuntu服务器入门指南

    千次阅读 2011-04-08 07:09:00
    域名解析服务 (DNS) 5.8.1 4.8.1. 安装 5.8.2 4.8.2. 配置 5.8.3 4.8.3. 引用 5.9 CUPS - 打印服务器 5.9.1 4.9.1. 安装 ...
  • 本文将讲一下应用漏洞扫描器在针对本地拒绝服务的检测方法。
  •  游戏逻辑是游戏的核心功能实现,也是整个游戏的服务中心,它被开发的好坏,直接决定了游戏服务器在运行中的性能。那在游戏逻辑的开发中我们要注意些什么呢?  (1)网络通信  游戏是一种网络交互比较...
  • daemons和services(守护进程和服务

    千次阅读 2014-11-26 13:48:03
    Daemons and Services Programming Guide ...提供服务器功能,例如服务web页。协同访问共享资源,如数据库。为前台应用程序工作,例如文件系统访问。 注意:该文档以前的标题是“系统启动编程指南”。
  • 求生之路2服务器指令比较全

    万次阅读 2016-08-23 09:58:22
    bind "b" "say !buy" 绑定 // 远程连接密码 rcon_password 256 net_graph 1 游戏显示FPS+ping的命令 打开控制台输入Sv_Cheats 1 下面就是命令代码: god 1 无敌 buddha 打不死 ...give ammo 加满弹夹
  • 在设计服务中心的过程中,对服务中心内服务接口和数据模型的设计非常重要,良好的设计原则和方法可以最大化地保障服务中心的可扩展性。强烈建议读者学习著名建模专家Eric Evans最具影响力的著...
  • WINDOWS 服务器终极安全方案

    千次阅读 2007-09-13 20:06:00
    原文地址:http://bbs.it577.com/viewthread.php?tid=3831、服务器安全设置之--硬盘权限篇 这里着重谈需要的权限,也就是最终文件夹或硬盘需要的权限,可以防御各种木马入侵,提权攻击,跨站攻击等。...
  • 引言 本文就设计和开发运营友好的服务的话题进行总结,得出一系列最佳实践。设计和部署大规模服务是一个高速发展的领域... 这篇论文是我们在过去的20年中在大规模以数据为中心的软件系统和互联网级大规模服务的智慧结
  • 面向服务的业务环境 面向服务是一种创建分布式系统的方法。在它最抽象的层面,面向服务作为一个服务提供程序,包含了一切——从大型机应用程序到打印机到码头工作人员到隔夜交货公司。服务提供程序通过接口公开了...
  • 服务间的IPC机制 按照微服务的架构体系,解决了服务发现的问题之后。就需要选择合适的服务间通信的机制。如果是在Springboot应用中,使用基于Http协议的REST API是一种同步的解决方案。而且Restful风格的API可以使...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,480
精华内容 4,592
关键字:

做好服务中心服务全局