ubuntu 16.04执行letsencrypt的时候报告错误“ImportError: No module named datetime”

网站一直使用 letsencrypt提供的 HTTPS证书,这个证书的问题在于每隔三个月就必须更新一次,本次更新证书的时候,提示如下错误:

错误发生的原因在于 letsencrypt自己构建了一个 Python的虚拟环境来隔离,但是早期建立的虚拟环境中是缺少部分软件包的,而自身的 BUG导致也没有重新更新虚拟环境,导致出现异常。

解决方法就是删除 letsencrypt自己构建的 Python的虚拟环境,然后继续执行脚本让他重建即可。

参考链接


Ubuntu 14.04.5版本上安装并启用 Apache 2.4.10 版本的Event MPM模块

Apache 2.4版本开始已经尝试借鉴 Nginx的实现方式来处理网络连接。但是到目前(2017.2.22)为止,实现的并不彻底,只是在处理 HTTP协议的时候使用异步模式,而处理 HTTPS协议的时候,依旧使用每个连接一个线程的模式。据说完整的支持 HTTPS异步,要到 Apache 3.x版本了。

目前的 Apache MPM event本质上还是 Apache MPM worker的优化版本,并不是一个完整的独立模式。

尽管支持的不是太完善,但是这部分的实现,已经能比较好的改善 Apache 2.4的网络处理性能了,尤其是对于我这种访问压力不是太大的网站来说,目前应该是够用了的。暂时可以缓解一下迁移到 Nginx的急迫性,并且比较好的减少访问网站时候的延迟比较高的问题。

到目前(2017.2.22)为止在 Ubuntu 14.04.5版本上 Apache Event MPM还不属于正式版本,而是被部署到了 backports(待发布)分支上,处于候选发布状态,因此我们安装的时候,需要执行指定 backports,具体执行命令如下:

模块的配置文件在 /etc/apache2/mods-available/mpm_event.conf,目前我这边用默认配置已经足够了(足见访问量是多么的少,呵呵)。

启用 Apache MPM event模块

查询 Apache 2.4当前正在使用的模块

返回值会是 event, prefork, worker中的一个,如果返回了 event,则说明我们已经成功启用了 Apache MPM event模块。

目前实际测试来看,确实能非常明显的加快网站的访问速度,访问延迟明显变短。

参考链接


Ubuntu 14.04系统上使用Apache2.4.10+PHP5+FastCGI的WordPress网站大量php5-cgi defunct引起网站访问异常缓慢

最近网站访问异常缓慢,网站响应时间明显延迟很多,观察系统的处理器占用,一点都不高,带宽也在合理范围之内,因此分析 Apache-2.4.10的错误日志

发现大量的出现

如下图:

感觉很奇怪,于是看了一下 php相关的进程,执行命令

执行结果如下图:

发现大量的 php5-cgi进程处于 defunct状态(僵尸状态),导致达到了进程数量的限制上限,无法继续提供服务。

但是上面的日志,是已经出现问题的时候的日志,既然进程不足了,自然无法提供服务了,继续向上追踪,发现大量的进程崩溃日志

感觉很奇怪,最初以为是由于调整 Apache-2.4.10服务器,多次在正常运行中重启服务器,导致正在服务的 php5-cgi进程变成了僵尸进程。但是重启服务器之后,过了几天后,问题依旧发生了。

于是网上搜索了一下,感觉应该更像是 PHP-CGI进程本身存在内存泄漏问题,导致进程长时间执行之后,由于资源开销问题导致进程崩溃。

目前我的服务器上启用的是 Apache2Event MPM模块,查看其中的配置文件:

可以看到里面的内容如下:

发现,设置 MaxConnectionsPerChild参数为0,根据 Apache MPM Common Directives 里面的介绍,这个参数的作用就是一个进程处理多少个请求后就退出。而如果设置了 0 则代表,除非出现了异常,否则进程会一直存在。这样的话,一旦资源泄漏,进程就会各种异常了。因此需要设置一下这个参数,一般这个参数设置为 1000- 5000左右,根据实际情况自己调整一下参数。注意这个参数的设置是会影响到网站的访问速度的,尤其是当服务器的连接次数到达限制的时候,此时大量的服务器进程都在重启,导致此时的访问要么被重置要么耗时变的非常长。因此,如果没有资源泄漏的话,可以不设置这个限制。

注意一下这个介绍的最后一句话,讲的就是这个参数可以修正资源泄漏问题,如下:

修改参数后,需要重启服务生效。

按照上面的方法实现后,过了一个礼拜后,这个现象再次发生了。

观察了一下 Apache2当前已经启用的模块

