• 关于

    虚拟可能性什么意思

    的搜索结果

回答

关于swap交换分区的设置:一种流行的、以讹传讹的说法是,安装Linux系统时,交换分区swap的大小应该是内存的两倍。也就是说,如果内存是2G,那么就应该分出4G的硬盘空间作为交换空间。其实这是严重的浪费。真实的情况是:可以根据你系统内存的大小,以及所使用的程序,自行决定交换分区的大小,甚至可以完全不用交换分区!首先解释一下什么是交换分区。交换分区,英文的说法是swap,意思是“交换”、“实物交易”。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。做一个假设:如果你的内存足够大,极少出现内存不足的情况,那么你就不需要交换分区。事实上,这种可能性是完全存在的。现在的1G内存的电脑不算什么了。动辄4G内存的电脑也日益普遍。日常使用的话,很少能用完全部的内存。在用不完内存容量的情况下,还要划出它两倍的硬盘空间用于内存交换,这不是浪费吗?可以说,在你内存基本够用的情况下,完全可以不要交换空间。在Windows下也是一样,在系统属性中,把虚拟内存设置为0,系统依然运行的很好。当然,如果你用的是服务器,还是要有专门的虚拟内存,有备无患。但是虚拟内存的大小不一定非要内存的两倍。那么怎么知道你的系统有没有用到交换空间呢?只需要在root用户下,运行下面的命令就可以知道了。free -m在日常应用中,通过上述命令看到交换空间的使用情况为0,那么你就不需要很大的虚拟内存,甚至可以完全不需要另辟硬盘空间作为虚拟内存。那么,万一有一天你需要了呢,难道要重装系统?大可不必,在Linux下虚拟内存不单可以放在单独的交换分区,也可以是一个在正常分区下的交换文件。1 查看swap 空间大小(总计): # free -m 默认单位为k, -m 单位为M   total used free shared buffers cached   Mem: 377 180 197 0 19 110   -/+ buffers/cache: 50 327   Swap: 572 0 5722 查看swap 空间(file(s)/partition(s)): 包括 文件 和 分区 的详细信息  # swapon -s  等价于  # cat /proc/swaps3 添加交换空间  两种选择:添加一个交换分区或添加一个交换文件。推荐你添加一个交换分区;不过,若你没有多少空闲空间可用,则添加交换文件。3.1 添加一个交换分区  步骤如下: a 使用fdisk来创建交换分区(假设 /dev/sdb2 是创建的交换分区) b 使用 mkswap 命令来设置交换分区:   # mkswap /dev/sdb2 c 启用交换分区:   # swapon /dev/sdb2 d 写入/etc/fstab,以便在引导时启用:   /dev/sdb2 swap swap defaults 0 03.2 添加一个交换文件  a 创建大小为512M的交换文件:   # dd if=/dev/zero of=/swapfile1 bs=1024k count=512  b 使用 mkswap 命令来设置交换文件:   # mkswap /swapfile1  c 启用交换分区:   # swapon /swapfile1  d 写入/etc/fstab,以便在引导时启用:   /swapfile1 swap swap defaults 0 0  新添了交换分区并启用它之后,请查看cat /proc/swaps 或 free 命令的输出来确保交换分区已被启用了。4 删除交换空间:  a 禁用交换分区:   # swapoff /dev/sdb2  b 从 /etc/fstab 中删除项目;  c 使用fdisk或yast工具删除分区。  删除交换文件步骤同上。--------------------------------------------------------------------------------   # free -m    total used free shared buffers cached   Mem: 377 180 197 0 19 110   -/+ buffers/cache: 50 327   Swap: 572 0 572Mem 行显示了从系统角度看来内存使用的情况, total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存.buffers和cached是系统用做缓冲的内存. buffers与某个块设备关联, 包含了文件系统元数据, 并且跟踪了块的变化. cache只包含了文件本身.-/+ buffers/cache 行则从用户角度显示内存信息, 可用内存从数量上等于mem行used列值减去buffers和cached内存的大小.因为buffers和cached是操作系统为加快系统运行而设置的, 当用户需要时, 可以只接为用户使用.top 显示系统运行时的各进程动态、实时的状态(cpu、内存)top 中有3个列 VIRT RES SHR, 标示了进程使用的内存情况.VIRT 标识这个进程可以使用的内存总大小, 包括这个进程真实使用的内存, 映射过的文件, 和别的进程共享的内存等.RES 标识这个这个进程真实占用内存的大小.SHR 标识可以和别的进程共享的内存和库大小.vmstat 显示内存的使用情况这些命令都是从/proc/meminfo中读取内存信息.关于/proc/meminfo中各行的含意, 在内核源代码的Documentation/filesystems/proc.txt文件中有叙述系统的真实内存大小可以用 dmesg | grep mM[mM]看到/proc/pid/status显示一个进程的详细状态# cat /proc/5346/status Name: bash State: S (sleeping) SleepAVG: 98% Tgid: 5346 Pid: 5346 PPid: 5343 TracerPid: 0 Uid: 1000 1000 1000 1000 Gid: 104 104 104 104 FDSize: 256 Groups: 6 24 29 44 104 113 1000 1001 VmPeak: 6528 kB VmSize: 6528 kB VmLck: 0 kB VmHWM: 1976 kB VmRSS: 1976 kB VmData: 752 kB VmStk: 84 kB VmExe: 644 kB VmLib: 1788 kB VmPTE: 16 kB Threads: 1 SigQ: 0/4294967295 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000000384004 SigCgt: 000000004b813efb CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000VmSize即为该进程内存总大小, 和top输出中的VIRT一致.

云栖技术 2019-12-02 02:35:43 0 浏览量 回答数 0

问题

ios9字体、阿里云oss、个人企业域名备案等常见问题和答案汇总

问问小秘 2020-01-02 10:31:59 36 浏览量 回答数 1

问题

别犹豫了,用阿里服务,不会错!做站的你遇到过下面的情况你会怎么办?

dieshang668 2019-12-01 21:24:39 8893 浏览量 回答数 4

万券齐发助力企业上云,爆款产品低至2.2折起!

限量神券最高减1000,抢完即止!云服务器ECS新用户首购低至0.95折!

回答

基础:比如计算机系统、算法、编译原理等等 Web开发: 主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面)、Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识。它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面),这部分内容你可以去上面的那个runoob网站上找。J2EE:你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频 。最后一步,你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC操作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。开发框架:目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。但你一定要可以快速的利用它们三个搭建出一个Web框架,你可以记录下你第一次搭建的过程,相信我,你一定会用到的。还要提一句的是,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。在这一年里,你至少需要看完《Java编程思想》这本书。这本书的内容是帮助你对于Java有一个更加深入的了解,是Java基础的升级版。 总而言之,这个阶段的核心学习思想就是,在工作中实践,并且更加深入的了解Java基础。对于参加工作1年到2年的同学。这部分时间段的同学,已经对Java有了一个更加深入的了解。但是对于面向对象的体会可能还不够深刻,编程的时候还停留在完成功能的层次,很少会去考虑设计的问题。于是这个时候,设计模式就来了。我当时看的是《大话设计模式》这本书,并且写了完整版的设计模式博客。因此,我要求大家,最多在你工作一年的时候,必须开始写博客,而设计模式就是你博客的开端。此外,设计模式并不是你这一年唯一的任务,你还需要看一些关于代码编写优化的书。比如《重构 改善既有代码的设计》,《effective java》。总而言之,这个阶段,你的核心任务就是提高你的代码能力,要能写出一手优雅的代码。对于参加工作2年到3年的同学有的同学在这个时候觉得自己已经很牛逼了,于是忍不住开始慢慢松懈。请记住,你还嫩的多。这个阶段,有一本书是你必须看的,它叫做《深入理解Java虚拟机》。这本书绝对是Java开发者最重要的书,没有之一。在我眼里,这本书的重要性还要高于《Java编程思想》。这本书的内容是帮助你全面的了解Java虚拟机,在这个阶段,你一定已经知道Java是运行在JVM之上的。所以,对于JVM,你没有任何理由不了解它。这个时候,你应该去更加深入的了解并发相关的知识,而这部分内容,我比较推荐《Java并发编程实战》这本书。只要你把这本书啃下来了,并发的部分基本已经了解了十之六七。与此同时,这个阶段你要做的事情还远不止如此。这个时候,你应该对于你所使用的框架应该有了更深入的了解,对于Java的类库也有了更深入的了解。因此,你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。这些源码能看懂的前提是,你必须对设计模式非常了解。否则的话,你看源码的过程中,永远会有这样那样的疑问,这段代码为什么要这么写?为什么要定义这个接口,它看起来好像很多余?由此也可以看出,这些学习的过程是环环相扣的,如果你任何一个阶段拉下来了,那么你就真的跟不上了,或者说是一步慢步步慢。而且我很负责的告诉你,我在这个阶段的时候,所学习的东西远多于这里所罗列出来的。总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库(比如并发那本书就是Java并发包java.concurrent的内容),也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。另外,还有一种学习的方式,在2年这个阶段,也应该启用了,那就是造轮子。不要听信那套“不要重复造轮子”的论调,那是公司为了节省时间成本编造出来的。重复造轮子或许对别人没有价值,因为你造的轮子可能早就有了,而且一般情况下你造出来的轮子还没有现存的好。  但是对别人没有价值,不代表对你自己没有价值。一个造轮子的过程,是一个从无到有的过程。这个过程可以对你进行系统的锻炼,它不仅考察你的编码能力,还考察你的框架设计能力,你需要让你的轮子拥有足够好的扩展性、健壮性。而且在造轮子的过程中,你会遇到各种各样的难题,这些难题往往又是你学习的契机。当你把轮子造好的时候,你一定会发现,其实你自己收获了很多。所以,这个阶段,除了上面提到的了解JVM、JDK和框架源码以外,也请你根据别人优秀的源码,去造一个任何你能够想象出来的轮子。第四部分:参加工作3年到4年的同学这个阶段的同学,提升已经是很难了,而且这个阶段的学习往往会比较多样化。因为在前3年的过程中,你肯定或多或少接触过一些其它的技术,比如大数据、分布式缓存、分布式消息服务、分布式计算、软负载均衡等等。这些技术,你能精通任何一项,都将是你未来面试时巨大的优势,因此如果你对某一项技术感兴趣的话,  这个时候可以深入去研究一下。这项技术不一定是你工作所用到的,但一定是相关的。而且在研究一门新技术时,切忌朝三暮四。有的同学今天去整整大数据,搞搞Hadoop、hbase一类的东西。过不了一段时间,就觉得没意思,又去研究分布式缓存,比如redis。然后又过不了一段时间,又去研究分布式计算,比如整整Mapreduce或者storm。结果到最后,搞得自己好像什么都会一样,在简历上大言不惭的写上大数据、分布式缓存、分布式计算都了解,其实任何一个都只是浮于表面。到时候面试官随便一问,就把你给识破了。我比较推崇的基础书籍有三本,分别是《深入理解计算机系统》,《tcp/ip详解 卷一、二、三》,《数据结构与算法》。其中TCP/IP有三本书,但我们这里把这三本看成是一本大书。这三本分别适合三种人,《深入理解计算机系统》比较适合一直从事Java Web开发和APP后端开发工作的人群。《tcp/ip详解 卷一、二、三》比较适合做网络编程的人群,比如你使用netty去开发的话,那么就要对TCP/IP有更深入的了解。而《数据结构与算法》这本书,则比较适合做计算研究工作的人,比如刚才提到的分布式计算。另外,我要强调的是,这里所说的适合,并不是其它两本对你就没有用。比如你做Java Web和APP后端开发,《tcp/ip详解 卷一、二、三》这本书对你的作用也是很大的。这里只是分出个主次关系而已,你要是时间足够的话,能把三本都精读那当然最好不过了。第五部分:参加工作4年到5年的同学经过前面一年的历练,相信你在自己所钻研的领域已经有了自己一定的见解,这个时候,技术上你应该已经遇到瓶颈了。这个时候不要着急提高自己的技术,已经是时候提高你的影响力了,你可以尝试去一些知名的公司去提高你的背景,你可以发表一些文章去影响更多的人。当然,你也可以去Github创建一个属于你的开源项目,去打造自己的产品。  这次的开源项目不同于之前的造轮子,你这个时候是真的要去尽量尝试造出来真正对别人有价值的轮子。技术学到这个阶段,很容易遇到瓶颈,而且往往达到一定程度后,你再深入下去的收效就真的微乎其微了,除非你是专门搞学术研究的。然而很可惜,大部分程序猿做不到这一步,那是科学家做的事情。这个时候提高影响力不仅仅是因为技术上容易遇到瓶颈,更多的是影响力可以给你创造更多的机会。程序猿在某种程度上和明星很像,一个好的电视剧和电影就可以成就一批明星,程序猿有的时候也是,一个好的项目就可以成就一群程序猿。比如国内几个脍炙人口的项目,像淘宝、支付宝、QQ、百度、微信等等。这每一个项目,都成就了一批程序猿。我敢说,这里面任何一个项目,如果你是它的核心开发,光是这样一个Title,就已经是你非常大的优势。更何况还不止如此,Title说到底也是个名头,更重要的是,这种项目在做的时候,对你的历练一定也是非常给力的。

