Host1Free VPS 内存占用优化

PS:第一次发完文章发现忘了写 nginx 和 php5-fpm 的对接,准备连上自己的 VPS 去看设置,打开终端 - 上键 - 回车,才发现自己打的上一行代码居然是 exit……

PS2:VPS 用 22 端口的童鞋请小心,你很有可能敲命令敲到一半断掉,换个端口就行,比如 2222。(好 2)

PS3:今天自己在 VBox 上搭了一个 Debian 6 实验,结果发现 Lighttpd 有插件功能…… 修改。

对于一个 VPS 来说,CPU、硬盘等对于像建一个像我这样的博客,一般已经足够,但是最烦的就是内存不足。一个 VPS 商可以把母鸡的一个 CPU 核心划给十几台 VPS 来用(虽然只有最坑爹的 VPS 商才会这样做),但是比如你主机的内存是 4G,你永远无法分出 20 台 256M 内存的 VPS,因为那会占你 5G 内存。而且,你的主系统还要跑 OpenVZ 之类的虚拟化技术和 HyperVM 之类的管理界面,你连 16 台(刚好占满 4G)都分不出。

对于我们这些 VPS 用户来说,当你拿到一台 VPS,你一定要把它的内存占用精简精简再精简,否则一旦内存爆满,你的 VPS 也就废了。我自己的 Host1Free VPS 有 128M 内存和 640M Swap(感觉没什么用),对于那 128M 内存,就得好好优化一番。一些 VPS 内存 64M 甚至 32M 的人,就更加杯具。(PS:我觉得买这种 VPS 的人都是钱多的没处花)

1.OS 的选择

对于一台 Linux 的 VPS,你可以选择 Debian,Ubuntu,CentOS,Gentoo 等等。不同发行版各有不同,Debian 的软件比较古老(原生源里的 PHP 连 FPM 都没有)但是都很实用,Ubuntu 软件暴多,CentOS 的软件源…… 反正可以让你练习 GCC 编译程序。

在各个发行版中,个人感觉 Debian 最省内存,因为我记得上次弄出过整个系统跑 nginx+php-fastcgi+mysql 才占 10M 内存的状况。我试用 CentOS 时,内置的 OpenSSH 反映很慢,而且我用不习惯 yum 和编译程序,而 Ubuntu 的软件源太多太杂,每次 apt-get update 都会占用我 5 分钟以上的时间,因为 Host1Free 对于每一台 VPS 都做了 100K 的网络限速。最终,我安装了 Debian 6。

另外罗嗦一句,在 VPS 上装 64 位操作系统可以让你的内存直接炸掉。当然你有 512M 及以上的内存那么随你。

2. 网站程序的选择

现在 Linux 平台上最著名的服务器软件有 3 款:Nginx,Apache,Lighttpd。Apache 是最古老也是功能最强大的一款,通过插件,它可以支持 PHP,可以支持 Mono(Linux 下运行 ASP.NET),还可以搭建一个简单的 FTP 服务器。但是在一台小内存 VPS 上,「功能强大」完全不是我们所考虑的。我们需要一个更加简单,速度快,而且省内存的方案。

Lighttpd 是一个简化过的服务器软件,它没有插件功能,所有模块都直接编译在源代码中(纠正:Lighttpd 有简单的插件功能),所以速度也会快一些,但是这东西不符合我的使用习惯,所以我没有深入地查过关于它的资料。

Nginx 比 Lighttpd 功能强一些,但是内存和执行效率也同样比 Lighttpd 好。据网上有人说,在同一台服务器上跑网站,如果 Apache 在 1000 并发下会卡死服务器,那么 Nginx 上 10 万并发毫无压力。这也许有夸张的成分,但是 Nginx 性能高是毋庸置疑的。Apache 的网络架构是 select,就是当客户端发出一个数据包,服务器收到后,Apache 需要从现有的连接中找到数据包对应的连接,这就需要一条条地找,性能自然上不去。但 Nginx 的 epoll 网络模型则维护一张表,数据包到达时查表而不是查连接,从而获得了更高的效率。

在高效率的同时,Nginx 由于没有插件功能,更省内存。所以我可以用 10M 内存跑上 LNMP 三件套。但是 Nginx 的缺点是不支持插件,所以 PHP 无法直接集成到 Nginx 里,必须通过 FastCGI 进行转发。转发也会留 1-2 个内存,这两个进程是占服务器内存的大户,具体看你的网站程序决定。