发现,由于是从 Apache2.2升级到的 Apache2.4,或许是某次的配置,导致 fastcgifcgi两个模块同时被启用了。

是不是两个相同功能的模块同时启用导致功能冲突了呢?

先尝试禁用 fastcgi(这个模块已经被 fcgi替换了).

目前看来,问题依旧发生了!!!

查看 Apache2中的 FastCGI的配置信息

可以看到如下内容

其中的 AddHandler中的 .php引起了注意,因为在日志中出现问题之前一直会出现如下的错误日志:

而这个配置项是从 Ubuntu 12.04中手工引入的,我们尝试去掉这个。另外,可以看到

也就是 FastCGI的最大进程数是被设置成了 10,但是,我这边限制 PHP-FPM的最大进程数为 5,是不是 FastCGI的进程数如果大于 PHP-FPM能够提供服务的数量的时候,会导致 FastCGI进程出现僵尸状态呢? 是不是这个原因导致的呢? 于是修改后的结果如下:

经过这几天的观察,貌似现象不再出现了,这个应该是 Apache 2.4版本引入的 BUG,以前的配置的 Apache 2.2版本上是没有任何问题的,究竟原因是 mod_fcgid无法处理 .php格式的脚本导致,还是由于 mod_fcgid进程数高于 php-fpm的进程数导致 mod_fcgid进程长时间无法获取到可用的 php-fpm连接,导致进程被饿死,这个暂时不详细追究了。

今天在修改配置的时候,由于配置错误,导致 PHP-FPM服务无法正常启动,但是整个服务器竟然一直可以正常访问,那么结论就是 Apache 2.4在当前的配置下,根本就没有使用 PHP-FPM模式进行通信,而是使用标准的 FastCGI的方式调度的。
于是网上搜索半天,结合自己的尝试,找到了根本原因:

上面的配置在 Apache 2.2版本上是不影响后面启用的 PHP-FPM配置的,对于 PHP的请求,最终都是定向到 PHP-FPM的。但是相同的配置在 Apache 2.4上面,则被定向到了 FastCGI上面。因此修改方式如下(至少要高于2.4.10,否则配置无效):

至此,应该才是从根本上解决了服务器上的问题。

开始的时候忽略了一个基础的问题,那就是 php5-cgiphp5-fpm进程本身就不应该同时存在,如果服务器使用 php5-fpm,那么 php5-cgi的进程就不应该被调用,这个问题没有重视,导致了整个问题分析时间冗长,反复。

本质上是服务器的配置错误导致问题。

Ubuntu 14.04上的Apache服务器限制单个用户的下载带宽

今天突然发现自己的服务器访问异常缓慢,从阿里云的监控平台上看到,CPU的利用率并不高,但是带宽却已经被吃满了,导致网站访问异常缓慢,跟踪了一下发现是某个用户下载网站上的大文件导致了带宽吃紧的情况。因此需要限制某个用户的独占带宽。

具体操作


1.安装带宽限制模块

2.启用模块

3.配置网站对于带宽的限制规则

在原有的

之间增加如下内容

然后重启 Apache2.

注意,如果配置了HTTPS,那么对应的配置文件也需要调整。

参考链接


Ubuntu 14.04服务器Apache禁止某些User Agent抓取网站

最近网站上,被某些爬虫占用了太大的资源,导致访问不畅,网上搜了一下禁止某些爬虫的办法。

下面这些方法需要同时实施才足够稳妥。

1.在网站根目录下修改或创建 .htaccess文件

注意,这个过滤条件需要添加到整个 .htaccess文件的头部,否则可能由于其他的过滤条件而跳过了这个过滤条件,导致某些情况下不生效。

2.修改 Apache2的配置文件

禁止某些 User-Agent的访问

注意:

中间不可用空格,否则无法成功生效。

3.网站根目录下面增加 robot.txt,禁止爬虫

4.对于使用 ProxyPass, ProxyPassReverse代理转发的情况

使用如下配置进行过滤

注意:

中间不可用空格,否则无法成功生效。

5.验证刚刚的服务器设置是否已生效

刚刚的设置完成后,我们需要修改浏览器的 User Agent,来验证一下我们的设置是否已经生效了。
Chrome-55.0为例, Windows下面按下 F12,在弹出的窗口中进行如下操作:

参考链接


服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站

Apache-2.4使用ServerAlias实现同一个网站绑定多个域名(Ubuntu 14.04)

最近自己申请了多个域名,打算绑定到同一台服务器上面,网上搜索了一下,很多的答案是开多个主机的方式来处理,方式可以,但是比较繁琐,不如使用 ServerAlias来的方便。
ServerAlias:服务器别名,在 Apache中可以用于设置虚拟主机接收到个域名,也可以用于接收泛解析的域名。具体的设置方法如下:

