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

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

具体操作


1.安装带宽限制模块

2.启用模块

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

在原有的

之间增加如下内容

然后重启 Apache2.

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

参考链接


Ubuntu 14.04检查是谁占用了带宽

今天突然发现自己的服务器访问异常缓慢,从阿里云的监控平台上看到,CPU的利用率并不高,但是带宽却已经被吃满了,导致网站访问异常缓慢,于是想看看究竟是哪个连接导致的,网上搜索了一下,找到 iftop工具。
安装如下:

阿里云的ECS服务器上,外网网卡默认是eth1,因此执行如下命令:

可以看看是哪些连接长时间占用了带宽,然后去 Apache2的访问日志中对应看看 IP地址在访问哪些文件就知道具体情况了。

下面是原文照抄

利用iftop找出是谁占用了带宽

有时候我们的网络缓慢并不是由远程服务器或路由器所引起,而只是因为系统中的某些进程占用了太多可用带宽。虽然从直观角度我们很难确定哪些进程正在使用带宽,但也有一些工具能帮大家把这些捣蛋的家伙揪出来。

top就是这样一款出色的故障排查工具,它的出现还带来一系列思路相似的衍生品,例如 iotop--能够确定到底是哪些进程占用了大部分磁盘I/O性能。最终名为 iftop的工具横空出世,能够在网络连接领域提供同等功能。与top不同,iftop不会亲自关注进程情况,而是列出用户服务器与远程IP之间占用带宽最多的连接对象。举例来说,我们可以在iftop中快速查看备份服务器IP地址在输出结果中的位置来判断备份工作有没有大量占用网络带宽。

iftop输出图示

红帽与 Debian的各个发行版都能使用 iftop这一名称的软件包,但在红帽发行版方面大家可能需要从第三方资源库才能获取。一旦安装过程完成,我们在命令行中运行 iftop命令即可启用(需要 root权限)。和 top命令一样,我们可以点Q键退出。

iftop界面屏幕的最上方是显示全局流量的信息栏。信息栏之下则是另外两列信息,一列为源IP、另一列为目标IP,二者之间以箭头填充帮助我们了解带宽被用于从自己的主机向外发送数据还是从远程主机端接收数据。再往下则是另外三个栏位,表示两台主机之间在2秒、10秒及40秒中的数据传输速率。与平均负载相似,大家可以看到目前带宽使用是否达到峰值,或者在过去的哪个时段达到过峰值。在屏幕的最下方,我们会找到传输数据(简称TX)与接收数据(简称RX)的总体统计结果。与 top差不多, iftop的界面也会定期更新。

在不添加额外参数的情况下, iftop命令通常能够满足我们故障排查的全部需求;但有的时候,我们可能也希望利用一些选项实现特殊功能。 iftop命令在默认情况下会显示查找到的第一个端口的统计信息,但在某些服务器中大家可能会使用多个端口,所以如果我们希望让 iftop打理第二个以太网端口(即实例中的 eth1),那么请输入 iftop -i eth1

默认情况下, iftop会试图将所有IP地址通过解析转换为主机名称。这样做的缺点在于一旦远程 DNS服务器速度缓慢,报告的生成速度也将随之惨不忍睹。另外,所有DNS解析活动都会增加额外的网络流量,而这些都会显示在 iftop的报告界面当中。因此要禁用网络解析功能,别忘了在 iftop命令后面加 -n哦。

一般说来, iftop显示的是主机之间所使用的全局带宽;但为了帮助大家缩小排查范围,我们可能希望每台主机具体使用哪个端口进行通信。毕竟只要找到了主机中占用最大带宽的网络端口,我们就可以在判断是否接入 FTP端口之外进行其它排查手段。启动 iftop之后,按P键可以切换端口的显示与隐藏状态。不过大家可能会注意到,有时候显示所有端口状态可能导致我们正在关注的主机被挤出当前显示屏幕。如果出现这种情况,我们还可以按 SD键来仅显示来自特定源或特定目标的端口。由于服务项目众多,目标主机可能随机使用多个端口并发生带宽占用峰值,这将导致工具无法识别出正在使用的服务,因此仅显示源端口还是相当有用的。不过服务器上的端口也可能与当前设备上的服务相对应。在这种情况下,我们可以使用前面提到的 netstat -lnp来找出服务所侦听的端口。

