小内存VPS上优化PHP

[| 2010/04/19 18:11]
今天装好了PHP,内存占用很小,很爽。后来重装了一次,结果内存占用大涨到50M。仔细观察发现,开一个php-cgi进程和开十个占的内存差距不大。。所以应该是有个什么插件类的东西占用了巨大的内存。后来用排除法看了下,发现是”eaccelerator“模块。该模块就是一个PHP的加速模块,有缓存的功能,还可以和zend optimizer加速引擎配合。可以提高php脚本速度1到10倍,所以该模块是绝对不能精简的。但是此模块占用了巨大的内存并不是因为模块臃肿,而是由于默认会开启比较大的缓冲区。所以进入配置文件eaccelerator.shm_size 值设置的小一点,比如8M即可。重新启动php-cgi。内存占用又恢复到以前了。

nginx+php yum安装方法

[| 2010/04/19 10:59]
网上教程都是讲编译的,其实我推荐编译,但是对于小内存vps的话可能编译过程中内存会爆,只能yum安装。经过摸索找出纯yum安装过程。

一,先装Nginx
由于centos没有默认的nginx软件包,需要启用REHL的附件包

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
然后yum update一下,再yum install nginx。就行了。版本挺老,不过放小站也够用。

二,安装PHP
网上很多教程说用spawn-fcgi作为容器来跑php_cgi,其实php_cgi可以独立运行。我看了看,spawn-fcgi确实功能多点。于是也用的它。安装简单,yum install spawn-fcgi即可。然后是php,我先yum install php,然后发现没有php_cgi。。汗,后来装了php-fpm php-cli php-pdo php-mysql php-mcrypt php-mbstring php-gd php-tidy php-xml php-xmlrpc php-pear php-pecl-memcache php-eaccelerator 。。然后就有了,不知道是那个软件包里的。反正这些软件包都挺重要的,都装上也无妨。

然后用spawn-fcgi -C 3 -a 127.0.0.1 -p 9000 -u nginx -g ngix -f php-cgi 就可以启动了。这里使用nginx权限启动php也是为了安全性考虑,root权限有点危险。


三,修改nginx配置文件,打开php支持。

nginx配置文件里默认已经有了转发php请求的相关语句了,只要把注释去掉即可,这里需要注意的一点是:这里的root指的是php模块的工作路径,一定要设置成和nginx存放网页一致的位置,否则php解析器找不到文件在哪里。会报错:No Input File。
例子:location ~ .php$ {
root /var/www/html;
***********************
}


现在就可以了。
Burst的VPS配置挺高的,性价比不错,但是系统时间总是不正确。这个实在不能忍。粗一想感觉也没什么,但真的用起来就有事了。昨天中午收到邮件反应站上不去了。下午去看日志,汗了,时间乱七八糟,根本不知道哪个是哪个。本来都决定续费了,还是决定放弃。

恰好昨晚ramhost有了几个空位子,赶紧上淘宝找代购,找来找去只有一家代购。一共60的VPS加了13块,真是够黑。不过ramhost的VPS实在是不好买,顾不得那么多了。买了一个。

注:ramhost是09年新成立的一个小主机商,资历浅,机器少。但是网上的评论出奇的好,而该主机商并未办什么发软文得代金券之类的活动,盛名之下,其实难副。ramhost出售的是基于OpenVZ的VPS,但是他在主页声明绝不超售,并公开各服务器实时状态供查看,很有诚意。去看商品列表的话也经常全是“Sold Out",应该是不超售的。并且价格实惠,最便宜的VPS只有2.99$。截止本文发文,所有商品又全都变成”Sold Out"了。火爆程度可见一斑。


我这次买由于不确定质量到底怎样,所以买了最低配的2.99$的那种,2G硬盘,80+48swap 内存,50G流量,一个IP。配置比burst的低了不止一个档次,不过我感觉就放我的小博客应该还是够用。即使不够就升级成高级一点的那档。也不过和burst的价格持平。burst虽然有两个ip,但听着诱人,实际用也没多大意义。


由于硬盘很小,Mldonkey是放不了了,不过用处也不大,就不放了。

