用 VPS 给博客做镜像

对于一个每日 PV 不超过1万的小博客来说,性能不是问题,一般的 VPS 都可以搞定,稳定性远比性能要重要。服务器 down 掉,会导致博客不能访问,不能更新,长时间 down 的话会失去读者,影响自己的写作计划/情绪,影响pagerank等等。前段时间 Hyperv 报漏洞,导致 FsckVPS 的很多客户丢失重要数据,长时间都不能恢复。小博客/网站的性能不是那么重要,每天没有那么多的访问压力。

为了给博客增加可靠性,给博客做个简单镜像是必要的,幸运的是我们的要求不高,不需要那些什么实时热备份,均衡负载,透明切换等高科技,只需要每隔一段时间同步一下博客以及数据库就可以了,很少有人能坚持每天写一篇博客,能每天写两篇就算牛博了,所以每天同步一次就够了。这里将讨论如何用 rsyn,ssh 和 mysqldump 来同步博客和数据库。

约定

为了更好的描述细节,这里作以下约定:

继续阅读 »

Linux kernel 的 sendfile 是如何提高性能的

现在流行的 web 服务器里面都提供 sendfile 选项用来提高服务器性能,那到底 sendfile 是什么,怎么影响性能的呢?sendfile 实际上是 Linux 2.0+ 以后的推出的一个系统调用,web 服务器可以通过调整自身的配置来决定是否利用 sendfile 这个系统调用。先来看一下不用 sendfile 的传统网络传输过程:

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈

一般来说一个网络应用是通过读硬盘数据,然后写数据到 socket 来完成网络传输的。上面2行用代码解释了这一点,不过上面2行简单的代码掩盖了底层的很多操作。来看看底层是怎么执行上面2行代码的:

1、系统调用 read() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。
2、数据从 kernel buffer 拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode。
3、系统调用 write() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后把步骤2读到 user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer 和 socket 相关联。
4、系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换了),然后 DMA 从 kernel buffer 拷贝数据到协议栈(第4次拷贝了)。

上面4个步骤有4次上下文切换,有4次拷贝,我们发现如果能减少切换次数和拷贝次数将会有效提升性能。在kernel 2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数。

再来看一下用 sendfile() 来进行网络传输的过程:

继续阅读 »

Web 前端优化

为了加快网站访问速度,除了可以优化后端数据库,cache,操作系统,web 服务器,重新设计架构以外,优化前端页面性能也很重要。

建议

Yahoo 的性能小组经过长期的研究总结出了几条让网站访问更快的实战经验:Best Practices for Speeding Up Your Web Site。High Performance Web Sites 和 YSlow 的作者 Steve Souders 在其教授的 Stanford CS193H 课程里谈到了这14条建议:

Make fewer HTTP requests
Use a CDN
Add an Expires header
Gzip components
Put stylesheets at the top
Put scripts at the bottom
Avoid CSS expressions
Make JS and CSS external
Reduce DNS lookups
Minify JS
Avoid redirects
Remove duplicate scripts
Configure ETags
Make AJAX cacheable

随后 Steve Souders 在其新书 Even Faster Web Sites 谈到了更多建议:

继续阅读 »

64MB VPS 上优化 MySQL

mysql

MySQL 是一个很棒的 open source 数据库引擎,大部分的网站和博客都是由 MySQL 驱动的。MySQL 的默认安装占用的内存资源比较大(相对于一个只有 64MB 的 VPS来说),优化 MySQL 可以减少内存消耗,把更多的内存省下来留给其他程序。

MySQL 的配置文件在 /etc/mysql/my.cnf(Debian 5),为了方便调整配置,MySQL 为小资源系统提供了一个叫做 my-small.cnf 的配置文件,是给小于 32MB 内存的服务器设置的。我们可以在这个配置文件的基础上作小部分的调整。

先找到 /usr/share/doc/mysql-server-5.0/examples/my-small.cnf,然后覆盖 /etc/mysql/my.cnf(Debian)。如果是 CentOS 5 的话,路径是:/usr/share/doc/mysql-server-5.0.45/my-small.cnf,覆盖 /etc/my.cnf。

参数说明

如果不使用 BDB table 和 InnoDB table 的话,加入下面2行关闭不需要的表类型很有必要,关闭 innodb 可以省下大量内存,虽然 InnoDB 好处多多但是在一个64MB的 VPS 上并不能体现出来,并且很占内存。

skip-bdb
skip-innodb


继续阅读 »

64MB VPS 上优化 Nginx

