云安全事故频发,如何应对

OT学习平台 发表了文章 • 0 个评论 • 132 次浏览 • 2017-04-14 14:44 • 来自相关话题

随着云计算、虚拟化等技术的飞速发展,数据中心向虚拟化、云存储已成大势,有专家预测,未来90%的大型企业、政府机构等都将使用虚拟化。在这一过程中,数据中心所面临的安全风险也在发生着演进与变化。虚拟化数据中心面临比传统数据中心更大的安全挑战。服务器虚拟化在带来种种好处的基础上也引入了新的安全威胁,如虚拟机之间的互相攻击,随时启动的防护间歇等。企业必须考虑各种潜在的威胁,然后才能迁移到云模型上。下面是几个企业应该注意的云安全问题:

谁有访问权限?
访问控制确实是一个问题。云身份认证是如何管理的?内部人员攻击是一种持续威胁。任何获得云平台访问权限的人都有可能成为潜在的问题。举一个例子:有一名员工可能离职或被辞退,结果他或她是唯一有访问密码的人。或者说,或许这一名员工是唯一一位负责给云提供商支付费用的人。你必须知道谁有访问权限,他或她是如何交接工作的,以及访问权限是如何中止的?
你是否有审计权限?
这个问题并不是小问题,相反是其中一个最重要的云安全问题。云提供商可能同意在书面上遵守一个审计标准;但是,对于审计人员和评估人员而言,想要评估云计算是否符合法规要求,已经被证明是一件越来越难完成和验证的工作。在IT要面对的诸多法规中,几乎没有专门针对云计算的。审计人员和评估人员可能还不熟悉云计算,也不熟悉某个特定的云服务。
云提供商给员工提供了哪一些培训?
这确实是一个非常值得注意的问题,因为人们在安全面前总是弱势群体。了解云服务商提供了哪些培训。大多数攻击都同时包含技术因素和社会因素。云服务商应该采用措施处理各种来源的社会攻击,包括电子邮件、恶意链接、电话及其他方式,它们都应该在出现在培训和认知项目中。
是否使用了加密手段?
加密手段也应该在考虑范围内。原始数据是否允许离开企业,或者它们应该留在内部,才能符合法规要求?数据在静止和或移动过程中,是否加密?此外,你还应该了解其中所使用的加密类型。要保证自己知道是谁在保管密钥,然后再签合约。加密手段一定要出现在云安全问题清单中。
你的数据与其他人的数据是如何分隔的?
数据位于一台共享服务器还是一个专用系统中?如果使用一个专用服务器,则意味着服务器上只有你的信息。如果在一台共享服务器上,则磁盘空间、处理能力、带宽等资源都是有限的,因为还有其他人一起共享这个设备。你需要确定自己是需要私有云还是公有云,以及谁在管理服务器。如果是共享服务器,那么数据就有可能和其他数据混在一起。
提供商的长期可用性体现有什么保障?
云服务商开展这个业务有多长时间了?过往的业务表现如何?如果它在这个业务上出现问题,你的数据会面临什么问题?是否会以原始格式交回给你?
如果出现安全漏洞会有什么应对措施?
如果发生了安全事故,你可以从云服务商获得哪些支持?虽然许多提供商都宣称自己的服务是万无一失的,但是基于云的服务是极其容易受到黑客攻击的。侧向通道、会话劫持、跨站脚本和分布式拒绝服务等攻击都是云数据经常遇到的攻击方式。
根据预测,未来三年有80%以上的数据中心流量将来自云服务。这意味着,即使你现在还没有做好云迁移,那么到2020年前你也会这样做的。所以,要用这一段时间保证自己采用正确的迁移方法。要提前定义合同要求,然后不能只是复制原来用于本地环境的安全策略。相反,要从迁移的角度去改进它。
OTPUB直播活动又双叒叕来喽!
直播主题
Excel的“天上人间”-“出台”到PPT的动态图表
直播时间
2017年4月25日 14:00-15:00
点击参与报名>>> 查看全部
随着云计算、虚拟化等技术的飞速发展,数据中心向虚拟化、云存储已成大势,有专家预测,未来90%的大型企业、政府机构等都将使用虚拟化。在这一过程中,数据中心所面临的安全风险也在发生着演进与变化。虚拟化数据中心面临比传统数据中心更大的安全挑战。服务器虚拟化在带来种种好处的基础上也引入了新的安全威胁,如虚拟机之间的互相攻击,随时启动的防护间歇等。企业必须考虑各种潜在的威胁,然后才能迁移到云模型上。下面是几个企业应该注意的云安全问题:

谁有访问权限?
访问控制确实是一个问题。云身份认证是如何管理的?内部人员攻击是一种持续威胁。任何获得云平台访问权限的人都有可能成为潜在的问题。举一个例子:有一名员工可能离职或被辞退,结果他或她是唯一有访问密码的人。或者说,或许这一名员工是唯一一位负责给云提供商支付费用的人。你必须知道谁有访问权限,他或她是如何交接工作的,以及访问权限是如何中止的?
你是否有审计权限?
这个问题并不是小问题,相反是其中一个最重要的云安全问题。云提供商可能同意在书面上遵守一个审计标准;但是,对于审计人员和评估人员而言,想要评估云计算是否符合法规要求,已经被证明是一件越来越难完成和验证的工作。在IT要面对的诸多法规中,几乎没有专门针对云计算的。审计人员和评估人员可能还不熟悉云计算,也不熟悉某个特定的云服务。
云提供商给员工提供了哪一些培训?
这确实是一个非常值得注意的问题,因为人们在安全面前总是弱势群体。了解云服务商提供了哪些培训。大多数攻击都同时包含技术因素和社会因素。云服务商应该采用措施处理各种来源的社会攻击,包括电子邮件、恶意链接、电话及其他方式,它们都应该在出现在培训和认知项目中。
是否使用了加密手段?
加密手段也应该在考虑范围内。原始数据是否允许离开企业,或者它们应该留在内部,才能符合法规要求?数据在静止和或移动过程中,是否加密?此外,你还应该了解其中所使用的加密类型。要保证自己知道是谁在保管密钥,然后再签合约。加密手段一定要出现在云安全问题清单中。
你的数据与其他人的数据是如何分隔的?
数据位于一台共享服务器还是一个专用系统中?如果使用一个专用服务器,则意味着服务器上只有你的信息。如果在一台共享服务器上,则磁盘空间、处理能力、带宽等资源都是有限的,因为还有其他人一起共享这个设备。你需要确定自己是需要私有云还是公有云,以及谁在管理服务器。如果是共享服务器,那么数据就有可能和其他数据混在一起。
提供商的长期可用性体现有什么保障?
云服务商开展这个业务有多长时间了?过往的业务表现如何?如果它在这个业务上出现问题,你的数据会面临什么问题?是否会以原始格式交回给你?
如果出现安全漏洞会有什么应对措施?
如果发生了安全事故,你可以从云服务商获得哪些支持?虽然许多提供商都宣称自己的服务是万无一失的,但是基于云的服务是极其容易受到黑客攻击的。侧向通道、会话劫持、跨站脚本和分布式拒绝服务等攻击都是云数据经常遇到的攻击方式。
根据预测,未来三年有80%以上的数据中心流量将来自云服务。这意味着,即使你现在还没有做好云迁移,那么到2020年前你也会这样做的。所以,要用这一段时间保证自己采用正确的迁移方法。要提前定义合同要求,然后不能只是复制原来用于本地环境的安全策略。相反,要从迁移的角度去改进它。
OTPUB直播活动又双叒叕来喽!
直播主题
Excel的“天上人间”-“出台”到PPT的动态图表
直播时间
2017年4月25日 14:00-15:00
点击参与报名>>>

Hadoop环境中管理大数据存储技巧

OT学习平台 发表了文章 • 0 个评论 • 210 次浏览 • 2017-04-12 15:03 • 来自相关话题

Hadoop环境中管理大数据存储八大技巧
目前大数据行业也越来越火爆,从而导致国内大数据人才也极度缺乏,下面介绍一下关于Hadoop环境中管理大数据存储技巧。

在现如今,随着IT互联网信息技术的飞速发展和进步。目前大数据行业也越来越火爆,从而导致国内大数据人才也极度缺乏,下面介绍一下关于Hadoop环境中管理大数据存储技巧。
1、分布式存储
传统化集中式存储存在已有一段时间。但大数据并非真的适合集中式存储架构。Hadoop设计用于将计算更接近数据节点,同时采用了HDFS文件系统的大规模横向扩展功能。
虽然,通常解决Hadoop管理自身数据低效性的方案是将Hadoop数据存储在SAN上。但这也造成了它自身性能与规模的瓶颈。现在,如果你把所有的数据都通过集中式SAN处理器进行处理,与Hadoop的分布式和并行化特性相悖。你要么针对不同的数据节点管理多个SAN,要么将所有的数据节点都集中到一个SAN。
但Hadoop是一个分布式应用,就应该运行在分布式存储上,这样存储就保留了与Hadoop本身同样的灵活性,不过它也要求拥抱一个软件定义存储方案,并在商用服务器上运行,这相比瓶颈化的Hadoop自然更为高效。
2、超融合VS分布式
注意,不要混淆超融合与分布式。某些超融合方案是分布式存储,但通常这个术语意味着你的应用和存储都保存在同一计算节点上。这是在试图解决数据本地化的问题,但它会造成太多资源争用。这个Hadoop应用和存储平台会争用相同的内存和CPU。Hadoop运行在专有应用层,分布式存储运行在专有存储层这样会更好。之后,利用缓存和分层来解决数据本地化并补偿网络性能损失。
3、避免控制器瓶颈(ControllerChokePoint)
实现目标的一个重要方面就是——避免通过单个点例如一个传统控制器来处理数据。反之,要确保存储平台并行化,性能可以得到显著提升。
此外,这个方案提供了增量扩展性。为数据湖添加功能跟往里面扔x86服务器一样简单。一个分布式存储平台如有需要将自动添加功能并重新调整数据。
4、删重和压缩
掌握大数据的关键是删重和压缩技术。通常大数据集内会有70%到90%的数据简化。以PB容量计,能节约数万美元的磁盘成本。现代平台提供内联(对比后期处理)删重和压缩,大大降低了存储数据所需能力。
5、合并Hadoop发行版
很多大型企业拥有多个Hadoop发行版本。可能是开发者需要或是企业部门已经适应了不同版本。无论如何最终往往要对这些集群的维护与运营。一旦海量数据真正开始影响一家企业时,多个Hadoop发行版存储就会导致低效性。我们可以通过创建一个单一,可删重和压缩的数据湖获取数据效率
6、虚拟化Hadoop
虚拟化已经席卷企业级市场。很多地区超过80%的物理服务器现在是虚拟化的。但也仍有很多企业因为性能和数据本地化问题对虚拟化Hadoop避而不谈。
7、创建弹性数据湖
创建数据湖并不容易,但大数据存储可能会有需求。我们有很多种方法来做这件事,但哪一种是正确的?这个正确的架构应该是一个动态,弹性的数据湖,可以以多种格式(架构化,非结构化,半结构化)存储所有资源的数据。更重要的是,它必须支持应用不在远程资源上而是在本地数据资源上执行。
不幸的是,传统架构和应用(也就是非分布式)并不尽如人意。随着数据集越来越大,将应用迁移到数据不可避免,而因为延迟太长也无法倒置。
理想的数据湖基础架构会实现数据单一副本的存储,而且有应用在单一数据资源上执行,无需迁移数据或制作副本。
8、整合分析
分析并不是一个新功能,它已经在传统RDBMS环境中存在多年。不同的是基于开源应用的出现,以及数据库表单和社交媒体,非结构化数据资源(比如,维基百科)的整合能力。关键在于将多个数据类型和格式整合成一个标准的能力,有利于更轻松和一致地实现可视化与报告制作。合适的工具也对分析/商业智能项目的成功至关重要。
OTPUB直播活动又双叒叕来喽!
直播主题
甲骨文第2代企业级IaaS云技术大会
直播时间
2017年4月13日 9:30-17:30
点击参与报名>>>
 
或者直接进入OTPUB官网
http://www.otpub.com/ 查看全部
Hadoop环境中管理大数据存储八大技巧
目前大数据行业也越来越火爆,从而导致国内大数据人才也极度缺乏,下面介绍一下关于Hadoop环境中管理大数据存储技巧。

在现如今,随着IT互联网信息技术的飞速发展和进步。目前大数据行业也越来越火爆,从而导致国内大数据人才也极度缺乏,下面介绍一下关于Hadoop环境中管理大数据存储技巧。
1、分布式存储
传统化集中式存储存在已有一段时间。但大数据并非真的适合集中式存储架构。Hadoop设计用于将计算更接近数据节点,同时采用了HDFS文件系统的大规模横向扩展功能。
虽然,通常解决Hadoop管理自身数据低效性的方案是将Hadoop数据存储在SAN上。但这也造成了它自身性能与规模的瓶颈。现在,如果你把所有的数据都通过集中式SAN处理器进行处理,与Hadoop的分布式和并行化特性相悖。你要么针对不同的数据节点管理多个SAN,要么将所有的数据节点都集中到一个SAN。
但Hadoop是一个分布式应用,就应该运行在分布式存储上,这样存储就保留了与Hadoop本身同样的灵活性,不过它也要求拥抱一个软件定义存储方案,并在商用服务器上运行,这相比瓶颈化的Hadoop自然更为高效。
2、超融合VS分布式
注意,不要混淆超融合与分布式。某些超融合方案是分布式存储,但通常这个术语意味着你的应用和存储都保存在同一计算节点上。这是在试图解决数据本地化的问题,但它会造成太多资源争用。这个Hadoop应用和存储平台会争用相同的内存和CPU。Hadoop运行在专有应用层,分布式存储运行在专有存储层这样会更好。之后,利用缓存和分层来解决数据本地化并补偿网络性能损失。
3、避免控制器瓶颈(ControllerChokePoint)
实现目标的一个重要方面就是——避免通过单个点例如一个传统控制器来处理数据。反之,要确保存储平台并行化,性能可以得到显著提升。
此外,这个方案提供了增量扩展性。为数据湖添加功能跟往里面扔x86服务器一样简单。一个分布式存储平台如有需要将自动添加功能并重新调整数据。
4、删重和压缩
掌握大数据的关键是删重和压缩技术。通常大数据集内会有70%到90%的数据简化。以PB容量计,能节约数万美元的磁盘成本。现代平台提供内联(对比后期处理)删重和压缩,大大降低了存储数据所需能力。
5、合并Hadoop发行版
很多大型企业拥有多个Hadoop发行版本。可能是开发者需要或是企业部门已经适应了不同版本。无论如何最终往往要对这些集群的维护与运营。一旦海量数据真正开始影响一家企业时,多个Hadoop发行版存储就会导致低效性。我们可以通过创建一个单一,可删重和压缩的数据湖获取数据效率
6、虚拟化Hadoop
虚拟化已经席卷企业级市场。很多地区超过80%的物理服务器现在是虚拟化的。但也仍有很多企业因为性能和数据本地化问题对虚拟化Hadoop避而不谈。
7、创建弹性数据湖
创建数据湖并不容易,但大数据存储可能会有需求。我们有很多种方法来做这件事,但哪一种是正确的?这个正确的架构应该是一个动态,弹性的数据湖,可以以多种格式(架构化,非结构化,半结构化)存储所有资源的数据。更重要的是,它必须支持应用不在远程资源上而是在本地数据资源上执行。
不幸的是,传统架构和应用(也就是非分布式)并不尽如人意。随着数据集越来越大,将应用迁移到数据不可避免,而因为延迟太长也无法倒置。
理想的数据湖基础架构会实现数据单一副本的存储,而且有应用在单一数据资源上执行,无需迁移数据或制作副本。
8、整合分析
分析并不是一个新功能,它已经在传统RDBMS环境中存在多年。不同的是基于开源应用的出现,以及数据库表单和社交媒体,非结构化数据资源(比如,维基百科)的整合能力。关键在于将多个数据类型和格式整合成一个标准的能力,有利于更轻松和一致地实现可视化与报告制作。合适的工具也对分析/商业智能项目的成功至关重要。
OTPUB直播活动又双叒叕来喽!
直播主题
甲骨文第2代企业级IaaS云技术大会
直播时间
2017年4月13日 9:30-17:30
点击参与报名>>>

 
或者直接进入OTPUB官网
http://www.otpub.com/

