路由器上 nginx 博客添加 fastcgi 缓存

openWRT 的路由器上架上了博客, 虽然路由器CPU, 内存都很弱, 但是假设一个博客系统还过得去. 最近发现一旦访问量大一点, 路由器CPU 就飙的很高.
为了解决这个问题, 在启动 fastcgi 的时候, 已经添加了多进程:

#运行PHP环境
PHP_FCGI_CHILDREN=2
PHP_FCGI_MAX_REQUESTS=30
export PHP_FCGI_CHILDREN
export PHP_FCGI_MAX_REQUESTS
/opt/bin/spawn-fcgi  -a 127.0.0.1 -p 9000 -f /opt/bin/php-fcgi

一开始设置PHP_FCGI_CHILDREN 为4, 但是发现还是有时候 CPU 飙升, 都是 fast_cgi 占用. nginx 的 CPU 占用率都很低. 那么瓶颈在于 php, 就要优化 php 这边.
博客系统的一个特性在于绝大部分只是看, 只有非常少的部分是修改. 那么就可以考虑设置缓存. 这里主要设置 fastcgi 的 cache, 当然也可以设置 nginx 的 cache, 或者其他的. fastcgi 的相对来说, 比较简单.
修改nginx 的http 部分, 添加如下设置:

fastcgi_cache_path /opt/var/nginx/tmp/fastcgi_cache levels=1:2 keys_zone=cache_zone:8m inactive=1d max_size=100m;
fastcgi_temp_path  /opt/var/nginx/tmp/fastcgi_temp;

fastcgi_cache cache_zone;
fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
fastcgi_cache_key "$scheme$request_method$host$request_uri$is_args$args";
fastcgi_cache_valid 200 301 302 1d;
fastcgi_ignore_client_abort on;

其中fastcgi_cache_path, 和 fastcgi_temp_path 必须设置在 http 部分, 其他设置可以设置在 server 或者 location 部分, 以缩小范围.
网上有很多教程, 但是比较容易出错的一个点是: fastcgi_ignore_headers, 如果不设置这一项, fastcgi cache 就不起作用, 因为一般的 web http 请求都是使用后面的这些值做缓存的. 参考:这里
设置好之后, nginx -t 测试修改是否正确, 然后重启或者 reload.

那么再重新 top, 启动多线程测试, 你就会发现现在是 nginx 占用 CPU 了, 但是也非常低.
另外要注意的就是 purge, 万一你修改了博客, 或者有用户添加了评论, 那么就需要重新从数据库里拿了, nginx 的 fastcgi 模块有这个指令: fastcgi_cache_purge, 可是它是从version 1.5.7 开始生效的, 所以这里就没配置.

对于某些不想缓存的文档, 可以这么设置:

set $no_cache 0;
if ($request_uri ~* "/(administrator)")
{
    set $no_cache 1;
}
fastcgi_cache_bypass $no_cache;

关于 nginx fastcgi 指令的全部描述, 参看这里

git 常用命令 - git config

git config 用来设置 git 的配置选项.

git 的配置文件分为三个层次:

  1. 系统层面, 适用于系统的所有用户和所有 git repo, 一般位于 /etc/gitconfig. 但是我的 git 是 xcode 自带的 git, 它的系统层面的配置文件就位于 /Applications/Xcode.app/Contents/Developer/usr/etc/gitconfig;
  2. 用户层面, 适用于当前用户的所有 git repo, 位于 ~/.gitconfig;
  3. repo 层面, 仅适用于当前 git repo. 一般位于当前 repo 的 .git/config.

git 的配置选项一般分成2类: 客户端起作用的配置服务器端起作用的配置, 但绝大多数是客户端起作用的.

git 列出当前所有的配置:

git config --list (如果在某 repo, 则显示当前 repo 继承的, 否则显示当前用户层面的)
git config --global --list
git config --system --list

得到某一具体配置:

git config --get user.name
git config --global --get user.name
git config --system --get user.name

添加某一配置:

git config --global test.example example 
git config --system --add test.sample "sample value"

去掉某一配置:

git config --global --unset test.example.value

git 常见的配置
git config 完全参考

openWRT 自带 busybox 的 netstat 命令查看端口

Usage: netstat [-ral] [-tuwx] [-enW]

Display networking information

Options:

-r      Routing table
-a      All sockets
-l      Listening sockets
        Else: connected sockets
-t      TCP sockets
-u      UDP sockets
-w      Raw sockets
-x      Unix sockets
        Else: all socket types
-e      Other/more information
-n      Don't resolve names
-W      Wide display

    

显示正在监听的 tcp, udp 端口

netstat -ltue

不解析常见的端口, 直接以数字显示

netstat -ltuen

小米路由器 购买到吐槽

从想买到想退

