certbot+letsencrypt配置免费单证书多域名ssl证书

前些天看到微信公众平台官方公告关于公众平台接口不再支持HTTP方式调用的公告之后决定把项目的协议从http改成https,于是开始在网上查,完成之后总结了一点经验 本文演示的是通用证书,即在certbot命令中不需要指定--apache或者--nginx之类,只需要在完成证书生成之后在服务器配置文件里进行引用即可 Let’s Encrypt Let’s Encrypt 认证签发为每3个月一次,也就是每 90 天必须更新(renew)一次。取得认证的过程需要进主机安裝代理程序:certbot,下面以ubuntu为例: 安装 $ sudo apt-get update $ sudo apt-get install software-properties-common $ sudo add-apt-repository ppa:certbot/certbot $ sudo apt-get update $ sudo apt-get install certbot 生成证书 $ sudo certbot certonly 此时会出现选项,按照提示选择即可 证书自动续期可以使用 certbot renew --force-renew 手动强制为证书续期 如果出现以下提示则说明更新成功 Congratulations, all renewals succeeded. The following certs have been renewed: 但为了更方便,通常使用crontab -e编辑定时任务,并加入 0 0 1 * * certbot renew --force-renew “重启服务器命令” 实现每个月1号0点自动续期 在服务器配置相关证书 apache2开启SSL tips: 如果有多个域名 可以用过在Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel):步骤通过,来分隔域名 可以使用以下命令来直接生成多个域名的证书 $ sudo certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com -w /var/www/thing -d thing.is -d m.thing.is 生成的证书通常保存在/etc/letsencrypt/live/目录下 注意:如果失败超过5次会被服务器屏蔽1小时 ...

January 3, 2018 · 1 min · 108 words

记录一次centos6排查80端口无法访问的问题