hiekay 2019-12-02 01:38:44 0 浏览量 回答数 0

回答

基础:比如计算机系统、算法、编译原理等等 Web开发: 主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面)、Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识。它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面),这部分内容你可以去上面的那个runoob网站上找。J2EE:你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频 。最后一步,你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC操作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。开发框架:目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。但你一定要可以快速的利用它们三个搭建出一个Web框架,你可以记录下你第一次搭建的过程,相信我,你一定会用到的。还要提一句的是,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。在这一年里,你至少需要看完《Java编程思想》这本书。这本书的内容是帮助你对于Java有一个更加深入的了解,是Java基础的升级版。 总而言之,这个阶段的核心学习思想就是,在工作中实践,并且更加深入的了解Java基础。对于参加工作1年到2年的同学。这部分时间段的同学,已经对Java有了一个更加深入的了解。但是对于面向对象的体会可能还不够深刻,编程的时候还停留在完成功能的层次,很少会去考虑设计的问题。于是这个时候,设计模式就来了。我当时看的是《大话设计模式》这本书,并且写了完整版的设计模式博客。因此,我要求大家,最多在你工作一年的时候,必须开始写博客,而设计模式就是你博客的开端。此外,设计模式并不是你这一年唯一的任务,你还需要看一些关于代码编写优化的书。比如《重构 改善既有代码的设计》,《effective java》。总而言之,这个阶段,你的核心任务就是提高你的代码能力,要能写出一手优雅的代码。对于参加工作2年到3年的同学有的同学在这个时候觉得自己已经很牛逼了,于是忍不住开始慢慢松懈。请记住,你还嫩的多。这个阶段,有一本书是你必须看的,它叫做《深入理解Java虚拟机》。这本书绝对是Java开发者最重要的书,没有之一。在我眼里,这本书的重要性还要高于《Java编程思想》。这本书的内容是帮助你全面的了解Java虚拟机,在这个阶段,你一定已经知道Java是运行在JVM之上的。所以,对于JVM,你没有任何理由不了解它。这个时候,你应该去更加深入的了解并发相关的知识,而这部分内容,我比较推荐《Java并发编程实战》这本书。只要你把这本书啃下来了,并发的部分基本已经了解了十之六七。与此同时,这个阶段你要做的事情还远不止如此。这个时候,你应该对于你所使用的框架应该有了更深入的了解,对于Java的类库也有了更深入的了解。因此,你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。这些源码能看懂的前提是,你必须对设计模式非常了解。否则的话,你看源码的过程中,永远会有这样那样的疑问,这段代码为什么要这么写?为什么要定义这个接口,它看起来好像很多余?由此也可以看出,这些学习的过程是环环相扣的,如果你任何一个阶段拉下来了,那么你就真的跟不上了,或者说是一步慢步步慢。而且我很负责的告诉你,我在这个阶段的时候,所学习的东西远多于这里所罗列出来的。总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库(比如并发那本书就是Java并发包java.concurrent的内容),也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。另外,还有一种学习的方式,在2年这个阶段,也应该启用了,那就是造轮子。不要听信那套“不要重复造轮子”的论调,那是公司为了节省时间成本编造出来的。重复造轮子或许对别人没有价值,因为你造的轮子可能早就有了,而且一般情况下你造出来的轮子还没有现存的好。  但是对别人没有价值,不代表对你自己没有价值。一个造轮子的过程,是一个从无到有的过程。这个过程可以对你进行系统的锻炼,它不仅考察你的编码能力,还考察你的框架设计能力,你需要让你的轮子拥有足够好的扩展性、健壮性。而且在造轮子的过程中,你会遇到各种各样的难题,这些难题往往又是你学习的契机。当你把轮子造好的时候,你一定会发现,其实你自己收获了很多。所以,这个阶段,除了上面提到的了解JVM、JDK和框架源码以外,也请你根据别人优秀的源码,去造一个任何你能够想象出来的轮子。第四部分:参加工作3年到4年的同学这个阶段的同学,提升已经是很难了,而且这个阶段的学习往往会比较多样化。因为在前3年的过程中,你肯定或多或少接触过一些其它的技术,比如大数据、分布式缓存、分布式消息服务、分布式计算、软负载均衡等等。这些技术,你能精通任何一项,都将是你未来面试时巨大的优势,因此如果你对某一项技术感兴趣的话,  这个时候可以深入去研究一下。这项技术不一定是你工作所用到的,但一定是相关的。而且在研究一门新技术时,切忌朝三暮四。有的同学今天去整整大数据,搞搞Hadoop、hbase一类的东西。过不了一段时间,就觉得没意思,又去研究分布式缓存,比如redis。然后又过不了一段时间,又去研究分布式计算,比如整整Mapreduce或者storm。结果到最后,搞得自己好像什么都会一样,在简历上大言不惭的写上大数据、分布式缓存、分布式计算都了解,其实任何一个都只是浮于表面。到时候面试官随便一问,就把你给识破了。我比较推崇的基础书籍有三本,分别是《深入理解计算机系统》,《tcp/ip详解 卷一、二、三》,《数据结构与算法》。其中TCP/IP有三本书,但我们这里把这三本看成是一本大书。这三本分别适合三种人,《深入理解计算机系统》比较适合一直从事Java Web开发和APP后端开发工作的人群。《tcp/ip详解 卷一、二、三》比较适合做网络编程的人群,比如你使用netty去开发的话,那么就要对TCP/IP有更深入的了解。而《数据结构与算法》这本书,则比较适合做计算研究工作的人,比如刚才提到的分布式计算。另外,我要强调的是,这里所说的适合,并不是其它两本对你就没有用。比如你做Java Web和APP后端开发,《tcp/ip详解 卷一、二、三》这本书对你的作用也是很大的。这里只是分出个主次关系而已,你要是时间足够的话,能把三本都精读那当然最好不过了。第五部分:参加工作4年到5年的同学经过前面一年的历练,相信你在自己所钻研的领域已经有了自己一定的见解,这个时候,技术上你应该已经遇到瓶颈了。这个时候不要着急提高自己的技术,已经是时候提高你的影响力了,你可以尝试去一些知名的公司去提高你的背景,你可以发表一些文章去影响更多的人。当然,你也可以去Github创建一个属于你的开源项目,去打造自己的产品。  这次的开源项目不同于之前的造轮子,你这个时候是真的要去尽量尝试造出来真正对别人有价值的轮子。技术学到这个阶段,很容易遇到瓶颈,而且往往达到一定程度后,你再深入下去的收效就真的微乎其微了,除非你是专门搞学术研究的。然而很可惜,大部分程序猿做不到这一步,那是科学家做的事情。这个时候提高影响力不仅仅是因为技术上容易遇到瓶颈,更多的是影响力可以给你创造更多的机会。程序猿在某种程度上和明星很像,一个好的电视剧和电影就可以成就一批明星,程序猿有的时候也是,一个好的项目就可以成就一群程序猿。比如国内几个脍炙人口的项目,像淘宝、支付宝、QQ、百度、微信等等。这每一个项目,都成就了一批程序猿。我敢说,这里面任何一个项目,如果你是它的核心开发,光是这样一个Title,就已经是你非常大的优势。更何况还不止如此,Title说到底也是个名头,更重要的是,这种项目在做的时候,对你的历练一定也是非常给力的。

hiekay 2019-12-02 01:40:04 0 浏览量 回答数 0

问题

【精品问答】python技术1000问(1)

问问小秘 2019-12-01 21:57:48 455812 浏览量 回答数 21

问题

一个老码农的技术理想

技术小菜鸟 2019-12-01 21:17:10 3067 浏览量 回答数 1

回答

