解决谷歌字体库导致页面加载慢

由于众所周知的原因,谷歌WEB字体库在中国是无法正常使用的,而很多国外的著名开源程序都使用了该库,比如wordpress、opencart等等。

网上也有很多避开这个问题的方法,下面我给出2种基于Nginx的方法。

一、使用360提供的中国镜像:

subs_filter fonts.googleapis.com fonts.useso.com;

二、基于Nginx的本地化的方法:

subs_filter (https?:)?//fonts.gstatic.com/ / r;
subs_filter (https?:)?//fonts.googleapis.com/ / r;

location ~ ^/css$ {
    proxy_set_header Accept-Encoding '';
    proxy_set_header Host fonts.googleapis.com;
    proxy_pass http://fonts.useso.com;
}

location ~ ^/s/opensans/ {
    proxy_set_header Accept-Encoding '';
    proxy_set_header Host fonts.gstatic.com;
    proxy_pass http://fonts.gstatic.com;
}

提示:
1.以上配置并未启用Nginx缓存,若有需要请自行添加
2.此配置依赖Nginx第三方扩展模块subs_filter

Ubuntu/Debian 安装 rsync 服务

1、安装并编辑配置

apt install -y rsync
sed -i 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/g' /etc/default/rsync
#复制配置文件
cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/
vi /etc/rsyncd.conf

2、按需修改配置项

[backup]

    comment = data backup
    path = /mnt/backup
    use chroot = yes
#   max connections=10
    lock file = /var/lock/rsyncd
    read only = yes
    list = yes
    uid = nobody
    gid = nogroup
#   exclude = 
#   exclude from = 
#   include =
#   include from =
#   auth users = 
#   secrets file = /etc/rsyncd.secrets
    strict modes = yes
#   hosts allow =
#   hosts deny =
    ignore errors = no
    ignore nonreadable = yes
    transfer logging = no
#   log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
    timeout = 600
    refuse options = checksum dry-run
    dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

Linux磁盘莫名其妙占满(No space left on device)

今天朋友跟我讲:好奇怪的现象,磁盘明明没有满,使用 df -h 查看,显示剩余80G,但是却无法创建或者写入文件,总提示 No space left on device

其实出现磁盘空间不足的提示,有两种原因,一种是我们通常认为的空间不足了,另外就是inode用完了。此时可以使用 df -li 命令看下,是不是inode使用过多造成的。

如果是由于inode占满造成,那怎么解决呢,最简单的:增加inode数量。但是可能你会不放心,因为inode被占满很可能是存在什么隐患的。。。

好吧,我们用下面的命令来看下一个目录中的文件总数好了,不过,你需要一个目录一个目录的耐心找下去喽!

#查看某文件夹下文件的个数,包括子文件夹
ls -lR | grep "^-" | wc -l
#查看某文件夹下文件夹的个数,包括子文件夹
ls -lR | grep "^d" | wc -l

找到后怎么办,不用我说了吧?

使用ab进行压力测试遇到”Connection reset by peer”

Nginx作为前端服务器,当使用 ab 进行压力测试的时候遇到
apr_socket_recv: Connection reset by peer

由于linux内核已经是3.x,基本网上各种方法已经不再适用,现给出2.6.x以上内核的解决方案

#按需加载内核模块
modprobe nf_conntrack_ipv4
modprobe nf_conntrack_ipv6

#按需修改网络参数
sysctl net.nf_conntrack_max=655360
sysctl net.netfilter.nf_conntrack_tcp_timeout_established=1200

注:
1、重启后网络参数会还原,若需永久保存该参数请使用: sysctl -w
2、Debian/Ubuntu下单独安装ab测试工具: apt install apache2-utils

查看Web服务器并发请求连接数

查看服务器TCP连接状态

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(k in S) print k,S[k]}'

得到的结果一般如下:
ESTABLISHED 1597 正常数据传输状态
TIME_WAIT 1057 等待超时结束的请求数

附一、netstat常见参数

-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

附二、awk常用内置变量

ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME 浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符

附三、TCP状态转换图

TCP状态转换图

CLOSED 无连接是活动的或正在进行
LISTEN 服务器在等待进入呼叫
SYN_RECV 一个连接请求已经到达,等待确认
SYN_SENT 应用已经开始,打开一个连接
ESTABLISHED 正常数据传输状态
FIN_WAIT1 应用说它已经完成
FIN_WAIT2 另一边已同意释放
ITMED_WAIT 等待所有分组死掉
CLOSING 两边同时尝试关闭
TIME_WAIT 另一边已初始化一个释放
LAST_ACK 等待所有分组死掉

设置CORS实现跨域请求

一、使用php代码实现

#
# CORS config for php
# Code by anrip[mail@anrip.com]
#

function make_cors($origin = '*') {

    $request_method = $_SERVER['REQUEST_METHOD'];

    if ($request_method === 'OPTIONS') {

        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');

        header('Access-Control-Max-Age:1728000');
        header('Content-Type:text/plain charset=UTF-8');
        header('Content-Length: 0',true);

        header('status: 204');
        header('HTTP/1.0 204 No Content');

    }

    if ($request_method === 'POST') {

        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');

    }

    if ($request_method === 'GET') {

        header('Access-Control-Allow-Origin:'.$origin);
        header('Access-Control-Allow-Credentials:true');
        header('Access-Control-Allow-Methods:GET, POST, OPTIONS');

    }

}

二、使用nginx配置实现

#
# CORS config for nginx
# Code by anrip[mail@anrip.com]
#

location / {

    set $origin '*';

    if ($request_method = 'OPTIONS') {

        add_header 'Access-Control-Allow-Origin' $origin;

        #
        # Om nom nom cookies
        #
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

        #
        # Custom headers and headers various browsers *should* be OK with but aren't
        #
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

        #
        # Tell client that this pre-flight info is valid for 20 days
        #
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        add_header 'Content-Length' 0;

        return 204;

    }

    if ($request_method = 'POST') {

        add_header 'Access-Control-Allow-Origin' $origin;
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

    }

    if ($request_method = 'GET') {

        add_header 'Access-Control-Allow-Origin' $origin;
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';

    }

}

Ubuntu启用SNMP服务器

一、安装snmpd

aptitude install snmpd

二、修改配置文件

vi /etc/snmp/snmpd.conf

1、监听所有IP地址,以允许外部监控

#agentAddress udp:127.0.0.1:161
agentAddress udp:161,udp6:[::1]:161

2、外部访问权限配置

snmp v2 方法

rocommunity AnripCom 12.34.56.78
rocommunity AnripCom 23.35.67.89

snmp v3 方法

createUser AnripCom MD5 "123456789"
rouser AnripCom

三、重启snmpd服务

service snmpd restart