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
全部运行完毕后重启php-fpm才能使zend optimizer生效,方法是执行 /usr/local/php/sbin/php-fpm restart
运行mysql: service mysql start
完毕。
Vsftpd我没有加上来,原因是vsftpd的安装和配置都很简单,在这里我做一个粗略的介绍。
运行 yum -y install vsftpd 安装vsftpd.
配置 vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO 呵呵,我的是给自己用的,不必固定目录。需要固定目录的就改一下
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list
最后在配置对应的文件/etc/vsftpd/chroot_list 把FTP的用户名填写进去就行了。
开启vsftpd :service vsftpd start
这样就可以上传网站了。
程序安装路径:
MySQL : /usr/local/mysql
PHP : /usr/local/php
Nginx : /usr/local/nginx
PHPMyAdmin /web/www/phpmyadmin
Web目录 /web/www
添加虚拟主机与用户:
首先给PHP做安全配置,别的我不说了说一下增加虚拟主机时候需要的设置。
登陆SSH后用户默认的路径在/root/里 若不在此目录直接cd回车
运行./addhost.sh 里面有提示添加虚拟主机
添加后会显示用户的密码等信息。
更多交流请到LINUX-PHP群讨论: 8707379
注意:MYSQL数据库用户名root密码root,登陆后进入mysql数据库,找到user表,删除除了有root密码外的所有用户。
然后把root密码改成自己的
May 18th, 2009 in
疯人醉语 ,
程序人生 | tags:
eAcelerator ,
Linux ,
LNMP ,
LNMPz ,
MYSQL ,
NGINX ,
PHP ,
PHPMYADMIN ,
Zend Optimizer |
19 Comments
今天有幸试用了一下新浪的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个服务器上实践过,结果是我自己很满意,因为从客户端的角度出发访问的速度很快。但是服务商不满意了,由此我的网站被反反复复关闭了好多次。以后的思路是动态数据动态化,静态数据静态化,这样可以大大节省服务器开支。
昨天突然间打开http://fengzi.org 特别慢,由于http://fengzi.org 是伪静态的,这说明PHP脚本出了问题。
用netstat -anpo | grep “php-cgi” | wc -l 查了一下,发现同时请求的php-cgi程序竟然有165个。仔细想了一下,产生该问题的原因可能是php-cgi.sock处理过慢,和PHP本身的问题造成的。
Nginx的fastcgi处理模式有两种,一种是通过sock来处理,另一种是通过fastcgi的端口来处理。sock的处理虽然相比fastcgi能慢一点,但是相对稳定。下面我们要做的就是给fastcgi做本地均衡,来同享php-cgi.sock和fastcgi端口模式的优点。
具体的做法是,首先拷贝4组php-fpm.conf的配置样本
[root@ido etc]# cp php-fpm.conf php-fpm-9000.conf
[root@ido etc]# cp php-fpm.conf php-fpm-9001.conf
[root@ido etc]# cp php-fpm.conf php-fpm-9002.conf
[root@ido etc]# cp php-fpm.conf php-fpm-9003.conf
修改php-fpm9000.conf,监听地址和子进程如下<value name=”listen_address”>127.0.0.1:9000</value> <value name=”max_children”>0</value>。其他三个文档以此类推。
给Nginx.conf添加upstream,以支持php-cgi(php-fpm)的本地均衡。
upstream king {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}
同样,server里的location加上proxy_pass
location ~ .*\.(php|php5)?$
{
proxy_pass http://king ;
fastcgi_pass unix:/tmp/php-cgi.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}
手动添加四组php-cgi均衡均衡脚本
[root@ido ~]# /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm-9000.conf
[root@ido ~]# /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm-9001.conf
[root@ido ~]# /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm-9002.conf
[root@ido ~]# /usr/local/php/bin/php-cgi –fpm –fpm-config /usr/local/php/etc/php-fpm-9003.conf
重启nginx,观察了一下,网站运转良好,速度也很快也很稳定,但是内存占用很大。
PS. 用netstat -an | grep 9000 发现该端口一直是监听状态,并没有使用。所以我怀疑这次尝试很可能是无意义的或者是失败的。