转自:阿里云官网 — 知乎 写好代码,阿里专家沉淀了一套“如何写复杂业务代码”的方法论,在此分享给大家,相信同样的方法论可以复制到大部分复杂业务场景。 一文教会你如何写复杂业务代码 了解我的人都知道,我一直在致力于应用架构和代码复杂度的治理。 这两天在看零售通商品域的代码。面对零售通如此复杂的业务场景,如何在架构和代码层面进行应对,是一个新课题。针对该命题,我进行了比较细致的思考和研究。结合实际的业务场景,我沉淀了一套“如何写复杂业务代码”的方法论,在此分享给大家。 我相信,同样的方法论可以复制到大部分复杂业务场景。 一个复杂业务的处理过程 业务背景 简单的介绍下业务背景,零售通是给线下小店供货的B2B模式,我们希望通过数字化重构传统供应链渠道,提升供应链效率,为新零售助力。阿里在中间是一个平台角色,提供的是Bsbc中的service的功能。 在商品域,运营会操作一个“上架”动作,上架之后,商品就能在零售通上面对小店进行销售了。是零售通业务非常关键的业务操作之一,因此涉及很多的数据校验和关联操作。 针对上架,一个简化的业务流程如下所示: 过程分解 像这么复杂的业务,我想应该没有人会写在一个service方法中吧。一个类解决不了,那就分治吧。 说实话,能想到分而治之的工程师,已经做的不错了,至少比没有分治思维要好很多。我也见过复杂程度相当的业务,连分解都没有,就是一堆方法和类的堆砌。 不过,这里存在一个问题:即很多同学过度的依赖工具或是辅助手段来实现分解。比如在我们的商品域中,类似的分解手段至少有3套以上,有自制的流程引擎,有依赖于数据库配置的流程处理: 本质上来讲,这些辅助手段做的都是一个pipeline的处理流程,没有其它。因此,我建议此处最好保持KISS(Keep It Simple and Stupid),即最好是什么工具都不要用,次之是用一个极简的Pipeline模式,最差是使用像流程引擎这样的重方法。 除非你的应用有极强的流程可视化和编排的诉求,否则我非常不推荐使用流程引擎等工具。第一,它会引入额外的复杂度,特别是那些需要持久化状态的流程引擎;第二,它会割裂代码,导致阅读代码的不顺畅。大胆断言一下,全天下估计80%对流程引擎的使用都是得不偿失的。 回到商品上架的问题,这里问题核心是工具吗?是设计模式带来的代码灵活性吗?显然不是,问题的核心应该是如何分解问题和抽象问题,知道金字塔原理的应该知道,此处,我们可以使用结构化分解将问题解构成一个有层级的金字塔结构: 按照这种分解写的代码,就像一本书,目录和内容清晰明了。以商品上架为例,程序的入口是一个上架命令(OnSaleCommand), 它由三个阶段(Phase)组成。 @Command public class OnSaleNormalItemCmdExe { @Resource private OnSaleContextInitPhase onSaleContextInitPhase; @Resource private OnSaleDataCheckPhase onSaleDataCheckPhase; @Resource private OnSaleProcessPhase onSaleProcessPhase; @Override public Response execute(OnSaleNormalItemCmd cmd) { OnSaleContext onSaleContext = init(cmd); checkData(onSaleContext); process(onSaleContext); return Response.buildSuccess(); } private OnSaleContext init(OnSaleNormalItemCmd cmd) { return onSaleContextInitPhase.init(cmd); } private void checkData(OnSaleContext onSaleContext) { onSaleDataCheckPhase.check(onSaleContext); } private void process(OnSaleContext onSaleContext) { onSaleProcessPhase.process(onSaleContext); } } 每个Phase又可以拆解成多个步骤(Step),以OnSaleProcessPhase为例,它是由一系列Step组成的: @Phase public class OnSaleProcessPhase { @Resource private PublishOfferStep publishOfferStep; @Resource private BackOfferBindStep backOfferBindStep; //省略其它step public void process(OnSaleContext onSaleContext){ SupplierItem supplierItem = onSaleContext.getSupplierItem(); // 生成OfferGroupNo generateOfferGroupNo(supplierItem); // 发布商品 publishOffer(supplierItem); // 前后端库存绑定 backoffer域 bindBackOfferStock(supplierItem); // 同步库存路由 backoffer域 syncStockRoute(supplierItem); // 设置虚拟商品拓展字段 setVirtualProductExtension(supplierItem); // 发货保障打标 offer域 markSendProtection(supplierItem); // 记录变更内容ChangeDetail recordChangeDetail(supplierItem); // 同步供货价到BackOffer syncSupplyPriceToBackOffer(supplierItem); // 如果是组合商品打标,写扩展信息 setCombineProductExtension(supplierItem); // 去售罄标 removeSellOutTag(offerId); // 发送领域事件 fireDomainEvent(supplierItem); // 关闭关联的待办事项 closeIssues(supplierItem); } } 看到了吗,这就是商品上架这个复杂业务的业务流程。需要流程引擎吗?不需要,需要设计模式支撑吗?也不需要。对于这种业务流程的表达,简单朴素的组合方法模式(Composed Method)是再合适不过的了。 因此,在做过程分解的时候,我建议工程师不要把太多精力放在工具上,放在设计模式带来的灵活性上。而是应该多花时间在对问题分析,结构化分解,最后通过合理的抽象,形成合适的阶段(Phase)和步骤(Step)上。 过程分解后的两个问题的确,使用过程分解之后的代码,已经比以前的代码更清晰、更容易维护了。不过,还有两个问题值得我们去关注一下: 1、领域知识被割裂肢解什么叫被肢解? 因为我们到目前为止做的都是过程化拆解,导致没有一个聚合领域知识的地方。每个Use Case的代码只关心自己的处理流程,知识没有沉淀。相同的业务逻辑会在多个Use Case中被重复实现,导致代码重复度高,即使有复用,最多也就是抽取一个util,代码对业务语义的表达能力很弱,从而影响代码的可读性和可理解性。 2、代码的业务表达能力缺失 试想下,在过程式的代码中,所做的事情无外乎就是取数据--做计算--存数据,在这种情况下,要如何通过代码显性化的表达我们的业务呢? 说实话,很难做到,因为我们缺失了模型,以及模型之间的关系。脱离模型的业务表达,是缺少韵律和灵魂的。 举个例子,在上架过程中,有一个校验是检查库存的,其中对于组合品(CombineBackOffer)其库存的处理会和普通品不一样。原来的代码是这么写的: boolean isCombineProduct = supplierItem.getSign().isCombProductQuote(); // supplier.usc warehouse needn't check if (WarehouseTypeEnum.isAliWarehouse(supplierItem.getWarehouseType())) { // quote warehosue check if (CollectionUtil.isEmpty(supplierItem.getWarehouseIdList()) && !isCombineProduct) { throw ExceptionFactory.makeFault(ServiceExceptionCode.SYSTEM_ERROR, "亲,不能发布Offer,请联系仓配运营人员,建立品仓关系!"); } // inventory amount check Long sellableAmount = 0L; if (!isCombineProduct) { sellableAmount = normalBiz.acquireSellableAmount(supplierItem.getBackOfferId(), supplierItem.getWarehouseIdList()); } else { //组套商品 OfferModel backOffer = backOfferQueryService.getBackOffer(supplierItem.getBackOfferId()); if (backOffer != null) { sellableAmount = backOffer.getOffer().getTradeModel().getTradeCondition().getAmountOnSale(); } } if (sellableAmount < 1) { throw ExceptionFactory.makeFault(ServiceExceptionCode.SYSTEM_ERROR, "亲,实仓库存必须大于0才能发布,请确认已补货.\r[id:" + supplierItem.getId() + "]"); } } 然而,如果我们在系统中引入领域模型之后,其代码会简化为如下: if(backOffer.isCloudWarehouse()){ return; } if (backOffer.isNonInWarehouse()){ throw new BizException("亲,不能发布Offer,请联系仓配运营人员,建立品仓关系!"); } if (backOffer.getStockAmount() < 1){ throw new BizException("亲,实仓库存必须大于0才能发布,请确认已补货.\r[id:" + backOffer.getSupplierItem().getCspuCode() + "]"); } 有没有发现,使用模型的表达要清晰易懂很多,而且也不需要做关于组合品的判断了,因为我们在系统中引入了更加贴近现实的对象模型(CombineBackOffer继承BackOffer),通过对象的多态可以消除我们代码中的大部分的if-else。 过程分解+对象模型 通过上面的案例,我们可以看到有过程分解要好于没有分解,过程分解+对象模型要好于仅仅是过程分解。对于商品上架这个case,如果采用过程分解+对象模型的方式,最终我们会得到一个如下的系统结构: 写复杂业务的方法论 通过上面案例的讲解,我想说,我已经交代了复杂业务代码要怎么写:即自上而下的结构化分解+自下而上的面向对象分析。 接下来,让我们把上面的案例进行进一步的提炼,形成一个可落地的方法论,从而可以泛化到更多的复杂业务场景。 上下结合 所谓上下结合,是指我们要结合自上而下的过程分解和自下而上的对象建模,螺旋式的构建我们的应用系统。这是一个动态的过程,两个步骤可以交替进行、也可以同时进行。这两个步骤是相辅相成的,上面的分析可以帮助我们更好的理清模型之间的关系,而下面的模型表达可以提升我们代码的复用度和业务语义表达能力。其过程如下图所示: 使用这种上下结合的方式,我们就有可能在面对任何复杂的业务场景,都能写出干净整洁、易维护的代码。 能力下沉 一般来说实践DDD有两个过程: 1. 套概念阶段 了解了一些DDD的概念,然后在代码中“使用”Aggregation Root,Bonded Context,Repository等等这些概念。更进一步,也会使用一定的分层策略。然而这种做法一般对复杂度的治理并没有多大作用。 2. 融会贯通阶段 术语已经不再重要,理解DDD的本质是统一语言、边界划分和面向对象分析的方法。 大体上而言,我大概是在1.7的阶段,因为有一个问题一直在困扰我,就是哪些能力应该放在Domain层,是不是按照传统的做法,将所有的业务都收拢到Domain上,这样做合理吗?说实话,这个问题我一直没有想清楚。 因为在现实业务中,很多的功能都是用例特有的(Use case specific)的,如果“盲目”的使用Domain收拢业务并不见得能带来多大的益处。相反,这种收拢会导致Domain层的膨胀过厚,不够纯粹,反而会影响复用性和表达能力。 鉴于此,我最近的思考是我们应该采用能力下沉的策略。 所谓的能力下沉,是指我们不强求一次就能设计出Domain的能力,也不需要强制要求把所有的业务功能都放到Domain层,而是采用实用主义的态度,即只对那些需要在多个场景中需要被复用的能力进行抽象下沉,而不需要复用的,就暂时放在App层的Use Case里就好了。 注:Use Case是《架构整洁之道》里面的术语,简单理解就是响应一个Request的处理过程 通过实践,我发现这种循序渐进的能力下沉策略,应该是一种更符合实际、更敏捷的方法。因为我们承认模型不是一次性设计出来的,而是迭代演化出来的。 下沉的过程如下图所示,假设两个use case中,我们发现uc1的step3和uc2的step1有类似的功能,我们就可以考虑让其下沉到Domain层,从而增加代码的复用性。 指导下沉有两个关键指标:代码的复用性和内聚性。 复用性是告诉我们When(什么时候该下沉了),即有重复代码的时候。 内聚性是告诉我们How(要下沉到哪里),功能有没有内聚到恰当的实体上,有没有放到合适的层次上(因为Domain层的能力也是有两个层次的,一个是Domain Service这是相对比较粗的粒度,另一个是Domain的Model这个是最细粒度的复用)。 比如,在我们的商品域,经常需要判断一个商品是不是最小单位,是不是中包商品。像这种能力就非常有必要直接挂载在Model上。 public class CSPU { private String code; private String baseCode; //省略其它属性 /** * 单品是否为最小单位。 * */ public boolean isMinimumUnit(){ return StringUtils.equals(code, baseCode); } /** * 针对中包的特殊处理 * */ public boolean isMidPackage(){ return StringUtils.equals(code, midPackageCode); } } 之前,因为老系统中没有领域模型,没有CSPU这个实体。你会发现像判断单品是否为最小单位的逻辑是以StringUtils.equals(code, baseCode)的形式散落在代码的各个角落。这种代码的可理解性是可想而知的,至少我在第一眼看到这个代码的时候,是完全不知道什么意思。 业务技术要怎么做 写到这里,我想顺便回答一下很多业务技术同学的困惑,也是我之前的困惑:即业务技术到底是在做业务,还是做技术?业务技术的技术性体现在哪里? 通过上面的案例,我们可以看到业务所面临的复杂性并不亚于底层技术,要想写好业务代码也不是一件容易的事情。 业务技术和底层技术人员唯一的区别是他们所面临的问题域不一样。业务技术面对的问题域变化更多、面对的人更加庞杂。而底层技术面对的问题域更加稳定、但对技术的要求更加深。比如,如果你需要去开发Pandora,你就要对Classloader有更加深入的了解才行。 但是,不管是业务技术还是底层技术人员,有一些思维和能力都是共通的。比如,分解问题的能力,抽象思维,结构化思维等等。 用我的话说就是:“做不好业务开发的,也做不好技术底层开发,反之亦然。业务开发一点都不简单,只是我们很多人把它做“简单”了因此,如果从变化的角度来看,业务技术的难度一点不逊色于底层技术,其面临的挑战甚至更大。 因此,我想对广大的从事业务技术开发的同学说:沉下心来,夯实自己的基础技术能力、OO能力、建模能力... 不断提升抽象思维、结构化思维、思辨思维... 持续学习精进,写好代码。我们可以在业务技术岗做的很”技术“!。

茶什i 2020-01-10 11:53:44 0 浏览量 回答数 0

问题

阿里云Centos5.4(32位)系统优化教程

ap6779g4h 2019-12-01 20:21:47 29336 浏览量 回答数 17

问题

《暗时间》读书笔记与读后感:报错

kun坤 2020-06-09 15:28:47 3 浏览量 回答数 1

问题

达达O2O后台架构演进实践:从0到4000高并发请求背后的努力:报错

kun坤 2020-06-09 15:20:48 4 浏览量 回答数 1

回答

Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱 (IMAP/POP3)代理服务器。它运行在UNIX,GNU /linux,BSD 各种版本,Mac OS X,Solaris和Windows。根据调查统计,6%的网站使用Nginx Web服务器。Nginx是少数能处理C10K问题的服务器之一。跟传统的服务器不同,Nginx不依赖线程来处理请求。相反,它使用了更多的可扩展的事 件驱动(异步)架构。Nginx为一些高流量的网站提供动力,比如WordPress,人人网,腾讯,网易等。这篇文章主要是介绍如何提高运行在 Linux或UNIX系统的Nginx Web服务器的安全性。 默认配置文件和Nginx端口 /usr/local/nginx/conf/ – Nginx配置文件目录,/usr/local/nginx/conf/nginx.conf是主配置文件 /usr/local/nginx/html/ – 默认网站文件位置 /usr/local/nginx/logs/ – 默认日志文件位置 Nginx HTTP默认端口 : TCP 80 Nginx HTTPS默认端口: TCP 443 你可以使用以下命令来测试Nginx配置文件准确性。 /usr/local/nginx/sbin/nginx -t 将会输出: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful 执行以下命令来重新加载配置文件。 /usr/local/nginx/sbin/nginx -s reload 执行以下命令来停止服务器。 /usr/local/nginx/sbin/nginx -s stop 一、配置SELinux 注意:对于云服务器 ECS,参阅 ECS 使用须知 ,基于兼容性、稳定性考虑,请勿开启 SELinux。 安全增强型 Linux(SELinux)是一个Linux内核的功能,它提供支持访问控制的安全政策保护机制。它可以防御大部分攻击。下面我们来看如何启动基于centos/RHEL系统的SELinux。 安装SELinux rpm -qa | grep selinux libselinux-1.23.10-2 selinux-policy-targeted-1.23.16-6 如果没有返回任何结果,代表没有安装 SELinux,如果返回了类似上面的结果,则说明系统安装了 SELinux。 布什值锁定 运行命令getsebool -a来锁定系统。 getsebool -a | less getsebool -a | grep off getsebool -a | grep o 二、通过分区挂载允许最少特权 服务器上的网页/html/php文件单独分区。例如,新建一个分区/dev/sda5(第一逻辑分区),并且挂载在/nginx。确保 /nginx是以noexec, nodev and nosetuid的权限挂载。以下是我的/etc/fstab的挂载/nginx的信息: LABEL=/nginx /nginx ext3 defaults,nosuid,noexec,nodev 1 2 注意:你需要使用fdisk和mkfs.ext3命令创建一个新分区。 三、配置/etc/sysctl.conf强化Linux安全 你可以通过编辑/etc/sysctl.conf来控制和配置Linux内核、网络设置。 Avoid a smurf attack net.ipv4.icmp_echo_ignore_broadcasts = 1 Turn on protection for bad icmp error messages net.ipv4.icmp_ignore_bogus_error_responses = 1 Turn on syncookies for SYN flood attack protection net.ipv4.tcp_syncookies = 1 Turn on and log spoofed, source routed, and redirect packets net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 No source routed packets here net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 Turn on reverse path filtering net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 Make sure no one can alter the routing tables net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 Don’t act as a router net.ipv4.ip_forward = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 Turn on execshild kernel.exec-shield = 1 kernel.randomize_va_space = 1 Tuen IPv6 net.ipv6.conf.default.router_solicitations = 0 net.ipv6.conf.default.accept_ra_rtr_pref = 0 net.ipv6.conf.default.accept_ra_pinfo = 0 net.ipv6.conf.default.accept_ra_defrtr = 0 net.ipv6.conf.default.autoconf = 0 net.ipv6.conf.default.dad_transmits = 0 net.ipv6.conf.default.max_addresses = 1 Optimization for port usefor LBs Increase system file descriptor limit fs.file-max = 65535 Allow for more PIDs (to reduce rollover problems); may break some programs 32768 kernel.pid_max = 65536 Increase system IP port limits net.ipv4.ip_local_port_range = 2000 65000 Increase TCP max buffer size setable using setsockopt() net.ipv4.tcp_rmem = 4096 87380 8388608 net.ipv4.tcp_wmem = 4096 87380 8388608 Increase Linux auto tuning TCP buffer limits min, default, and max number of bytes to use set max to at least 4MB, or higher if you use very high BDP paths Tcp Windows etc net.core.rmem_max = 8388608 net.core.wmem_max = 8388608 net.core.netdev_max_backlog = 5000 net.ipv4.tcp_window_scaling = 1 四、删除所有不需要的Nginx模块 你需要直接通过编译Nginx源代码使模块数量最少化。通过限制只允许web服务器访问模块把风险降到最低。你可以只配置安装nginx你所需要的模块。例如,禁用SSL和autoindex模块你可以执行以下命令: ./configure –without-http_autoindex_module –without-http_ssi_module make make install 通过以下命令来查看当编译nginx服务器时哪个模块能开户或关闭: ./configure –help | less 禁用你用不到的nginx模块。 (可选项)更改nginx版本名称。 编辑文件/http/ngx_http_header_filter_module.c: vi +48 src/http/ngx_http_header_filter_module.c 找到行: static char ngx_http_server_string[] = “Server: nginx” CRLF; static char ngx_http_server_full_string[] = “Server: ” NGINX_VER CRLF; 按照以下行修改: static char ngx_http_server_string[] = “Server: Ninja Web Server” CRLF; static char ngx_http_server_full_string[] = “Server: Ninja Web Server” CRLF; 保存并关闭文件。现在你可以编辑服务器了。增加以下代码到nginx.conf文件来关闭nginx版本号的显示。 server_tokens off 五、使用mod_security(只适合后端Apache服务器) mod_security为Apache提供一个应用程序级的防火墙。为后端Apache Web服务器安装mod_security,这会阻止很多注入式攻击。 六、安装SELinux策略以强化Nginx Web服务器 默认的SELinux不会保护Nginx Web服务器,但是你可以安装和编译保护软件。 1、安装编译SELinux所需环境支持 yum -y install selinux-policy-targeted selinux-policy-devel 2、下载SELinux策略以强化Nginx Web服务器。 cd /opt wget ‘http://downloads.sourceforge.net/project/selinuxnginx/se-ngix_1_0_10.tar.gz?use_mirror=nchc’ 3、解压文件 tar -zxvf se-ngix_1_0_10.tar.gz 4、编译文件 cd se-ngix_1_0_10/nginx make 将会输出如下: Compiling targeted nginx module /usr/bin/checkmodule: loading policy configuration from tmp/nginx.tmp /usr/bin/checkmodule: policy configuration loaded /usr/bin/checkmodule: writing binary representation (version 6) to tmp/nginx.mod Creating targeted nginx.pp policy package rm tmp/nginx.mod.fc tmp/nginx.mod 5、安装生成的nginx.pp SELinux模块: /usr/sbin/semodule -i nginx.pp 七、基于Iptables防火墙的限制 下面的防火墙脚本阻止任何除了允许: 来自HTTP(TCP端口80)的请求 来自ICMP ping的请求 ntp(端口123)的请求输出 smtp(TCP端口25)的请求输出 #!/bin/bash IPT=”/sbin/iptables” IPS Get server public ip SERVER_IP=$(ifconfig eth0 | grep ‘inet addr:’ | awk -F’inet addr:’ ‘{ print $2}’ | awk ‘{ print $1}’) LB1_IP=”204.54.1.1″ LB2_IP=”204.54.1.2″ Do some smart logic so that we can use damm script on LB2 too OTHER_LB=”" SERVER_IP=”" [[ "$SERVER_IP" == "$LB1_IP" ]] && OTHER_LB=”$LB2_IP” || OTHER_LB=”$LB1_IP” [[ "$OTHER_LB" == "$LB2_IP" ]] && OPP_LB=”$LB1_IP” || OPP_LB=”$LB2_IP” IPs PUB_SSH_ONLY=”122.xx.yy.zz/29″ FILES BLOCKED_IP_TDB=/root/.fw/blocked.ip.txt SPOOFIP=”127.0.0.0/8 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 0.0.0.0/8 240.0.0.0/4 255.255.255.255/32 168.254.0.0/16 224.0.0.0/4 240.0.0.0/5 248.0.0.0/5 192.0.2.0/24″ BADIPS=$( [[ -f ${BLOCKED_IP_TDB} ]] && egrep -v “^#|^$” ${BLOCKED_IP_TDB}) Interfaces PUB_IF=”eth0″ # public interface LO_IF=”lo” # loopback VPN_IF=”eth1″ # vpn / private net start firewall echo “Setting LB1 $(hostname) Firewall…” DROP and close everything $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP Unlimited lo access $IPT -A INPUT -i ${LO_IF} -j ACCEPT $IPT -A OUTPUT -o ${LO_IF} -j ACCEPT Unlimited vpn / pnet access $IPT -A INPUT -i ${VPN_IF} -j ACCEPT $IPT -A OUTPUT -o ${VPN_IF} -j ACCEPT Drop sync $IPT -A INPUT -i ${PUB_IF} -p tcp ! –syn -m state –state NEW -j DROP Drop Fragments $IPT -A INPUT -i ${PUB_IF} -f -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL FIN,URG,PSH -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL ALL -j DROP Drop NULL packets $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” NULL Packets “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL NONE -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,RST SYN,RST -j DROP Drop XMAS $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” XMAS Packets “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP Drop FIN packet scans $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” Fin Packets Scan “ $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags FIN,ACK FIN -j DROP $IPT -A INPUT -i ${PUB_IF} -p tcp –tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP Log and get rid of broadcast / multicast and invalid $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j LOG –log-prefix ” Broadcast “ $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type broadcast -j DROP $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j LOG –log-prefix ” Multicast “ $IPT -A INPUT -i ${PUB_IF} -m pkttype –pkt-type multicast -j DROP $IPT -A INPUT -i ${PUB_IF} -m state –state INVALID -j LOG –log-prefix ” Invalid “ $IPT -A INPUT -i ${PUB_IF} -m state –state INVALID -j DROP Log and block spoofed ips $IPT -N spooflist for ipblock in $SPOOFIP do $IPT -A spooflist -i ${PUB_IF} -s $ipblock -j LOG –log-prefix ” SPOOF List Block “ $IPT -A spooflist -i ${PUB_IF} -s $ipblock -j DROP done $IPT -I INPUT -j spooflist $IPT -I OUTPUT -j spooflist $IPT -I FORWARD -j spooflist Allow ssh only from selected public ips for ip in ${PUB_SSH_ONLY} do $IPT -A INPUT -i ${PUB_IF} -s ${ip} -p tcp -d ${SERVER_IP} –destination-port 22 -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -d ${ip} -p tcp -s ${SERVER_IP} –sport 22 -j ACCEPT done allow incoming ICMP ping pong stuff $IPT -A INPUT -i ${PUB_IF} -p icmp –icmp-type 8 -s 0/0 -m state –state NEW,ESTABLISHED,RELATED -m limit –limit 30/sec -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -p icmp –icmp-type 0 -d 0/0 -m state –state ESTABLISHED,RELATED -j ACCEPT allow incoming HTTP port 80 $IPT -A INPUT -i ${PUB_IF} -p tcp -s 0/0 –sport 1024:65535 –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -o ${PUB_IF} -p tcp –sport 80 -d 0/0 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT allow outgoing ntp $IPT -A OUTPUT -o ${PUB_IF} -p udp –dport 123 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${PUB_IF} -p udp –sport 123 -m state –state ESTABLISHED -j ACCEPT allow outgoing smtp $IPT -A OUTPUT -o ${PUB_IF} -p tcp –dport 25 -m state –state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -i ${PUB_IF} -p tcp –sport 25 -m state –state ESTABLISHED -j ACCEPT add your other rules here ####################### drop and log everything else $IPT -A INPUT -m limit –limit 5/m –limit-burst 7 -j LOG –log-prefix ” DEFAULT DROP “ $IPT -A INPUT -j DROP exit 0 八、控制缓冲区溢出攻击 编辑nginx.conf,为所有客户端设置缓冲区的大小限制。 vi /usr/local/nginx/conf/nginx.conf 编辑和设置所有客户端缓冲区的大小限制如下: Start: Size Limits & Buffer Overflows client_body_buffer_size 1K; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k; END: Size Limits & Buffer Overflows 解释: 1、client_body_buffer_size 1k-(默认8k或16k)这个指令可以指定连接请求实体的缓冲区大小。如果连接请求超过缓存区指定的值,那么这些请求实体的整体或部分将尝试写入一个临时文件。 2、client_header_buffer_size 1k-指令指定客户端请求头部的缓冲区大小。绝大多数情况下一个请求头不会大于1k,不过如果有来自于wap客户端的较大的cookie它可能会大于 1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers里面设置。 3、client_max_body_size 1k-指令指定允许客户端连接的最大请求实体大小,它出现在请求头部的Content-Length字段。 如果请求大于指定的值,客户端将收到一个”Request Entity Too Large” (413)错误。记住,浏览器并不知道怎样显示这个错误。 4、large_client_header_buffers-指定客户端一些比较大的请求头使用的缓冲区数量和大小。请求字段不能大于一个缓冲区大小,如果客户端发送一个比较大的头,nginx将返回”Request URI too large” (414) 同样,请求的头部最长字段不能大于一个缓冲区,否则服务器将返回”Bad request” (400)。缓冲区只在需求时分开。默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,如果一个连接请求最终将状态转换为keep- alive,它所占用的缓冲区将被释放。 你还需要控制超时来提高服务器性能并与客户端断开连接。按照如下编辑: Start: Timeouts client_body_timeout 10; client_header_timeout 10; keepalive_timeout 5 5; send_timeout 10; End: Timeouts 1、client_body_timeout 10;-指令指定读取请求实体的超时时间。这里的超时是指一个请求实体没有进入读取步骤,如果连接超过这个时间而客户端没有任何响应,Nginx将返回一个”Request time out” (408)错误。 2、client_header_timeout 10;-指令指定读取客户端请求头标题的超时时间。这里的超时是指一个请求头没有进入读取步骤,如果连接超过这个时间而客户端没有任何响应,Nginx将返回一个”Request time out” (408)错误。 3、keepalive_timeout 5 5; – 参数的第一个值指定了客户端与服务器长连接的超时时间,超过这个时间,服务器将关闭连接。参数的第二个值(可选)指定了应答头中Keep-Alive: timeout=time的time值,这个值可以使一些浏览器知道什么时候关闭连接,以便服务器不用重复关闭,如果不指定这个参数,nginx不会在应 答头中发送Keep-Alive信息。(但这并不是指怎样将一个连接“Keep-Alive”)参数的这两个值可以不相同。 4、send_timeout 10; 指令指定了发送给客户端应答后的超时时间,Timeout是指没有进入完整established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应,nginx将关闭连接。 九、控制并发连接 你可以使用NginxHttpLimitZone模块来限制指定的会话或者一个IP地址的特殊情况下的并发连接。编辑nginx.conf: Directive describes the zone, in which the session states are stored i.e. store in slimits. 1m can handle 32000 sessions with 32 bytes/session, set to 5m x 32000 session limit_zone slimits $binary_remote_addr 5m; Control maximum number of simultaneous connections for one session i.e. restricts the amount of connections from a single ip address limit_conn slimits 5; 上面表示限制每个远程IP地址的客户端同时打开连接不能超过5个。 十、只允许我们的域名的访问 如果机器人只是随机扫描服务器的所有域名,那拒绝这个请求。你必须允许配置的虚拟域或反向代理请求。你不必使用IP地址来拒绝。 Only requests to our Host are allowed i.e. nixcraft.in, images.nixcraft.in and www.nixcraft.in if ($host !~ ^(nixcraft.in|www.nixcraft.in|images.nixcraft.in)$ ) { return 444; } 十一、限制可用的请求方法 GET和POST是互联网上最常用的方法。 Web服务器的方法被定义在RFC 2616。如果Web服务器不要求启用所有可用的方法,它们应该被禁用。下面的指令将过滤只允许GET,HEAD和POST方法: Only allow these request methods if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } Do not accept DELETE, SEARCH and other methods 更多关于HTTP方法的介绍 GET方法是用来请求,如文件http://www.moqifei.com/index.php。 HEAD方法是一样的,除非该服务器的GET请求无法返回消息体。 POST方法可能涉及到很多东西,如储存或更新数据,或订购产品,或通过提交表单发送电子邮件。这通常是使用服务器端处理,如PHP,Perl和Python等脚本。如果你要上传的文件和在服务器处理数据,你必须使用这个方法。 十二、如何拒绝一些User-Agents? 你可以很容易地阻止User-Agents,如扫描器,机器人以及滥用你服务器的垃圾邮件发送者。 Block download agents if ($http_user_agent ~* LWP::Simple|BBBike|wget) { return 403; } 阻止Soso和有道的机器人: Block some robots if ($http_user_agent ~* Sosospider|YodaoBot) { return 403; } 十三、如何防止图片盗链 图片或HTML盗链的意思是有人直接用你网站的图片地址来显示在他的网站上。最终的结果,你需要支付额外的宽带费用。这通常是在论坛和博客。我强烈建议您封锁,并阻止盗链行为。 Stop deep linking or hot linking location /images/ { valid_referers none blocked www.example.com example.com; if ($invalid_referer) { return 403; } } 例如:重定向并显示指定图片 valid_referers blocked www.example.com example.com; if ($invalid_referer) { rewrite ^/images/uploads.*.(gif|jpg|jpeg|png)$ http://www.examples.com/banned.jpg last } 十四、目录限制 你可以对指定的目录设置访问权限。所有的网站目录应该一一的配置,只允许必须的目录访问权限。 通过IP地址限制访问 你可以通过IP地址来限制访问目录/admin/: location /docs/ { block one workstation deny 192.168.1.1; allow anyone in 192.168.1.0/24 allow 192.168.1.0/24; drop rest of the world deny all; } 通过密码保护目录 首先创建密码文件并增加“user”用户: mkdir /usr/local/nginx/conf/.htpasswd/ htpasswd -c /usr/local/nginx/conf/.htpasswd/passwd user 编辑nginx.conf,加入需要保护的目录: Password Protect /personal-images/ and /delta/ directories location ~ /(personal-images/.|delta/.) { auth_basic “Restricted”; auth_basic_user_file /usr/local/nginx/conf/.htpasswd/passwd; } 一旦密码文件已经生成,你也可以用以下的命令来增加允许访问的用户: htpasswd -s /usr/local/nginx/conf/.htpasswd/passwd userName 十五、Nginx SSL配置 HTTP是一个纯文本协议,它是开放的被动监测。你应该使用SSL来加密你的用户内容。 创建SSL证书 执行以下命令: cd /usr/local/nginx/conf openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr cp server.key server.key.org openssl rsa -in server.key.org -out server.key openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 编辑nginx.conf并按如下来更新: server { server_name example.com; listen 443; ssl on; ssl_certificate /usr/local/nginx/conf/server.crt; ssl_certificate_key /usr/local/nginx/conf/server.key; access_log /usr/local/nginx/logs/ssl.access.log; error_log /usr/local/nginx/logs/ssl.error.log; } 重启nginx: /usr/local/nginx/sbin/nginx -s reload 十六、Nginx与PHP安全建议 PHP是流行的服务器端脚本语言之一。如下编辑/etc/php.ini文件: Disallow dangerous functions disable_functions = phpinfo, system, mail, exec Try to limit resources Maximum execution time of each script, in seconds max_execution_time = 30 Maximum amount of time each script may spend parsing request data max_input_time = 60 Maximum amount of memory a script may consume (8MB) memory_limit = 8M Maximum size of POST data that PHP will accept. post_max_size = 8M Whether to allow HTTP file uploads. file_uploads = Off Maximum allowed size for uploaded files. upload_max_filesize = 2M Do not expose PHP error messages to external users display_errors = Off Turn on safe mode safe_mode = On Only allow access to executables in isolated directory safe_mode_exec_dir = php-required-executables-path Limit external access to PHP environment safemode_allowed_env_vars = PHP Restrict PHP information leakage expose_php = Off Log all errors log_errors = On Do not register globals for input data register_globals = Off Minimize allowable PHP post size post_max_size = 1K Ensure PHP redirects appropriately cgi.force_redirect = 0 Disallow uploading unless necessary file_uploads = Off Enable SQL safe mode sql.safe_mode = On Avoid Opening remote files allow_url_fopen = Off 十七、如果可能让Nginx运行在一个chroot监狱 把nginx放在一个chroot监狱以减小潜在的非法进入其它目录。你可以使用传统的与nginx一起安装的chroot。如果可能,那使用FreeBSD jails,Xen,OpenVZ虚拟化的容器概念。 十八、在防火墙级限制每个IP的连接数 网络服务器必须监视连接和每秒连接限制。PF和Iptales都能够在进入你的nginx服务器之前阻止最终用户的访问。 Linux Iptables:限制每次Nginx连接数 下面的例子会阻止来自一个IP的60秒钟内超过15个连接端口80的连接数。 /sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –set /sbin/iptables -A INPUT -p tcp –dport 80 -i eth0 -m state –state NEW -m recent –update –seconds 60 –hitcount 15 -j DROP service iptables save 请根据你的具体情况来设置限制的连接数。 十九:配置操作系统保护Web服务器 像以上介绍的启动SELinux.正确设置/nginx文档根目录的权限。Nginx以用户nginx运行。但是根目录(/nginx或者/usr /local/nginx/html)不应该设置属于用户nginx或对用户nginx可写。找出错误权限的文件可以使用如下命令: find /nginx -user nginx find /usr/local/nginx/html -user nginx 确保你更所有权为root或其它用户,一个典型的权限设置 /usr/local/nginx/html/ ls -l /usr/local/nginx/html/ 示例输出: -rw-r–r– 1 root root 925 Jan 3 00:50 error4xx.html -rw-r–r– 1 root root 52 Jan 3 10:00 error5xx.html -rw-r–r– 1 root root 134 Jan 3 00:52 index.html 你必须删除由vi或其它文本编辑器创建的备份文件: find /nginx -name ‘.?’ -not -name .ht -or -name ‘~’ -or -name ‘.bak’ -or -name ‘.old*’ find /usr/local/nginx/html/ -name ‘.?’ -not -name .ht -or -name ‘~’ -or -name ‘.bak’ -or -name ‘.old*’ 通过find命令的-delete选项来删除这些文件。 二十、限制Nginx连接传出 黑客会使用工具如wget下载你服务器本地的文件。使用Iptables从nginx用户来阻止传出连接。ipt_owner模块试图匹配本地产生的数据包的创建者。下面的例子中只允许user用户在外面使用80连接。 /sbin/iptables -A OUTPUT -o eth0 -m owner –uid-owner vivek -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT 通过以上的配置,你的nginx服务器已经非常安全了并可以发布网页。可是,你还应该根据你网站程序查找更多的安全设置资料。例如,wordpress或者第三方程序。

KB小秘书 2019-12-02 02:06:56 0 浏览量 回答数 0

回答

回 1楼(liam_fantasy) 的帖子 您好, 如果忽略以上内容的信息提示,可以顺利完成其它步骤吗? ------------------------- 回 5楼(hengic) 的帖子 您好, 我没有直接的判断经验,但我可以尝试迟些为您在Debian 7 的测试机里试试。 ------------------------- 回 5楼(hengic) 的帖子 您好, 我在阿里云公共镜像里的Debian 7 64位测试,好象可以。 您在配置了 he-ipv6 接口后,有没有重启网络服务(service networking restart)? ------------------------- 回 8楼(hengic) 的帖子 您好, 请问您使用的Web是哪种软件呢,是nginx吗? 有的Web默认不监听IPv6的端口喔。 您可以使用 netstat 的命令,或检查一下Web的配置文件,确认除了IPv4的80端口外,是否在IPv6的端口也有监听喔。 ------------------------- 回 10楼(hengic) 的帖子 您好, 按照apache的说明文档,或许您需要在配置文件中添加一个类似这样的内容: http://httpd.apache.org/docs/current/bind.html Listen [2001:470:18:898::2]:80 然后您在系统中能查看到tcp6的80端口也是在监听状态。 ------------------------- 回 14楼(三少.) 的帖子 您好, 欢迎来到阿里云论坛。 请问您在什么系统上尝试配置IPv6隧道地址上遇到疑问了呢?是CentOS 6系统吗? ------------------------- 回 16楼(ahy) 的帖子 您好, 欢迎来到阿里云论坛。 如上图,个人觉得算是成功了。 ------------------------- 回 18楼(weiykj胡伟) 的帖子 您好, 欢迎来到阿里云论坛。 是和哪位遇到的现象差不多呢,是16楼吗? ------------------------- 回 20楼(hlq) 的帖子 您好, 欢迎来到阿里云论坛。 请问您在系统里,能看到IPv6的隧道地址,能否ping通本地的测试地址::1呢? ::1 ------------------------- 回 28楼(magicmoment) 的帖子 您好, 个人来看,如果前两项测试成功,那应该可以了。 是的,有时可能境内的公共网络无法访问IPv6的地址。 ------------------------- 回 30楼(leonandandy) 的帖子 您好, 应该是 Client IPv6 Address。 ------------------------- 回 32楼(评心静气) 的帖子 您好, 您是想让80端口在tcp6上监听吗? 请问您使用的是哪种Web呢?是nginx,apache? ------------------------- 回 36楼(评心静气) 的帖子 您好, 好象我通过 wget -6 的命令来测试,能获取到您的站点首页(ok的内容): root@los:~/test# wget -6 [ http://apiv.beloved999.com] [ http://apiv.beloved999.com]: Scheme missing. root@los:~/test# wget -6 http://apiv.beloved999.com converted 'http://apiv.beloved999.com' (ANSI_X3.4-1968) -> 'http://apiv.beloved999.com' (UTF-8) --2016-09-29 00:14:06--   http://apiv.beloved999.com/ Resolving apiv.beloved999.com (apiv.beloved999.com)... 2001:470:39:4a6::2 Connecting to apiv.beloved999.com (apiv.beloved999.com)|2001:470:39:4a6::2|:80... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: 'index.html' index.html                       [ <=>                                            ]       2  --.-KB/s   in 0s 2016-09-29 00:14:08 (107 KB/s) - 'index.html' saved [2] ------------------------- 回 37楼(leonandandy) 的帖子 您好, 如果提示 No route to host ,那可能漏掉了例子中的某一步了,如是否曾成功执行以下的这条命令呢? ip route add ::/0 dev he-ipv6 ------------------------- 回 41楼(评心静气) 的帖子 您好, 首先要确认您使用wget所在的系统里是支持IPv6的喔。 ------------------------- 回 44楼(关关007) 的帖子 您好, 我在外网ping不通您的ipv6地址喔,请问您的ubuntu是否有设置了防火墙呢? root@los:~# ping6 ipv6.playalot.cn PING ipv6.playalot.cn(guanguan007-1-pt.tunnel.tserv22.tyo1.ipv6.he.net) 56 data bytes --- ipv6.playalot.cn ping statistics --- 51 packets transmitted, 0 received, 100% packet loss, time 50006ms ------------------------- 回 46楼(关关007) 的帖子 您好, 一般在ECS里,可能有两个因素会影响到: a. 系统的防火墙,如iptables b. ECS的安全组, https://help.aliyun.com/document_detail/25471.html ------------------------- 回 48楼(关关007) 的帖子 您好, 从现有的帮助说明文档来看,好象“安全组”目前仅支持IPv4。 您可以尝试完全关闭iptables的服务后,再对比结果。 ------------------------- 回 50楼(kevin0317) 的帖子 您好, 从图中信息来看,看起来,apache已经在ipv6的80端口上监听了(:::80)。 但我现在从一个香港的机子上,ping不通您的 2001:470:c:b30::2 地址 。 root@hk:~# ping6 ipv6.google.com PING ipv6.google.com(tg-in-x66.1e100.net) 56 data bytes 64 bytes from tg-in-x66.1e100.net: icmp_seq=1 ttl=47 time=22.4 ms 64 bytes from tg-in-x66.1e100.net: icmp_seq=2 ttl=47 time=22.1 ms 64 bytes from tg-in-x66.1e100.net: icmp_seq=3 ttl=47 time=22.4 ms --- ipv6.google.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 22.129/22.336/22.442/0.146 ms root@hk:~# ping6 2001:470:c:b30::2 PING 2001:470:c:b30::2(2001:470:c:b30::2) 56 data bytes --- 2001:470:c:b30::2 ping statistics --- 8 packets transmitted, 0 received, 100% packet loss, time 7000ms ------------------------- 回 54楼(kevin0317) 的帖子 您好, 感谢您的更新回复喔。 ------------------------- 回 56楼(hancock99) 的帖子 您好, 请问您已经完成操作步骤的第一步了吗? 您的操作系统是 CentOS 7 吗? ------------------------- 回 59楼(dianjilv) 的帖子 您好, 欢迎来到阿里云论坛。 当您看到形如下边的监听状态时,很可能,nginx已经在tcp6的80端口上监听了喔。 tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      22458/nginx           tcp        0      0 :::80                       :::*                        LISTEN      22458/nginx   因为第一行中的0.0.0.0可以理解监听tcp4的80端口,而第二行:::表示监听tcp6的80端口。这可能是因为系统版本不同,有的系统没有显示tcp6的字样,但形如::开头的IP,应该是表示ipv6的。 我现在用lynx并不能打开:http://[2001:470:35:10f6::2]/ root@hk:~# lynx [2001:470:35:10f6::2] Looking up  '[2001:470:35:10f6::2]' first Looking up [2001:470:35:10f6::2] first Looking up [2001:470:35:10f6::2] Making HTTP connection to [2001:470:35:10f6::2] Alert!: Unable to connect to remote host. lynx: Can't access startfile http://[2001:470:35:10f6::2]/ ------------------------- 回 61楼(dianjilv) 的帖子 您好, 如果事情不急,是可以再等等。 如果急,也可以直接找原生支持Ipv6的环境,如美国的机子。 ------------------------- 回 63楼(dianjilv) 的帖子 您好, 看具体的需求啰。 假如您的主站,是国内用户访问的,那就首选阿里云国内的地域啊。 您的子站,如下载或需要使用IPv6,主要是国外用户访问的,那可以综合考虑,看除了阿里云,是否还存在更佳的选择。 虽然阿里云整体上已经很好了,但如国内大环境IPv6条件还不成熟的前提条件下,或许客户需再特殊考虑一下。 ------------------------- 回 65楼(eason_zhang) 的帖子 您好, 请问您的系统版本是 CentOS 7 吗? ------------------------- 回 66楼(一直在等) 的帖子 您好, 好象 nginx 提示您在当前的平台上,不支持ipv6。 您能ping通本地的IPv6地址吗(::1)? ------------------------- 回 69楼(eason_zhang) 的帖子 您好, 本帖子的例子,是在CentOS 7 版本上测试完成的,可能并不适合 CentOS 6 的环境喔。 如果您目前还没有在 CentOS 6 里配置好Ipv6,我也可以为您找机子来测试一下。 ------------------------- 回 71楼(eason_zhang) 的帖子 您好, 好哩。我现在为您试试。 如果完成测试,会在帖子里回复您。 ------------------------- 回 74楼(eason_zhang) 的帖子 您好, 抱歉让您久等了。 为您写了一个例子的帖子,希望能帮得上您:《为阿里云ECS(CentOS6)配置IPv6隧道地址》 - https://bbs.aliyun.com/read.php?tid=299254 ------------------------- 回 77楼(yongzhang52545) 的帖子 您好, 欢迎来到阿里云论坛。 我为您找找资料。请稍等。 ------------------------- 回 77楼(yongzhang52545) 的帖子 您好, 为您写了这一个例子帖子,希望对您有用喔:《在CentOS 7系统里设置开机自动执行脚本systemd》 - https://bbs.aliyun.com/read.php?tid=301042 ------------------------- 回 82楼(木头2121) 的帖子 您好, 如果提示网络访问失败,那可能没有成功在系统里设置好IPv6隧道地址喔。 您在系统里运行 ifconfig 查看有IPv6的隧道地址信息吗? ------------------------- 回 84楼(木头2121) 的帖子 您好, 截图上传,可能因为宽度过长,论坛程序为了整体的美观,自动降低相素和比例了,但下载后看是您原来上传的尺寸大小,不影响查看图片内容的。 ipv6-test.com 里的第三项是检查项目应该是 ipv6-only 的,这不符合现有的环境,国内ipv6的环境还不成熟。但如果通过第一和第二项,应该不影响您基本使用,如可通过苹果对于APP要有有效ipv6地址访问的要求。 ------------------------- 回 86楼(木头2121) 的帖子 您好, 有可能是因为HE免费提供的隧道网络(如果您选择的是香港的节点),互联可能不是很流畅。 ------------------------- 回 88楼(木头2121) 的帖子 您好, 这么奇怪? 如果要一直ping,或许您可用个screen在后台跑着。 我个人是仅用于测试,当时选择的是HE香港的节点。 ------------------------- 回 90楼(热尔特人) 的帖子 您好, 如果您的系统里没有 he-ipv6 的虚拟网卡,可能在本地都不能使用ipv6的环境喔, 您运行 ping6 ::1 ,会有什么样的结果呢? ------------------------- 回 92楼(热尔特人) 的帖子 您好, 如果能ping通本地的::1地址, 请问能否ping通您申请到的IPv6隧道地址(如2001:470:18:401::2 这样的), 或能否ping通外网的IPv6地址,如 ping6 ipv6.google.com ? ------------------------- 回 94楼(热尔特人) 的帖子 您好, 请问您的系统确认是CentOS 7版本的吗? 我照着例子重新操作了一次,正常的喔。 [root@iZ23jyp275rZ php]# ip -6 routeunreachable ::/96 dev lo  metric 1024  error -101unreachable ::ffff:0.0.0.0/96 dev lo  metric 1024  error -101200:2:9f6a:794b:: dev he-ipv6  metric 0    cache2001:470:18:401::/64 dev he-ipv6  proto kernel  metric 256unreachable 2002:a00::/24 dev lo  metric 1024  error -101unreachable 2002:7f00::/24 dev lo  metric 1024  error -101unreachable 2002:a9fe::/32 dev lo  metric 1024  error -101unreachable 2002:ac10::/28 dev lo  metric 1024  error -101unreachable 2002:c0a8::/32 dev lo  metric 1024  error -101unreachable 2002:e000::/19 dev lo  metric 1024  error -101unreachable 3ffe:ffff::/32 dev lo  metric 1024  error -101fe80::/64 dev eth0  proto kernel  metric 256fe80::/64 dev eth1  proto kernel  metric 256default dev he-ipv6  metric 1024[root@iZ23jyp275rZ php]# ping6 ipv6.google.comPING ipv6.google.com(tsa03s01-in-x0e.1e100.net) 56 data bytes64 bytes from tsa03s01-in-x0e.1e100.net: icmp_seq=1 ttl=55 time=389 ms64 bytes from tsa03s01-in-x0e.1e100.net: icmp_seq=2 ttl=55 time=390 ms [root@iZ23jyp275rZ php]# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 10.117.40.202  netmask 255.255.248.0  broadcast 10.117.47.255        inet6 fe80::216:3eff:fe00:3e22  prefixlen 64  scopeid 0x20<link>        ether 00:16:3e:00:3e:22  txqueuelen 1000  (Ethernet)        RX packets 19203  bytes 27666872 (26.3 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 5745  bytes 339979 (332.0 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 121.43.110.72  netmask 255.255.252.0  broadcast 121.43.111.255        inet6 fe80::216:3eff:fe00:1a3b  prefixlen 64  scopeid 0x20<link>        ether 00:16:3e:00:1a:3b  txqueuelen 1000  (Ethernet)        RX packets 204694  bytes 278187033 (265.2 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 67036  bytes 10194365 (9.7 MiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0he-ipv6: flags=209<UP,POINTOPOINT,RUNNING,NOARP>  mtu 1480        inet6 fe80::792b:6e48  prefixlen 128  scopeid 0x20<link>        inet6 2001:470:18:401::2  prefixlen 64  scopeid 0x0<global>        sit  txqueuelen 0  (IPv6-in-IPv4)        RX packets 18  bytes 1592 (1.5 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 19  bytes 1360 (1.3 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536        inet 127.0.0.1  netmask 255.0.0.0        inet6 ::1  prefixlen 128  scopeid 0x10<host>        loop  txqueuelen 0  (Local Loopback)        RX packets 102  bytes 9177 (8.9 KiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 102  bytes 9177 (8.9 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0 ------------------------- 回 96楼(热尔特人) 的帖子 您好, 当您能ping通ipv6.google.com时,应该说明ipv6的隧道地址已经设置好了, 这个时候,如果测试您的站点还不能通过ipv6隧道地址访问,您得检查一下Web服务是否在ipv6的地址是监听喔(如运行 netstat -noa | grep 80 的命令查看一下)。 当您重启网络服务或重启系统后,ipv6的隧道地址已经失效了的,因为这个环节的命令仅当次有效的,请参考: https://bbs.aliyun.com/read/301042.html ------------------------- 回 98楼(热尔特人) 的帖子 您好, 您要将域名设置AAA记录到 2001:470:18:a8b::2 而不是 fe80::216:3eff:fe00:54f9 喔: # curl [2001:470:18:a8b::2] -so - | grep -iPo '(?<=<title>)(.*)(?=</title>)' LNMP一键安装包 by Licess ------------------------- 回 100楼(热尔特人) 的帖子 您好, 您可以按之前的步骤,一步步来排查呢。 如可以先检查本地的IPv6隧道地址设置是否正常,Web监听状态是否正常。 ------------------------- 回 103楼(taihehaode) 的帖子 您好, 欢迎来到阿里云论坛。 在网上找到两条命令,您可以试试: firewall-cmd --permanent --zone=public --add-port=80/tcp假如您默认的区域是  public ,现在需放行 80 的 tcp 端口。 之后,再用 reload 的命令重新加载下 firewalld: firewall-cmd --reload 参考: http://www.codero.com/knowledge-base/content/10/377/en/how-to-manage-firewall-rules-in-centos-7.html ------------------------- 回 108楼(ffffffffffffv) 的帖子 您好, 看您的最后的一个截图, IPv6隧道地址的站点,已经可以访问了喔,恭喜。 ------------------------- 回 110楼(taihehaode) 的帖子 您好, 对于CentOS 7里的firewalld防火墙设置例子,可看一下第104楼回帖里的内容喔。 ------------------------- 回 112楼(taihehaode) 的帖子 您好, 抱歉延时回复。 请问您已经解决问题了吗? ------------------------- 回 113楼(网际码工) 的帖子 您好, 抱歉延时回复, 请问在您的应用环境里,除了nginx,还有其它Web服务软件吗? 一般来说,nginx默认是使用80端口的。 ------------------------- 回 116楼(网际码工) 的帖子 您好, 那您的网站访问地址是什么呢? ------------------------- 回 118楼(lyan) 的帖子 您好, 欢迎来到阿里云论坛。 请问您的程序(web)里配置监听所有的可用端口,如 nginx 里可以填写如下的配置内容: listen [::]:8091r ------------------------- 回 121楼(cenfee~) 的帖子 您好, 请问您正使用的系统(MacBook?)是否支持IPv6的网络呢? ------------------------- 回 120楼(fedorjia) 的帖子 您好, 请问您的服务器是否禁ping了? ------------------------- 回 124楼(cenfee~) 的帖子 您好, 可以ping得通您的ipv6地址喔, PING 2001:470:a:c8e::2(2001:470:a:c8e::2) 56 data bytes 64 bytes from 2001:470:a:c8e::2: icmp_seq=1 ttl=55 time=327 ms 64 bytes from 2001:470:a:c8e::2: icmp_seq=2 ttl=55 time=331 ms 64 bytes from 2001:470:a:c8e::2: icmp_seq=3 ttl=55 time=328 ms ------------------------- 回 126楼(cenfee~) 的帖子 您好, 可以访问哩,如下图: ------------------------- 回 129楼(hhs_) 的帖子 您好, 欢迎来到阿里云论坛。 第二项检测不过头,那可能无法通过ipv6地址访问到内容。 是否有防火墙阻止了ipv6的80端口访问呢? ------------------------- 回 131楼(hhs_) 的帖子 您好, 好象两个IPv6地址都ping不通喔。 PING 2001:470:c:10b0::2(2001:470:c:10b0::2) 56 data bytes --- 2001:470:c:10b0::2 ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4004ms root@ipv6tunnel:~/test# ping6 2001:470:c:10b1::2 PING 2001:470:c:10b1::2(2001:470:c:10b1::2) 56 data bytes --- 2001:470:c:10b1::2 ping statistics --- 7 packets transmitted, 0 received, 100% packet loss, time 5999ms root@ipv6tunnel:~/test# ping6 ipv6.google.com PING ipv6.google.com(lax17s05-in-x0e.1e100.net) 56 data bytes 64 bytes from lax17s05-in-x0e.1e100.net: icmp_seq=1 ttl=57 time=0.589 ms 64 bytes from lax17s05-in-x0e.1e100.net: icmp_seq=2 ttl=57 time=0.705 ms ------------------------- 回 133楼(hhs_) 的帖子 您好, 如果可以,请提供 tunnelbroker.net 分配给您的 IPv6隧道地址配置信息。 和服务器的登录信息(请通过站内信发送),我为您登录查看。 ------------------------- 回 135楼(hhs_) 的帖子 您好, 好象提示SSL证书错误喔。 --2017-04-13 01:17:47--  https://[2001:da8:20d:400::3ccd:ffa]/ Connecting to [2001:da8:20d:400::3ccd:ffa]:443... connected. ERROR: The certificate of '2001:da8:20d:400::3ccd:ffa' is not trusted. ERROR: The certificate of '2001:da8:20d:400::3ccd:ffa' hasn't got a known issuer. The certificate's owner does not match hostname '2001:da8:20d:400::3ccd:ffa' ------------------------- 回 137楼(余得水) 的帖子 您好, 因为例子中的配置是当时有效,没有写入配置文件,重启后会失效的。 ------------------------- 回 138楼(余得水) 的帖子 您好, 如果ECS的宽带类型是“专有网络”,本帖中的配置方法不适用喔。 ------------------------- 回 141楼(hhs_) 的帖子 您好, 苹果好象说是您的APP在IPv6的环境中加载不到内容。 或许您需要检查一下您的Web日志,看看有没有相应的错误信息。 ------------------------- 回 143楼(wangsili) 的帖子 您好, 现在测试,好象正常哩。 ------------------------- 回 146楼(淘拍拍) 的帖子 您好, 第二项是Web访问, 请问您的业务类型是http的吗? ------------------------- 回 148楼(淘拍拍) 的帖子 您好, 请问您运行如 netstat -noa | grep 80 的结果会有哪些信息呢? ------------------------- 回 151楼(lifetin) 的帖子 您好, 请问您使用的web服务器是什么呢? 或许您需要在Web服务器里绑定您的域名或IPv6地址到具体的站点喔。 ------------------------- 回 153楼(ifaceparty) 的帖子 您好, 从国外的测试机,好象ping不能您设置的ipv6地址喔, PING 2001:470:23:11f6::2(2001:470:23:11f6::2) 56 data bytes --- 2001:470:23:11f6::2 ping statistics --- 82 packets transmitted, 0 received, 100% packet loss, time 81185ms ------------------------- 回 154楼(ifaceparty) 的帖子 您好, 个人没发现有可行的解决办法,因为国内的大环境限制,阿里云即使是技术跟得上,也无法实现IPv6接入互联网。 如果仅是应对APP审核,或许可以尝试其它的办法,如临时换用国外支持IPv6的CDN商家。 ------------------------- 回 158楼(ifaceparty) 的帖子 您好, 如果您的配置方法有效,那可以提醒一下其他网友尝试。 ------------------------- 回 160楼(weinie) 的帖子 您好, 欢迎来到阿里云论坛。 上午我曾成功注册过一个tunnelbroker.net账号哩。 invalid registration data,字面上意思好象填写的账号申请信息有错误喔。 ------------------------- 回 162楼(weinie) 的帖子 您好, 很高兴听到您已经解决问题了喔。 欢迎有空时再来论坛逛逛。 ------------------------- 回 164楼(等火车) 的帖子 您好, 欢迎来到阿里云论坛。 很高兴帖子的内容能给您带来帮助喔。 ------------------------- 回 166楼(goldplusgold) 的帖子 您好, 欢迎来到阿里云论坛。 个人没有在SLB的环境里测试喔,但您可以先自行测试一下。 ------------------------- 回 168楼(goldplusgold) 的帖子 您好, 在HE网站申请隧道地址时,填写的是公网IP地址喔, 之后在您的实例里执行命令时,需要将示例中的公网IP换成内网IP的喔。 ------------------------- 回 170楼(灵动在线) 的帖子 您好, 现在我从境外的机子测试您的子域名网站,可以正常访问到内容的喔: converted 'http://wjdipv6.18183g.cc' (ANSI_X3.4-1968) -> 'http://wjdipv6.18183g.cc' (UTF-8) --2017-06-09 09:03:57--   http://wjdipv6.18183g.cc/ Resolving wjdipv6.18183g.cc (wjdipv6.18183g.cc)... 2001:470:35:660::2 Connecting to wjdipv6.18183g.cc (wjdipv6.18183g.cc)|2001:470:35:660::2|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 3700 (3.6K) [text/html] Saving to: 'index.html.1' ------------------------- 回 176楼(aii_dev) 的帖子 您好, 在后台用一个ping6命令保持ipv6隧道地址的“运行”状态,如:nohup ping6.ipv6.google.com & ------------------------- 回 178楼(umerxiaowang) 的帖子 您好, 欢迎来到阿里云论坛。 请问您的接口是通过http访问的吗? 这样: converted 'http://service.umer.com.cn' (ANSI_X3.4-1968) -> 'http://service.umer.com.cn' (UTF-8) --2017-06-13 09:39:58--   http://service.umer.com.cn/ Resolving service.umer.com.cn (service.umer.com.cn)... 2001:470:c:38b::2 Connecting to service.umer.com.cn (service.umer.com.cn)|2001:470:c:38b::2|:80... connected. HTTP request sent, awaiting response... 404 2017-06-13 09:39:59 ERROR 404: (no description). ------------------------- 回 179楼(aii_dev) 的帖子 您好, 我暂时没有根治的方法,但对比中,Windows Server系统好象没有这个现象。 ------------------------- 回 182楼(匠巴巴) 的帖子 您好, 欢迎来到阿里云论坛。 是的,是这个意思。 是一个什么样的“同样结果”呢?您在CentOS 7里使用浏览器访问 ipv6-test.com 来测试吗? ------------------------- 回 185楼(donatello) 的帖子 您好, 欢迎来到阿里云论坛。 目前多数人配置的,是使用ipv6隧道地址,即HE.net提供的6in4的隧道地址,这种实现方式好象是封闭成ipv4包来收发的。 ------------------------- 回 187楼(peanut888) 的帖子 您好, 欢迎来到阿里云论坛。 现在测试,您的ipv6地址在ping6一段时间后,可以ping6通喔。 64 bytes from 2001:470:18:9c2::2: icmp_seq=188 ttl=63 time=359 ms 64 bytes from 2001:470:18:9c2::2: icmp_seq=189 ttl=63 time=365 ms 64 bytes from 2001:470:18:9c2::2: icmp_seq=190 ttl=63 time=405 ms --- 2001:470:18:9c2::2 ping statistics --- 190 packets transmitted, 9 received, 95% packet loss, time 190449ms rtt min/avg/max/mdev = 351.692/363.540/405.073/15.177 ms ------------------------- 回 189楼(rexue) 的帖子 您好, 可尝试用 nohup 的命令,令ping6长驻后台运行, 至于原因,我不确定。可能需要咨询一下隧道供应商HE。 ------------------------- 回 192楼(zoan) 的帖子 您好, 欢迎来到阿里云论坛。 是的,因为配置时,是用命令执行,当次有效,没有写进配置文件里的, 所以重启网络的服务后,ipv6隧道地址不会自动再次配置。 您可以尝试将这些配置ipv6的命令写到自动执行的脚本时,这样,重启系统或重启网络后,可以自动再次配置ipv6隧道地址。 ------------------------- 回 194楼(踩你哦) 的帖子 您好, 现在从外网测试 ,可以ping6通您的域名喔: PING zhangzezheng.cn(zhangzezheng-5-pt.tunnel.tserv20.hkg1.ipv6.he.net) 56 data bytes 64 bytes from zhangzezheng-5-pt.tunnel.tserv20.hkg1.ipv6.he.net: icmp_seq=1 ttl=63 time=328 ms 64 bytes from zhangzezheng-5-pt.tunnel.tserv20.hkg1.ipv6.he.net: icmp_seq=2 ttl=63 time=328 ms 64 bytes from zhangzezheng-5-pt.tunnel.tserv20.hkg1.ipv6.he.net: icmp_seq=3 ttl=63 time=333 ms 64 bytes from zhangzezheng-5-pt.tunnel.tserv20.hkg1.ipv6.he.net: icmp_seq=4 ttl=63 time=328 ms ------------------------- 回 194楼(踩你哦) 的帖子 您好, 能ping6通,但访问不了web,建议检查web服务。 liujia@hk2:~/test5$ ping6 zhangzezheng.cn PING zhangzezheng.cn(zhangzezheng-5-pt.tunnel.tserv20.hkg1.ipv6.he.net) 56 data bytes 64 bytes from zhangzezheng-5-pt.tunnel.tserv20.hkg1.ipv6.he.net: icmp_seq=1 ttl=63 time=328 ms 64 bytes from zhangzezheng-5-pt.tunnel.tserv20.hkg1.ipv6.he.net: icmp_seq=2 ttl=63 time=328 ms --- zhangzezheng.cn ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 328.299/328.353/328.407/0.054 ms liujia@hk2:~/test5$ wget -6 zhangzezheng.cn                                          --2017-10-12 22:32:58--   http://zhangzezheng.cn/ Resolving zhangzezheng.cn (zhangzezheng.cn)... 2001:470:18:9f::2 Connecting to zhangzezheng.cn (zhangzezheng.cn)|2001:470:18:9f::2|:80... failed: Connection re fused. ------------------------- 回 199楼(hjlapp) 的帖子 您好, 欢迎来到阿里云论坛。 如果可以ping通ipv6的主机地址,但不能访问web, 可能需要检查: a. web是否在ipv6的网络接口上监听使用 b. ECS实例的安全组是否允许外网访问相应的端口 ------------------------- 回 201楼(hjlapp) 的帖子 您好, 因为目前安全组的规则仅是ipv4, 所以建议您先尝试放行全部的协议后,再来看看能否从外网访问隧道地址。 ------------------------- 您好,很高兴听到您已经解决了问题。希望有空时,多来论坛转转喔。 ------------------------- 回 205楼(异乡人_北) 的帖子 版主回复: 请问您使用的是公共镜像里的CentOS 7系统吗? ------------------------- 回 207楼(异乡人_北) 的帖子 版主回复: 如果是 CentOS 6.5 的,或许可参考一下这个帖子里的操作顺序: https://bbs.aliyun.com/read/304532.html ------------------------- 回 209楼(异乡人_北) 的帖子 版主回复: 上边内容的话,仅在第二行添加 # 符号,注释掉后,应该就可以了。 ------------------------- 回 211楼(youdy) 的帖子 版主回复: 尝试添加IPv6隧道地址的方法,仅是可行性测试,并不是100%能让APP成功上架的喔。 因为苹果的文档里,侧重于APP在构建过程中 考虑到IPv6网络的访问,并不是强制要求APP一定有IPv6地址,建议您让程序员参考苹果的文档喔: https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html ------------------------- 回 213楼(北京小戚戚) 的帖子 版主回复: 按he提供的帮助说明页,如果经过NAT设备,或许需要您的上游设备允许41协议。 ------------------------- 回 214楼(菜鸟小白白) 的帖子 版主回复: 请问您的ECS实例是否有分配公网IP地址呢? 能否截图,看看您的ECS实例网络信息?

dongshan8 2019-12-02 01:51:12 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 阿里云双十一主会场 阿里云双十一新人会场 1024程序员加油包 阿里云双十一拼团会场 场景化解决方案 阿里云双十一直播大厅