3. 系统基础程序的选择

对于一个 VPS,系统最基础的程序就是 Shell,OpenSSH 和日志管理。

Debian 6 默认集成了 Bash,其功能强大,但是和 Apache 一个德行,内存占用也偏大。对于我这种平时只开一两个 Shell 的人还好,听说有的人一登 VPS 就要连开 6 个 Shell,那内存占用可以吃掉你一半的内存。所以我们需要换 Shell。

网上一些文章推荐了 pdksh,它的特点就是小。它没有 Bash 强大,但是我在前面说过,强大一点用也没有,够用就行。

对于 SSH,所有发行版都带了 OpenSSH,但是它也有不足:你登上 Shell 的时候,如果你是 root,那么会给你新开一个 SSH 进程,但是如果你不是 root,那就是两个。相信大家都不会像我这样偷懒直接 root 的,所以内存占用也较可观。另外,OpenSSH 支持 SFTP,功能强大,我就不解释了。DropBear 则是一个替代品,它不支持 SFTP,但是内存占用也小,最重要的是不会开上好几个进程耗你内存。

日志管理中 Debian 6 带了 sysklogd,本身非常轻量,但是 Debian 5 没那么幸运,自带的 rsyslog 过分强大。这时可以直接 apt-get install sysklogd,apt-get remove rsyslog 就可以了。

4. 博客程序的选择。

现在以 PHP 为语言的建站程序中,WordPress 简直空前绝后,它的插件功能和强大的自定义设置让它的功能有了很大的提高,它可以搭建个人博客,也可以搭建企业官方网站等等。但是一路走到 3.5.1 的路上,WP 已经变得非常臃肿,连打开后台都会耗掉服务器 30 多 M 内存,对于一个 VPS 来说有些吃不消。

另一个选择是 Typecho。作为一款国人的作品,它的代码也就 300 多 K,相比于 WP 的 5M…… 而且它的插件功能有所减弱,这也使它有了更快的速度。最重要的是省内存。

接下来就可以开始实战优化了。

1. 安装好 Debian 6,SSH 登上。

2. 安装 pdksh

apt-get install pdksh
chsh -s /bin/pdksh

重新登录,搞定。

3. 安装 DropBear

#不让OpenSSH启动
touch /etc/ssh/sshd_not_to_be_run
#安装
apt-get install dropbear
nano /etc/default/dropbear
#找到NO_START=1一行,改成0
service dropbear start

4. 安装 LAMP 组合

#增加DotDeb软件源以获得php-fpm软件包
nano /etc/apt/sources.list
#在末尾增加一行deb http://packages.dotdeb.org stable all
cd ~
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add -
rm dotdeb.gpg
#以上增加软件源证书
apt-get update
apt-get upgrade
apt-get install mysql-server nginx php5-fpm php5-mysql php5-gd
cd /etc/php5/fpm/pool.d
nano www.conf
#自己修改设置
#listen = /var/run/php5-fpm.sock
#用Unix套接字,比TCP省资源,但是稳定性略差
#pm = static
#pm.max_children = 2
#pm.start_servers = 1
#pm.min_spare_servers = 1
#pm.max_spare_servers = 1
#pm.max_requests = 512
#以上是我的设置
cd /etc/mysql
nano my.cnf
#在[mysqldump]前面加上
#default-storage-engine = MyISAM
#skip-innodb
#InnoDB占内存巨大,MyISAM可以满足常用WP、DZ等99%以上需求,禁止掉!
#注意:这里加#号是为了语法高亮不乱,加进去时别忘了删掉#!
cd /etc/nginx/sites-available
nano default
#root行改成root /var/www或者你喜欢的路径
#加上这堆代码(PHP用)
#location ~ \.php$ {
#if (!-f $request_filename){return 404;}
# #不加上面这行一旦找不到文件只能显示File not found,连Nginx里定义的404错误页也弄不出来
#fastcgi_split_path_info ^(.+\.php)(/.+)$;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
#fastcgi_index index.php;
#include fastcgi_params;
#}
cd ..
nano nginx.conf
#worker_processes 2;
service nginx restart
service mysql restart
service php5-fpm restart
#搞定!看你内存占用,空载一般不超过20M,当然跑上WP占个70M+没问题,但是128M绝对够