大概是一个月前的事情了,最近工作繁忙,暂时忘了记录… 当时的情况大概是这样: 客户的机房开通的是广电网的固定IP,服务器系统是 centos6.8,已知 80 端口和 22 端口对外是开放并能访问的; 服务器上有两个 web 项目,一个对应 80 端口,一个对应 8080 端口 web 服务器是 apache2.2,目前监听了 80 和 8080 端口,httpd-vhosts.conf 下有两个虚拟机配置,分别对应 80 和 8080 端口; 防火墙状态:service iptables status(iptables:未运行防火墙。) SELinux 状态:getenforce (Disabled) 项目目录的访问权限是足够的 lsof -i :8080 httpd 22357 root 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 22431 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 22433 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 22478 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 22668 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 22690 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 23028 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 23030 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 23760 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 23761 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 23762 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) httpd 23855 www 6u IPv6 27111118 0t0 TCP *:webcache (LISTEN) netstat -nlpt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:58726 0.0.0.0:* LISTEN 2630/rpc.statd tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 6324/mysqld tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 2574/rpcbind tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3235/pure-ftpd (SER tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3941/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2668/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3109/sendmail tcp 0 0 :::34760 :::* LISTEN 2630/rpc.statd tcp 0 0 :::111 :::* LISTEN 2574/rpcbind tcp 0 0 :::8080 :::* LISTEN 22357/httpd tcp 0 0 :::80 :::* LISTEN 22357/httpd tcp 0 0 :::21 :::* LISTEN 3235/pure-ftpd (SER tcp 0 0 :::22 :::* LISTEN 3941/sshd tcp 0 0 ::1:631 :::* LISTEN 2668/cupsd tcp 0 0 :::443 :::* LISTEN 22357/httpd 问题: 服务器的 8080 端口在本地可以通过 curl 命令(curl http://localhost:8080)获取到 index.php 的内容,但是外网无法通过 ip:port 的形式访问到 ...

December 28, 2017 · 2 min · 295 words

SoapClient的一点总结

近期在开发一个小型的酒店订房系统 **应用场景:**由于是在公司之前一个订房系统基础上进行修改,因此工作量不算大,但需要在系统中多个位置和酒店方提供的另一个PMS系统的信息进行对接(部分数据需要同步[库存,房间编号,订单信息等等]),接口使用xml格式进行数据传递,后端开发语言是php **问题:**开发中遇到的一个坑就是使用SoapClient在调用PMS系统接口的时候会出现间歇性404(Solution: Soap WSDL Error - “failed to load external entity”) **解决方法:**向PMS接口提供方反应这个情况之后那边说接口正常,后来网上查阅才发现需要使用libxml_disable_entity_loader(false)这个函数来打开entity_loader,随即问题解决.该函数通常添加在需要使用SoapClient实例的脚本上方

December 18, 2017 · 1 min · 13 words

phpexcel踩坑记

最近在使用phpexcel扩展处理表格导入的时候,遇到两个坑,现做以下记录 坑一:excel表中的富文本导入后数据始终不对 解决方法:假设$temp为循环读取的每列数据值,判断是否是PHPExcel_RichText类的实例,如果是,则调用$temp自身的方法__toString()转换,代码如下: if ($temp instanceof PHPExcel_RichText) $temp = $temp->__toString(); 坑二:excel表中的日期导入后变成了float类型的值 解决方法1:假设$temp为循环读取的每列数据值,假设日期所在列为D 代码如下(这里的if仅仅是用来判断日期是否为空,如果不判断,为空时会自动用当前时间填充,根据实际业务决定): if($k=='D'){//指定D列为时间所在列 $date = $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue(); if($date){ $temp = date("Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($date)); }else{ $temp = ''; } }else{ $temp = $objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue(); } 解决方法2:也可以在业务代码里直接转换时间值 $shared = new \PHPExcel_Shared_Date(); $date = date('Y-m-d',$shared->ExcelToPHP($v1));//日期/时间 坑三:phpexcel 单元格内换行的问题 $phpexcel->getActiveSheet()->getStyle('B')->getAlignment()->setWrapText(True); $phpexcel->getActiveSheet()->setCellValue("B".$i, "hi my name is\n darkmuzi"); 在单元格赋值之前先设置样式

December 1, 2017 · 1 min · 50 words

一个投票项目的总结

最近开发了一个只有3个页面的微信投票小项目 基本流程:一个微信号一天只能对一个参与者投一次票且一天总共可以对不同参与者投10次票 首页内容:展示所有投票参与者以及其得票数,按照编号排序(支持点击投票) 排行页内容:展示所有投票参与者以及其得票数,按照得票数排序 详情页内容:展示指定参与者以及其得票数(支持点击投票) 后台略过… 项目上线后服务器cpu长时间负载100%,仔细查看后发现几个主要问题: 首页和详情页js中没有对触发异步请求的请求中状态(已发出请求且未收到响应[搜索,下一页加载,投票操作])没有禁用处理和提示,可能导致用户连续点击操作,挂起多个请求 解决方法:添加对应请求中的状态,在发出请求后,收到响应前都无法再次发出相同请求 之前有对三个页面的访问量进行统计,但用的是简单粗暴每次访问都直接更新数据库的响应字段值,导致并发增加时数据库写入次数过多 解决方法:配置一个值,每次请求时先将总访问量+1,再判断如果等于配置值,则更新数据库的总访问量并清空缓存,反之写入缓存 忘了关闭TP框架的调试模式(调试模式会使模板缓存和字段缓存失效) 解决方法:关闭调试模式 mysql数据表的联合索引没有生效(原因待定)

November 20, 2017 · 1 min · 14 words

ab测试中并发量导致的拒绝问题

今天对一个微信投票的小项目进行ab测试 环境:windows 10+cmd(管理员身份) 问题:在输入了ab -n 5000 -c 500 http://hostname/并enter之后等待片刻出现了apr_socket_connect():由于目标计算机积极拒绝,无法连接。(730061) 在网上找到了其他人的方法,参考后,问题解决 解决方法:找到http.conf,打开,找到关于httpd-mpm.conf的引用配置,如果没有引用,则去掉#,反之则无视,打开httpd-mpm.conf文件,将其中的ThreadsPerChild参数值调大,重启Apache即可 补充:在后续的测试中遇到了apr_poll: The timeout specified has expired (70007)的提示 解决方法:使用-k参数(Connection: Keep-Alive)

November 15, 2017 · 1 min · 20 words

head标签中自动设置ie内核版本的写法

最近在开发中遇到后台管理系统部分样式,js对IE浏览器不兼容的情况,最后通过在head标签中添加如下代码实现自动设置IE内核版本解决: <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome=1" /> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=9" />

November 11, 2017 · 1 min · 12 words

一些常用正则表达式

最近用phpspider抓取网页,除了用xpath匹配标签外,偶尔也会用到正则表达式,这里简单记录一下常用的正则如下: $str=preg_replace("/\s+/", " ", $str); //过滤多余回车 $str=preg_replace("/<[ ]+/si","<",$str); //过滤<__("<"号后面带空格) $str=preg_replace("/<\!--.*?-->/si","",$str); //注释 $str=preg_replace("/<(\!.*?)>/si","",$str); //过滤DOCTYPE $str=preg_replace("/<(\/?html.*?)>/si","",$str); //过滤html标签 $str=preg_replace("/<(\/?head.*?)>/si","",$str); //过滤head标签 $str=preg_replace("/<(\/?meta.*?)>/si","",$str); //过滤meta标签 $str=preg_replace("/<(\/?body.*?)>/si","",$str); //过滤body标签 $str=preg_replace("/<(\/?link.*?)>/si","",$str); //过滤link标签 $str=preg_replace("/<(\/?form.*?)>/si","",$str); //过滤form标签 $str=preg_replace("/cookie/si","COOKIE",$str); //过滤COOKIE标签 $str=preg_replace("/<(applet.*?)>(.*?)<(\/applet.*?)>/si","",$str); //过滤applet标签 $str=preg_replace("/<(\/?applet.*?)>/si","",$str); //过滤applet标签 $str=preg_replace("/<(style.*?)>(.*?)<(\/style.*?)>/si","",$str); //过滤style标签 $str=preg_replace("/<(\/?style.*?)>/si","",$str); //过滤style标签 $str=preg_replace("/<(title.*?)>(.*?)<(\/title.*?)>/si","",$str); //过滤title标签 $str=preg_replace("/<(\/?title.*?)>/si","",$str); //过滤title标签 $str=preg_replace("/<(object.*?)>(.*?)<(\/object.*?)>/si","",$str); //过滤object标签 $str=preg_replace("/<(\/?objec.*?)>/si","",$str); //过滤object标签 $str=preg_replace("/<(noframes.*?)>(.*?)<(\/noframes.*?)>/si","",$str); //过滤noframes标签 $str=preg_replace("/<(\/?noframes.*?)>/si","",$str); //过滤noframes标签 $str=preg_replace("/<(i?frame.*?)>(.*?)<(\/i?frame.*?)>/si","",$str); //过滤frame标签 $str=preg_replace("/<(\/?i?frame.*?)>/si","",$str); //过滤frame标签 $str=preg_replace("/<(script.*?)>(.*?)<(\/script.*?)>/si","",$str); //过滤script标签 $str=preg_replace("/<(\/?script.*?)>/si","",$str); //过滤script标签 $str=preg_replace("/javascript/si","Javascript",$str); //过滤script标签 $str=preg_replace("/vbscript/si","Vbscript",$str); //过滤script标签 $str=preg_replace("/on([a-z]+)\s*=/si","On\\1=",$str); //过滤script标签 $str=preg_replace("/&#/si","&#",$str); //过滤script标签,如javaSCript:alert

October 14, 2017 · 1 min · 63 words

使用apache2反向代理访问google

引言 刚刚在v2ex上看到一篇用nginx做反向代理访问google的帖子,出于好奇,试了试用apache进行反向代理访问google,果然很好玩! 准备工作: apache服务器需要安装proxy相关模块,如果是ubuntu环境可以直接使用命令sudo a2enmod 模块名称进行安装,模块可以在/etc/apache2/mods-available/目录下查看,安装好的模块可以在/etc/apache2/mods-enabled/ 里查看 这里直接上配置: <VirtualHost *:443> ServerName facebook.smarthippo.club SSLEngine on SSLCertificateFile "/etc/letsencrypt/archive/facebook.smarthippo.club/cert1.pem" SSLCertificateKeyFile "/etc/letsencrypt/archive/facebook.smarthippo.club/privkey1.pem" SetEnvIf User-Agent “.*MSIE.*” \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 SSLProxyEngine On ProxyPass / https://www.facebook.com/ ProxyPassReverse / https://www.facebook.com/ </VirtualHost> <VirtualHost *:443> ServerName google.smarthippo.club SSLEngine on SSLCertificateFile "/etc/letsencrypt/archive/google.smarthippo.club/cert1.pem" SSLCertificateKeyFile "/etc/letsencrypt/archive/google.smarthippo.club/privkey1.pem" SetEnvIf User-Agent “.*MSIE.*” \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 SSLProxyEngine On ProxyPass / https://www.google.com.hk/ ProxyPassReverse / https://www.google.com.hk/ </VirtualHost> So,Google,Wiki,就是这么简单~ 备注: 这篇文章的前提当然是有一个国外的服务器,安利一波vultr(价格合理,且稳定,按天计费) 可以通过添加子域名的方式实现对不同墙外站点的访问,详见第二个配置 安装ssl证书网上太多,就不写了 目前存在的问题: 在反向代理站点中如果有跳转到其他被墙站点的链接,依然无法访问 部分网站对机器访问的请求有限制,比如google,虽然首页可以正常访问,但其他页面可能会访问不了,跳转到ipv4.google.com进行人机验证 最后还是没能第二个问题… 还是用科学上网吧… ...

October 14, 2017 · 1 min · 74 words

成都-泸沽湖-洱海自驾游

住宿安排 10月1日 4点从成都出发 这是大概6点左右的成雅高速 大概中下午1点到了西昌,随意在路边吃了个干锅鸡,然后去酒店放了行李,睡个觉,就去琼海边上溜达了 这个是琼海,还行,比较空旷,空气不错 晚上在西昌吃了当地的羊肉米粉 10月2日 全程307省道,从西昌经盐源县到泸沽湖,大概7小时,260公里山路,路上有点堵 我们入住的泸沽湖阿塔兄弟之家的晚餐,还不错,比较有当地特色的菜 10月3日 当天晚上依然在阿塔兄弟之家吃的饭,店里还有一只金毛 10月4日 准备离开泸沽湖,出发去大理,下面这张图是早晨7点多拍到的日出,还不错 当天下午4点多到了大理古城,本想去点评上人气高的段公子,奈何人太多,结果去旁边吃过桥米线了(以后再也不想吃了),当天晚上去古城里逛了一下, 就回客栈睡觉去了 10月5日 去喜洲镇,海舌公园玩了大半天,本来要去双廊,结果当地’施工’,没去 晚上去当地一家不错的东北小馆吃了粥和葱油面(个人认为比过桥米线好吃吧),逛了下古城 一家比较有特点的麦当劳 当地的鸡丝米线(老婆说味道不错) 10月6日 开车从大理经杭瑞高速转那个什么省道(忘了)经元谋县到攀枝花,结束这次泸沽湖大理之旅 下面是在元谋县附近经过的一个变形金刚(忘了哪一部)的拍摄地 备注 本次行程2262公里 时间:2017.10.01-2017.10.07

October 8, 2017 · 1 min · 27 words