nginx

Nginx 小巧,高效,稳定等优点非常适合配置不高,内存小的 VPS。这里的优化策略不是让nginx每秒能处理更多的请求,那是一个繁忙网站要做的。记住,这是一个只有 64MB 的 VPS,对于架设一个访问量不大的网站/博客来说,尽可能减少 Nginx 的内存占用率是最重要的,用尽量小的 Nginx 占用内存去满足不大的访问量。

优化 nginx.conf

Nginx 运行的进程数,一般设置成和 CPU 的核数相同。

worker_processes  1;

使用 epoll,Linux 内核2.6版本以上支持 epoll(eventport支持 Soaris,kqueue 支持 BSD系列),worker_connections 每个 Nginx 进程所允许的最大的连接数,max_clients = worker_processes * worker_connections。

 events { 
    use epoll;
    worker_connections  128;
 } 

设置连接的超时时间。

keepalive_timeout  5;


继续阅读 »

64MB VPS 上优化 PHP

php

PHP 默认会有很多扩展模块自动启动,这里优化 PHP 的主要思路就是禁止那些用不着的模块去节省内存资源。

提高安全

一般来说,通过隐藏版本等信息来提高安全性的方法不是很管用。但在有些情况下,尽可能的多增加一点安全性是值得的。在 php.ini 文件里设置 expose_php = off 可以帮助隐藏 PHP 信息,这样就增加了一点点攻击者发现系统漏洞的难度。

expose_php = Off

提高性能

register_globals 既关系到安全问题也关系到性能问题,register_globals = On 的话容易导致变量滥用,给攻击者控制判断变量。不过现在的 PHP 版本都把这个参数默认设置为 Off。

register_globals = Off


继续阅读 »

64MB VPS 上优化 Debian 5

debian

前几天看到 VPSLink 在打折就跑去注册了一个 64M VPS,(具体请看:VPS 主机试用:VPSLink),想看看 64MB 的 VPS 能不能跑一个小规模访问量的 WordPress 博客,这里的小规模是指每日500 PV 以下。然后分别试着跑了一下 Debian 和 CentOS,默认安装后跑Debian没有问题,但是运行 CentOS 时明显感到系统很慢。CentOS/RHEL 官方推荐的最小配置(不带图形界面)虽然是 64MB 内存,但是考虑到同时要跑 MySQL,PHP,Wordpress 等程序 64MB CentOS就有点吃力了。还有一个考虑就是运行一次 yum 需要比 apt-get 多得多的内存资源。所以按照我的 VPS 配置,64MB内存,128MB 交换,2.5GB 的硬盘,就只能选 Debian 了。

Debian 是一个古老,严谨,自由而且流行的 Linux 发行版,有 n 多的软件包可以用,有很好的稳定性和安全性,是各大 Linux hosting 服务商的主流系统之一,几乎所有 Linux VPS 都支持 Debian 版本。安装 Debian 的系统最低内存要求是 64MB,但是官方文档也说了真正的最低内存配置要比 64MB 低一些,根据不同的硬件体系安装在只有 48MB 的 i386 上也是可能的。

查看 VPS 配置

1、查看以下 VPS 的硬件信息,做到心中有数

# free
# cat /proc/cpuinfo


继续阅读 »

128MB VPS 上优化 CentOS 5

centos

CentOS 是一个构建在 Red Hat Enterprise Linux (RHEL) 源代码上的 Linux 发行版,并且从二进制的角度100%兼容 RHEL 软件包,简单的说 RHEL上 可以运行的软件包在 CentOS 上不需要编译就可以直接安装运行。除了少量的版权信息外,CentOS 和 RHEL 基本上一样。CentOS 是免费的,并且有着 RHEL 的稳定,因此深受各大 hosting 服务商支持,几乎所有 Linux VPS 都支持 CentOS。

一般来说如果 VPS 配置较高我会选 CentOS,配置低的话就选 Debian,当然这是个人偏好,大多数 Linux VPS 服务商也会提供 Gentoo,不过每次安装程序,升级都要编译会消耗很多资源,耗时,而且性能没有明显提高,不推荐给配置低的 VPS。

VPS 服务商一般给的操作系统版本都是最小安装版本,或者优化过的版本。每个 VPS 服务商提供的版本都可能不同,安装 CentOS 的系统最低要求至少 64MB 内存(纯文字界面),1GB 硬盘空间。

安装和升级系统

1、登录 VPS 安装 CentOS 5。

继续阅读 »