Nginx map

map $room $room_server {
    default 192.168.1.101:8080;
    1 192.168.1.101:8080;
    2 192.168.1.102:8080;
}

server {
    listen  80;

    location ~ /api/(\d+)/room {
        set $room $1;
        echo $room_server;
    }
}

split_clients 类似的结构,可以用来做请求 A/B 测试:

split_clients $arg_app_key $variant {
    0.5%    .one;
    2.0%    .two;
    *       "";
}

nginx mirroring tips and tricks

Shell Notes

&& || ; in shell command:

  • cmd1 && cmd2 means cmd2 will only run while cmd1 success.
  • cmd1 || cmd2 means cmd2 will only run while fmd1 fails.
  • cmd1 ; cmd2 will run cmd2 regardless cmd1 success or not.

通过 Debian Snapshot 安装旧版本包

某个项目需要 PHP 5.3 支持,通过 APT 没办法直接安装,编译安装又是一大堆依赖,最后通过 Debian Snapshot 解决。

  1. http://snapshot.debian.org/ 搜索需要的包, 比如 php5
  2. Got http://snapshot.debian.org/archive/debian-ports/20120225T023111Z/pool-m68k/main/p/php5/
  3. 添加到 source.list:
deb http://snapshot.debian.org/archive/debian/20120225T023111Z/ unstable main
deb-src http://snapshot.debian.org/archive/debian/20120225T023111Z/ unstable main
  1. apt-get -o Acquire::Check-Valid-Until=false update
  2. apt-get install php5=5.3.10-2 php5-fpm php5-cgi, done.

docker-compose for MySQL + phpMyAdmin

version: '3'
services:
  mysql:
    image: 'mysql:5'
    container_name: 'mysql'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --init-connect='SET NAMES UTF8;'
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 'test'
  phpmyadmin:
    image: 'phpmyadmin/phpmyadmin'
    container_name: 'phpmyadmin'
    links:
      - mysql
    ports:
      - '8080:80'
    environment:
      PMA_HOST: mysql

Logging mode: Push vs. Pull

日志收集或监控系统有两种工作模式,Push or Pull:

  • Push 是在应用内自己主动把监控指标推送到监控系统
  • Pull 是应用把指标按照指定的格式暴露出来,由监控系统定期的抓取收集,看起来像是监控系统从应用拉取

Push mode:

  • 对于 event-drive 类型的监控更为灵活方便
  • 应用多点部署不影响监控
  • 可能对监控系统 DDos
  • 要注意推送频率控制,以及失败后的重试机制

Pull mode:

  • 方便控制收集频率,对应用压力可控,侵入也小
  • 更及时的发现服务宕机
  • 需要大量配置监控接入点,尤其是应用集群化
  • 指标不够实时,顺序可能错乱
  • 监控指标一般是通过 log 文件或 HTTP 接口对外暴露,parser 较为复杂

Push:

Pull:

macOS Python env

brew install python

which python  // /usr/bin/python
which python3 // /usr/local/bin/python3

sudo easy_install neovim
pip3 install --upgrade neovim

多版本共存还可以用 pyenv 解决。

使用 pipsi 安装 Python-base 工具,比如 ansible,httpie,pylint,yapf 等:

sudo /usr/bin/easy_install virtualenv
curl https://raw.githubusercontent.com/mitsuhiko/pipsi/master/get-pipsi.py | /usr/bin/python

pipsi install 'python-language-server[all]'
pipsi install pipenv

对于 Python 项目,通过 pipenv 管理包依赖:

pipenv install --python 3.6.5
pipenv install requests

pipenv shell

设置 VSCode 支持 pipenv:

{
    "python.pythonPath": "/Users/fannheyward/.virtualenvs/tools-CDG8SfKX/bin/python"
}

tee

read from stdin, write to stdout AND files.

curl https://github.com/fannheyward.keys | tee -a ~/.ssh/authorized_keys

fastlane notes

gem install fastlane -NV.

fastlane match:

1. `fastlane match init` 初始化生成 `Matchfile`,设置私有仓库来保存密钥和证书。
2. `fastlane match development/appstore` 同步或生成证书及描述文件,多 target 可以通过 `--git_branch` 指定
3. `fastlane match nuke distribution` 吊销证书

fastlane gym --scheme X 编译打包。

fastlane pilot upload 上传 TestFlight.

fastlane deliver 上传 iTC.

Bash Set notes

  1. set -u 不存在的变量报错中止
  2. set -e 发生错误时中止
  3. set -x 打印输出要执行的命令

Nginx limit_req

limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;

location /api {
    limit_req zone=req_zone burst=10 nodelay;
}

rate 限定单位时间内的请求数,burst 限定缓冲队列长度。上面配置是用 client IP 做请求限制,单 IP 限制每秒钟最多十个请求,也就是每 100ms 只能有一个请求,如果 100ms 内有超过一个的请求到达,会被放进 buffer 队列,大小由 burst 指定,所以 100ms 内的第 11 个请求会被 503。

  1. limit_req zone=req_zone;
    • 严格按照 rate 来处理请求
    • 超过 rate 处理能力的直接 drop
    • 收到的请求无延时
  2. limit_req zone=req_zone burst=5;
    • 按照 rate 设置处理请求
    • 设置一个大小为 5 的缓冲队列,在缓冲队列中的请求会被慢慢处理
    • 超出 burst+rate 的请求会被直接 drop
    • 收到的请求有延时
  3. limit_req zone=req_zone burst=5 nodelay;
    • 按照 rate 设置处理请求
    • 设置一个大小为 5 的缓冲队列
    • 峰值处理能力是 burst+rate,超出处理能力的请求被直接 drop
    • 完成峰值请求后,缓冲队列不能再放入请求。假如 rate=10r/s, 峰值后这段时间没有请求过来,则每 0.01s 缓冲队列恢复一个缓冲请求的能力,直到恢复能缓冲 5 个请求
    • 收到的请求无延时