系统刚开始用最熟悉的Ubuntu9.10Server,决定用经典的LAMP结构。装上Apache,把启动进程设置为3个。然后装MySQL。。怎么也装不上,以为是系统问题或者内存问题,Reload好几次,不行。。先换CentOS试试,(CentOS以前没用过,不过大同小异,只是apt换成了yum。yum也挺流行的,有必要学习下。)结果yum都不能跑。。开始严重质疑VPS质量,给客服发了个Ticket,然后吃面去,回来给回复了:原来是yum的一个自动选择最快源的插件内存占用过大,超过了128。好在服务器带宽还是很足的,于是关闭了那个插件。正常使用了。。

由于怀疑MySQL不能跑是内存问题,所以上来先装MySQL,装完后顺利启动。top一下,一看。。。内存剩余量只有几百K了。。果然是内存问题,去网上搜了几个优化的方法,用了很有效,但是貌似阉割了很多重要功能。于是准备自己改改。先参考MySQL自带的例子,结果最小的“small”方案都要占100m左右的内存。。开始对比网上的方案和small方案的差距,改了几个缓存之类的,都无大效果。。开始怀疑起innodb引擎来,因为这个引擎还是很吃内存的。虽然small方案并没有启用关于innodb的东西,但是这个最可疑。。显示禁用innodb引擎后,内存占用直接降到30左右。。汗,大头原来在这里,爽。


下一步是装Nginx和PHP,剩余的90M内存应付这两个应该绰绰有余了。明天考试要早起,先睡觉,明天考完再搞。
地址:http://hi.baidu.com/ywknife/blog/item/cfc9d6bf8911170f18d81f43.html
讲的很全,学会不少东西,给大家推荐下。





这里说明,Ubuntu 中系统没有了RH系统中的 chkconfig 命令 !

可用一些小工具来管理 Ubuntu 的启动选项:
小工具 rcconf:
#sudo apt-get rcconf
#sudo apt-get install rcconf
root 下运行: #sudo rcconf
功能更全的工具:sysv-rc-conf
#sudo apt-get update
#sudo apt-get install sysv-rc-conf
运行:#sudo sysv-rc-conf
也可以直接加入启动程序,例如把 /etc/init.d/red5 加入到系统自动启动列表中:
#sudo sysv-rc-conf red5 on
其他使用方法见: google::Ubuntu::sysv-rc-conf 命令用法

也可以直接修改
直接改 /etc/rc0.d ~ /etc/rc6.d 和 /etc/rcS.d 下的东西,S开头的表示启动,K开头的表示不启动,
例如:想关闭 Red5 的开机自动启动,只需 #sudo mv /etc/rc2.d/S20red5 /etc/rc2.d/K20red5 就可以了。

Ubuntu自动启动程序

首先,linux随机启动的服务程序都在/etc/init.d这个文件夹里,里面的文件全部都是脚本文件(脚本程序简单的说就是把要运行的程序写 到一个 文件里让系统能够按顺序执行,类似windows下的autorun.dat文件),另外在/etc这个文件夹里还有诸如名为rc1.d, rc2.d一直到rc6.d的文件夹,这些都是linux不同的runlevel,我们一般进入的X windows多用户的运行级别是第5级,也就是rc5.d,在这个文件夹下的脚本文件就是运行第5级时要随机启动的服务程序。需要注意的是,在每个rc (1-6).d文件夹下的文件其实都是/etc/init.d文件夹下的文件的一个软连接(类似windows中的快捷方式),也就是说,在 /etc/init.d文件夹下是全部的服务程序,而每个rc(1-6).d只链接它自己启动需要的相应的服务程序!

要启动scim (某一程序),我们首先要知道scim程序在哪里,用locate命令可以找到,scim在/usr/bin/scim这里,其中usr表 示是 属于用户的,bin在linux里表示可以执行的程序。这样,我就可以编写一个脚本程序,把它放到/etc/init.d里,然后在rc5.d里做一个相 应的软链接就可以了。

这个脚本其实很简单,就两行:

#!/bin/bash

/usr/bin/scim

第一行是声明用什么终端运行这个脚本,第二行就是要运行的命令。

