2010年3月17日发布升级文件update.sh
适合所有安装过本LNMP的服务器,文件打包于LNMP.zip
2010年3月14日晚发布1.0正式版本,更新如下:
1.增加FTP管理员账户(提示输入)和密码
2.增加MYSQL管理员账户提示输入密码
3.完善主机系统,完整添加新域名的FTP用户、MYSQL用户以及PHPMYADMIN
4.新版本系统更加安全,修正其他小问题
计划:
1.用pureftp替换目前VSFTP,以便为用户划分磁盘份额
2.增加WEB交互友好界面,让管理员运用自如
历次改版:
2010年1月28日上午改版,增加VSFTPD自动安装;增加PHP安全性能自动配置;
修正主机域名问题,修正添加主机问题。
2010年1月2日上午改版,增加SHTML支持,增加虚拟主机管理系统。
==============================全新安装开始==================================
全新安装:
首先声明,该LNMP一键安装包并非我个人的原创。本人接触Linux刚2个星期,对于Linux 的很多细节都不甚了解。
LNMP是本人根据张宴 和Licess 的LNMP改
写而成,并经过本人的测试成功后才发布的。因此,这个LNMP上有很多前辈的身影。之所以发布出来,是本着共享的精神,也是希望更多的人能用上最新版本的Nginx+MySQL+PHP+phpMyAdmin+eAcelerator+Zend optimizer这些软件。
目前已经有超过200台服务器运用该LNMP软件包,且本人在THENYNOC 和BURSTNET 的VPS上都以做过测试,运行良好。言归正传,开始本LNMP的正式介绍。
VPS重装后,运行yum update进行系统升级。
运行cd /usr/src
接着下载本LNMP一键安装包 wget http://fengzi.org/LNMP.zip
解压缩 unzip LNMP.zip
进入该目录 cd LNMP
给脚本赋权 chmod +x down.sh install.sh opt.sh startup.sh addhost.sh
进行下载和安装
执行./down.sh
执行./install.sh
安装到最后的Zend optimizer时需要确认,在php.ini的location时填写 /usr/local/php/etc/ 然后询问服务器是否是apache时选NO,因为我们用的是Nginx
运行完毕后,进行优化,命令: ./opt.sh 最后开机运行 ./startup.sh
完毕。
这样就可以上传网站了。
程序安装路径:
MySQL : /usr/local/mysql
PHP : /usr/local/php
Nginx : /usr/local/nginx
PHPMyAdmin /web/www/phpmyadmin
Web目录 /web/www
添加虚拟主机与用户:
登陆SSH后用户默认的路径在/root/里 若不在此目录直接cd回车
运行./addhost.sh 里面有提示添加虚拟主机
添加后会显示用户的密码等信息。
更多交流请到LINUX-PHP群讨论: 8707379
注意:MYSQL数据库用户名root密码为你初始设置的密码,登陆后进入mysql数据库,找到user表,删除除了有root密码外的所有用户。
==============================全新安装结束==================================
==============================旧版本升级开始===================================
旧版本升级:
(适合所有曾经安装过本LNMP软件包的服务器)
cd /usr/src
rm -fr LNMP*
wget http://fengzi.org/LNMP.zip
unzip LNMP.zip
cd LNMP
sh update.sh
这样就可以了。
注意:
1.安装ZEND的时候询问php.ini目录时需要更改成/usr/local/php /etc/
2.升级过程中会根据服务器的状况停止WEB约30分钟,全新安装不必升级。
==============================旧版本升级结束===================================
May 18th, 2009 in
疯人醉语 ,
程序人生 | tags:
eAcelerator ,
Linux ,
LNMP ,
LNMPz ,
MYSQL ,
NGINX ,
PHP ,
PHPMYADMIN ,
Zend Optimizer |
19 Comments
对于NGINX的爱好者来说,常常会把NGINX 502 BAD-GATEWAY 和 NINGX 504 GATEWAY TIME-OUT混淆,也就是搞不懂NGINX 502 BAD-GATEWAY 和 NINGX 504 GATEWAY TIME-OUT的真正含义。
下面我给出一个形象的比喻,有助于大家理解。
NGINX 502 BAD-GATEWAY说的是PHP-CGI脚本太累了,已经生病住院了,不能做任何事情了,所以它放弃了手头的工作,给它安排的工作它也做不了;
而NINGX 504 GATEWAY TIME-OUT说的是PHP-CGI只是很累很累,不能再做任何多余的安排了,目前只能做手头的工作,但是还没有生病,还没有进医院。所以在给它安排工作它也做不了。
总的来说NINGX 504 GATEWAY TIME-OUT没有NGINX 502 BAD-GATEWAY严重,NGINX504说明服务器很繁忙,而NGINX 502 BAD-GATEWAY说明PHP-CGI的脚本已经出问题了。这样大家就方便理解了。
今天有幸试用了一下新浪的SAE,新浪官方的介绍如下:
Sina App Engine(SAE),是由新浪公司开发和运营的开放云计算平台的核心组成部分。
SAE的目标是实现互联网应用在开发运维上的无缝整合,为App开发者提供稳定、快捷、透明、可控的服务化的平台,并且减少开发者的开发和维护成本。
同时通过对消耗资源的量化,反向作用于开发过程,促进新浪公司互联网应用服务的质量提升。
首先是探针演示:http://asdf.sinaapp.com ,可以看出支持的组件很少
其次从官方给出的文档来看,大概是自定义了一些预定义变量和修改了一些常用函数。
禁用的函数和类如下:
2010年2月1日解禁函数
fprintf,fscanf,ftruncate,fflush,fwrite,fputs,tempnam,file_put_contents,
fputcsv,error_reporting,phpinfo,copy,rename,phpcredits,gzputs,gzwrite,
gzpassthru
2009年10月8日追加禁用函数
gzputs,gzwrite,gzpassthru,openlog,syslog,closelog
最新禁用函数列表
php_logo_guid,php_real_logo_guid,php_egg_logo_guid,zend_logo_guid,
php_sapi_name,php_uname,php_ini_scanned_files,php_ini_loaded_file,readlink,
linkinfo,symlink,link,unlink,exec,system,escapeshellcmd,escapeshellarg,passthru,shell_exec,
proc_open,proc_close,proc_terminate,proc_get_status,proc_nice,getmyuid,getmygid,getmypid,
getmyinode,putenv,getopt,sys_getloadavg,getrusage,get_current_user,set_time_limit,
get_cfg_var,magic_quotes_runtime,set_magic_quotes_runtime,get_magic_quotes_gpc,
get_magic_quotes_runtime,import_request_variables,error_log,error_get_last,debug_zval_dump,
ini_get,ini_get_all,ini_set,ini_alter,ini_restore,get_include_path,set_include_path,
restore_include_path,move_uploaded_file,dl,pclose,popen,rewind,rmdir,umask,fpassthru,
mkdir,stream_select,stream_context_create,stream_context_set_params,stream_context_set_option,
stream_context_get_options,stream_context_get_default,stream_filter_prepend,
stream_filter_append,stream_filter_remove,stream_socket_client,stream_socket_server,
stream_socket_accept,stream_socket_get_name,stream_socket_recvfrom,stream_socket_sendto,
stream_socket_enable_crypto,stream_socket_shutdown,stream_socket_pair,stream_copy_to_stream,
stream_get_contents,stream_set_write_buffer,set_file_buffer,set_socket_blocking,
stream_set_blocking,socket_set_blocking,stream_get_meta_data,stream_get_line,
stream_wrapper_register,stream_register_wrapper,stream_wrapper_unregister,stream_wrapper_restore,
stream_get_wrappers,stream_get_transports,stream_is_local,get_headers,stream_set_timeout,
socket_set_timeout,socket_get_status,mail,apc_add,apc_cache_info,apc_clear_cache,apc_compile_file,
apc_define_constants,apc_delete,apc_fetch,apc_load_constants,apc_sma_info,apc_store,flock,tmpfile
XMLWriter,DOMDocument,DOMNotation,DOMXPath,PDOException,PDO,PDOStatement,PDORow,SQLiteDatabase,
SQLiteResult,SQLiteUnbuffered,SQLiteException
file_put_contents用$f = new SaeFetchurl();
$img = $f->fetch('a url of a img');来代替
imagecreatefromgif等一系列图片函数用类似如下的CLASS来代替
$f = new SaeFetchurl ( ) ;
$img_data = $f -> fetch ( ‘http://ss7.sinaimg.cn/bmiddle/488efcbbt7b5c4ae51ca6&690′ ) ;
$img = new SaeImage ( ) ;
$img -> setData( $img_data ) ;
$img -> resize( 200 ) ; // 等比缩放到200宽
$img -> flipH( ) ; // 水平翻转
$img -> flipv ( ) ; // 垂直翻转
$new_data = $img -> exec( ) ; // 执行处理并返回处理后的二进制数据
// 或者可以直接输出
$img -> exec( ‘jpg’ , true )
还有其他的细节就不一一列出。
这样做的好处我自己总结了一下,就是首先通过自建函数库(这种函数都是及其占用资源的)来通过统一的中央引擎来高效处理,并且可以节省服务器开销,提高服务器安全。但是缺点是显而易见的,把所有PHP的原有定义改成新浪的SAE形式的话无疑是一个浩大的工程,而且其必要性也有待于考证。诸如很多占用服务器资源的问题可以通过提高硬件的性能来解决。
还有一点就是说一下这个SAE的BUG或者说是另一种限制吧,以前写PHP脚本的时候我们可以使用<? …?>这种形式,但是在SAE下我们必须使用<?php … ?>这种形式,否则不会认为是PHP文件。
总的来说用两个字来总结新浪的SEA就是折腾,不过这也符合中国人的思维习惯。
February 4th, 2010 in
程序人生 | tags:
SEA ,
sina ,
文档 ,
新浪 ,
测试 |
No Comments
闲话不说, HTTP版的CURL代理
$url=http://www.baicu.com ;
$ch = curl_init();
$proxy = “http://206.127.181.126:8080 “;
// curl_setopt ($ch, CURLOPT_PROXY, $proxy);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_REFERER, ‘http://www.samedomain.com’); /*破解防盗链*/
curl_setopt ($ch, CURLOPT_USERAGENT, ‘Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)’);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 30);
$im = @curl_exec($ch);
curl_close($ch);
echo $im;
SOCKS5版的CURL代理
$url = ‘http://www.google.com’;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_PROXY, “218.75.42.178″);
curl_setopt($ch, CURLOPT_PROXYPORT, 1080);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$im = curl_exec($ch);
curl_close($ch);
echo $im;
两个代理IP貌似都好用哦~~
January 4th, 2010 in
程序人生 |
No Comments
BurstNet 给我变更了VPS, 发现新的VPS时间与北京时间不一样.于是查询了如何修改服务器的时间(特别感谢BurstNet 的Brain.S, 他教会了我如何设置), 详细的设置步骤如下:
首先,链接活着拷贝上海的时区设置作为本地的时区默认设置,即:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
或者
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
其次,使服务器时间同步化:
yum install -y ntp
ntpdate -d us.pool.ntp.org
这样就可以了
December 17th, 2009 in
程序人生 | tags:
Centos ,
Linux ,
vps ,
修改 ,
同步 ,
时间 ,
服务器 ,
服务器时间 |
No Comments
Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。
Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。
解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。
而正确的设置需要考虑服务器自身的性能和访客的数量等多重因素。
以我目前的服务器为例子CPU是奔四1.5G的,内存1GB,CENTOS的系统,访客大概是50人左右同时在线。
但是在线的人大都需要请求PHP-CGI进行大量的信息处理,因此我将nginx.conf设置为:
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;#8 128
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
这里最主要的设置是前三条,即
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
这里规定了PHP-CGI的连接、发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导致502 Bad Gateway和504 Gateway Time-out。
下面我们来仔细分析一下php-fpm.conf几个重要的参数:
php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout”
我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。
计算的方式如下:
如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。
而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
新买了一个服务器,所有配置文件和原有的都一样,但是VSFTPD在服务器重启以后的一段时间后就不好用,提示Starting vsftpd for vsftpd: [ FAILED ]
重装也不好用很是奇怪。
偶然从网上搜索到/etc/logrotate.d/vsftpd.log的文件配置,和我自己的对比一下,我的多了missingok一项,把它注释掉启动,搞定!
目前的/etc/logrotate.d/vsftpd.log文件如下:
/var/log/vsftpd.log {
# ftpd doesn’t handle SIGHUP properly
nocompress
# missingok
}
/var/log/xferlog {
# ftpd doesn’t handle SIGHUP properly
nocompress
# missingok
}
October 30th, 2009 in
程序人生 |
No Comments
IPTABLES里面仅仅开放了80、21等常用端口,这样就导致了VSFTPD在被动模式时无法使用随机端口,从而造成了客户端连接FTP时无法列出目录这样的问题。解决方式很简单,给VSFTPD增加随机端口的范围,然后把这个端口范围添加到IPTABLES.
具体做法如下:
修改/etc/vsftpd/vsftpd.conf的配置文件,在文件末端添加
pasv_max_port=6666
pasv_min_port=5555
然后将这两个端口范围添加到IPTABLES中,亦即vi /etc/sysconfig/iptables修改IPTABLES的配置文件,在其中添加
-I INPUT -p tcp –dport 5555:6666 -j ACCEPT
-I OUTPUT -p tcp –sport 5555:6666 -j ACCEPT
这样的随机端口范围,使之合法化。
最后重启一下两个服务:
[root@ido ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@ido ~]# service iptables restart
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: mangle filter nat [ OK ]
Applying iptables firewall rules: [ OK ]
用客户端测试,成功!
August 23rd, 2009 in
程序人生 | tags:
21 ,
iptables ,
PASV ,
vsftpd ,
冲突 ,
被动模式 |
No Comments
function fetch($url){
$curl = curl_init();
$timeout = 0;
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; )');
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIE, 'domain=www.stocksir.com');
$tmpInfo = curl_exec($curl);
curl_close($curl);
return $tmpInfo;
}
$str = fetch("http://www.stocksir.com/index.php");
echo substr($str, -5);
?>
August 10th, 2009 in
程序人生 | tags:
Add new tag ,
HTML ,
PHP |
No Comments
Michael Joseph Jackson was born on Aug. 29, 1958, in Gary, Indiana, the seventh child of a musically gifted family. He was 11 when he made his debut as a member of The Jackson 5, with older brothers Jackie, Tito, Jermaine and Marlon.
His solo career began in 1971 with the single “Got to Be There.” His first No. 1 single came in 1971 — “Ben,” the title song from a film about a rat.
In 1979, at 21, he came out with “Off the Wall,” an album that produced four hit singles, according to the Hall of Fame.
“Thriller,” his 1982 album, and especially the 14-minute music video made for the title song and released a year later, propelled Jackson into the upper echelon of pop stardom. It topped the album charts for 37 weeks in 1983, according to the Hall of Fame.
“Billie Jean,” the second single from the album, led the charts for another seven weeks. It was with that song that Jackson introduced his famous and much-imitated “moonwalk” dance move.
His 1987 album, “Bad,” produced seven more hit singles, including the title song.
He performed at halftime of Super Bowl XXVII in 1993.
June 26th, 2009 in
程序人生 | tags:
Michael Jackson |
3 Comments
相信很多站长都在考虑将自己的网站静态化,一方面HTML访问速度较快,另一方面对搜索引擎也友好。
在这里先不谈rulrewrite, 因为我们要做的是将网站动态页面真实静态化。
流程图如下:
一般来说,服务器端的cron请求不宜过频,控制在10分钟左右,保证没有用户访问的前提下网站能实现自动更新。而客户端的JS脚本则可以设置20秒左右请求更新一次,但是这样就会出现一个问题,那就是当同时登陆网站的客户端较多时会给网站造成不小的压力。这时候就需要在PHP2HTML脚本上动动脑筋,判断前一次生成HTML离现在的时间间隔,我一般是30秒重新生成一次,也就是说如果上一次生成时间离现在不到30秒,那么无论是客户端还是服务器端请求PHP2HTML都会自动停止。这样一方面减少了服务器的压力,另一方面能保证网站数据的定时有序的更新。
然而实际上,网站静态化的时间间隔会低于30秒,为什么会这样呢?答案是PHP2HTML运行本身需要时间,在它自身运行时又有新的请求产生,因此会同时运行导致生成时间间隔略小于预设的时间。这个问题理论上有解决的方法,就是利用session。但是实际中利用session会让你遇到意想不到的麻烦的,比如PHP2HTML突然间死掉了,session还存在,那么整个网站的静态就需要等到session也死掉,这需要很长的时间。
上述思路我在2个服务器上实践过,结果是我自己很满意,因为从客户端的角度出发访问的速度很快。但是服务商不满意了,由此我的网站被反反复复关闭了好多次。以后的思路是动态数据动态化,静态数据静态化,这样可以大大节省服务器开支。