可以看到如下的配置内容:

注意其中的 ServerAlias字段,就是指定多个域名同时指向的这个服务器的。中间用空格来区分。

注意上述的 ServerAlias中,包含 www字段的域名 www.mobibrw.com,跟不包含 www字段的域名 mobibrw.com声明了两次,目的是某些浏览器在进行域名认证的时候( HTTPS证书校验),采用的是全字匹配,导致尽管这两个实际上是指向同一个地址,但是这些浏览器会报告域名证书不正确。

同样道理,对于使用了 HTTPS的服务器来说,这个更重要

执行跟上述相同设置即可。
如果跟本站一样使用 Lets Encrypt颁发的 SSL证书的网站来说,修改完成配置后,需要重新申请一下证书。

Tomcat 7使用AJP协议导致AJP端口被意外暴露给外网

使用Ubuntu 13.10 Apache 2.2 通过 AJP 整合 Tomcat 7中的方法配置了通过 AJP协议来通过 Apache进行访问的代理。

但是最近发现 Tomcat有时候会崩溃掉。刚刚开始以为是正常的 OOM,后来分析日志,并没有找到相关的记录,反倒是发现如下内容:

于是感觉有些奇怪,因为 AJP协议应该不会发生非常频繁的通信协议错误问题。结果尝试从外网连接 TomcatAjp端口 8009,发现竟然可以通过 telnet连接成功!!说明端口意外暴露给了外网。

那么根据The AJP Connector中的介绍说明(注意 address部分),如果没有指定 IP地址的话,默认是绑定任意地址,这样就导致外网也可以访问这个端口。因此出于安全考虑,我们需要增加这个 address的设置,并且绑定到 127.0.0.1。最终结果如下:

而我在配置的时候,恰恰少设置了 address="127.0.0.1".这个这种错误有些低级啊。

Ubuntu 14.04系统Apache 2.4.7版本使用mod_headers过滤HTTP响应头中的WP-Super-Cache字段

服务器上面安装了 WP-Super-Cache后,服务器的响应报文中会自动增加一个 WP-Super-Cache字段,这个字段会暴露服务器的一些细节,而 WP-Super-Cache的设置中又没有找到去掉这个字段的设置选项,如下图:

WP-Super-Cache-Http-Response

比较简单的解决方法就是,使用 Apache2自带的 mod_headers模块,通过修改 .htacess配置文件的方式来去掉这个响应信息。
1.在网站目录下的 .htacess文件中增加如下语句

2.启用 mod_headers模块

3.重启 Apache2服务

Ubuntu 14.04主机优化加速mod_pagespeed安装使用

背景介绍


谷歌优化加速mod_pagespeed作为Apache HTTP Server的module,它能在服务网页请求的即时做出超过15种的优化调整,包括优化缓存,最小化客户端—服务器往返路程,压缩有效传输体积。
经过实验观察,mod_pagespeed最高能使页面加载时间压缩50%。
项目已经被迁移到了GitHub,链接地址为:https://github.com/pagespeed/mod_pagespeed

Apache mod_pagespeed安装方法


1.下载安装包

32位系统

64位系统

鉴于国内被和谐的情况,可以本站下载 64位Ubuntu点击这里 32位Ubuntu点击这里

2.安装

3.重启 Apache2

4.检查是否安装成功

5.潜在问题

安装这个插件之后,可能会导致页面在不同操作系统之间的显示错乱问题,目前 WordPress上会出现这种问题,应该是缓存导致的问题,因为 WordPress会根据系统,浏览器的不同来进行页面兼容处理,如果直接返回缓存数据,反而会出问题。目前暂时只能是禁用这个插件了。

另外,当主机的 CPU,内存有限的情况下,这个模块反而增加了系统开销,导致系统响应缓慢。有些 Javascript代码被优化后,会工作不正常,目前看来,对小网站来说副作用大于正面作用。

参考链接


主机优化加速mod_pagespeed和ngx_pagespeed安装使用

Ubuntu 14.04编译安装Apache 2.4.20

1.安装开发工具包

2.下载 Apache 2.4.20的源代码

3.安装 apr依赖库

4.安装 pcre

5.解压缩代码

6.配置并编译

参考链接


Apache httpd 2.4.x 使用 mod_proxy_fcgi 和 PHP-FPM 的方式
Ubuntu 14.04下编译及配置apache2.4(python CGI)
How do I compile the latest apache2 on ubuntu using the original layout, configuration and configure options