还 需要注意的一点是,在rc5.d里,每个链接的名字都是以S或者K开头的,S开头的表示是系统启动是要随机启动的,K开头的是不随机启动的。这 样,你就可以知道,如果我要哪个服务随机启动,就把它名字第一个字母K改成S就可以了,当然,把S改成K后,这个服务就不能随机启动了。因此,我这个链接 还要起名为SXXX,这样系统才能让它随机启动。

在RH下,rc.local是默认启动的最后一个脚本文件,所以,
如果你想要随机启动,还有一种方法就是在rc.local的尾部加入/usr/bin/scim,这样就可以了。
Linux 自动启动程序

1.开机启动时自动运行程序

Linux加载后, 它将初始化硬件和设备驱动, 然后运行第一个进程init。init根据配置文件继续引导过程,启动其它进程。通常情况下,修改放置在 /etc/rc或 /etc/rc.d 或 /etc/rc?.d 目录下的脚本文件,可以使init自动启动其它程序。例如:编辑 /etc/rc.d/rc.local 文件(该文件通常是系统最后启动的脚本),在文件最末加上一行“xinit”或“startx”,可以在开机启动后直接进入X-Window。

2.登录时自动运行程序

用户登录时,bash首先自动执行系统管理员建立的全局登录script :/ect/profile。然后bash在用户起始目录下按顺序查找三个特殊文件中的一个:/.bash_profile、/.bash_login、 /.profile,但只执行最先找到的一个。
因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。

3.退出登录时自动运行程序

退出登录时,bash自动执行个人的退出登录脚本/.bash_logout。例如,在/.bash_logout中加入命令“tar -cvzf c.source.tgz *.c”,则在每次退出登录时自动执行 “tar” 命令备份 *.c 文件。

4.定期自动运行程序

Linux有一个称为crond的守护程序,主要功能是周期性地检查 /var/spool/cron目录下的一组命令文件的内容,并在设定的时间执行这些文件中的命令。用户可以通过crontab 命令来建立、修改、删除这些命令文件。

例如,建立文件crondFile,内容为“00 9 23 Jan * HappyBirthday”,运行“crontab cronFile”命令后,每当元月23日上午9:00系统自动执行“HappyBirthday”的程序(“*”表示不管当天是星期几)。

5.定时自动运行程序一次

定时执行命令at 与crond 类似(但它只执行一次):命令在给定的时间执行,但不自动重复。at命令的一般格式为:at [ -f file ] time ,在指定的时间执行file文件中所给出的所有命令。也可直接从键盘输入命令:

$ at 12:00
at>mailto Roger -s ″Have a lunch″ < plan.txt
at>Ctr-D
Job 1 at 2000-11-09 12:00
2000-11-09 12:00时候自动发一标题为“Have a lunch”,内容为plan.txt文件内容的邮件给Roger。?9 12:00
2000-11-09 12:00时候自动发一标题为“Have a lunch”,内容为plan.txt文件内容的邮件给Roger。er。ger。er。

Ubuntu 开机自动挂载windows分区

要挂载NTFS格式分区,需要NTFS-3g这个软件。它短小精悍,而且功能强大。
NTFS-3g是一个开源软件,它支持在Windows下面读写NTFS格式的分区。它非常的快速,同时也很安全。它支持Windows 2000、XP和2003,并且支持所有的符合POSIX标准的磁盘操作。

首先要编辑sources.list
#sudo gedit /etc/apt/sources.list

Ubuntu Drapper添加:
deb http://givre.cabspace.com/ubuntu/ dapper main main-all
deb http://ntfs-3g.sitesweetsite.info/ubuntu/ dapper main main-all
deb http://flomertens.keo.in/ubuntu/ dapper main main-all

Ubuntu Edgy添加:
deb http://givre.cabspace.com/ubuntu/ edgy main
deb http://ntfs-3g.sitesweetsite.info/ubuntu/ edgy main
deb http://flomertens.keo.in/ubuntu/ edgy main

同时必须导入GPG-Key,可以这样:
#wget http://flomertens.keo.in/ubuntu/givre_key.asc -O- | sudo apt-key add -
#wget http://givre.cabspace.com/ubuntu/givre_key.asc -O- | sudo apt-key add -