之前玩了1年的 DualWan, 感觉基于 openWRT 的路由器还是很好玩的, 首先它是一个 linux, 是一个在公网上的 linux, 他可以低功耗的下载东西不用关机, 可以建立 DLNA Server, 局域网内音影共享, 可以设立打印机共享, 可以安装 nginx+mysql+php, 可以安装 ruby, 等. 所以很期待小米路由器. 期待它的内存更大, CPU 更高, 期待它的 DLNA 支持字幕, 期待它能提供摄像头驱动, 期待一家大公司背后的软件维护团队.
相信自己从来不会有1圆预约的狗屎运, 就老老实实的等到第一次开放购买, 同事们都去吃饭了, 我等到12点, 点击抢购, 排队1分钟过后, 显示抢到. 等到付款的时候, 犹豫了, 实事求是的想, 它能替代我现在的 DualWan 吗? 没有付款, 去吃饭, 吃饭回来, 想想就当买个玩具算了, 就付款了. 付款过后, 迟迟不发货, 周六去小米路由器论坛逛了逛, 发现论坛上多人都说是 "半成品", 各种功能都没有. 心里很失落, 于是点击了申请退款, 可是他妈的, 刚点2分钟,手机收到短信: 您的路由器已发货..., 发货发了1天多的顺风, 周一上午才到上海. 期间逛了好几次论坛, 期待有托讲讲好的地方, 妈的, 竟然没有. 只好安慰自己, 有硬件, 软件明天会更好.

第一次把玩

再怎么不期待, 还是要打开看看的. 才开纸盒(尼玛, 我的大木箱呢?), 里面有个路由器, 一个充电器. 都不用自己安装了. 插电, 发现路由器声音比较大, 多大呢? 反正比我笔记本声音要大许多许多. 发现 WIFI, 2.4G 和5G wifi 各一个. 连上, 设置密码.
开始查看基本的功能:

  1. 默认的 ip 段 分配的是 192.168.31.*, 不是以前的 192.168.1.1, 所以路由器是
    192.168.31.1 登录. 不过这个可以登录之后重新设置.
  2. 登录的时候, 默认是 小米帐号登录, 还有可选的 管理密码登录, 对此, 我想对路由器的产品经理说, 你脑子里全是屎吗?
    买你家路由器就一定要使用你们家帐号么? 就一定要联网么? 即便如此, 为什么默认不是管理密码登录?
  3. 看到菜单, 我必须要真心的夸一下小米的残品经理, 这菜单做的真不错, 很是间接, 和我 DualWan
    上面看到10几个大菜单不一样,很清爽, 清爽的什么功能都没有...
  4. 点开主菜单: 应用管理. 收到消息 你现在处于管理密码登录状态,管理应用需要用小米账号登录,是否登录. 并且这个地方必须要小米帐号登录, 如果不用的话, 你的应用是看不到的, 也就是说我必须联网, 才能玩我的 LAMP 么? 如果 DLNA 开关, 重新扫描也在这里面, 我必须联网到 xiaomi, 才能观看我路由器上的共享视频么? 尼玛的, 你们也太坏了...
  5. 看到了 UPnP, 没有看到 DLNA, 不过在后台的bin 目录看到了 dlna;
  6. 默认没有开 telnet, 如果要登录, 必须要在 url 后面输入 #!pro/lamp, 然后点击 Start dropbear, 结果,悲剧的是, 点击根本没反应. 这个路径下,点击创建 LAMP sandbox 也是没反应.
  7. 论坛上问, 得知要访问一个专门的 URL 才能开启 ssh, 指想知道这样的隐秘 URL 到底有多少?
    是不是有些就是做后门的? 今天我登录你们的论坛, 你记住了我的 IP, 然后你就悄悄的控制了我的路由器.....
  8. 登录之后, 发现路由器竟然叫 xiaoqiang, 太贱了, 果断改名叫 home;
  9. 搜一下: lighttpd, nginx, mysql, 全找不到, 这那里要是创建 LAMP 的节奏? 不可能什么 web server 都没装啊, 至少管理界面开着呢. 终于找到, 尼玛的, 竟然把 nginx 改名为 sysapihttpd, 放在/usr/sbin/sysapihttpd, 然后把 配置文件改为 /etc/sysapihttpd/sysapihttpd.conf. 去看了下这个配置文件, 里面改的惨不忍睹, 开了好几个端口, 配置了不同的访问策略和路径.
  10. 好吧, 我自己要装 mysql 了, 看了下, ipkg 没装, apt-get, yum 更不可能装了, 装的是 opkg, 直接 opkg update, 失败. 然后看 repo 地址(/etc/opkg.conf), 竟然是一个不存在的URL: http://downloads.openwrt.org/attitude_adjustment/12.09/brcm4709/generic/packages. 看到有 brcm47xx, 就改了, 结果能更新, 却是架构不对, 不能安装, 又改过来. 为什么要给一个不存在的路径? 你们以后要发布到这个路径? 还是你们以后自己建 repo?

- 阅读剩余部分 -