与大多数 Linux命令相似, iftop也拥有多种高级选项。我们在文章中提到的这些已经足以涵盖大多数故障排查需求,但为了满足大家进一步了解 iftop功能的愿望,我教各位一个小技巧:只要输入 man iftop,就可以阅读包含在软件包当中的使用手册、获得更多与之相关的知识。

参考链接


Linux服务器故障排查指南:出是谁占用了带宽

macOS Sierra (10.12.3)使用Android Studio 2.2.3导入Android 5.1.1_r38 (Lollipop)源代码

1.编译 Android 5.1.1_r38源代码

参考链接:
macOS Sierra (10.12.3)上编译ARM版本Android 5.1.1_r38 (Lollipop)源代码

2.调整 Android Studio的属性

默认情况下, macOS的磁盘分区文件名是不区分大小写的,但是我们编译的 Android 5.1.1_r38源代码却是在新建的一个区分大小写的分区上的,因此需要临时要求 Android Studio区分文件名的大小写。

在其中增加

3. 编译 Android SDK

Android SDK我们需要自己编译注意,此时磁盘空间可能已经不足了,我们首先增大一下磁盘空间

由于我们修改了 TARGET_BUILD_TYPE,因此需要调整代码

全部替换里面的 ${OUT_DIR}/target${OUT_DIR}/debug/target

编译代码

编译好的文件在 out/host/darwin-x86/sdk/sdk目录下面。

4.生成工程文件

工程目录与编译目录相同

编译完成后,在 /Volumes/android目录下,生成 android.ipr,然后用 Android Studio 2.2.3导入已经存在的项目即可,导入后,需要比较长时间建立索引,要耐心等待。

导入完成后,根据错误提示,设置 JDK为我们编译内核时候的 JDK,设置 Android SDK为我们刚刚编译的版本即可。
File-> Project Structure-> Project Settings-> Project-> Project SDK中设置 JDK版本。

File-> Project Structure-> Project Settings-> Modules-> android-> Dependencies中设置 Android SDK路径以及版本。

参考链接


macOS Sierra (10.12.3)上通过SSH免密码登录Ubuntu 14.04服务器

1.先参考 Putty通过SSH无密码登陆Ubuntu12.04 配置好 Linux服务器,并保证在Windows下可以正常自动登录服务器

2.拷贝已经配置好的私钥到当前登录用户的 .ssh目录下

 

3.使用指定的私钥登录服务器

macOS Sierra (10.12.3)上编译ARM版本Android 5.1.1_r38 (Lollipop)源代码

前置条件


  • macOS Sierra  (10.12.3)
  • Homebrew (1.1.9 或更高版本)
  • Xcode (8.2.1 或更高版本)
  • Xcode (5.1.1 只能是此版本)

准备环境


1.创建大小写区分的磁盘分区

2.挂载刚刚创建好的分区

3. 切换到刚刚挂载的分区

4.安装最新版本的 repo

5. 安装依赖的第三方应用

6.下载并安装 Xcode 5.1.1此版本,我们只是使用其中的 SDK,其他的,我们使用8.2.1中的工具,注意,我们只能使用MacOSX10.8.sdk才能顺利编译通过。

下载地址 http://adcdownload.apple.com/Developer_Tools/xcode_5.1.1/xcode_5.1.1.dmg

下载之后,安装之前我们先把8.2.1的Xcode重命名一下,稍后我们再修改回来即可。我们安装之后,提取 Xcode 5.1.1版本里面的"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk",然后拷贝到Xcode 8.2.1 版本的"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs"目录下面。操作完成后,可以删除 Xcode 5.1.1

也可以从phracker/MacOSX-SDKs 获取已经提取好了的版本。

执行如下命令,使得低版本的SDK生效。

如此操作的原因有两条:

(1)在macOS Sierra  (10.12.3)上, Xcode 5.1.1无法执行,因此没办法做到两个版本并存.

(2)如果通过修改代码来把代码中限制的系统版本调整到10.8版本以上,则GCC存在BUG,导致编译无法正常通过,具体的BUG参考
libgcc: error: unknown value '10.10' of -mmacosx-version-min