Zookeeper日志设置和清理

push 发表了文章 • 0 个评论 • 195 次浏览 • 2017-04-11 15:38 • 来自相关话题

最近搭建zookeeper和kafka集群,遇到了Zookeeper日志问题输出路径的问题, 发现zookeeper设置log4j.properties不能解决日志路径问题, 发现解决方案如下。

一、日志设置
第一步:修改log4j.properties, 这个应该是大家都会去改改, 加粗处是我修改的, 但是只改这个文件后来发现还是不生效

# Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO,ROLLINGFILE 
zookeeper.console.threshold=INFO
zookeeper.log.dir=.
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=DEBUG
zookeeper.tracelog.dir=.
zookeeper.tracelog.file=zookeeper_trace.log

#
# ZooKeeper Logging Configuration
#

# Format is "<default threshold> (, <appender>)+

# DEFAULT: console appender only
log4j.rootLogger=${zookeeper.root.logger}

# Example with rolling log file
#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE

# Example with rolling log file and tracing
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE

#
# Log INFO level and above messages to the console
#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n

#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender  //按天日记轮转
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}

# Max log file size of 10MB
#log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n


#
# Add TRACEFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}

log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
### Notice we are including log4j's NDC here (%x)
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n

第二步:还需要改${zkhome}/bin/zkEnv.sh, 注意加粗处, 这时日志已经可以成功按照你设置的目录进行输出了

#!/usr/bin/env bash

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This script should be sourced into other zookeeper
# scripts to setup the env variables

# We use ZOOCFGDIR if defined,
# otherwise we use /etc/zookeeper
# or the conf directory that is
# a sibling of this script's directory

ZOOBINDIR="${ZOOBINDIR:-/usr/bin}"
ZOOKEEPER_PREFIX="${ZOOBINDIR}/.."

if [ "x$ZOOCFGDIR" = "x" ]
then
  if [ -e "${ZOOKEEPER_PREFIX}/conf" ]; then
    ZOOCFGDIR="$ZOOBINDIR/../conf"
  else
    ZOOCFGDIR="$ZOOBINDIR/../etc/zookeeper"
  fi
fi

if [ -f "${ZOOCFGDIR}/zookeeper-env.sh" ]; then
  . "${ZOOCFGDIR}/zookeeper-env.sh"
fi

if [ "x$ZOOCFG" = "x" ]
then
    ZOOCFG="zoo.cfg"
fi

ZOOCFG="$ZOOCFGDIR/$ZOOCFG"

if [ -f "$ZOOCFGDIR/java.env" ]
then
    . "$ZOOCFGDIR/java.env"
fi

if [ "x${ZOO_LOG_DIR}" = "x" ]
then
    ZOO_LOG_DIR="/data/zookeeper/outlogs/"
fi

if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"    
fi

if [ "$JAVA_HOME" != "" ]; then
  JAVA="$JAVA_HOME/bin/java"
else
  JAVA=java
fi

#add the zoocfg dir to classpath
CLASSPATH="$ZOOCFGDIR:$CLASSPATH"

