nginx中location的顺序(优先级)及rewrite规则写法 一、location正则写法 一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration C ] } location ~ /documents/Abc { # 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration CC ] } location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的请求 # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则 [ configuration E ] } location /images/ { # 字符匹配到 /images/,继续往下,会发现 ^~ 存在 [ configuration F ] } location /images/abc { # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在 # F与G的放置顺序是没有关系的 [ configuration G ] } location ~ /images/abc/ { # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用 [ configuration H ] } l... 阅读全文
如何防止Cloudflare CDN背后的图片被盗连(Hotlink Protection)? 「Hotlink Protection」(直接链接保护)是经营网站经常需要去注意的一块,但为什么我们会需要「Hotlink Protection」呢?身为图文并茂的网络文章作家,最担心得就是自己的文章被别人整篇连文带图地拷贝粘贴到其它地方了。此时如果图片有套用「Hotlink Protection」的话,就可以让被盗用的图片在其它网站上「不被正常显示」出来,如此一来,就能使其它误入盗文页面的访客可以知道该篇文章是篇被盗用的文章。不同的网站架构有不同的「Hotlink Protection」的设置方式,如果您的网站有打开Cloudflare的CDN服务的话,可以参考这篇文章,来实现「Hotlink Protection」的功能。 我的网站服务器是用Nginx或Apache,难道不能直接对它们做设置吗? 很遗憾,只要我们有激活Cloudflare的CDN服务,就无法有效地通过自己的服务器程序来设置Hotlink Protection。这是因为网页浏览器在打开您网站的图片时,会去链接Cloudflare的CDN服务器,而非我们自己的服务器,所以就算我们有在自己的服务器上制作Hotlink Protection的功能,也根本不会被触发到。 既然有Cloudflare CDN,为什么还要Hotlink Protection?被盗连的图,其流量不是不会算在我们头上吗? 的确,有了Cloudflare CDN之后,就算图片被盗连,它主要也还是会去吃Cloudflare CDN服务器的流量。但是,您真的愿意让您文章中的图片原封不动地在盗文网站上显示出来吗?所以还是设置一下Hotlink Protection吧! Cloudflare内置的Hotlink Protection开关 Cloudflare的控制后台中,其实就有提供一个一键套用Hotlink Protection的开关,只要打开来,就可以让有激活CDN功能的网域拥有Hotlink Protection的功能。这个开关藏在Cloudflare控制后台的「Scrape Shield」分页中。 这个Hotlink Protection一旦打开,整个有打开Cloudflare CDN服务的网域(包含子网域)下的图片链接,就只能在这整个网域(包含子网域)下打开,否则的话会直接回传HTTP的403... 阅读全文
“不建议跟李玫瑾教授学育儿”惹争议:对留言的集中答疑 01 当孩子出现“问题行为” 许多家长朋友高度焦虑如何教育孩子的问题,是在孩子表现出“问题行为”之后。比如: 孩子长时间看手机、看电视;孩子写作业磨蹭,学习上不自律;孩子不停要新玩具,不给买就哭闹、耍赖;甚至,稍大一些的孩子还会因为一些不如意用自杀威胁父母。 面对孩子的“问题行为”,父母的第一个想法往往会是“怎么能让他别看手机了”“怎么能让他别磨蹭了,赶紧把作业做完”“怎么能让他停止哭闹、耍赖、自杀”……总之,是让“问题行为”尽快消除。 从这一想法出发,就进入了解决眼前问题模式,自然会去寻求能快速解决眼前问题的种种方法。 强硬点的方法一般会是:训斥、打骂,没收手机、电脑,强行关掉电视,把孩子按在椅子上监督他学习等。 “温柔”点的方法一般会是:苦口婆心讲道理,谈条件,诱使孩子签订协约,或李玫瑾教授所提供的“四个不要”法( 把孩子带进卧室,不打,不骂,不说教,不离开,笑眯眯地看着孩子哭,直到孩子自己“缴械”)。 这些方法表面看起来不同,目的相同,都是让孩子快速听话,让他的“问题行为”快速消失。对这些方法的“有效性”我没有任何异议。 我想谈的是面对同样问题的另一种思维模式——先想一想: 孩子出现了“问题行为”,具体原因是什么?孩子选择采取“问题行为”,他的心理需求是什么?在“问题行为”出现之前,父母的教养方式是什么样的?父母哪些教养方式可能导致孩子出现“问题行为”——而这些教养方式需要改变? 两种思维模式的不同在哪呢? 如果说孩子的“问题行为”是种结果,那么第一种思维模式是采取行动,直接作用于结果本身,让结果快速消失;而第二种思维模式是先去寻找导致该结果的原因,在改变原因上做努力,结果自然会跟着发生改变。 举例说明: 采取第一种思维模式,用或强硬、或“温柔”的手段让孩子停止磨蹭,去写作业了。父母会以为是自己的手段起效了,以后会重复使用该手段,如不停地催促。孩子习得的是什么呢?是把父母当成“闹钟”,自己什么时候去做作业,取决于父母这种“闹钟”什么时候铃声大作。 孩子停留在了“他律”阶段,没有机会练习“自律”。然后会出现新的“问题行为”——从某一天没有自觉写作业,变成长期不能自觉写作业——就是家长抱怨的“孩子不自律”。 采取第二种思维模式看待孩子学习不自律的问题,会怎么样呢? 我们会去思考:孩子不爱写作业,是作业对孩子来说有点多、有点难吗?是某位老师讲课枯燥,破坏了孩子的学习... 阅读全文
设计师别担心,微软雅黑这样使用不侵权 这几天设计圈都被一条字体侵权消息刷屏,一公司在没有获得字体版权的情况下使用微软雅黑做印刷品,样稿印刷厂印了5000万张已经全国商用,公司损失2860万,裁员42人,含8个主管。 现在各位设计师都知道,微软雅黑版权是属于方正的,并不能免费使用!在大家惊叹赔偿金额的时候,方正官方出来辟谣: 这次事件,方正字体给我们间接地上了一课:想安全使用我们的字体?乖乖付费吧。同时还告诉那些没有买过版权的公司:该交保护费了。目前事件已在百度热点搜索排名第三,也让中国很多非设计行业人员了解了方正。 不过在大家都在聚焦新闻本身的时候,有没有想过,什么样的字体行为会受到侵权呢? 在设计行业中,常见的微软雅黑字体侵权主要表现在线上的banner、广告、页面、电影等,线下的印刷品、户外广告、书籍等。各位设计师对这些都非常清楚:无版权,不可商用。 UI前端和微软雅黑 但是在UI设计这块,我们在电脑网页中显示的微软雅黑有版权吗?公司官网显示的文章字体都是微软雅黑,这样会侵权吗?我们再回顾下微软雅黑的历史。 “微软雅黑”字体是“北大方正电子有限公司”设计开发的字体作品。该字体与著名的“方正兰亭黑系列字体”(该系列字体共有十一个不同粗细版本,共十一款字体)系出同源,前者针对屏幕显示,后者针对印刷用。方正公司拥有“方正兰亭黑系列字体”的全部版权。但微软雅黑的版权分为两个部分,在Windows系统的内嵌使用,包括屏幕输出和个人使用为目的的打印,这部分微软已经向方正支付了版权授权费用,所有正版Windows用户均可放心使用。但是以商业发布为目的的微软雅黑版权,仍由北大方正保留。 微软公司在开发新一代操作系统时,为了改善屏幕字体的视觉效果,委托方正公司设计两款字体。微软公司将此两款字体命名为“微软雅黑”和“微软雅黑 Bold”。 这里我们可以看到一个关键词“屏幕输出”,即电脑屏幕上显示和我们关系最大。设计师设计完网页之后,前端需要进行代码制作,这时候使用的微软雅黑字体,其实就是属于屏幕输出。 如果要深入搞清楚这个,我们就要了解网页中是如何显示字体的。前端网页字体的定义主要有两种方式:font-family和@font-face。关于这些前端基础知识,各位UI设计师必须要了解下。 font-family font-family属于前端css属性中最基础... 阅读全文
项目开发文档编写规范 前言 在开发项目的过程中,我深刻的意识到,文档存在的意义并不是无用的报告,简洁明了的文档不光能记录你当下所做的,还能在繁重的工作中分神思考下一步该做什么时为你节约精力,并且在项目周期内,使整个项目保持一致性。所以,软件开发文档的编写是很有必要的。我参考网上的资料,结合自己项目开发时的心得,分享一些经验。 文档类型 在项目开发过程中,应该按要求编写好十三种文档,文档编写要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。同时依照项目人员的角色划分,完成不同类型的文档。以下排序并未严格按照时间排序。 类型说明 可行性分析报告(产品人员) 可行性研究报告的编写目的是:说明该软件开发项目的实现在技术、经济和社会条件方面的可行性;评述为了合理达到开发目标而可能选择的各种方案;实施方案的利弊;说明并论证所选定的方案。 项目开发计划(产品人员) 软件项目开发计划即为软件项目实施方案制定出的具体计划。项目开发计划应提前给管理部门,并作为开发阶段评审的基础。编写项目开发计划的目的是用文件的形式,把对于在开发过程中各项工作的负责人员、开发进度、所需经费预算、所需的软硬条件等问题做出的安排记载下来,以便根据本计划开展和检查项目的开发工作。 软件需求说明书(产品人员) 软件需求说明书也称为软件规格说明。该说明书对所开发软件的功能、性能、用户界面及运行环境等做出详细的说明。它是用户与开发人员双方对软件需求取得共同理解基础上达成的协议,也是实施开发工作的基础。软件需求说明书的编写目的就是为了使用户和软件开发者双方对该软件的初需求有一个共同的理解,并使之成为整个开发工作的基础。 概要设计说明书 (开发人员) 概要设计说明书又可称系统设计说明书,这里所说的系统是指程序系统。编写的目的是说明对程序系统的设计考虑,包括程序系统的基本处理。流程、程序系统的组织结构、模块划分、功能分配、接口设计。运行设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。 详细设计规格说明书(开发人员) 详细设计说明书又可称程序设计说明书。编写目的是说明一个软件系统各个层次中的每一个程序(每人模块或子程序)的设计考虑。 如果项目比较简单,层次较少,本文件可以不单独编写,有关内容合并入概要设计说明书。 用户操作手册(产品人员) 用户操作手册的编... 阅读全文
远离你身边的煤气灯人 今天讲个煤气灯人的故事,这可不是一个关于张牙舞爪的喷火小木偶的恐怖故事。 我想说的远比恐怖故事惊悚多了。 它毁人心智,杀人于无形。 何为煤气灯人?如果你感觉这个词很陌生,那么朋友,你听说过PUA吗? PUA(Pick-up Artist,把妹达人),一个近年来广为人知的群体,与其相关的理论亦称为“泡学”。 大量不善交际的尝试者,几经辗转购入高价PUA课程,并将其珍若江湖两性秘笈。但同时在更多人眼中,PUA群体也沦为过街之鼠,人人喊打。甚至还有人故意在人际交往中,突显自己的直男直女本性,与“套路”二字划清界限。 但你真以为自己能摆脱PUA吗——Nope,甚至也许 你就是正在进行“情感操纵”的PUA本A 。 01. PUA,其实就是一种煤气灯人 现今意义上的PUA,上可追溯至1944年,由美国导演乔治·库克执导的一部惊悚片 《煤气灯下》(Gaslight) 中的主角安东。 在电影中,钢琴师安东(CharlesBoyer饰)为了将妻子宝拉(Ingrid Bergman饰)所要继承的大额财产据为己有,一面将自己伪装成潇洒体贴的丈夫,另一面又不断使用各种心理战术,联合家中的女佣企图将妻子逼疯。 在丈夫缜密的心理操纵下,宝拉逐渐变得神经兮兮,怀疑现实、质疑自己,最后在精神上几乎完全依附于安东。 这种试图破坏他人对现实的感知的情感操纵,也因该电影而得名为 Gaslighting(煤气灯操纵) 。下面我挑选了几个经典的Gaslighting片段让大家品品: Part 1 信息封锁:在一段时间内不断重复强调某一信息 安东和宝拉新婚满三个月时,外出去伦敦塔游玩。出门前安东送给妻子一枚小巧的白色胸针,声称是母亲去世前留给他的,并嘱咐宝拉把它收好。 此时安东略显刻意地强调了一句: “你可能会弄丢,你知道的,你经常丢三落四” 。这是电影中安东第一次对宝拉实施Gaslighting,也是宝拉初步对自己产生怀疑。 但是在二人离去之后,两位女佣之间的对话又再次佐证了,宝拉从未体现出任何异常。但是男主人安东,却不断向他们传输“女主人生病了”这一信息。 如果说此时,仆人们还对女主人生病一事尚有所怀疑。那么接下来的事情,就令他们对于这一言论深信不疑了。 当天的游玩结束后,安东便以饰物常年未佩戴、需要修理为由,向宝拉索要胸针。由于安东从一开始就并未将胸针放入宝拉的手包,而是偷偷将其藏在手心转移至别处,... 阅读全文
kubernetes中部署mysql高可用集群 很多软件后端使用的存储都是mysql,当这些软件系统在生产环境部署时,都会面临一个严峻问题,需要在生产环境中部署一个高可用的mysql集群服务。刚好在最近一周的工作中,需要在kubernetes环境中搭建mysql高可用集群,这里记录一下。 搭建MySQL集群 MySQL的主从半同步复制方案、Galera集群方案以前都也实践过,感觉都不是太友好,配置比较麻烦,而且发生故障转移时经常需要人工参与。所以这里还是采用MySQL官方推荐的Group Replication集群方案。关于MySQL Group Replication集群的架构设计可以看 官方文档 ,懒得看英文的话,也可以看我之前整理出的 资料 。另外kubedb网页上也有介绍 MySQL几种高可用方案的构架方案 ,也比较有意思。 之前的博文 也讲过在非容器环境搭建MySQL Group Replication集群,现在在Kubernetes的容器环境配合kubedb,搭建更方便了,命令如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 # 添加appscode的helm仓库 $ helm repo add appscode https://charts.appscode.com/stable/ $ helm repo update # 部署kubedb $ helm install appscode/kubedb --namespace kube-system --name kube... 阅读全文
分布式定时任务对比 1. 什么是分布式定时任务 把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。叫做分布式定时任务。 2. 常见开源方案 elastic-job , xxl-job , quartz , saturn, opencron , antares elastic-job elastic-job 是由当当网基于quartz 二次开发之后的分布式调度解决方案 , 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 。 Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。 Elastic-Job-Cloud使用Mesos + Docker(TBD)的解决方案,额外提供资源治理、应用分发以及进程隔离等服务 亮点: 基于quartz 定时任务框架为基础的,因此具备quartz的大部分功能 使用zookeeper做协调,调度中心,更加轻量级 支持任务的分片 支持弹性扩容 , 可以水平扩展 , 当任务再次运行时,会检查当前的服务器数量,重新分片,分片结束之后才会继续执行任务 失效转移,容错处理,当一台调度服务器宕机或者跟zookeeper断开连接之后,会立即停止作业,然后再去寻找其他空闲的调度服务器,来运行剩余的任务 提供运维界面,可以管理作业和注册中心。 elastic-job结合了quartz非常优秀的时间调度功能,并且利用ZooKeeper实现了灵活的分片策略。除此之外,还加入了大量实用的监控和管理功能, 以及其开源社区活跃、文档齐全、代码优雅等优点,是分布式任务调度框架的推荐选择。 由于elastic-job-lite 不支持动态添加作业,此处仅贴上elastic-job-Cloud架构图 xxl-job 由个人开源的一个轻量级分布式任务调度框架 ,主要分为 调度中心和执行器两部分 , 调度中心在启动初始化的时候,会默认生成执行器的RPC代理 对象(http协议调用), 执行器项目启动之后, 调度中心在触发定时器之后通过jobHand... 阅读全文
Java 认证考试 OCAJP 经验总结 1. 考证、认证是否有用含金量的话题 关于认证考试(无论什么认证)是否有用?这个话题无论是在哪里都有人问。这个问题就好比上大学是否有用吗一样,有的人没上过大学一样年薪百万。 认证这种东西需要的时候即有用,不需要的时候就没用。有,并没有什么坏处。说实话个人感觉这证件没什么大用。 而自己想考的理由完全是想自我check下,逼自己复习学习基础。如果你是刚毕业的GH或者在校的,手里有些零花钱的可以考虑下,有这个证/或许/可以证明你Java基础还不错。 2. 关于OCAJP、什么是OCAJP? OCAJP全称为:Oracle Certified Associate Java SE 8 Programmer Certification 也叫OCA。改版前认证为 OCJP,在Sun公司没有被Oracle收购前叫 SCJP。 这里要提一下,之前的OCJP已经Retire(停考/退休)。Java 7的认证也即将停考。所以如果想考试建议直接考Java SE 8的也就是 Java SE 8 Programmer I 认证,考试编号为1Z0-808,下一个考试为:Java SE 8 Programmer II | 1Z0-809。 3. 关于各考试种类认证科目 ? ? ? 上图的考试科目链接: https://education.oracle.com/oracle-certification-exams-list 在上图中前两个1Z0-803和804是之前获取 Java 7的认证考试; 1Z0-805 是已经获取过Java6认证(也就是OCJP/SCJP)的升级成为Java7的认证 1Z0-808和809 是Java 8 I和II的认证,也就是OCAJP和OCPJP认证。 其他不建议,会在2019年底随着Java 7的认证考试取消,而随着均会停考。 另外在官网中可以查看到后缀带有JPN的考试科目,该考试为日语认证,考试等同于英语的1Z0-808和809,只是考试语言为日语。有日语要求的可以考虑该版本考试。考试内容一样。 4. 考试费用,考试时长 及 合格标准 SE考试费用均为 1,077 RMB,我是在VUE网站报名,使用的VISA信用卡支付的美元,下... 阅读全文
Yaf framework 相关项目骨架 在 yaf 的源码目录,附带了一个工具 tools 目录, 下面有个 cg/yaf_cg 工具,是通过模版生成 yaf 项目骨架的工具。 Usage: ./yaf_cg ApplicationName [ApplicationPath] 项目目录 ├── application │ ├── Bootstrap .php │ ├── controllers │ ├── library │ ├── models │ ├── plugins │ └── views ├── conf │ └── application .ini └── index .php index.php 程序的入口文件 application 主要的应用程序代码目录。 2.1 可以通过 application.directory 这个配置来修改。 2.2 application 目录下的目录(controllers、models、plugins、views)是默认的代码结构目录,yaf 会根据相关的类名称,去相关目录下加载相关的文件,例如 IndexController extends Yaf\Controller_Abstract 这个文件,yaf 就会到 controllers 目录下查找 Index.php、类 UserModel 就会到 models 目录下查找 User.php(可以定制文件后缀或前缀模式,如 ModelUser 就是前缀模式)。 2.3 除了 library 目录以外,其它目录都是在框架编译的时候确定的,library 目录主要是存放一些本地库文件例如我有个 Helper_Html (名称空间模式 Helper\Html) 类,通过注册本地类名称空间 Yaf_Loader::registerLocalNamespace("Helper") 来加载,文件的存储结构是 library/helper/Html.php 需要注意的就是要开启名称空间,使用 namespace 的类名称和不使用 namespace 的 classname 有些差异。 2.4 Bootstrap.php 是框架的引导类 (可以没有),继承自 Yaf\Bootst... 阅读全文