7.下载 Android-5.1.1_r38源代码(此处请准备梯子,或者自己从国内源进行替换)

编译代码


1.设置编译需要的环境信息

2.切换Java版本到1.7

3.清理代码,为编译准备干净的环境

4.引入编译环境变量

5.设置编译目标,此处我们指定编译 ARM下的完整调试版本

6.如果需要跟踪调试代码,建议编译为调试类型

7.编译

注意此处如果发生编译失败,原因基本上是编译顺序导致的引用出错,也就是某些模块还没有编译完成,其他模块已经开始尝试链接,导致依赖错误,此时只要把多线程并发编译修改成单线程编译即可,即直接执行

运行镜像


上面运行起来的镜像是从 /Volumes/android/Android_Source/out/debug/target/product/generic/hardware-qemu.ini即可读取配置信息的,但是这个文件直接修改无效,我们如果需要修改参数,只能从启动参数中设置。
比如我们如果需要增大内存,开启 GPU的支持,则执行如下命令:

参考链接


WordPress 4.7.x版本禁用 REST API

最近 Wordpress频繁爆出漏洞,尤其是 REST API部分,简直是漏洞百出,但是,从4.7.0版本开始,这部分功能被深度整合进入了核心模块,没办法彻底屏蔽 REST API,只有通过 rest_authentication_errors这个接口来限制非登陆用户,具体代码如下

此部分的代码需要被添加到当前主题的 functions.php中的最后即可。
增加完成后,重启 Apache2服务器,然后再访问https://www.mobibrw.com/wp-json/ 就可以看到错误信息了。

参考链接


解决从WordPress 4.7.1升级到WordPress 4.7.2失败后再次更新提示"另一更新正在进行"

从WordPress 4.7.1升级到WordPress 4.7.2,中途失败了,结果再次更新的时候,提示“另一更新正在进行”,如下图所示:

这是由于在升级 Wordpress时, Wordpress会在数据库 wp_options表中增加 core_updater.lock记录。如中途打断 Wordpress升级,这个记录会留在数据库中。当下次升级时, Wordpress检测到此记录的存在就会返回”另一更新正在进行”。可通过终端登录数据库删除这条记录来处理.

如上操作之后,再次重新升级,就可以解决问题了。

参考链接


Android查看SELinux状态及关闭SELinux

SELinux2.6版本的 Linux内核中提供的强制访问控制 ( MAC)系统。对于目前可用的 Linux安全模块来说, SELinux是功能最全面,而且测试最充分的,它是在 20年的 MAC研究基础上建立的。 SELinux在类型强制服务器中合并了多级安全性或一种可选的多类策略,并采用了基于角色的访问控制概念。

selinux默认配置在 /etc/sysconfig/selinux

默认有三种级别

enforcing级别: Linuxselinux所设置的安全策略都会被启用.所有与 selinux安全策略有关的服务或者程序都会被策略阻止.也就是,所有操作都会进行权限检查。

permissive级别: Linuxselinux所设置的安全策略都会被启动,但是所有与 selinux安全策略有关的服务或者程序不会被策略阻止,但是会收到警告.也就是,所有操作都被允许(即没有 MAC),但是如果有违反权限的话,会记录日志

disabled级别:关闭 selinux,相当于系统没有安装 selinux一样.

 

一般可以通过 getenforce查看 selinux的运行级别.也可以通过 setenforce 0或者 1设置 selinux的运行级别,级别 表示 Permissive模式,级别 1表示 Enforcing模式. 至于 disabled模式和其他模式的切换只能修改配置文件,命令不起作用.其次,修改完成之后,必须重启系统才能够生效.

参考链接


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抓取网站

被优化为无排版和缩进的JavaScript代码,如何调试?

有时候网页上的 JavaScript代码被优化器优化过后,会丢失原来的换行,导致整个的代码蜷缩成一行,完全没办法调试,此时我们就需要借助 Chrome或者 FireFox自带的代码调整功能来实现代码的调试了,如下图:

参考链接


毫无排版和缩进的 JavaScript 代码,怎么阅读?