for i in "$ZOOBINDIR"/../src/java/lib/*.jar
do
    CLASSPATH="$i:$CLASSPATH"
done

#make it work in the binary package
#(use array for LIBPATH to account for spaces within wildcard expansion)
if [ -e "${ZOOKEEPER_PREFIX}"/share/zookeeper/zookeeper-*.jar ]; then
  LIBPATH=("${ZOOKEEPER_PREFIX}"/share/zookeeper/*.jar)
else
  #release tarball format
  for i in "$ZOOBINDIR"/../zookeeper-*.jar
  do
    CLASSPATH="$i:$CLASSPATH"
  done
  LIBPATH=("${ZOOBINDIR}"/../lib/*.jar)
fi

for i in "${LIBPATH[@]}"
do
    CLASSPATH="$i:$CLASSPATH"
done

#make it work for developers
for d in "$ZOOBINDIR"/../build/lib/*.jar
do
   CLASSPATH="$d:$CLASSPATH"
done

#make it work for developers
CLASSPATH="$ZOOBINDIR/../build/classes:$CLASSPATH"

case "`uname`" in
    CYGWIN*) cygwin=true ;;
    *) cygwin=false ;;
esac

if $cygwin
then
    CLASSPATH=`cygpath -wp "$CLASSPATH"`
fi

#echo "CLASSPATH=$CLASSPATH" 

第三步:设置zookeeper.out
zookeeper.out由nohup的输出,也就是zookeeper的stdout和stdeer输出,修改bin/zkServer.sh 文件:

_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"

case $1 in
start)
    echo  -n "Starting zookeeper ... "
    if [ -f $ZOOPIDFILE ]; then
      if kill -0 `cat $ZOOPIDFILE` > /dev/null 2>&1; then
         echo $command already running as process `cat $ZOOPIDFILE`.
         exit 0
      fi
    fi
    nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &

第四步:快照事物日志
在使用zookeeper过程中,我们知道,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默认情况下只有dataDir目录,snapshot和事务日志都保存在这个目录中),通过zoo.cfg配置文件可配置:#snapshot file dir
dataDir=/data/zookeeper/data
#tran log dir
dataLogDir=/data/zookeeper/log
二、日志清理
正常运行过程中,ZK会不断地把快照数据和事务日志输出到这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的,需要管理员来清理,这里介绍4种清理日志的方法。在这4种方法中,推荐使用第一种方法,对于运维人员来说,将日志清理工作独立出来,便于统一管理也更可控。毕竟zk自带的一些工具并不怎么给力,这里是社区反映的两个问题:
https://issues.apache.org/jira/browse/ZOOKEEPER-957  
http://zookeeper-user.578899.n2.nabble.com/PurgeTxnLog-td6304244.html  
 
第一种,也是运维人员最常用的,写一个删除日志脚本,每天定时执行即可:#!/bin/bash

#snapshot file dir
dataDir=/data/zookeeper/data/version-2
#tran log dir
dataLogDir=/data/zookeeper/log/version-2
#zk log dir
logDir=/data/zookeeper/outlog/
#Leave 60 files
count=60
count=$[$count+1]
ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f
ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f
ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -f以上这个脚本定义了删除对应三个目录中的文件,保留最新的60个文件,可以将他写到crontab中,设置为每天凌晨2点执行一次就可以了。
 
第二种,使用ZK的工具类PurgeTxnLog,它的实现了一种简单的历史文件清理策略,可以在这里看一下他的使用方法:http://zookeeper.apache.org/doc/r3.4.3/api/index.html ,可以指定要清理的目录和需要保留的文件数目,简单使用如下:java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir><snapDir> -n <count>第三种,对于上面这个Java类的执行,ZK自己已经写好了脚本,在bin/zkCleanup.sh中,所以直接使用这个脚本也是可以执行清理工作的。
 
第四种,从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 这两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的:autopurge.purgeInterval: 24*2
autopurge.snapRetainCount: 2 autopurge.purgeInterval  这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。
autopurge.snapRetainCount 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。
参考:http://nileader.blog.51cto.com/1381108/932156  查看全部
最近搭建zookeeper和kafka集群,遇到了Zookeeper日志问题输出路径的问题, 发现zookeeper设置log4j.properties不能解决日志路径问题, 发现解决方案如下。

一、日志设置
第一步:修改log4j.properties, 这个应该是大家都会去改改, 加粗处是我修改的, 但是只改这个文件后来发现还是不生效


# Define some default values that can be overridden by system properties
zookeeper.root.logger=INFO,ROLLINGFILE 
zookeeper.console.threshold=INFO
zookeeper.log.dir=.
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=DEBUG
zookeeper.tracelog.dir=.
zookeeper.tracelog.file=zookeeper_trace.log

#
# ZooKeeper Logging Configuration
#

# Format is "<default threshold> (, <appender>)+

# DEFAULT: console appender only
log4j.rootLogger=${zookeeper.root.logger}

# Example with rolling log file
#log4j.rootLogger=DEBUG, CONSOLE, ROLLINGFILE

# Example with rolling log file and tracing
#log4j.rootLogger=TRACE, CONSOLE, ROLLINGFILE, TRACEFILE

#
# Log INFO level and above messages to the console
#
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n

#
# Add ROLLINGFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.ROLLINGFILE=org.apache.log4j.DailyRollingFileAppender  //按天日记轮转
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}

# Max log file size of 10MB
#log4j.appender.ROLLINGFILE.MaxFileSize=10MB
# uncomment the next line to limit number of backup files
#log4j.appender.ROLLINGFILE.MaxBackupIndex=10

log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n


#
# Add TRACEFILE to rootLogger to get log file output
#    Log DEBUG level and above messages to a log file
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}

log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
### Notice we are including log4j's NDC here (%x)
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n


第二步:还需要改${zkhome}/bin/zkEnv.sh, 注意加粗处, 这时日志已经可以成功按照你设置的目录进行输出了


#!/usr/bin/env bash

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This script should be sourced into other zookeeper
# scripts to setup the env variables

# We use ZOOCFGDIR if defined,
# otherwise we use /etc/zookeeper
# or the conf directory that is
# a sibling of this script's directory

ZOOBINDIR="${ZOOBINDIR:-/usr/bin}"
ZOOKEEPER_PREFIX="${ZOOBINDIR}/.."

if [ "x$ZOOCFGDIR" = "x" ]
then
  if [ -e "${ZOOKEEPER_PREFIX}/conf" ]; then
    ZOOCFGDIR="$ZOOBINDIR/../conf"
  else
    ZOOCFGDIR="$ZOOBINDIR/../etc/zookeeper"
  fi
fi

if [ -f "${ZOOCFGDIR}/zookeeper-env.sh" ]; then
  . "${ZOOCFGDIR}/zookeeper-env.sh"
fi

if [ "x$ZOOCFG" = "x" ]
then
    ZOOCFG="zoo.cfg"
fi

ZOOCFG="$ZOOCFGDIR/$ZOOCFG"

if [ -f "$ZOOCFGDIR/java.env" ]
then
    . "$ZOOCFGDIR/java.env"
fi

if [ "x${ZOO_LOG_DIR}" = "x" ]
then
    ZOO_LOG_DIR="/data/zookeeper/outlogs/"
fi

if [ "x${ZOO_LOG4J_PROP}" = "x" ]
then
    ZOO_LOG4J_PROP="INFO,ROLLINGFILE"    
fi

if [ "$JAVA_HOME" != "" ]; then
  JAVA="$JAVA_HOME/bin/java"
else
  JAVA=java
fi

#add the zoocfg dir to classpath
CLASSPATH="$ZOOCFGDIR:$CLASSPATH"

for i in "$ZOOBINDIR"/../src/java/lib/*.jar
do
    CLASSPATH="$i:$CLASSPATH"
done

#make it work in the binary package
#(use array for LIBPATH to account for spaces within wildcard expansion)
if [ -e "${ZOOKEEPER_PREFIX}"/share/zookeeper/zookeeper-*.jar ]; then
  LIBPATH=("${ZOOKEEPER_PREFIX}"/share/zookeeper/*.jar)
else
  #release tarball format
  for i in "$ZOOBINDIR"/../zookeeper-*.jar
  do
    CLASSPATH="$i:$CLASSPATH"
  done
  LIBPATH=("${ZOOBINDIR}"/../lib/*.jar)
fi

for i in "${LIBPATH[@]}"
do
    CLASSPATH="$i:$CLASSPATH"
done

#make it work for developers
for d in "$ZOOBINDIR"/../build/lib/*.jar
do
   CLASSPATH="$d:$CLASSPATH"
done

#make it work for developers
CLASSPATH="$ZOOBINDIR/../build/classes:$CLASSPATH"

case "`uname`" in
    CYGWIN*) cygwin=true ;;
    *) cygwin=false ;;
esac

if $cygwin
then
    CLASSPATH=`cygpath -wp "$CLASSPATH"`
fi

#echo "CLASSPATH=$CLASSPATH" 


第三步:设置zookeeper.out
zookeeper.out由nohup的输出,也就是zookeeper的stdout和stdeer输出,修改bin/zkServer.sh 文件:


_ZOO_DAEMON_OUT="$ZOO_LOG_DIR/zookeeper.out"

case $1 in
start)
    echo  -n "Starting zookeeper ... "
    if [ -f $ZOOPIDFILE ]; then
      if kill -0 `cat $ZOOPIDFILE` > /dev/null 2>&1; then
         echo $command already running as process `cat $ZOOPIDFILE`.
         exit 0
      fi
    fi
    nohup $JAVA "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
    -cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &


第四步:快照事物日志
在使用zookeeper过程中,我们知道,会有dataDir和dataLogDir两个目录,分别用于snapshot和事务日志的输出(默认情况下只有dataDir目录,snapshot和事务日志都保存在这个目录中),通过zoo.cfg配置文件可配置:
#snapshot file dir
dataDir=/data/zookeeper/data
#tran log dir
dataLogDir=/data/zookeeper/log

二、日志清理
正常运行过程中,ZK会不断地把快照数据和事务日志输出到这两个目录,并且如果没有人为操作的话,ZK自己是不会清理这些文件的,需要管理员来清理,这里介绍4种清理日志的方法。在这4种方法中,推荐使用第一种方法,对于运维人员来说,将日志清理工作独立出来,便于统一管理也更可控。毕竟zk自带的一些工具并不怎么给力,这里是社区反映的两个问题:
https://issues.apache.org/jira/browse/ZOOKEEPER-957  
http://zookeeper-user.578899.n2.nabble.com/PurgeTxnLog-td6304244.html  
 
第一种,也是运维人员最常用的,写一个删除日志脚本,每天定时执行即可:
#!/bin/bash

#snapshot file dir
dataDir=/data/zookeeper/data/version-2
#tran log dir
dataLogDir=/data/zookeeper/log/version-2
#zk log dir
logDir=/data/zookeeper/outlog/
#Leave 60 files
count=60
count=$[$count+1]
ls -t $dataLogDir/log.* | tail -n +$count | xargs rm -f
ls -t $dataDir/snapshot.* | tail -n +$count | xargs rm -f
ls -t $logDir/zookeeper.log.* | tail -n +$count | xargs rm -f
以上这个脚本定义了删除对应三个目录中的文件,保留最新的60个文件,可以将他写到crontab中,设置为每天凌晨2点执行一次就可以了。
 
第二种,使用ZK的工具类PurgeTxnLog,它的实现了一种简单的历史文件清理策略,可以在这里看一下他的使用方法:http://zookeeper.apache.org/doc/r3.4.3/api/index.html ,可以指定要清理的目录和需要保留的文件数目,简单使用如下:
java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf org.apache.zookeeper.server.PurgeTxnLog <dataDir><snapDir> -n <count>
第三种,对于上面这个Java类的执行,ZK自己已经写好了脚本,在bin/zkCleanup.sh中,所以直接使用这个脚本也是可以执行清理工作的。
 
第四种,从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置 autopurge.snapRetainCount 和 autopurge.purgeInterval 这两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的:
autopurge.purgeInterval: 24*2 
autopurge.snapRetainCount: 2
autopurge.purgeInterval  这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。
autopurge.snapRetainCount 这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。
参考:http://nileader.blog.51cto.com/1381108/932156 

​云计算,你看好哪个时代?

OT学习平台 发表了文章 • 0 个评论 • 128 次浏览 • 2017-04-11 15:17 • 来自相关话题

云计算的每条技术路线都代表着一个时代
高效、便捷、安全
传统路线 虚拟机云


这是已经被广泛应用的技术路线,从AWS到国内的阿里云,使用者得到的最小单位是虚拟机,需要追加和扩展的资源实际上是整个虚拟机的资源。但每一个虚拟机资源都受到物理机最大资源的限制。例如物理机总共有128G内存,那么任何一台虚拟机的最大内存都不会超过128G。


这种路线特别适合从物理机刚转到云的技术人员,因为所有的操作、配置、管理几乎与物理机一致。

轻量级路线 容器云


随着Docker的出现,容器云开始出现。容器云是以应用为单位进行资源分割的。无论在物理机年代还是虚拟机云上,一个虚拟机/物理机上可以运行多个应用,一个应用可以简单理解为一个或一组程序。在容器云上以应用为最基本单位进行资源(CPU、内存、硬盘)的分配,相对于虚拟机云,容器云资源分割粒度进一步精细化。
 
虚拟机云是以硬件为基础实施的,例如在阿里云上买一台4核的虚拟机,实际上是独占了物理机上CPU中4核的资源,这部分CPU资源就不能再被其他物理机使用。

 

在容器云上,可以指定CPU资源,但不能再像虚拟机那样让某一个应用独占CPU资源。使用者只能指定使用哪个CPU,使用的优先级以及CPU资源分配周期。

而出于安全性的考虑,产生了第三条路线:

中间路线 容器+mini kernel路线


这条路线就是容器之间不再共享内核,而是为每一个容器提供一个独立的内核。Intel推出的clear linux项目,就是这种路线的代表。中间路线是前面两条路线的融合,未来容器云路线极有可能向此条路线发展。

 

三条技术路线,代表着三个时代,虚拟机路线是最早出现且成熟的,因为它符合了技术人员的使用习惯,方便过渡。容器云是目前发展最快的路线,因为它把资源分割粒度做到最小,且使传统的运维工作提升效率。未来有可能是容器+mini kernel路线的天下,更高校、更便捷、更安全,永远是追求的目标。
OTPUB直播活动又双叒叕来喽!
直播主题
甲骨文第2代企业级IaaS云技术大会
直播时间
2017年4月13日 9:30-17:30
点击报名参与>>>
  查看全部

云计算的每条技术路线都代表着一个时代
高效、便捷、安全
传统路线 虚拟机云


这是已经被广泛应用的技术路线,从AWS到国内的阿里云,使用者得到的最小单位是虚拟机,需要追加和扩展的资源实际上是整个虚拟机的资源。但每一个虚拟机资源都受到物理机最大资源的限制。例如物理机总共有128G内存,那么任何一台虚拟机的最大内存都不会超过128G。


这种路线特别适合从物理机刚转到云的技术人员,因为所有的操作、配置、管理几乎与物理机一致。

轻量级路线 容器云


随着Docker的出现,容器云开始出现。容器云是以应用为单位进行资源分割的。无论在物理机年代还是虚拟机云上,一个虚拟机/物理机上可以运行多个应用,一个应用可以简单理解为一个或一组程序。在容器云上以应用为最基本单位进行资源(CPU、内存、硬盘)的分配,相对于虚拟机云,容器云资源分割粒度进一步精细化。
 
虚拟机云是以硬件为基础实施的,例如在阿里云上买一台4核的虚拟机,实际上是独占了物理机上CPU中4核的资源,这部分CPU资源就不能再被其他物理机使用。

 

在容器云上,可以指定CPU资源,但不能再像虚拟机那样让某一个应用独占CPU资源。使用者只能指定使用哪个CPU,使用的优先级以及CPU资源分配周期。

而出于安全性的考虑,产生了第三条路线:

中间路线 容器+mini kernel路线


这条路线就是容器之间不再共享内核,而是为每一个容器提供一个独立的内核。Intel推出的clear linux项目,就是这种路线的代表。中间路线是前面两条路线的融合,未来容器云路线极有可能向此条路线发展。

 

三条技术路线,代表着三个时代,虚拟机路线是最早出现且成熟的,因为它符合了技术人员的使用习惯,方便过渡。容器云是目前发展最快的路线,因为它把资源分割粒度做到最小,且使传统的运维工作提升效率。未来有可能是容器+mini kernel路线的天下,更高校、更便捷、更安全,永远是追求的目标。
OTPUB直播活动又双叒叕来喽!
直播主题
甲骨文第2代企业级IaaS云技术大会
直播时间
2017年4月13日 9:30-17:30

点击报名参与>>>
 

热璞科技大跃进-招人了

OpenSkill 发表了文章 • 0 个评论 • 123 次浏览 • 2017-04-11 10:49 • 来自相关话题

MySQL DBA:
岗位名称:MySQL DBA(薪资:15-35K)

岗位要求:
1、五年以上Oracle DBA(至少一年MySQL DBA) 或三年以上MySQL DBA的实战经验
2、了解MySQL数据库的运行机制和架构体系
3、熟悉MySQL数据库基本调优,了解MySQL数据库内存与I/O机制
4、熟悉MySQL数据库数据同步的异步、半同步、Group Replication等基本原理
5、至少熟练一门脚本编程语言或JAVA编程语言
6、至少掌握业界中的mysqlslap、sysbench、tpcc-c等两种以上性能压测工具
7、有Cobar、Amoeba、MyCAT使用经历者优先
8.具备良好的团队合作能力及沟通协调能力,工作主动、积极,责任心强和自学能力较强。


高级JAVA程师:
岗位名称:高级JAVA程师(分布式数据库中间件研究)

薪资:15k-35k

岗位要求:
1、专科以上学历,三年及以上Java软件开发项目工作经验。
2、熟悉JVM内存管理、类加载机制等,掌握Java系统的故障排查和性能调优。
3、熟悉多线程、NIO、Socket编程。
4、熟练掌握MySQL数据库特性。
5、熟悉Cobar、Mycat、TDDL等数据库中间件者优先考虑。

 
更多信息:
公司招纳人才:(公司简介:专注于研发数据库中间件和私有云数据 架构设计与部署实施的一站式服务公司)

招聘岗位:
(1)、java高级软件工程师(2名)(年限:3年以上;薪资:15k-25k)
(2)、java高级工程师(数据库中间件研发方向)(年限:5年以上;薪资(15k-30k)
(3)、MySQL DBA (年限:5年以上;薪资:15k-35k)
(4)、架构咨询师 (年限:5年以上;薪资:15k-35k)
(5)、产品经理PM (年限:4年以上;薪资:15k-25k; 懂pass平台经验)

来撩我QQ:1793564171  简历投递邮箱:job@hotpu.cn
工作地点:上海闵行区10号线龙柏新村站  查看全部
MySQL DBA:
岗位名称:MySQL DBA(薪资:15-35K)

岗位要求:
1、五年以上Oracle DBA(至少一年MySQL DBA) 或三年以上MySQL DBA的实战经验
2、了解MySQL数据库的运行机制和架构体系
3、熟悉MySQL数据库基本调优,了解MySQL数据库内存与I/O机制
4、熟悉MySQL数据库数据同步的异步、半同步、Group Replication等基本原理
5、至少熟练一门脚本编程语言或JAVA编程语言
6、至少掌握业界中的mysqlslap、sysbench、tpcc-c等两种以上性能压测工具
7、有Cobar、Amoeba、MyCAT使用经历者优先
8.具备良好的团队合作能力及沟通协调能力,工作主动、积极,责任心强和自学能力较强。


高级JAVA程师:
岗位名称:高级JAVA程师(分布式数据库中间件研究)

薪资:15k-35k

岗位要求:
1、专科以上学历,三年及以上Java软件开发项目工作经验。
2、熟悉JVM内存管理、类加载机制等,掌握Java系统的故障排查和性能调优。
3、熟悉多线程、NIO、Socket编程。
4、熟练掌握MySQL数据库特性。
5、熟悉Cobar、Mycat、TDDL等数据库中间件者优先考虑。

 
更多信息:
公司招纳人才:(公司简介:专注于研发数据库中间件和私有云数据 架构设计与部署实施的一站式服务公司)

招聘岗位:
(1)、java高级软件工程师(2名)(年限:3年以上;薪资:15k-25k)
(2)、java高级工程师(数据库中间件研发方向)(年限:5年以上;薪资(15k-30k)
(3)、MySQL DBA (年限:5年以上;薪资:15k-35k)
(4)、架构咨询师 (年限:5年以上;薪资:15k-35k)
(5)、产品经理PM (年限:4年以上;薪资:15k-25k; 懂pass平台经验)


来撩我QQ:1793564171  简历投递邮箱:job@hotpu.cn
工作地点:上海闵行区10号线龙柏新村站 


Python字符串反转方法小记

采菊篱下 发表了文章 • 1 个评论 • 239 次浏览 • 2017-04-09 15:29 • 来自相关话题

有个朋友开突然问我在Python下怎么把字符串倒过来排序,刚开始我懵逼了,倒过来排序有什么意义,你的场景是什么,如果你单纯问我这个作为一个小考验,我觉得搜索一大推,自行Google就好啊。他说他们需要针对密码加密,简单的逻辑就是反转加密实现,厉害了疙瘩。下面我主要记录一下Python下的几种方法。

No.1 切片方式

字符串的切片跟列表是一样的,主要是利用切片的扩展语法-1来实现def rev1(cont):
return cont[::-1]
切片详细语法查看:https://docs.python.org/2/whatsnew/2.3.html#extended-slices 

No.2 列表reverse实现

利用列表的reverse()方法这个特性,可以先将字符串转换成列表,利用reverse()方法进行反转后,再处理成字符串。def rev2(cont):
result = list(cont)
result.reverse()
return ''.join(result)

No.3 内置函数reversed实现

def rev3(cont):
return ''.join(reversed(cont))

No.4 递归方法

def rev4(cont):
if cont == "":
return cont
else:
return rev4(cont[1:])+cont[0]# 在Python 3里,reduce()内置函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里
from functools import reduce

def rev5(cont):
return reduce(lambda x, y : y + x, cont)

No.5 字符串拼接

def rev6(cont):
new_string = ''
index = len(cont)
while index:
index -= 1 # index = index - 1
new_string += cont[index] # new_string = new_string + character
return new_stringdef rev7(cont):
new_strings =
index = len(cont)
while index:
index -= 1
new_strings.append(cont[index])
return ''.join(new_strings)
如上几种方法效率比较:#!/usr/bin/env python3
# Author: nock
from functools import reduce
import timeit

cont = 'kcon' * 20

def rev1(cont):
return cont[::-1]

def rev2(cont):
result = list(cont)
result.reverse()
return ''.join(result)

def rev3(cont):
return ''.join(reversed(cont))

def rev4(cont):
if cont == "":
return cont
else:
return rev4(cont[1:])+cont[0]

def rev5(cont):
return reduce(lambda x, y : y + x, cont)

def rev6(cont):
new_string = ''
index = len(cont)
while index:
index -= 1 # index = index - 1
new_string += cont[index] # new_string = new_string + character
return new_string

def rev7(cont):
new_strings =
index = len(cont)
while index:
index -= 1
new_strings.append(cont[index])
return ''.join(new_strings)

if __name__ == '__main__':
print("rev1 run time is: %s" % min(timeit.repeat(lambda: rev1(cont))))
print("rev2 run time is: %s" % min(timeit.repeat(lambda: rev2(cont))))
print("rev3 run time is: %s" % min(timeit.repeat(lambda: rev3(cont))))
print("rev4 run time is: %s" % min(timeit.repeat(lambda: rev4(cont))))
print("rev5 run time is: %s" % min(timeit.repeat(lambda: rev5(cont))))
print("rev6 run time is: %s" % min(timeit.repeat(lambda: rev6(cont))))
print("rev7 run time is: %s" % min(timeit.repeat(lambda: rev7(cont))))时间结果如下:rev1 run time is: 0.45436444599181414
rev2 run time is: 2.3974227079888806
rev3 run time is: 2.633627591014374
rev4 run time is: 3.0160443240310997
rev5 run time is: 16.342944753996562
rev6 run time is: 12.666344199969899
rev7 run time is: 14.762871471000835所以如上可以看出,还是用切片的方法最好,所以记住切片步长为-1就可反转就好。 查看全部
有个朋友开突然问我在Python下怎么把字符串倒过来排序,刚开始我懵逼了,倒过来排序有什么意义,你的场景是什么,如果你单纯问我这个作为一个小考验,我觉得搜索一大推,自行Google就好啊。他说他们需要针对密码加密,简单的逻辑就是反转加密实现,厉害了疙瘩。下面我主要记录一下Python下的几种方法。


No.1 切片方式


字符串的切片跟列表是一样的,主要是利用切片的扩展语法-1来实现
def rev1(cont):
return cont[::-1]
切片详细语法查看:https://docs.python.org/2/whatsnew/2.3.html#extended-slices 


No.2 列表reverse实现


利用列表的reverse()方法这个特性,可以先将字符串转换成列表,利用reverse()方法进行反转后,再处理成字符串。
def rev2(cont):
result = list(cont)
result.reverse()
return ''.join(result)


No.3 内置函数reversed实现


def rev3(cont):
return ''.join(reversed(cont))


No.4 递归方法


def rev4(cont):
if cont == "":
return cont
else:
return rev4(cont[1:])+cont[0]
# 在Python 3里,reduce()内置函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里
from functools import reduce

def rev5(cont):
return reduce(lambda x, y : y + x, cont)


No.5 字符串拼接


def rev6(cont):
new_string = ''
index = len(cont)
while index:
index -= 1 # index = index - 1
new_string += cont[index] # new_string = new_string + character
return new_string
def rev7(cont):
new_strings =
index = len(cont)
while index:
index -= 1
new_strings.append(cont[index])
return ''.join(new_strings)

如上几种方法效率比较:
#!/usr/bin/env python3
# Author: nock
from functools import reduce
import timeit

cont = 'kcon' * 20

def rev1(cont):
return cont[::-1]

def rev2(cont):
result = list(cont)
result.reverse()
return ''.join(result)

def rev3(cont):
return ''.join(reversed(cont))

def rev4(cont):
if cont == "":
return cont
else:
return rev4(cont[1:])+cont[0]

def rev5(cont):
return reduce(lambda x, y : y + x, cont)

def rev6(cont):
new_string = ''
index = len(cont)
while index:
index -= 1 # index = index - 1
new_string += cont[index] # new_string = new_string + character
return new_string

def rev7(cont):
new_strings =
index = len(cont)
while index:
index -= 1
new_strings.append(cont[index])
return ''.join(new_strings)

if __name__ == '__main__':
print("rev1 run time is: %s" % min(timeit.repeat(lambda: rev1(cont))))
print("rev2 run time is: %s" % min(timeit.repeat(lambda: rev2(cont))))
print("rev3 run time is: %s" % min(timeit.repeat(lambda: rev3(cont))))
print("rev4 run time is: %s" % min(timeit.repeat(lambda: rev4(cont))))
print("rev5 run time is: %s" % min(timeit.repeat(lambda: rev5(cont))))
print("rev6 run time is: %s" % min(timeit.repeat(lambda: rev6(cont))))
print("rev7 run time is: %s" % min(timeit.repeat(lambda: rev7(cont))))
时间结果如下:
rev1 run time is: 0.45436444599181414
rev2 run time is: 2.3974227079888806
rev3 run time is: 2.633627591014374
rev4 run time is: 3.0160443240310997
rev5 run time is: 16.342944753996562
rev6 run time is: 12.666344199969899
rev7 run time is: 14.762871471000835
所以如上可以看出,还是用切片的方法最好,所以记住切片步长为-1就可反转就好。

wget命令参数用法总结

chris 发表了文章 • 0 个评论 • 194 次浏览 • 2017-03-31 13:14 • 来自相关话题

wget 是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。
 
自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。
 
wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务 器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。
 

wget的常见用法

wget不但功能强大,而且使用起来比较简单,基本的语法是:wget [参数列表] “URL” 用””引起来可以避免因URL中有特殊字符造成的下载出错。

下面就结合具体的例子来说明一下wget的用法。
 
1、下载整个http或者ftp站点wget http://place.your.url/here这个命令可以将http://place.your.url/here 首页下载下来。使用-x会强制建立服务器上一模一样的目录,如果使用-nd参数,那么服务器上下载的所有内容都会加到本地当前目录。
 
wget -r http://place.your.url/here这个命令会按照递归的方法,下载服务器上所有的目录和文件,实质就是下载整个网站。这个命令一定要小心使用,因为在下载的时候,被下载网站指向的所有地址 同样会被下载,因此,如果这个网站引用了其他网站,那么被引用的网站也会被下载下来!基于这个原因,这个参数不常用。可以用-l number参数来指定下载的层次。例如只下载两层,那么使用-l 2。
 
要是您想制作镜像站点,那么可以使用-m参数,例如:
wget -m http://place.your.url/here这时wget会自动判断合适的参数来制作镜像站点。此时,wget会登录到服务器上,读入robots.txt并按robots.txt的规定来执行。
 
2、断点续传
当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。wget的断点续传是自动的,只需要使用-c参数,例如:wget -c http://the.url.of/incomplete/file使用断点续传要求服务器支持断点续传。-t参数表示重试次数,例如需要重试100次,那么就写-t 100,如果设成-t 0,那么表示无穷次重试,直到连接成功。-T参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时。

3、批量下载
如果有多个文件需要下载,那么可以生成一个文件,把每个文件的URL写一行,例如生成文件download.txt,然后用命令:
wget -i download.txt这样就会把download.txt里面列出的每个URL都下载下来。(如果列的是文件就下载文件,如果列的是网站,那么下载首页)

4、选择性的下载
可以指定让wget只下载一类文件,或者不下载什么文件。例如:wget -m –reject=gif http://target.web.site/subdirectory表示下载http://target.web.site/subdirectory,但是忽略gif文件。–accept=LIST 可以接受的文件类型,–reject=LIST拒绝接受的文件类型。

5、密码和认证
wget只能处理利用用户名/密码方式限制访问的网站,可以利用两个参数:
–http-user=USER 设置HTTP用户
–http-passwd=PASS 设置HTTP密码对于需要证书做认证的网站,就只能利用其他下载工具了,例如curl。

6、利用代理服务器进行下载
如果用户的网络需要经过代理服务器,那么可以让wget通过代理服务器进行文件的下载。此时需要在当前用户的目录下创建一个.wgetrc文件。文件中可以设置代理服务器:http-proxy = 111.111.111.111:8080
ftp-proxy = 111.111.111.111:8080分别表示http的代理服务器和ftp的代理服务器。如果代理服务器需要密码则使用:
–proxy-user=USER 设置代理用户
–proxy-passwd=PASS 设置代理密码这两个参数,使用参数–proxy=on/off 使用或者关闭代理;wget还有很多有用的功能,需要自己可以去了解一下参数和用法。
 

wget的使用格式

Usage: wget [OPTION]… [URL]…1、用wget做站点镜像
wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/
or
wget -m http://dsec.pku.edu.cn/~usr_name/
2、在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载
wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &或者从filelist读入要下载的文件列表
wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件 filelist.txt中,在晚上要出去系统前执行上面代码的第二条。

3、使用代理下载
wget -Y on -p -k https://sourceforge.net/projects/wvware/代理可以在环境变量或wgetrc文件中设定。
 
在环境变量中设定代理:
export PROXY=http://211.90.168.99:8080/在~/.wgetrc中设定代理:
http_proxy = http://proxy.yoyodyne.com:18023/
ftp_proxy = http://proxy.yoyodyne.com:18023/

wget各种选项分类列表

1、启动
-V, –version 显示wget的版本后退出
-h, –help 打印语法帮助
-b, –background 启动后转入后台执行
-e, –execute=COMMAND 执行`.wgetrc’格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc2、记录和输入文件
-o, –output-file=FILE 把记录写到FILE文件中
-a, –append-output=FILE 把记录追加到FILE文件中
-d, –debug 打印调试输出
-q, –quiet 安静模式(没有输出)
-v, –verbose 冗长模式(这是缺省设置)
-nv, –non-verbose 关掉冗长模式,但不是安静模式
-i, –input-file=FILE 下载在FILE文件中出现的URLs
-F, –force-html 把输入文件当作HTML格式文件对待
-B, –base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
–sslcertfile=FILE 可选客户端证书
–sslcertkey=KEYFILE 可选客户端证书的KEYFILE
–egd-file=FILE 指定EGD socket的文件名3、下载
–bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
-t, –tries=NUMBER 设定最大尝试链接次数(0 表示无限制).
-O –output-document=FILE 把文档写到FILE文件中
-nc, –no-clobber 不要覆盖存在的文件或使用.#前缀
-c, –continue 接着下载没下载完的文件
–progress=TYPE 设定进程条标记
-N, –timestamping 不要重新下载文件除非比本地文件新
-S, –server-response 打印服务器的回应
–spider 不下载任何东西
-T, –timeout=SECONDS 设定响应超时的秒数
-w, –wait=SECONDS 两次尝试之间间隔SECONDS秒
–waitretry=SECONDS 在重新链接之间等待1…SECONDS秒
–random-wait 在下载之间等待0…2*WAIT秒
-Y, –proxy=on/off 打开或关闭代理
-Q, –quota=NUMBER 设置下载的容量限制
–limit-rate=RATE 限定下载输率4、目录
-nd –no-directories 不创建目录
-x, –force-directories 强制创建目录
-nH, –no-host-directories 不创建主机目录
-P, –directory-prefix=PREFIX 将文件保存到目录 PREFIX/…
–cut-dirs=NUMBER 忽略 NUMBER层远程目录5、HTTP选项
–http-user=USER 设定HTTP用户名为 USER.
–http-passwd=PASS 设定http密码为 PASS.
-C, –cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许).
-E, –html-extension 将所有text/html文档以.html扩展名保存
–ignore-length 忽略 `Content-Length’头域
–header=STRING 在headers中插入字符串 STRING
–proxy-user=USER 设定代理的用户名为 USER
–proxy-passwd=PASS 设定代理的密码为 PASS
–referer=URL 在HTTP请求中包含 `Referer: URL’头
-s, –save-headers 保存HTTP头到文件
-U, –user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION.
–no-http-keep-alive 关闭 HTTP活动链接 (永远链接).
–cookies=off 不使用 cookies.
–load-cookies=FILE 在开始会话前从文件 FILE中加载cookie
–save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中6、FTP选项
-nr, –dont-remove-listing 不移走 `.listing’文件
-g, –glob=on/off 打开或关闭文件名的 globbing机制
–passive-ftp 使用被动传输模式 (缺省值).
–active-ftp 使用主动传输模式
–retr-symlinks 在递归的时候,将链接指向文件(而不是目录)7、递归下载
-r, –recursive 递归下载--慎用!
-l, –level=NUMBER 最大递归深度 (inf 或 0 代表无穷).
–delete-after 在现在完毕后局部删除文件
-k, –convert-links 转换非相对链接为相对链接
-K, –backup-converted 在转换文件X之前,将之备份为 X.orig
-m, –mirror 等价于 -r -N -l inf -nr.
-p, –page-requisites 下载显示HTML文件的所有图片8、递归下载中的包含和不包含(accept/reject)-A, –accept=LIST 分号分隔的被接受扩展名的列表
-R, –reject=LIST 分号分隔的不被接受的扩展名的列表
-D, –domains=LIST 分号分隔的被接受域的列表
–exclude-domains=LIST 分号分隔的不被接受的域的列表
–follow-ftp 跟踪HTML文档中的FTP链接
–follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表
-G, –ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表
-H, –span-hosts 当递归时转到外部主机
-L, –relative 仅仅跟踪相对链接
-I, –include-directories=LIST 允许目录的列表
-X, –exclude-directories=LIST 不被包含目录的列表
-np, –no-parent 不要追溯到父目录wget -S –spider url 不下载只显示过程。 查看全部
wget 是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。
 
自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。
 
wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务 器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。
 


wget的常见用法


wget不但功能强大,而且使用起来比较简单,基本的语法是:wget [参数列表] “URL” 用””引起来可以避免因URL中有特殊字符造成的下载出错。

下面就结合具体的例子来说明一下wget的用法。
 
1、下载整个http或者ftp站点
wget http://place.your.url/here
这个命令可以将http://place.your.url/here 首页下载下来。使用-x会强制建立服务器上一模一样的目录,如果使用-nd参数,那么服务器上下载的所有内容都会加到本地当前目录。
 
wget -r http://place.your.url/here
这个命令会按照递归的方法,下载服务器上所有的目录和文件,实质就是下载整个网站。这个命令一定要小心使用,因为在下载的时候,被下载网站指向的所有地址 同样会被下载,因此,如果这个网站引用了其他网站,那么被引用的网站也会被下载下来!基于这个原因,这个参数不常用。可以用-l number参数来指定下载的层次。例如只下载两层,那么使用-l 2。
 
要是您想制作镜像站点,那么可以使用-m参数,例如:
wget -m http://place.your.url/here
这时wget会自动判断合适的参数来制作镜像站点。此时,wget会登录到服务器上,读入robots.txt并按robots.txt的规定来执行。
 
2、断点续传
当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。wget的断点续传是自动的,只需要使用-c参数,例如:
wget -c http://the.url.of/incomplete/file
使用断点续传要求服务器支持断点续传。-t参数表示重试次数,例如需要重试100次,那么就写-t 100,如果设成-t 0,那么表示无穷次重试,直到连接成功。-T参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时。

3、批量下载
如果有多个文件需要下载,那么可以生成一个文件,把每个文件的URL写一行,例如生成文件download.txt,然后用命令:
wget -i download.txt
这样就会把download.txt里面列出的每个URL都下载下来。(如果列的是文件就下载文件,如果列的是网站,那么下载首页)

4、选择性的下载
可以指定让wget只下载一类文件,或者不下载什么文件。例如:
wget -m –reject=gif http://target.web.site/subdirectory
表示下载http://target.web.site/subdirectory,但是忽略gif文件。–accept=LIST 可以接受的文件类型,–reject=LIST拒绝接受的文件类型。

5、密码和认证
wget只能处理利用用户名/密码方式限制访问的网站,可以利用两个参数:
–http-user=USER    设置HTTP用户
–http-passwd=PASS 设置HTTP密码
对于需要证书做认证的网站,就只能利用其他下载工具了,例如curl。

6、利用代理服务器进行下载
如果用户的网络需要经过代理服务器,那么可以让wget通过代理服务器进行文件的下载。此时需要在当前用户的目录下创建一个.wgetrc文件。文件中可以设置代理服务器:
http-proxy = 111.111.111.111:8080
ftp-proxy = 111.111.111.111:8080
分别表示http的代理服务器和ftp的代理服务器。如果代理服务器需要密码则使用:
–proxy-user=USER       设置代理用户
–proxy-passwd=PASS 设置代理密码
这两个参数,使用参数–proxy=on/off 使用或者关闭代理;wget还有很多有用的功能,需要自己可以去了解一下参数和用法。
 


wget的使用格式


Usage: wget [OPTION]… [URL]…
1、用wget做站点镜像
wget -r -p -np -k http://dsec.pku.edu.cn/~usr_name/
or
wget -m http://dsec.pku.edu.cn/~usr_name/

2、在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载
wget -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &
或者从filelist读入要下载的文件列表
wget -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log &
上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件 filelist.txt中,在晚上要出去系统前执行上面代码的第二条。

3、使用代理下载
wget -Y on -p -k https://sourceforge.net/projects/wvware/
代理可以在环境变量或wgetrc文件中设定。
 
在环境变量中设定代理:
export PROXY=http://211.90.168.99:8080/
在~/.wgetrc中设定代理:
http_proxy = http://proxy.yoyodyne.com:18023/
ftp_proxy = http://proxy.yoyodyne.com:18023/


wget各种选项分类列表


1、启动
-V, –version 显示wget的版本后退出
-h, –help 打印语法帮助
-b, –background 启动后转入后台执行
-e, –execute=COMMAND 执行`.wgetrc’格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc
2、记录和输入文件
-o, –output-file=FILE 把记录写到FILE文件中
-a, –append-output=FILE 把记录追加到FILE文件中
-d, –debug 打印调试输出
-q, –quiet 安静模式(没有输出)
-v, –verbose 冗长模式(这是缺省设置)
-nv, –non-verbose 关掉冗长模式,但不是安静模式
-i, –input-file=FILE 下载在FILE文件中出现的URLs
-F, –force-html 把输入文件当作HTML格式文件对待
-B, –base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀
–sslcertfile=FILE 可选客户端证书
–sslcertkey=KEYFILE 可选客户端证书的KEYFILE
–egd-file=FILE 指定EGD socket的文件名
3、下载
–bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用)
-t, –tries=NUMBER 设定最大尝试链接次数(0 表示无限制).
-O –output-document=FILE 把文档写到FILE文件中
-nc, –no-clobber 不要覆盖存在的文件或使用.#前缀
-c, –continue 接着下载没下载完的文件
–progress=TYPE 设定进程条标记
-N, –timestamping 不要重新下载文件除非比本地文件新
-S, –server-response 打印服务器的回应
–spider 不下载任何东西
-T, –timeout=SECONDS 设定响应超时的秒数
-w, –wait=SECONDS 两次尝试之间间隔SECONDS秒
–waitretry=SECONDS 在重新链接之间等待1…SECONDS秒
–random-wait 在下载之间等待0…2*WAIT秒
-Y, –proxy=on/off 打开或关闭代理
-Q, –quota=NUMBER 设置下载的容量限制
–limit-rate=RATE 限定下载输率
4、目录
-nd –no-directories 不创建目录
-x, –force-directories 强制创建目录
-nH, –no-host-directories 不创建主机目录
-P, –directory-prefix=PREFIX 将文件保存到目录 PREFIX/…
–cut-dirs=NUMBER 忽略 NUMBER层远程目录
5、HTTP选项
–http-user=USER 设定HTTP用户名为 USER.
–http-passwd=PASS 设定http密码为 PASS.
-C, –cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许).
-E, –html-extension 将所有text/html文档以.html扩展名保存
–ignore-length 忽略 `Content-Length’头域
–header=STRING 在headers中插入字符串 STRING
–proxy-user=USER 设定代理的用户名为 USER
–proxy-passwd=PASS 设定代理的密码为 PASS
–referer=URL 在HTTP请求中包含 `Referer: URL’头
-s, –save-headers 保存HTTP头到文件
-U, –user-agent=AGENT 设定代理的名称为 AGENT而不是 Wget/VERSION.
–no-http-keep-alive 关闭 HTTP活动链接 (永远链接).
–cookies=off 不使用 cookies.
–load-cookies=FILE 在开始会话前从文件 FILE中加载cookie
–save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中
6、FTP选项
-nr, –dont-remove-listing 不移走 `.listing’文件
-g, –glob=on/off 打开或关闭文件名的 globbing机制
–passive-ftp 使用被动传输模式 (缺省值).
–active-ftp 使用主动传输模式
–retr-symlinks 在递归的时候,将链接指向文件(而不是目录)
7、递归下载
-r, –recursive 递归下载--慎用!
-l, –level=NUMBER 最大递归深度 (inf 或 0 代表无穷).
–delete-after 在现在完毕后局部删除文件
-k, –convert-links 转换非相对链接为相对链接
-K, –backup-converted 在转换文件X之前,将之备份为 X.orig
-m, –mirror 等价于 -r -N -l inf -nr.
-p, –page-requisites 下载显示HTML文件的所有图片
8、递归下载中的包含和不包含(accept/reject)
-A, –accept=LIST 分号分隔的被接受扩展名的列表
-R, –reject=LIST 分号分隔的不被接受的扩展名的列表
-D, –domains=LIST 分号分隔的被接受域的列表
–exclude-domains=LIST 分号分隔的不被接受的域的列表
–follow-ftp 跟踪HTML文档中的FTP链接
–follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表
-G, –ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表
-H, –span-hosts 当递归时转到外部主机
-L, –relative 仅仅跟踪相对链接
-I, –include-directories=LIST 允许目录的列表
-X, –exclude-directories=LIST 不被包含目录的列表
-np, –no-parent 不要追溯到父目录
wget -S –spider url 不下载只显示过程。

20个高效正则表达式

push 发表了文章 • 0 个评论 • 225 次浏览 • 2017-03-27 12:27 • 来自相关话题

1 . 校验密码强度​
密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
2. 校验中文
字符串仅能是中文。
^[\\u4e00-\\u9fa5]{0,}$
3. 由数字、26个英文字母或下划线组成的字符串
^\\w+$
4. 校验E-Mail 地址
同密码一样,下面是E-mail地址合规性的正则检查语句。
 
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?
5. 校验身份证号码
下面是身份证号码的正则校验。15 或 18位。
15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$

18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
6. 校验日期
“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
7. 校验金额
金额校验,精确到2位小数。
^[0-9]+(.[0-9]{2})?$
8. 校验手机号
下面是国内 13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码)
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$
9. 判断IE的版本
IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。
^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$
10. 校验IP-v4地址
IP4 正则语句。
\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
11. 校验IP-v6地址
IP6 正则语句。
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
12. 检查URL的前缀
应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。
if (!s.match(/^[a-zA-Z]+:\\/\\//)) { s = 'http://' + s;}
13. 提取URL链接
下面的这个表达式可以筛选出一段文本中的URL。
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?
14. 文件路径及扩展名校验
验证windows下文件路径和扩展名(下面的例子中为.txt文件)
^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$
15. 提取Color Hex Codes
有时需要抽取网页中的颜色代码,可以使用下面的表达式。
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
16. 提取网页图片
假若你想提取网页中所有图片信息,可以利用下面的表达式。\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)
17. 提取页面超链接
提取html中的超链接。
(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>
18. 查找CSS属性
通过下面的表达式,可以搜索到相匹配的CSS属性。
^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}
19. 抽取注释
如果你需要移除HMTL中的注释,可以使用如下的表达式。
<!--(.*?)-->
20. 匹配HTML标签
通过下面的表达式可以匹配出HTML中的标签属性。
<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?> 查看全部
1 . 校验密码强度​
密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

2. 校验中文
字符串仅能是中文。
^[\\u4e00-\\u9fa5]{0,}$

3. 由数字、26个英文字母或下划线组成的字符串
^\\w+$

4. 校验E-Mail 地址
同密码一样,下面是E-mail地址合规性的正则检查语句。
 
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?

5. 校验身份证号码
下面是身份证号码的正则校验。15 或 18位。
15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$

18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$

6. 校验日期
“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

7. 校验金额
金额校验,精确到2位小数。
^[0-9]+(.[0-9]{2})?$

8. 校验手机号
下面是国内 13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码)
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$

9. 判断IE的版本
IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。
^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

10. 校验IP-v4地址
IP4 正则语句。
\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b

11. 校验IP-v6地址
IP6 正则语句。
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

12. 检查URL的前缀
应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。
if (!s.match(/^[a-zA-Z]+:\\/\\//)) {    s = 'http://' + s;}

13. 提取URL链接
下面的这个表达式可以筛选出一段文本中的URL。
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?

14. 文件路径及扩展名校验
验证windows下文件路径和扩展名(下面的例子中为.txt文件)
^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$

15. 提取Color Hex Codes
有时需要抽取网页中的颜色代码,可以使用下面的表达式。
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

16. 提取网页图片
假若你想提取网页中所有图片信息,可以利用下面的表达式。
\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)

17. 提取页面超链接
提取html中的超链接。
(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>

18. 查找CSS属性
通过下面的表达式,可以搜索到相匹配的CSS属性。
^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}

19. 抽取注释
如果你需要移除HMTL中的注释,可以使用如下的表达式。
<!--(.*?)-->

20. 匹配HTML标签
通过下面的表达式可以匹配出HTML中的标签属性。
<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>

Apache基本使用总结

Rock 发表了文章 • 0 个评论 • 240 次浏览 • 2017-03-26 17:53 • 来自相关话题

一、常用配置

1、修改监听的IP和Port
Listen[IP:]PORT
Listen 12.24.34.56:80
Listen 8080
# 省略ip表示监听本机所有IP;Listen可重复出现多次;2、持久连接
KeepAive On # 开启
MaxKeepAliveRequests 0 # 一个持久TCP最多允许的请求数,这里设置0表示不限制)
KeepAliveTimeout 15 # 表示15秒KeepAlive是什么东西?它是http协议的一部分,让我们复习一下没有KeepAlive的http请求,从客户在浏览器输入一个有效url地址开始,浏览器就会利用socket向url对应的web服务器发送一条TCP请求,这个请求成功一次就得需要来回握三次手才能确定,成功以后,浏览器利用socket TCP连接资源向web服务器请求http协议,发送以后就等着web服务器把http返回头和body发送回来,发回来后浏览器关闭socket连接,然后做http返回头和body的解析工作,最后呈现在浏览器上的就是漂亮的页面了。这里面有什么问题呢?TCP连接需要三次握手,也就是来回请求三次方能确定一个TCP请求是否成功,然后TCP关闭呢?来回需要4次请求才能完成!每次http请求就3次握手,4次拜拜,这来来回回的不嫌累啊,多少时间和资源都被浪费在socket连接关闭上了,能不能一次socket TCP连接发送多次http请求呢?于是KeepAlive就应运而生,http/1.0里需要客户端自己在请求头加入Connection:Keep-alive方能实现,在这里我们只考虑http1.1了,只需要设置一下Apache,让它默认就是Keep-Alive持久连接模式(Apache必须1.2+才能支持Keep-Alive)。在httpd.conf里找到KeepAive配置项,果断设置为On,MaxKeepAliveRequests果断为0(一个持久TCP最多允许的请求数,如果过小,很容易在TCP未过期的情况下,达到最大连接,那下次连接就又是新的TCP连接了,这里设置0表示不限制),然后对于mysql_pconnect最重要的选项KeepAliveTimeout设置为15(表示15秒), httpd-2.4支持毫秒级持久时间。
测试:
<?php
echo "Apache进程号:". getmypid();
?>很简单,获取当前PHP执行者(Apache)的进程号,用浏览器浏览这个页面,看到什么?对,有看到一串进程号数字,15秒内,连续刷新页面,看看进程号有无变化?木有吧?现在把手拿开,交叉在胸前,度好时间,1秒,2秒,3,...15,16。好,过了15秒了,再去刷新页面,进程号有没有变化?变了!又是一个新的Apache进程了,为什么15秒后就变成新的进程了?记得我们在Apache里设置的KeepAliveTimeout吗?它的值就是15秒。现在我们应该大致清楚了,在web服务器默认打开KeepAlive的情况下,客户端第一次http成功请求后,Apache不会立刻断开socket,而是一直监听来自这一客户端的请求,监听多久?根据KeepAliveTimeout选项配置的时间决定,一旦超过这一时间,Apache就会断开socket了,那么下次同一客户端再次请求,Apache就会新开一个进程来相应。所以我们之前15内不停的刷新页面,看到的进程号都是一致的,表明是浏览器请求给了同一个Apache进程。

浏览器是怎么知道不需要重新进行TCP连接就可以直接发送http请求呢?因为http返回头里就会带上Connection:keep-alive,Keep-alive:15两行,意思就是让客户端浏览器明白,这次socket连接我这边还没关闭呢,你可以在15内继续使用这个连接,并发送http请求,于是乎浏览器就知道应该怎么做了。
 
3、MPM参数
MultipathProcessModule:多道处理模块
prefork,worker,event
<IfModule prefork.c>
StartServers 8 #服务启动时启动的子进程数
MinSpareServers 5 #最少空闲子进程数
MaxSpareServers 20
ServerLimit 256 #同时启动的子进程数上限
MaxClients 256 #同时服务的客户端数上限(支持的并发数上限)
MaxRequestsPerChild 4000 #每个子进程在其生命周期内处理的请求数上限
</IfModule>

<IfModule worker.c>
StartServers 4 #服务启动时启动的子进程数
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25 #每个子进程可启动的线程数
MaxRequestsPerChild 0 #每个子进程可处理的请求数,0表示无限制
</IfModule>4、DSO
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
#要卸载某个模块直接将其注释掉即可,不用重读配置文件就可立即生效;模块路径为相对于ServerRoot而言的路径
显示DSO动态装载的模块:
# httpd -D DUMP_MODULES
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
auth_basic_module (shared)
auth_digest_module (shared)
authn_file_module (shared)
authn_alias_module (shared)
...
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
# httpd.worker -l
Compiled in modules:
core.c
worker.c
http_core.c
mod_so.c5、定义'Main'server的文档页面路径
DocumentRoot "/path/to/somefile"
文档路径映射:
DocumentRoot 指向的路径为URL路径的起始位置;
DocumentRoot "/var/www/html" #默认为这个位置
test/index.html-->http://HOST:PORT/test/index.html6、站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
<Directory "/path/to/somewhere">
...
</Direcotry>
<File [~] "/path/to/somewhere">
...
</File>
基于URL访问路径做访问控制:
<Location"">
...
</Location>
#另外,路径可做模式匹配,但若非迫不得已不建议使用
#如果即能使用Diretoory控制,也能使用Location控制,建议使用Directory7、Directory中“基于来源地址”实现访问控制
(1)Options
所有可用特性:Indexes,Includes,FollowSymLinks,SymLinksifOwnerMatch
ExecCGI,MultiViews,None,All
Indexes:索引;在无默认主页面又无欢迎页时,将所有资源以列表形式呈现给用户。
危险,慎用;在选项前添加减号即为禁用。如-Indexes
FollowSymlinks:允许跟踪符号链接文件;
# vim /etc/httpd/conf/httpd.conf
<Directory "/www/html">
Options Indexes FollowSymLinks #默认是开启的
AllowOverride None
Order allow,deny
Allow from all
</Directory>
(2)AllowOverride
支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能;
.htaccess文件会影响httpd的性能
(3)基于IP做访问控制机制
Order:检查次序
Order allow,deny
Allow form 192.168.10.0/24
form后面能够接受的地址格式:
IP,Network Address
网络地址格式较为灵活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.08、定义默认主页面DirecotryIndex index.htm lindex.html.var9、日志设定
ErrorLog "/path/to/error_log" #错误日志,路径为相对于ServerRoot而言的路径
LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
指定级别及比其更高级别的信息都会被记录
LogFormat 格式 格式名
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时输入用户名,没有认证时为-
%t: 服务器收到 用户请求时的时间
%r:请求报名的起始行
%>s: 响应状态码
%b: 响应报文的长度,单位是字节
%{HEADER_NAME}i: 记录指定首部对应的值
例如 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#格式中若要使用引号则要使用反斜线转义
CustomLog "/path/to/access_log" LogFormat_Name10、路径别名
实现URL路径的映射,从而所访问的资源不再依赖于站点根目录。
Alias /URL/ "/path/to/somewhere/"
例如 Alias /images/ "/www/tupian/" #后面映射的路径是绝对路径,而不是相对于站点根目录而言的路径;此时若站点根目录(以/var/www/html为例)下也有一个images目录,那么将无法访问/var/www/html/images中的资源,因为images已被别名征用
# mkdir test hello
# cat test/a.html
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# cat hello/b.html
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
# vim /etc/httpd/conf/httpd.conf
Alias /test/ "/www/html/hello/"
# service httpd restart
停止 httpd: [确定]
正在启动 httpd: [确定]

# curl http://localhost/test/a.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /test/a.html was not found on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at localhost Port 80</address>
</body></html>
# curl http://localhost/test/b.html
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb11、设定默认字符集AddDefaultCharset UTF-8
# 字符集:GBK,GB2312,GB1803012、基于用户的访问控制用户认证类型:
基本认证:Basic,明文发送
摘要认证:digest
虚拟用户:仅用于访问某服务或获取某资源的凭证;
账号和密码的存储机制:
文本文件:.htpasswd
SQL数据库
dbm:数据库引擎,提供API
ldap:
案例:基于文件做访问控制
(1)基于用户进行认证
<Directory />
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
# Require valid-user:文件中所有用户均可访问
# Require user USERNAME,... 指定用户访问
(2)提供认证文件
htpasswd [option] passwdfile username
选项:
-c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除原有内容
-m:以md5的格式编码存储用户的密码信息
-s:sha1加密用户密码;
-D:删除指定用户
(3)基于组认证
<Directory />
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GROUP_NAME
</Directory>
组文件(.htgroup)格式 组名:user1 user2 user3
例如:
# cd /var/www/html
# mkdir admin
# cat admin/admin.html
The user is admin.
# vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
# htpasswd -c -m /etc/httpd/conf/.htpasswd bjwf #创建第一个用户时必须创建文件
New password:
Re-type new password:
Adding password for user bjwf
# htpasswd -m /etc/httpd/conf/.htpasswd tom #创建第二个用户
New password:
Re-type new password:
Adding password for user tom
# service httpd restart



13、虚拟主机有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost"IP:PORT">
SeverName
DocumentRoot""
</VirtualHost>
ServerAlias:虚拟主机的别名;
ErrorLog
CustomLog
<Directory"">
</Directory>

示例1:基于ip
<VirtualHost172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot"/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
示例2:基于port
<VirtualHost172.16.100.7:80>
ServerNameweb2.magedu.com
DocumentRoot"/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.7:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
示例3:基于hostname
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
#注:一般要启用虚拟主机,最好是新建一个文档在/etc/httpd/conf.d/vhost.conf里面,这样一来虚拟主机
设定的参数可以随便修改,而且不会影响到主配置文件,而主配置文件httpd.conf中有个include的参数可以
将/etc/httpd/conf.d/*.conf都包含进来。示例:
# mkdir /var/www/html/{a.com,b.net,c.org} -pv
mkdir: 已创建目录 "/var/www/html/a.com"
mkdir: 已创建目录 "/var/www/html/b.net"
mkdir: 已创建目录 "/var/www/html/c.org"
# echo a.com > /var/www/html/a.com/index.html
# echo b.net > /var/www/html/b.net/index.html
# echo c.org > /var/www/html/c.org/index.html
# cat vhost.conf (基于IP的虚拟主机)
<VirtualHost 192.168.130.250:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>

<VirtualHost 192.168.130.251:80>
ServerName www.b.net
DocumentRoot "/var/www/html/b.net"
</VirtualHost>

<VirtualHost 192.168.130.252:80>
ServerName www.c.org
DocumentRoot "/var/www/html/c.org"
</VirtualHost>
# curl http://192.168.130.250
a.com
# curl http://192.168.130.251
b.net
# curl http://192.168.130.252
c.org

# cat vhost.conf (基于主机名的虚拟主机)
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>

<VirtualHost *:80>
ServerName www.b.net
DocumentRoot "/var/www/html/b.net"
</VirtualHost>

<VirtualHost *:80>
ServerName www.c.org
DocumentRoot "/var/www/html/c.org"
</VirtualHost>
# cat /etc/hosts
192.168.130.250 kvm.jlc.com
192.168.130.250 www.a.com
192.168.130.250 www.b.net
192.168.130.250 www.c.org
# curl http://www.a.com
a.com
# curl http://www.b.net
b.net
# curl http://www.c.org
c.org14、内置的status页面
handler:当文件被调用时,apache的内部表现形式,一般每种文件类型都有其隐式处理器
httpd内嵌有handler,其中有一个handler(server-status)用于输出当前httpd服务相关状态信息
启用handler要使用SetHandler指定# vim httpd.conf
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 192.168.130.0/24
Allow from 192.168.120.0/24
Deny from all
</Location>
# httpd -t #检查配置文件语法
Syntax OK
# service httpd reload



15、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道(proxy tunneling),甚至它还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大。
用法:curl [option] URL
常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.016、使用mod_deflate模块压缩页面优化传输速度
SetOutputFilter DEFLATE
# mod_deflate configuration

# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9 #指定压缩比

# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html #针对特定浏览器的特殊指定

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html17、https
http over ssl = https 443/tcp
一般使用的协议ssl: v3  tls: v1
 
SSL会话的简化过程:
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;

(2) 服务器端发送证书以及选定的加密方式给客户端;

(3) 客户端取得证书并进行证书验正:

如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;

(b) 验正证书的内容的合法性:完整性验正

(c) 检查证书的有效期限;

(d) 检查证书是否被吊销;

(e) 证书中拥有者的名字,与访问的目标主机要一致;

(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;

(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
 
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA

(b) 在服务器创建证书签署请求

(c) CA签证

(2) 配置httpd支持使用ssl,及使用的证书;

# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile(3) 测试基于https访问相应的主机;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]示例:在一台主机上既当CA又有http1、httpd上生成证书
# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
..........................................++++++
..............++++++
e is 65537 (0x10001)
[root@kvm ssl]# openssl req -new -key httpd.key -out httpd.csr -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) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:JLC
Organizational Unit Name (eg, section) []:JSB
Common Name (eg, your name or your server's hostname) []:www.bjwf.com
Email Address []:admin@bjwf.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
2、自建CA
# cd /etc/pki/CA
# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...............................................................+++
......+++
e is 65537 (0x10001)
[root@kvm 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) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:JLC
Organizational Unit Name (eg, section) []:JSB
Common Name (eg, your name or your server's hostname) []:ca.bjwf.com
Email Address []:ca@bjwf.com
# touch index.txt serial #准备文件
# echo 01 > serial
# openssl ca -in httpd.csr -out httpd.crt -days 365 #CA签署证书
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: Jun 23 08:06:22 2016 GMT
Not After : Jun 23 08:06:22 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = BJ
organizationName = JLC
organizationalUnitName = JSB
commonName = www.bjwf.com
emailAddress = admin@bjwf.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
83:60:A6:B7:E5:EF:E1:50:A6:69:E2:BD:3A:60:50:AF:A6:36:1B:39
X509v3 Authority Key Identifier:
keyid:B2:5F:33:01:B3:1A:B5:B9:2B:0F:C0:A5:37:48:AE:FD:3E:49:09:5F

Certificate is to be certified until Jun 23 08:06:22 2017 GMT (365 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
3、配置https
# yum -y install mod_ssl
# cd /etc/httpd/conf.d
# vim ssl.conf
<VirtualHost 192.168.130.250:443>
...
DocumentRoot "/var/www/html/a.com"
ServerName a.com:443
...
SSLCertificateFile /etc/httpd/ssl/httpd.crt #指明服务器证书的位置
...
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key #指明服务器密钥的位置
...
</VirtualHost>
# httpd -t
Syntax OK
# service httpd restart #查看https服务端口是否监听
停止 httpd: [确定]
正在启动 httpd: [确定]
[root@kvm conf.d]# netstat -tnlp|grep 443
tcp 0 0 :::443 :::* LISTEN 15378/httpd
# openssl s_client -connect 192.168.130.250:443 -CAfile /etc/pki/CA/cacert.pem
CONNECTED(00000003)
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: 82D9C7A1676D82AB28F73C8C0A6322A023689B8F73491E3E78B73F7E
Session-ID-ctx:
Master-Key: 340D147D1F4B479A0226EC9708728C9D872BFAF1B20B02C3403C9EDA98578D4
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 31 a3 1a 34 ba e5 11 99-77 6e e2 86 7b dc cf 3f 1..4....wn..{..?
0010 - d0 a9 3f 22 f0 77 4e ec-31 52 6b dd a7 70 41 44 ..?".wN.1Rk..pAD
0020 - e9 02 25 1f ee 24 56 d3-77 ac 56 10 e7 99 12 63 ..%..$V.w.V....c
0030 - 2e 8c d9 09 15 32 59 21-46 17 8e 77 de 0f ff e8 .....2Y!F..w....
0040 - 31 b4 e1 57 63 02 09 a1-31 42 8f f2 3f e3 49 c6 1..Wc...1B..?.I.
0050 - e7 66 ee 95 8b 1c 6a 7f-cc 8e 9b 5e 83 c2 c9 2f .f....j....^.../
0060 - 8e 26 62 1b 0b 39 4b 79-50 80 5e de c6 dc 01 f9 .&b..9KyP.^.....
0070 - 81 16 c7 3b 5a 90 3a a2-85 27 b4 7c ea 20 d5 83 ...;Z.:..'.|. ..
0080 - 7e fe 9f 37 8b b3 66 3e-e1 e8 a6 fd 32 9b d0 82 ~..7..f>....2...
0090 - 9f b0 be 7e a4 cf cf 6d-85 0d 93 ca 2b 70 c5 cf ...~...m....+p..
00a0 - 55 57 07 f7 bc fc 1d a2-df 30 d0 b6 05 6c 25 15 UW.......0...l%.
00b0 - ee 32 51 6c 87 51 25 b9-55 3b 96 d3 50 4a 03 b6 .2Ql.Q%.U;..PJ..

Start Time: 1466669780
Timeout : 300 (sec)
Verify return code: 0 (ok)
---

GET /index.html HTTP/1.1
HOST: www.a.com

HTTP/1.1 200 OK
Date: Thu, 23 Jun 2016 08:16:51 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 23 Jun 2016 06:27:07 GMT
ETag: "260639-6-535ec24af4cd1"
Accept-Ranges: bytes
Content-Length: 6
Connection: close
Content-Type: text/html; charset=UTF-8

a.com
closed




二、httpd自带工具

1、httpd:apache服务器程序
常用选项:
-t:测试配置文件
-l:显示静态编译进httpd的模块
-D DUMP_MODULES:列出DSO模块
-M:相当于-t -D DUMP_MODULES
-D DUMP_VHOSTS:列出所有虚拟主机
2、htpasswd:为基于文件的basic认证创建和更新用户认证文件
常用选项:
-c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除所有内容
-m:以md5的格式编码存储用户的密码信息
-s:sha1加密用户密码
-D:删除指定用户
3、apachectl:脚本,httpd服务控制工具
常用选项:
start:启用服务
stop:关闭服务
status:查看服务
configtest:测试服务配置文件
4、ab:apache benchmark,httpd的基准性能测试工具
用法:ab [options] [http[s]://]hostname[:port]/path/to/somefile
常用选项:
-c #:模拟的并发数
-n #:模拟的请求数,-n的值一定要大于等于-c的值
同类工具:http_load,webbench,seige
5、apxs:httpd得以扩展使用第三方模块的工具
6、htcacheclean:磁盘缓存清理工具
7、htdigest:为digest认证创建和更新用户认证文件
8、httxt2dbm:为rewrite map创建dbm格式的文件
9、rotatelogs:滚动日志,不关闭httpd而切换其使用日志文件的工具
access_log, access_log.1, access_log.2,
10、suexec:当httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexec作临时切换;
 

三、资源限定

软限定:可临时超出一定时长的上限
硬限定:绝对不可超出的上限可以使用ulimit命令临时的修改各种资源的软限制:
ulimit -n [#]:显示或设置能同事打开的文件句柄数
linux内核允许普通用户最多同时打开1024个文件
ulimit -u [#]:显示或设备能同时启动的进程数
ulimit -a:显示当前资源限定的设定
要长期有效,需要修改配置文件
/etc/security/limits.conf
/etc/security/limits.d/*.conf

更多选项:参考博客文档收集
ulimit -a 用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux用户
的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit -u 10000
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited
linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。
超出上限的修改就会出“不允许的操作”这样的错误。


# ulimit -n
1024
# ulimit -n 65535
# ulimit -n
65535

#<domain> <type> <item> <value>
#

#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4

# End of file
* soft noproc 10240
* hard noproc 10240
* soft nofile 10240
* hard nofile 10240 这就可以限定用户打开的最大线程及文件为10240个
 

四、AB测试

# ab -c 300 -n 3000 http://www.a.com/index.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.a.com (be patient)
Completed 300 requests
Completed 600 requests
Completed 900 requests
Completed 1200 requests
Completed 1500 requests
Completed 1800 requests
Completed 2100 requests
Completed 2400 requests
Completed 2700 requests
Completed 3000 requests
Finished 3000 requests


Server Software: Apache/2.2.15
Server Hostname: www.a.com
Server Port: 80

Document Path: /index.html
Document Length: 6 bytes #请求的资源大小

Concurrency Level: 300 #并发数
Time taken for tests: 0.630 seconds #测试的总时长
Complete requests: 3000 #请求总数
Failed requests: 0 #失败的请求
Write errors: 0
Total transferred: 816272 bytes #总共传输了多少字节
HTML transferred: 18006 bytes #整个场景中HTML内容传输量
Requests per second: 4760.79 [#/sec] (mean) #每秒处理的请求个数
Time per request: 63.015 [ms] (mean) #每处理一个并发单位所经过的时长
Time per request: 0.210 [ms] (mean, across all concurrent requests) #处理单个请求的时长
Transfer rate: 1265.01 [Kbytes/sec] received #传输速率

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 3.4 1 16
Processing: 1 47 129.2 18 608
Waiting: 1 47 129.2 18 608
Total: 8 49 131.4 19 619

Percentage of the requests served within a certain time (ms)
50% 19
66% 19
75% 20
80% 20
90% 21
95% 617
98% 618
99% 618
100% 619 (longest request)原文地址:http://79076431.blog.51cto.com/8977042/1792118   查看全部


一、常用配置


1、修改监听的IP和Port
Listen[IP:]PORT
Listen 12.24.34.56:80
Listen 8080
# 省略ip表示监听本机所有IP;Listen可重复出现多次;
2、持久连接
KeepAive On # 开启
MaxKeepAliveRequests 0 # 一个持久TCP最多允许的请求数,这里设置0表示不限制)
KeepAliveTimeout 15 # 表示15秒
KeepAlive是什么东西?它是http协议的一部分,让我们复习一下没有KeepAlive的http请求,从客户在浏览器输入一个有效url地址开始,浏览器就会利用socket向url对应的web服务器发送一条TCP请求,这个请求成功一次就得需要来回握三次手才能确定,成功以后,浏览器利用socket TCP连接资源向web服务器请求http协议,发送以后就等着web服务器把http返回头和body发送回来,发回来后浏览器关闭socket连接,然后做http返回头和body的解析工作,最后呈现在浏览器上的就是漂亮的页面了。这里面有什么问题呢?TCP连接需要三次握手,也就是来回请求三次方能确定一个TCP请求是否成功,然后TCP关闭呢?来回需要4次请求才能完成!每次http请求就3次握手,4次拜拜,这来来回回的不嫌累啊,多少时间和资源都被浪费在socket连接关闭上了,能不能一次socket TCP连接发送多次http请求呢?于是KeepAlive就应运而生,http/1.0里需要客户端自己在请求头加入Connection:Keep-alive方能实现,在这里我们只考虑http1.1了,只需要设置一下Apache,让它默认就是Keep-Alive持久连接模式(Apache必须1.2+才能支持Keep-Alive)。在httpd.conf里找到KeepAive配置项,果断设置为On,MaxKeepAliveRequests果断为0(一个持久TCP最多允许的请求数,如果过小,很容易在TCP未过期的情况下,达到最大连接,那下次连接就又是新的TCP连接了,这里设置0表示不限制),然后对于mysql_pconnect最重要的选项KeepAliveTimeout设置为15(表示15秒), httpd-2.4支持毫秒级持久时间。
测试:
<?php
echo "Apache进程号:". getmypid();
?>
很简单,获取当前PHP执行者(Apache)的进程号,用浏览器浏览这个页面,看到什么?对,有看到一串进程号数字,15秒内,连续刷新页面,看看进程号有无变化?木有吧?现在把手拿开,交叉在胸前,度好时间,1秒,2秒,3,...15,16。好,过了15秒了,再去刷新页面,进程号有没有变化?变了!又是一个新的Apache进程了,为什么15秒后就变成新的进程了?记得我们在Apache里设置的KeepAliveTimeout吗?它的值就是15秒。现在我们应该大致清楚了,在web服务器默认打开KeepAlive的情况下,客户端第一次http成功请求后,Apache不会立刻断开socket,而是一直监听来自这一客户端的请求,监听多久?根据KeepAliveTimeout选项配置的时间决定,一旦超过这一时间,Apache就会断开socket了,那么下次同一客户端再次请求,Apache就会新开一个进程来相应。所以我们之前15内不停的刷新页面,看到的进程号都是一致的,表明是浏览器请求给了同一个Apache进程。

浏览器是怎么知道不需要重新进行TCP连接就可以直接发送http请求呢?因为http返回头里就会带上Connection:keep-alive,Keep-alive:15两行,意思就是让客户端浏览器明白,这次socket连接我这边还没关闭呢,你可以在15内继续使用这个连接,并发送http请求,于是乎浏览器就知道应该怎么做了。
 
3、MPM参数
MultipathProcessModule:多道处理模块
prefork,worker,event
<IfModule prefork.c>
StartServers 8 #服务启动时启动的子进程数
MinSpareServers 5 #最少空闲子进程数
MaxSpareServers 20
ServerLimit 256 #同时启动的子进程数上限
MaxClients 256 #同时服务的客户端数上限(支持的并发数上限)
MaxRequestsPerChild 4000 #每个子进程在其生命周期内处理的请求数上限
</IfModule>

<IfModule worker.c>
StartServers 4 #服务启动时启动的子进程数
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25 #每个子进程可启动的线程数
MaxRequestsPerChild 0 #每个子进程可处理的请求数,0表示无限制
</IfModule>
4、DSO
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
#要卸载某个模块直接将其注释掉即可,不用重读配置文件就可立即生效;模块路径为相对于ServerRoot而言的路径
显示DSO动态装载的模块:
# httpd -D DUMP_MODULES
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
auth_basic_module (shared)
auth_digest_module (shared)
authn_file_module (shared)
authn_alias_module (shared)
...
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
# httpd.worker -l
Compiled in modules:
core.c
worker.c
http_core.c
mod_so.c
5、定义'Main'server的文档页面路径
DocumentRoot "/path/to/somefile"
文档路径映射:
DocumentRoot 指向的路径为URL路径的起始位置;
DocumentRoot "/var/www/html" #默认为这个位置
test/index.html-->http://HOST:PORT/test/index.html
6、站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
<Directory "/path/to/somewhere">
...
</Direcotry>
<File [~] "/path/to/somewhere">
...
</File>
基于URL访问路径做访问控制:
<Location"">
...
</Location>
#另外,路径可做模式匹配,但若非迫不得已不建议使用
#如果即能使用Diretoory控制,也能使用Location控制,建议使用Directory
7、Directory中“基于来源地址”实现访问控制
(1)Options
所有可用特性:Indexes,Includes,FollowSymLinks,SymLinksifOwnerMatch
ExecCGI,MultiViews,None,All
Indexes:索引;在无默认主页面又无欢迎页时,将所有资源以列表形式呈现给用户。
危险,慎用;在选项前添加减号即为禁用。如-Indexes
FollowSymlinks:允许跟踪符号链接文件;
# vim /etc/httpd/conf/httpd.conf
<Directory "/www/html">
Options Indexes FollowSymLinks #默认是开启的
AllowOverride None
Order allow,deny
Allow from all
</Directory>
(2)AllowOverride
支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能;
.htaccess文件会影响httpd的性能
(3)基于IP做访问控制机制
Order:检查次序
Order allow,deny
Allow form 192.168.10.0/24
form后面能够接受的地址格式:
IP,Network Address
网络地址格式较为灵活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8、定义默认主页面
DirecotryIndex index.htm lindex.html.var
9、日志设定
ErrorLog "/path/to/error_log"   #错误日志,路径为相对于ServerRoot而言的路径
LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
指定级别及比其更高级别的信息都会被记录
LogFormat 格式 格式名
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时输入用户名,没有认证时为-
%t: 服务器收到 用户请求时的时间
%r:请求报名的起始行
%>s: 响应状态码
%b: 响应报文的长度,单位是字节
%{HEADER_NAME}i: 记录指定首部对应的值
例如 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#格式中若要使用引号则要使用反斜线转义
CustomLog "/path/to/access_log" LogFormat_Name
10、路径别名
实现URL路径的映射,从而所访问的资源不再依赖于站点根目录。
Alias /URL/ "/path/to/somewhere/"
例如 Alias /images/ "/www/tupian/" #后面映射的路径是绝对路径,而不是相对于站点根目录而言的路径;此时若站点根目录(以/var/www/html为例)下也有一个images目录,那么将无法访问/var/www/html/images中的资源,因为images已被别名征用
# mkdir test hello
# cat test/a.html
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
# cat hello/b.html
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
# vim /etc/httpd/conf/httpd.conf
Alias /test/ "/www/html/hello/"
# service httpd restart
停止 httpd: [确定]
正在启动 httpd: [确定]

# curl http://localhost/test/a.html
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /test/a.html was not found on this server.</p>
<hr>
<address>Apache/2.2.15 (CentOS) Server at localhost Port 80</address>
</body></html>
# curl http://localhost/test/b.html
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
11、设定默认字符集
AddDefaultCharset UTF-8
# 字符集:GBK,GB2312,GB18030
12、基于用户的访问控制
用户认证类型:
基本认证:Basic,明文发送
摘要认证:digest
虚拟用户:仅用于访问某服务或获取某资源的凭证;
账号和密码的存储机制:
文本文件:.htpasswd
SQL数据库
dbm:数据库引擎,提供API
ldap:
案例:基于文件做访问控制
(1)基于用户进行认证
<Directory />
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
# Require valid-user:文件中所有用户均可访问
# Require user USERNAME,... 指定用户访问
(2)提供认证文件
htpasswd [option] passwdfile username
选项:
-c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除原有内容
-m:以md5的格式编码存储用户的密码信息
-s:sha1加密用户密码;
-D:删除指定用户
(3)基于组认证
<Directory />
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GROUP_NAME
</Directory>
组文件(.htgroup)格式 组名:user1 user2 user3
例如:
# cd /var/www/html
# mkdir admin
# cat admin/admin.html
The user is admin.
# vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "admin area"
AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
# htpasswd -c -m /etc/httpd/conf/.htpasswd bjwf #创建第一个用户时必须创建文件
New password:
Re-type new password:
Adding password for user bjwf
# htpasswd -m /etc/httpd/conf/.htpasswd tom #创建第二个用户
New password:
Re-type new password:
Adding password for user tom
# service httpd restart
authes.png

13、虚拟主机
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost"IP:PORT">
SeverName
DocumentRoot""
</VirtualHost>
ServerAlias:虚拟主机的别名;
ErrorLog
CustomLog
<Directory"">
</Directory>

示例1:基于ip
<VirtualHost172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot"/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
示例2:基于port
<VirtualHost172.16.100.7:80>
ServerNameweb2.magedu.com
DocumentRoot"/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.7:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
示例3:基于hostname
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
#注:一般要启用虚拟主机,最好是新建一个文档在/etc/httpd/conf.d/vhost.conf里面,这样一来虚拟主机
设定的参数可以随便修改,而且不会影响到主配置文件,而主配置文件httpd.conf中有个include的参数可以
将/etc/httpd/conf.d/*.conf都包含进来。
示例:
# mkdir /var/www/html/{a.com,b.net,c.org} -pv
mkdir: 已创建目录 "/var/www/html/a.com"
mkdir: 已创建目录 "/var/www/html/b.net"
mkdir: 已创建目录 "/var/www/html/c.org"
# echo a.com > /var/www/html/a.com/index.html
# echo b.net > /var/www/html/b.net/index.html
# echo c.org > /var/www/html/c.org/index.html
# cat vhost.conf (基于IP的虚拟主机)
<VirtualHost 192.168.130.250:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>

<VirtualHost 192.168.130.251:80>
ServerName www.b.net
DocumentRoot "/var/www/html/b.net"
</VirtualHost>

<VirtualHost 192.168.130.252:80>
ServerName www.c.org
DocumentRoot "/var/www/html/c.org"
</VirtualHost>
# curl http://192.168.130.250
a.com
# curl http://192.168.130.251
b.net
# curl http://192.168.130.252
c.org

# cat vhost.conf (基于主机名的虚拟主机)
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/var/www/html/a.com"
</VirtualHost>

<VirtualHost *:80>
ServerName www.b.net
DocumentRoot "/var/www/html/b.net"
</VirtualHost>

<VirtualHost *:80>
ServerName www.c.org
DocumentRoot "/var/www/html/c.org"
</VirtualHost>
# cat /etc/hosts
192.168.130.250 kvm.jlc.com
192.168.130.250 www.a.com
192.168.130.250 www.b.net
192.168.130.250 www.c.org
# curl http://www.a.com
a.com
# curl http://www.b.net
b.net
# curl http://www.c.org
c.org
14、内置的status页面
handler:当文件被调用时,apache的内部表现形式,一般每种文件类型都有其隐式处理器
httpd内嵌有handler,其中有一个handler(server-status)用于输出当前httpd服务相关状态信息
启用handler要使用SetHandler指定
# vim httpd.conf 
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 192.168.130.0/24
Allow from 192.168.120.0/24
Deny from all
</Location>
# httpd -t #检查配置文件语法
Syntax OK
# service httpd reload
AapachStatus.png

15、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道(proxy tunneling),甚至它还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大。
用法:curl [option] URL
常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
16、使用mod_deflate模块压缩页面优化传输速度
SetOutputFilter DEFLATE
# mod_deflate configuration

# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9 #指定压缩比

# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html #针对特定浏览器的特殊指定

# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
17、https
http over ssl = https 443/tcp
一般使用的协议ssl: v3  tls: v1
 
SSL会话的简化过程:
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;

(2) 服务器端发送证书以及选定的加密方式给客户端;

(3) 客户端取得证书并进行证书验正:

如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;

(b) 验正证书的内容的合法性:完整性验正

(c) 检查证书的有效期限;

(d) 检查证书是否被吊销;

(e) 证书中拥有者的名字,与访问的目标主机要一致;

(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;

(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
 
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA

(b) 在服务器创建证书签署请求

(c) CA签证

(2) 配置httpd支持使用ssl,及使用的证书;

# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 测试基于https访问相应的主机;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
示例:在一台主机上既当CA又有http
1、httpd上生成证书
# mkdir /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
..........................................++++++
..............++++++
e is 65537 (0x10001)
[root@kvm ssl]# openssl req -new -key httpd.key -out httpd.csr -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) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:JLC
Organizational Unit Name (eg, section) []:JSB
Common Name (eg, your name or your server's hostname) []:www.bjwf.com
Email Address []:admin@bjwf.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
2、自建CA
# cd /etc/pki/CA
# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...............................................................+++
......+++
e is 65537 (0x10001)
[root@kvm 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) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:JLC
Organizational Unit Name (eg, section) []:JSB
Common Name (eg, your name or your server's hostname) []:ca.bjwf.com
Email Address []:ca@bjwf.com
# touch index.txt serial #准备文件
# echo 01 > serial
# openssl ca -in httpd.csr -out httpd.crt -days 365 #CA签署证书
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: Jun 23 08:06:22 2016 GMT
Not After : Jun 23 08:06:22 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = BJ
organizationName = JLC
organizationalUnitName = JSB
commonName = www.bjwf.com
emailAddress = admin@bjwf.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
83:60:A6:B7:E5:EF:E1:50:A6:69:E2:BD:3A:60:50:AF:A6:36:1B:39
X509v3 Authority Key Identifier:
keyid:B2:5F:33:01:B3:1A:B5:B9:2B:0F:C0:A5:37:48:AE:FD:3E:49:09:5F

Certificate is to be certified until Jun 23 08:06:22 2017 GMT (365 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
3、配置https
# yum -y install mod_ssl
# cd /etc/httpd/conf.d
# vim ssl.conf
<VirtualHost 192.168.130.250:443>
...
DocumentRoot "/var/www/html/a.com"
ServerName a.com:443
...
SSLCertificateFile /etc/httpd/ssl/httpd.crt #指明服务器证书的位置
...
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key #指明服务器密钥的位置
...
</VirtualHost>
# httpd -t
Syntax OK
# service httpd restart #查看https服务端口是否监听
停止 httpd: [确定]
正在启动 httpd: [确定]
[root@kvm conf.d]# netstat -tnlp|grep 443
tcp 0 0 :::443 :::* LISTEN 15378/httpd
# openssl s_client -connect 192.168.130.250:443 -CAfile /etc/pki/CA/cacert.pem
CONNECTED(00000003)
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: 82D9C7A1676D82AB28F73C8C0A6322A023689B8F73491E3E78B73F7E
Session-ID-ctx:
Master-Key: 340D147D1F4B479A0226EC9708728C9D872BFAF1B20B02C3403C9EDA98578D4
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 31 a3 1a 34 ba e5 11 99-77 6e e2 86 7b dc cf 3f 1..4....wn..{..?
0010 - d0 a9 3f 22 f0 77 4e ec-31 52 6b dd a7 70 41 44 ..?".wN.1Rk..pAD
0020 - e9 02 25 1f ee 24 56 d3-77 ac 56 10 e7 99 12 63 ..%..$V.w.V....c
0030 - 2e 8c d9 09 15 32 59 21-46 17 8e 77 de 0f ff e8 .....2Y!F..w....
0040 - 31 b4 e1 57 63 02 09 a1-31 42 8f f2 3f e3 49 c6 1..Wc...1B..?.I.
0050 - e7 66 ee 95 8b 1c 6a 7f-cc 8e 9b 5e 83 c2 c9 2f .f....j....^.../
0060 - 8e 26 62 1b 0b 39 4b 79-50 80 5e de c6 dc 01 f9 .&b..9KyP.^.....
0070 - 81 16 c7 3b 5a 90 3a a2-85 27 b4 7c ea 20 d5 83 ...;Z.:..'.|. ..
0080 - 7e fe 9f 37 8b b3 66 3e-e1 e8 a6 fd 32 9b d0 82 ~..7..f>....2...
0090 - 9f b0 be 7e a4 cf cf 6d-85 0d 93 ca 2b 70 c5 cf ...~...m....+p..
00a0 - 55 57 07 f7 bc fc 1d a2-df 30 d0 b6 05 6c 25 15 UW.......0...l%.
00b0 - ee 32 51 6c 87 51 25 b9-55 3b 96 d3 50 4a 03 b6 .2Ql.Q%.U;..PJ..

Start Time: 1466669780
Timeout : 300 (sec)
Verify return code: 0 (ok)
---

GET /index.html HTTP/1.1
HOST: www.a.com

HTTP/1.1 200 OK
Date: Thu, 23 Jun 2016 08:16:51 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 23 Jun 2016 06:27:07 GMT
ETag: "260639-6-535ec24af4cd1"
Accept-Ranges: bytes
Content-Length: 6
Connection: close
Content-Type: text/html; charset=UTF-8

a.com
closed
CAError.png


二、httpd自带工具


1、httpd:apache服务器程序
常用选项:
-t:测试配置文件
-l:显示静态编译进httpd的模块
-D DUMP_MODULES:列出DSO模块
-M:相当于-t -D DUMP_MODULES
-D DUMP_VHOSTS:列出所有虚拟主机
2、htpasswd:为基于文件的basic认证创建和更新用户认证文件
常用选项:
-c:创建一个passwdfile,如果passwdfile已经存在,那么它会重新写入并删除所有内容
-m:以md5的格式编码存储用户的密码信息
-s:sha1加密用户密码
-D:删除指定用户
3、apachectl:脚本,httpd服务控制工具
常用选项:
start:启用服务
stop:关闭服务
status:查看服务
configtest:测试服务配置文件
4、ab:apache benchmark,httpd的基准性能测试工具
用法:ab [options] [http[s]://]hostname[:port]/path/to/somefile
常用选项:
-c #:模拟的并发数
-n #:模拟的请求数,-n的值一定要大于等于-c的值
同类工具:http_load,webbench,seige
5、apxs:httpd得以扩展使用第三方模块的工具
6、htcacheclean:磁盘缓存清理工具
7、htdigest:为digest认证创建和更新用户认证文件
8、httxt2dbm:为rewrite map创建dbm格式的文件
9、rotatelogs:滚动日志,不关闭httpd而切换其使用日志文件的工具
access_log, access_log.1, access_log.2,
10、suexec:当httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexec作临时切换;

 


三、资源限定


软限定:可临时超出一定时长的上限
硬限定:绝对不可超出的上限
可以使用ulimit命令临时的修改各种资源的软限制:
ulimit -n [#]:显示或设置能同事打开的文件句柄数
linux内核允许普通用户最多同时打开1024个文件
ulimit -u [#]:显示或设备能同时启动的进程数
ulimit -a:显示当前资源限定的设定
要长期有效,需要修改配置文件
/etc/security/limits.conf
/etc/security/limits.d/*.conf

更多选项:参考博客文档收集
ulimit -a 用来显示当前的各种用户进程限制。
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux用户
的最大进程数,下面我把某linux用户的最大进程数设为10000个:
ulimit -u 10000
其他建议设置成无限制(unlimited)的一些重要设置是:
数据段长度:ulimit -d unlimited
最大内存大小:ulimit -m unlimited
堆栈大小:ulimit -s unlimited
CPU 时间:ulimit -t unlimited
虚拟内存:ulimit -v unlimited
linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。
超出上限的修改就会出“不允许的操作”这样的错误。


# ulimit -n
1024
# ulimit -n 65535
# ulimit -n
65535

#<domain> <type> <item> <value>
#

#* soft core 0
#* hard rss 10000
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
#@student - maxlogins 4

# End of file
* soft noproc 10240
* hard noproc 10240
* soft nofile 10240
* hard nofile 10240 这就可以限定用户打开的最大线程及文件为10240个

 


四、AB测试


# ab -c 300 -n 3000 http://www.a.com/index.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.a.com (be patient)
Completed 300 requests
Completed 600 requests
Completed 900 requests
Completed 1200 requests
Completed 1500 requests
Completed 1800 requests
Completed 2100 requests
Completed 2400 requests
Completed 2700 requests
Completed 3000 requests
Finished 3000 requests


Server Software: Apache/2.2.15
Server Hostname: www.a.com
Server Port: 80

Document Path: /index.html
Document Length: 6 bytes #请求的资源大小

Concurrency Level: 300 #并发数
Time taken for tests: 0.630 seconds #测试的总时长
Complete requests: 3000 #请求总数
Failed requests: 0 #失败的请求
Write errors: 0
Total transferred: 816272 bytes #总共传输了多少字节
HTML transferred: 18006 bytes #整个场景中HTML内容传输量
Requests per second: 4760.79 [#/sec] (mean) #每秒处理的请求个数
Time per request: 63.015 [ms] (mean) #每处理一个并发单位所经过的时长
Time per request: 0.210 [ms] (mean, across all concurrent requests) #处理单个请求的时长
Transfer rate: 1265.01 [Kbytes/sec] received #传输速率

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 3.4 1 16
Processing: 1 47 129.2 18 608
Waiting: 1 47 129.2 18 608
Total: 8 49 131.4 19 619

Percentage of the requests served within a certain time (ms)
50% 19
66% 19
75% 20
80% 20
90% 21
95% 617
98% 618
99% 618
100% 619 (longest request)
原文地址:http://79076431.blog.51cto.com/8977042/1792118  

Redis高可用架构之Sentinel

Geek小A 发表了文章 • 0 个评论 • 190 次浏览 • 2017-03-25 19:09 • 来自相关话题

一、背景​  
公司的业务在大量的使用redis,访问量大的业务我们有在使用codis集群,redis 3.0集群,说到redis 3.0集群,我们线上已经跑了半年多了,集群本身没有出现过任务问题,但是由于我们这个业务是海外的,集群建在aws的ec2上,由于ec2的网络抖动或者ec2本身的原因,导致主从切换,目前aws的技术正在跟进,这个集群目前的QPS 50w+,集群本身已经做到了高可用和横向扩展,但是,实际情况一些小的业务没必要上集群,单个实例就可以满足业务需求,那么我们就要想办法如何保证单个实例的高可用,最近也在看相关的文档,做一些测试,大家有在使用redis主从+lvs 漂VIP的方案,也有使用redis主从+哨兵 漂VIP的方案,甚至有在代码逻辑做故障切换等等,各种各样的方案都有,下面我介绍一下redis主从+ 哨兵 漂VIP的方案,后面我们打算线上大规模的使用这个方案。
 
二、环境
#redis
100.10.32.54:6400 主库
100.10.32.55:6400 从库
100.10.32.250 VIP

#sentinel
100.10.32.54:26400 sentinel 本地节点
100.10.32.55:26400 sentinel 本地节点
100.10.32.57:26400 sentinel 仲裁节点
三、部署
1、安装
yum -y install redis2、撰写redis配置文件(100.10.32.54 和100.10.32.55)
vim /etc/redis_6400.conf

daemonize yes
pidfile "/var/run/redis_6400.pid"
port 6400
tcp-backlog 65535
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/var/log/redis/redis_6400.log"
maxmemory 8gb
maxmemory-policy allkeys-lru
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/data/redis/6400"
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 1283、撰写sentinel配置文件(100.10.32.54 、100.10.32.55 和100.10.32.57)
vim /etc/redis-sentinel6400.conf

daemonize yes
port 26400
dir "/data/redis/redis_sentinels"
pidfile "/var/run/redis/sentinel6400.pid"
logfile "/data/redis/redis_sentinels/sentinel6400.log"
sentinel monitor master6400 100.10.32.54 6400 2
sentinel down-after-milliseconds master6400 6000
sentinel failover-timeout master6400 18000
sentinel client-reconfig-script master6400 /opt/notify_master6400.sh ##仲裁节点无需添加这行配置,client-reconfig-script参数是在sentinel做failover的过程中调用脚本漂vip到新的master上PS:
关于sentinel 的一些工作原理和参数说明,请参阅:http://redisdoc.com/topic/sentinel.html  
 
4、撰写漂VIP的脚本(100.10.32.54 、100.10.32.55)
vim /opt/notify_master6400.sh

#!/bin/bash
MASTER_IP=$6
LOCAL_IP='100.10.32.54' #从库修改为100.10.32.55
VIP='100.10.32.250'
NETMASK='24'
INTERFACE='eth0'
if [ ${MASTER_IP} = ${LOCAL_IP} ]; then
/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit 0
fi
exit 1chmod +x /opt/notify_master6400.sh #赋予可执行权限PS:
这里大概说一下这个脚本的工作原理,sentinel在做failover的 过程中会传出6个参数,分别是<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中第6个参数from-ip也就是新的master的ip,对应脚本中的MASTER_IP,下面的if判断大家应该都很了然了,如果MASTER_IP=LOCAL_IP,那就绑定VIP,反之删除VIP。
 
5、启动redis服务(100.10.32.54、100.10.32.55)
redis-server /etc/redis_6400.conf6、初始化主从(100.10.32.55)
redis-cli -p 6400 slaveof 10.10.32.54 64007、绑定VIP到主库(100.10.32.54)
/sbin/ip addr add 100.10.32.250/24 dev eth08、启动sentinel服务(100.10.32.54、100.10.32.55、100.10.32.57)
redis-server /etc/redis-sentinel6400.conf --sentinel至此,整个高可用方案已经搭建完成。
 
[root@localhost tmp]# redis-cli -h 100.10.32.54 -p 6400 info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=100.10.32.55,port=6400,state=online,offset=72669,lag=1
master_repl_offset:72669
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:72668[root@localhost tmp]# redis-cli -h 100.10.32.54 -p 26400 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master6400,status=ok,address=100.10.32.54:6400,slaves=1,sentinels=3[root@localhost tmp]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 100.10.32.54/24 brd 100.10.32.255 scope global eth0
inet 100.10.32.250/24 scope global secondary eth0
四、测试
1、把主库停掉
redis-cli -h 100.10.32.54 -p 6400 shutdown2、看从库是否提升为主库
[root@localhost tmp]# redis-cli -h 100.10.32.55 -p 6400 info Replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0看VIP是否漂移到100.10.32.55上
[root@localhost tmp]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 100.10.32.55/24 brd 100.10.32.255 scope global eth0
inet 100.10.32.250/24 scope global secondary eth04、看Sentinel的监控状态
[root@localhost tmp]# redis-cli -p 26400 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master6400,status=ok,address=100.10.32.55:6400,slaves=1,sentinels=3原文链接:http://navyaijm.blog.51cto.com/4647068/1745569  
参考学习:http://www.cnblogs.com/LiZhiW/p/4851631.html  查看全部
一、背景​  
公司的业务在大量的使用redis,访问量大的业务我们有在使用codis集群,redis 3.0集群,说到redis 3.0集群,我们线上已经跑了半年多了,集群本身没有出现过任务问题,但是由于我们这个业务是海外的,集群建在aws的ec2上,由于ec2的网络抖动或者ec2本身的原因,导致主从切换,目前aws的技术正在跟进,这个集群目前的QPS 50w+,集群本身已经做到了高可用和横向扩展,但是,实际情况一些小的业务没必要上集群,单个实例就可以满足业务需求,那么我们就要想办法如何保证单个实例的高可用,最近也在看相关的文档,做一些测试,大家有在使用redis主从+lvs 漂VIP的方案,也有使用redis主从+哨兵 漂VIP的方案,甚至有在代码逻辑做故障切换等等,各种各样的方案都有,下面我介绍一下redis主从+ 哨兵 漂VIP的方案,后面我们打算线上大规模的使用这个方案。
 
二、环境
#redis
100.10.32.54:6400 主库
100.10.32.55:6400 从库
100.10.32.250 VIP

#sentinel
100.10.32.54:26400 sentinel 本地节点
100.10.32.55:26400 sentinel 本地节点
100.10.32.57:26400 sentinel 仲裁节点

三、部署
1、安装
yum -y install redis
2、撰写redis配置文件(100.10.32.54 和100.10.32.55)
vim /etc/redis_6400.conf

daemonize yes
pidfile "/var/run/redis_6400.pid"
port 6400
tcp-backlog 65535
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/var/log/redis/redis_6400.log"
maxmemory 8gb
maxmemory-policy allkeys-lru
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/data/redis/6400"
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
3、撰写sentinel配置文件(100.10.32.54 、100.10.32.55 和100.10.32.57)
vim /etc/redis-sentinel6400.conf

daemonize yes
port 26400
dir "/data/redis/redis_sentinels"
pidfile "/var/run/redis/sentinel6400.pid"
logfile "/data/redis/redis_sentinels/sentinel6400.log"
sentinel monitor master6400 100.10.32.54 6400 2
sentinel down-after-milliseconds master6400 6000
sentinel failover-timeout master6400 18000
sentinel client-reconfig-script master6400 /opt/notify_master6400.sh ##仲裁节点无需添加这行配置,client-reconfig-script参数是在sentinel做failover的过程中调用脚本漂vip到新的master上
PS:
关于sentinel 的一些工作原理和参数说明,请参阅:http://redisdoc.com/topic/sentinel.html  
 
4、撰写漂VIP的脚本(100.10.32.54 、100.10.32.55)
vim /opt/notify_master6400.sh

#!/bin/bash
MASTER_IP=$6
LOCAL_IP='100.10.32.54' #从库修改为100.10.32.55
VIP='100.10.32.250'
NETMASK='24'
INTERFACE='eth0'
if [ ${MASTER_IP} = ${LOCAL_IP} ]; then
/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE}
/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE}
exit 0
fi
exit 1
chmod +x /opt/notify_master6400.sh   #赋予可执行权限
PS:
这里大概说一下这个脚本的工作原理,sentinel在做failover的 过程中会传出6个参数,分别是<master-name>、 <role>、 <state>、 <from-ip>、 <from-port>、 <to-ip> 、<to-port>,其中第6个参数from-ip也就是新的master的ip,对应脚本中的MASTER_IP,下面的if判断大家应该都很了然了,如果MASTER_IP=LOCAL_IP,那就绑定VIP,反之删除VIP。
 
5、启动redis服务(100.10.32.54、100.10.32.55)
redis-server /etc/redis_6400.conf
6、初始化主从(100.10.32.55)
redis-cli -p 6400 slaveof 10.10.32.54 6400
7、绑定VIP到主库(100.10.32.54)
/sbin/ip addr add 100.10.32.250/24 dev eth0
8、启动sentinel服务(100.10.32.54、100.10.32.55、100.10.32.57)
redis-server /etc/redis-sentinel6400.conf --sentinel
至此,整个高可用方案已经搭建完成。
 
[root@localhost tmp]# redis-cli -h 100.10.32.54  -p 6400 info  Replication
# Replication
role:master
connected_slaves:1
slave0:ip=100.10.32.55,port=6400,state=online,offset=72669,lag=1
master_repl_offset:72669
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:72668
[root@localhost tmp]# redis-cli -h 100.10.32.54  -p 26400 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master6400,status=ok,address=100.10.32.54:6400,slaves=1,sentinels=3
[root@localhost tmp]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 100.10.32.54/24 brd 100.10.32.255 scope global eth0
inet 100.10.32.250/24 scope global secondary eth0

四、测试
1、把主库停掉
redis-cli -h 100.10.32.54  -p 6400 shutdown
2、看从库是否提升为主库
[root@localhost tmp]# redis-cli -h 100.10.32.55 -p 6400 info Replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
看VIP是否漂移到100.10.32.55上
[root@localhost tmp]# ip a |grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
inet 100.10.32.55/24 brd 100.10.32.255 scope global eth0
inet 100.10.32.250/24 scope global secondary eth0
4、看Sentinel的监控状态
[root@localhost tmp]# redis-cli -p 26400 info  Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=master6400,status=ok,address=100.10.32.55:6400,slaves=1,sentinels=3
原文链接:http://navyaijm.blog.51cto.com/4647068/1745569  
参考学习:http://www.cnblogs.com/LiZhiW/p/4851631.html