现在更新一下源:
#sudo aptitude update

正式安装

在“终端”下面运行:
#sudo apt-get install ntfs-3g

配置NTFS-3g

首先看一些硬盘分区的分区类型
#sudo fdisk -l

现在就可以修改 /etc/fstab,来让Ubuntu启动的时候自动挂载NTFS分区了。但是首先请备份一下这个文件:
#sudo cp /etc/fstab /etc/fstab.bak

建立挂载点,譬如挂载在 /media/windows 下面
#sudo mkdir /media/windows

现在可以在 /etc/fstab 的后面添加
/dev/hda1 /media/ ntfs-3g defaults,locale=zh_CN.utf8 0 0
根据自己的情况进行修改。

一些示例

挂载 /dev/hda3
添加 /dev/hda3 /media/windows ntfs-3g ro,locale=zh_CN.utf8,uid=1000 0 0

关于自己的locale

可以用下面的命令查看所有的locale
#locale -a

如果不想重新启动,就可以
#sudo umount -a
#sudo mount -a

最后一个挂载FAT分区的命令
#sudo mount /dev/hda3 /media/windows/ -t vfat -o iocharset=utf8,umask=000

当然可以在/etc/fstab里面添加
/dev/hda3 /media/windows vfat iocharset=utf8,umask=000 0 0

Openfire随着Ubuntu自动启动

openfire缺省情况下,是不随机启动的。为了解决每次都要手工启动的麻烦,我编写了一个脚本,放在/etc/init.d目录里面
#sudo vim /etc/init.d/openfire
内容如下:

#!/bin/sh

openfire_start(){
/etc/openfire/bin/openfire start
}

openfire_stop(){
/etc/openfire/bin/openfire stop
}

case $1 in
start)
openfire_start
;;
stop)
openfrie_stop
;;
*)
echo ‘Usage:openfire start|stop’
;;
esac
最近一直在用控制台操纵linux,比较郁闷的就是没有一个软件包管理的工具,apt是可以,但是要想查看已安装的软件包的话会打印长长长长长的一大溜结果,看起来不直观也不美观。以前倒是一直用aptitude search来搜索软件包,没想到aptitude自己是个带有文字界面的管理工具,控制台下可使用,和新立得基本相同,超爽。
Linux下的OPENVPN客户端并不支持服务器push过来的dns地址(我是使用Ubuntu下/etc/init.d/openvpn start来启动vpn客户端的),所以假如使用vpn上国外某些网站的话,会由于国内的dns污染而无法连接。这不是vpn的问题,是由于dns解析出来的结果压根就是错的。

解决办法:root权限修改/etc/resolv.conf。修改为国外的dns服务器,这里可以使用Google的:8.8.8.8服务器,简单好记。正在研究通过修改/etc/init.d/openvpn脚本来自动实现修改dns的方法。


现在,SS5仍不能把这个vpn连接共享出去,因为路由表的问题。vpn连接建立后会把所有的流量路由至vpn服务器,比如该机收到1发来的包,他会把应答发送至vpn服务器,让vpn服务器来发送给1,由于1无法和vpn服务器通信(比如教育网机器和国外vpn),导致1无法收到代理服务器的应答,共享失败。所以要在路由表中添加一条规则,让发往1的数据包直接发往网关而不经vpn。

注:上面说的共享失败的原因我现在还不确定到底是何种原因,可能性如下:1,就是文中说的,主机1和vpn服务器无法通信。2,主机1中本来是和代理服务器通信的,突然收到vpn服务器发来的一堆包,会认为是垃圾,丢弃导致通信失败。
如大家有对其中原理了解的欢迎指教。不过即使这种方式能通信,也由于应答发往vpn再从vpn发回来而导致带宽浪费和延迟加大。


最后,还需要在iptables里开放相应端口。iptables我最近一直在研究,让人蛋疼的是居然没有一个命令可以显示出所有的规则。-L也只是显示一部分。所以有时候开端口不用在iptables里加规则(默认开放),有的时候就必须加了。为保万一,还是加上的好。

Linux下SOCKS5服务器:SS5

[| 2010/04/14 01:00]
Windows下的CCproxy实在不能忍,老是出毛病,决定转战linux。查了下,貌似SS5不错。去:http://sourceforge.net/projects/ss5/files/ 下了最新的源码,参考:http://forum.ubuntu.org.cn/viewtopic.php?t=243631
里面说的编译安装了。默认装到:/etc/opt/ss5中,这里要注意:修改配置文件:ss5.conf。将:
auth 0.0.0.0/0- -
permit - 0.0.0.0/0 - 0.0.0.0/0 - - - - -
去掉注释,然后:sudo /usr/sbin/ss5 -u root -b 0.0.0.0:1080 启动即可,有人说可以用:sudo /etc/rc.d/init.d/ss5 start 来启动,看了看那个脚本,貌似也挺简陋,还是自己手动启动比较好。

现在可以用了。爽
上周在Ubuntu中国论坛官方店买的VPS开通了,价格不贵,并且也能为开源做点贡献。所以鼓励大家买vps的话优先去那里看看。性价比还是非常高的,不过速度一般,并且由于机房在美国东海岸,所以延迟要三百多。

先熟悉了下操作,以前连自己虚拟机我都是偷懒用telnet的,现在要跨越好几千公里了,所以要用SSH,弄了一会把SSH搞懂了,然后就是试着添加删除用户,修改权限什么的。期间reload了一下系统。因位我拿到vps的时候内存占用330m,想换个内存占用小点的,就换CentOS,换过去后发现不大适应,又换回Ubuntu,发现内存居然降到20M以内。。。可能服务商开通的时候人性化的帮客户开通了一些东西。

物尽其用,先搞了个MyEnTunnel,连接顺利,去Google了一下“胡萝卜”,可以正常搜到。

然后试着架一下OpenVPN,方便共享给同学用。配置也比较简单,只是签发证书的时候找了点资料看,对密码学知识又实践了一把。刚刚测试成功。先睡觉,明天给大家用一用。

明天课比较多,VPS继续熟悉一下,给博客架个反向代理,充分利用vps的独立ip。这样我的博客在搜索引擎中的权重也会更高一点。

做了个有意思的小东西

[| 2010/04/05 03:09]
今天做出了大素数class的生成随机大数的一个函数,想试试我到底生成的够不够随机,于是想了个办法:把生成的数字以点的形式打印到屏幕上。

由于项目做的就是在Linux下画屏,所以做个画点的程序也不难。我准备在一个100*100的区域内画点,所以随机数的区域就选择4位数。

先是生成100,1000,2000,10000个点,画上去看看有没有明显的空洞,我看了看,应该没有问题。

然后每屏画100,1000,2000,10000个点,刷新100屏,延迟零点一秒刷新一次,看有没有某区域持续取不到点或持续取到,也没问题。

然后每次画1,10个点,画1000屏,延迟零点一秒画一次,中间不清屏,观察点是否均匀画上,在这里看出点小规律:发现点的运动规律是在各小区跳动并按类圆周轨迹运动,这应该是rand函数的问题。没有大的问题。


然后测试另外一个函数:生成小于指定值的随机大数。也按上面的步骤来,也没有问题。

由此虽然不能验证我生成随机大数的类方法生成的数字严格随机,但是可以定性证明不会导致严重的概率不均。

话说看着屏幕上一堆小点乱动有点像电视雪花屏。小点积累过程像下雪一样。有点意思。
由于之前程序里的一个BUG,导致返回的临时对象里的char*成员指向的内存其实已经被释放了。

当我使用这个临时对象给另外一个新对象赋值时,首先需要给新对象申请空间,我惊奇的发现,新new申请的内存地址和临时对象的那个char*成员的值相同。

想了一想,猜测是以下原因:由于new申请的内存都在堆中,在距离上次释放内存之后没有新申请内存,所以再次申请内存的时候按顺序申请,自然地址从上次释放的起始位置开始,自然和之前的那个指针值相等。

看似巧合,实际有必然性。
分页: 26/31 第一页 上页 21 22 23 24 25 26 27 28 29 30 下页 最后页 [ 显示模式: 摘要 | 列表 ]