原创:解决 cp: omitting directory
linux下面执行cp命令时提示如下信息:
cp: omitting directory
可以用下面的办法来解决
cp -r orginal_file new_file
By admin
read morelinux下面执行cp命令时提示如下信息:
cp: omitting directory
可以用下面的办法来解决
cp -r orginal_file new_file
By admin
read more更新ports到最新,然后直接重新 (make install) 编辑安装PHP时提示出错。升级之前就想到这个问题,因为没有卸载旧版本的PHP,新版本的可能没有办法正常安装。但是卸载的话相关的几个包也都要重新安装,很麻烦也很浪费时间。google了一圈也没有结果就只能自己试了。
提示是这样的:
===> php5-5.2.6 is already installed
You may wish to ``make deinstall'' and install this port again
by ``make reinstall'' to upgrade it properly.
If you really wish to overwrite the old port of lang/php5
without deleting it first, set the variable "FORCE_PKG_REGISTER"
in your environment or the "make install" command line.
*** Error code 1
Stop in /usr/ports/lang/php5.
*** Error code 1
Stop in /usr/ports/lang/php5.
这时候可以有几种选择:
By admin
read more钟情FreeBSD的其中一个原因就是它的方便快捷的ports软件包管理,本文在安装Nginx、PHP、Php-fpm的时候也采用ports方式安装。ports是一个非常优秀的软件包管理器,如果不希望编译安装的话,使用ports安装,几个命令就能全部搞定,这对初学者来说是很有帮助的。
事实上,Nginx 和 PHP已经在FreeBSD的ports系统里了,只是Php-fpm没有,不过,简单几个命令就能把Php-fpm添加到FreeBSD的ports中去。下面我们来看看具体的操作步骤:
1. 安装nginx
# cd /usr/ports/www/nginx
# make install
安装过程中要选择安装模块,这里我选择如下几个模块做示范
FreeBSD下的ports安装实在是太简单、方便了,没什么可多说的,下面直接安装php。
2. 安装php
# cd /usr/ports/lang/php5 # make install
安装过程中,选择如下模块:
3. 安装Php-fpm
FreeBSD是没有php-fpm的ports的,那就下个呗
# wget http://alamster.googlepages.com/php5-fpm.5.2.6.tar.gz
然后解压至ports中
# tar xvzf php5-fpm.5.2.6.tar.gz –-directory=/usr/ports/lang
# rm php5-fpm.5.2.6.tar.gz
现在就可以进入ports安装php-fpm了 # cd /usr/ports/lang/php5-fpm/ && make install
安装过程中选择安装如下模块:
事实上,以上的步骤已经把这本个软件包都安装好了,简单吧,现在开始对nginx作简单的配置吧
4. 配置
配置前,我们更改一下rc.conf文件,让nginx和php-fpm开机启动,编辑 /etc/rc.conf 文件
# ee /etc/rc.conf
添加如下配置
nginx_enable=”YES”
By admin
read more先设置时区:
# tzsetup
再与国家授时中心服务器对时: # ntpdate 210.72.145.44
以后自动同步:
首先修改/etc/rc.conf添加**ntpd_enable=”YES”**到最后一行。
然后配置对时服务器:
# vi /etc/ntp.conf
server 210.72.145.44 prefer server 159.226.154.47 server 127.127.1.0 fudge 127.127.0.1 stratum 5 restrict default ignore restrict 127.0.0.0 mask 255.0.0.0 restrict 192.168.0.0 mask 255.255.255.0 noquery nopeer notrust restrict 210.72.145.44 noquery restrict 159.226.154.47 noquery driftfile /var/db/ntpd.drift
/var/run/xntpd.pid
# ntpd -p /var/run/ntpd.pid # tail /var/log/messages Oct 9 16:46:56 chiwawa ntpd[89409]: ntpd 4.1.0-a Thu Apr 3 08:26:24 GMT 2003 (1) Oct 9 16:46:56 chiwawa ntpd[89409]: kernel time discipline status 2040…… Oct 9 16:50:10 chiwawa ntpd[89409]: time set -0.189546 s
By admin
read more一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可,这是抽象类的一个优点
如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是接口的一个缺点;而抽象类就不存在这个问题,只是为子类添加了一个新的方法(接口中旧的方法)
看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B . 这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现, 而需要走一些弯路。目前系统架构的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。 这就需要通过实现多个接口的方式来实现,显然,抽象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends A , C extends B 如果想要为c抽象出一个抽象类D的话,就需要找到它的最顶层A来从头做起,因为无法做到C extends D
——————————- 继承抽象类的时候不需要实现全部方法,但此子类还是abstract的,无法实例化 ——————————- 我的意思也是尽量使用interface,但抽象类也不是说没用,应该是各有各的优点。最好的方法就是写一个接口,然后做一个这个接口的default抽象类实现,根据需要选择实现接口还是继承抽象类,但这样的缺点就是写太多的类 ——————————- 抽象类的优点:B继承A,C也继承A,假设类B、C中继承的fun1这个方法实现代码是一样的,则可以在A中写好代码,BC只要调用父类A的方法既可,不用重新编写代码;而其他BC方法名相同、具体实现不相同的代码,则在A写成抽象的方法。 ——————————- 这句话讲的很好,以此类推,不断的extends出新的抽象类,不断完成新的方法,以供不同的类来继承实现,提高代码的复用性,但缺点是过于死板,针对性强了一些 ——————————- 要想实现接口隔离只能通过接口来实现,这也是abstract的最大缺陷 ——————————- 接口可多继承,地球人都知道,接口里的东东是public的。 ——————————- 整理一下楼主的贴:
一个子类implements一个接口,如果该子类是非abstract类,就必须实现接口中的所有方法(不管是否需要);而如果该子类是abstract类,则可以实现接口的中方法也可以不实现。 一个子类如果是继承一个抽象类,如果该子类是非abstract类,就必须实现基类中的所有抽象方法;而如果该子类是abstract类,则可以实现基类的中抽象方法也可以不实现。 //这两种情况看起来是一样的,只不过,抽象类中可以有非抽象方法,而接口中必须全是抽象方法。
如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为接口的那个改名的方法在非抽象子类中没有实现。 抽象类如果修改了一个抽象方法的名称,子类同样编译不过,但若修改的是非抽象方法,编译没有问题。 //两者看起来看是差不多的,只不过修改的方法有抽象和非抽象之别。
关于 抽象类如果修改了一个抽象方法的名称,子类同样编译不过,如果修改的是非抽象方法,编译没有问题,这个不确定性恰恰是抽象类的致命弱点。
By admin
read moreinterface a { //接口内不可以定义属性 //所有方法必须为抽象方法(既不实现,只定义)
public function method1($param); protected function method2($param); }
//接口不可被实现,例如 $instance = new a; //错误
//接口实现类必须实现接口的所有方法,且方法参数也必须相同 //例如 class b implaments a{ //错误,封装应与接口相同 protected function method1($param) { //somecode here… }
//错误,参数应与接口定义相同 protected function method2() {
} }
接口功能是实现类似C++中的多重继承的,但其语法更为明了
By admin
read morePHP的接口:为了实现特定功能而预留的类似类的一种类型。接口的主要目的:提供给类类似于模板的框架,以方便类的构建。
在PHP****中定义接口
在PHP中定义接口的形式如下:
Interface interfaceName
{
Const 1;
……
Const 2;
Function methodName1();
……
Function methodName2();
}
PHP****中单一接口的实现
实现接口的语法如下:
Class class_name implements interface_name
例如:
id = $id;
}
function getID()
{
return $this->id;
}
function setName($name)
{
$this->name = $name;
}
function getName()
{
return $this->name;
}
function otherFunc() //这是一个接口中不存在的方法
{
echo “Test”;
}
}
?>
PHP****中多重接口的实现
在** PHP**的实际编程中,有时根据需要需设计多个接口,在实现的时候根据实际情况选择不同的一组来实现,这时需要使用一个类来实现两个或两个以上的接口。
例如:
id = $id;
}
function getID()
{
return $this->id;
}
function setName($name)
{
$this->name = $name;
}
function getName()
{
return $this->name;
}
function otherFunc() //这是一个接口中不存在的方法
{
echo “Test”;
}
}
?>
PHP****中的抽象类
By admin
read more在FreeBSD服务器上调试ipfw防火墙规则的时候,有时候需要临时关闭ipfw防火墙,可以使用如下命令来进行操作:
1)停止ipfw防火墙:
ipfw disable firewall
/etc/rc.d/ipfw stop
2)开启ipfw防火墙:
ipfw enable firewall
/etc/rc.d/ipfw start
随机器启动自动启用防火墙方法需要修改/etc/rc.conf文件,参考:第三步.
3)如何查看ipfw是否在运行
方法一:通过ipfw -a list 不断的去看包的数量
方法二:sysctl -a | grep net.inet.ip.fw.enable
如果状态是1表示是开启,0为关闭.
ipfw中文手册pdf: http://docs.haohtml.com/download/freebsd/ipfw_zh.pdf
By admin
read more其实这个Bug是由分两种情况的:
1.和Nginx无关,是针对CSS背景图片的。
一般用户不会碰到,更多的时候是开发者将自己的IE的缓存策略从默认的”自动”改为“每次访问都查询”才发生 的。特点是鼠标一旦浮动到有背景图片的地方,IE会不顾已经缓存的图片,自行去服务器再次获取图片,造成图片短暂消失。这个问题比较简单,可以通过以下脚 本解决。
1
2. 但是实际上更常见的原因是Nginx上打开了Gzip压缩功能。
这个是IE6 的著名Bug,早在2002年就被人详细讨论过了,在IE7中有所改进,但微软永远也不会去修复IE6了。
根本原因是Nginx对于启用了Gzip的http上下文,即使你在之前的配置文件里声明过 gzip_disable “MSIE [1-6].”,Nginx不再对IE6用Gzip压缩了,但是送出的http报头却仍然采用了和Gzip压缩数据包相匹配的Vary: Accept-Encoding。IE6不认识这个报头,IE6对除了Vary: User-Agent的报头外,都不查询缓存,直接去服务器申请。更绝得是,不是使用查询文件是否更新,而是强行要求一份完整文件。(IE7总算客气了 点,就是先查询一下文件是否更新在下载,减轻了这个bug的影响)。
这个Bug的级别很高,靠前面1中的方法是不行的。在 NGINX中,通过add-header Cache-Control “post-check:3600, pre-check:43200″; ,象这里 介绍的方法, 也是不行的。通过一番痛苦的摸索,才发现要解决这个Bug,有两个方法,一个是使用Nginx的headers-more-nginx-module, 遇到User-Agent是IE6(或者不管三七二十一),修改报头为Vary: User-Agent。不过这个模块并不是标准配置,需要重新编译Nginx。
另一个更为简便易行的方式就是在诸如图片和CSS,JS文件存取的地方加上一下语句,显示关闭Gzip,并手工加上报头。
1 if ($http_user_agent ~ “MSIE [1-6].”) {
2 #Must explicitly turns off gzip to prevent Nginx set Vary:Accept-Encoding
3 #which will prevent IE6 from caching anything
4 gzip off;
5 add_header Vary “User-Agent”;
6 }
经过我的测试这样是可以解决问题的。这里只能用$http_user_agent来获取浏览器参数,曾经试过$ancient_browser,不 过没有成功。
另外,Nginx本身是有一个Gzip的Derective来控制Header的, 就是gzip_vary。设成gzip_vary off应该也能解决问题,但这是这个参数只能存在与http, location,server这些上下文里,不能添加到if上下文里,所以只能用gzip off; 把gzip完全给关了。
By admin
read morespawn-fcgi是一个通用的FastCGI管理服务器
她是lighttpd中的一部份,但目前已经单独成为一个项目,最新的lighttpd没有这一块(),但可以在以前版本中找到她
在lighttpd-1.4.15( http://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz )中就有她
Note注:最新的spawn-fcgi可以到lighttpd.net网站搜索“spawn-fcgi”找到她的最新版本发布地址
目前她的下载地址是http://redmine.lighttpd.net/news/2 最新版本是http://www.lighttpd.net/download/spawn-fcgi-1.6.0.tar.gz
tar -zxvf lighttpd-1.4.15.tar.gz cd lighttpd-1.4.15 ./configure #编译 make #因为我不需要安装lighttp而是只需要他其中的某个文件,所以只make就可以了,不需要make install cp src/spawn-fcgi /usr/local/bin/spawn-fcgi #取出spawn-fcgi的程序
下面我们就可以使用 spawn-fcgi 来控制php-cgi的FastCGI进程了
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi
参数含义如下:
-f 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置 -a 绑定到地址addr -p 绑定到端口port -s 绑定到unix socket的路径path -C 指定产生的FastCGI的进程数,默认为5(仅用于PHP) -P 指定产生的进程的PID文件路径 -u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,Ubuntu下可以使用www-data,其他的根据情况配置,如nobody、apache等
php-fpm
她同样也是一个PHP FastCGI管理服务器,**是只用于PHP的,**可以在 http://php-fpm.org/download 下载得到.
她其实是PHP源代码的一个补丁,必须将她patch到你的PHP源代码中,在编译安装PHP后才可以使用。
安装方法类似:
tar zxvf php-5.2.10.tar.gz gzip -cd php-5.2.10-fpm-0.5.11.diff.gz | patch -d php-5.2.10 -p1 cd php-5.2.10/ ./configure –prefix=/usr/local/webserver/php
–with-config-file-path=/usr/local/webserver/php/etc
–with-mysql=/usr/local/webserver/mysql
–with-mysqli=/usr/local/webserver/mysql/bin/mysql_config
–with-iconv-dir=/usr/local
–with-freetype-dir
–with-jpeg-dir
–with-png-dir
–with-zlib
–with-libxml-dir=/usr
–enable-xml
–disable-rpath
–enable-discard-path
–enable-safe-mode
–enable-bcmath
–enable-shmop
–enable-sysvsem
–enable-inline-optimization
–with-curl
–with-curlwrappers
–enable-mbregex
–enable-fastcgi
–enable-fpm
–enable-force-cgi-redirect
–enable-mbstring
–with-mcrypt
–with-gd
–enable-gd-native-ttf
–with-openssl
–with-mhash
–enable-pcntl
–enable-sockets
–with-ldap
–with-ldap-sasl
–with-xmlrpc
–enable-zip
–enable-soap
–without-pear make ZEND_EXTRA_LIBS=’-liconv’ make install cp php.ini-dist /usr/local/webserver/php/etc/php.ini cd ../
By admin
read more常用的APT命令参数
apt-cache search package 搜索包
apt-cache show package 获取包的相关信息,如说明、大小、版本等
sudo apt-get install package 安装包
sudo apt-get install package – – reinstall 重新安装包
sudo apt-get -f install 修复安装”-f = ――fix-missing”
sudo apt-get remove package 删除包
sudo apt-get remove package – – purge 删除包,包括删除配置文件等
sudo apt-get update 更新源
sudo apt-get upgrade 更新已安装的包
sudo apt-get dist-upgrade 升级系统
sudo apt-get dselect-upgrade 使用 dselect 升级
apt-cache depends package 了解使用依赖
apt-cache rdepends package 是查看该包被哪些包依赖
sudo apt-get build-dep package 安装相关的编译环境
By admin
read moreOS:freebsd 7.2
在FreeBSD 7.2下,通过ssh客户端连接到FreeBSD端,用普通的用户登录,执行下列命令报错:
$ su – su: Sorry $ su su: Sorry
原因:在FreeBSD上要使用 su命令成为root用户,不但要知道root的口令,还需要经过特别设置,否则就不能成功使用这个命令。这是因为 FreeBSD对执行su命令的用户进行了更严格的限制,能使用su命令的用户必须属于wheel组(root的基本属组,组ID为0),否则就不能通过这个命令成为root用户。
因此需要编辑组设置文件/etc/group,将需要超级用户权力的管理成员加入到wheel组中。
用 root用户登录,修改/etc/group文件,在wheel组中添加普通用户,操作如下:
#ee /etc/group
#wheel:*:0:root,pup (在wheel组中,增加pup用户)
按ESC,选择a)leave editor—->选择a)save changes,保存退出!
使用pup用户ssh登录
$ su – Password:
成功切换到root权限!
参考:
By admin
read more今天看的内容是有关书上第六章编译内核的问题:
首先为什么要编译内核?
它最大的好处就是可以调整linux系统,以便其更合理地安装到计算机中。linux集成套件通常包括多种目
标内核,能够处理各种机器。除此之外,还可以通过重新编译内核以便在你的计算机上实现一些功能,
例如:将linux系统设置为一个临时路由器,使之拥有内置的路由功能,或者作为放火墙,添加一个新的外部设备(如SCSI卡等)
创建自己的内核的最好理由就是使全世界内核设计者所提供的各种为改进性能而设计的内核得到充分利用。创建内核的过程不是很困难,只是要花费一些时间,并且系统越老或运行越慢,在创建时所花费的时间就越长,而且要特别注意一些关键的驱动程序或者其特性时,那会带来不少麻烦的
这个内核将针对机器的处理器进行优化,并且只提供需要的驱动和特征。另一个原因是为内核增加新的支持特性,有些特性在发行商提供的内核中有可能没有包括进来,或让硬件工作得更好。
最终结果是建立一个更小的,更快的,打上所有最新最稳定的补丁和增强特性的内核。
By admin
read moresquid优化建议(转贴) 作者:听松一隅
SQUID是个很不错CACHE服务器,各大门户网站都在用。过去二天也做了些SQUID优化,把经验贴上来。
几个重要参数:
首先要分析SQUID所cache内容:
运行 squidclient -p 80 cache_object://localhost/info 能看到如下内容:
Storage Swap size: 7549104 KB Storage Mem size: 418804 KB Mean Object Size: 160.46 KB
Mean Object Size是平均内容大小,一般要把maximum_object_size_in_memory设置成离它最近的128的倍数。在这个例子中maximum_object_size_in_memory 的值应该是256kB。
cache_mem 一般设置成服务器内存的一半或更多,只要运行过程中LINUX没有使用SWAP就可以。
再就是按业务分SQUID: 比如某个论坛,用户能上载图片和视频;当然我们要把上载的图片、视频放在单独的域名上,比如img.example.com, video.example.com;这两个域名只提供静态文件服务。
根据统计,图片的平均大小在100KB,视频的平均大小在4M,差别是很大,应该建两个squid分别作图片和视频的CACHE。图片SQUID的 maximum_object_size_in_memory 设置为256KB,视频的SQUID的maximum_object_size_in_memory设置为8196KB。
实际应用中,原来把图片和视频混在一起的CACHE HIT RATE只有60%,CPU占用率经常在50%以上。分开后图片的CACHE HIT RATE达到95%,CPU占用率降到15%;视频的CACHE HIT RATE到80%了,取得了很好的效果
附上非常有用的squid命令: list of useful squidclient commands
By admin
read more前言:
很久没有写过文章了,最近收到不少朋友来信,提及了有关优化配置和一些新的安全问题,在此我想和大家浅显讨论一下这些问题,有什么不准确和有更好的方式,请给我来信共同讨论提高。
在网上看到不少有关linux优化方面的好文章,在此我也不赘述这些文章了,我只想从我自己的体会来谈谈这方面的问题。
作为一个系统管理员,我下面说的都是基于服务器应用的linux来谈的,由于个人电脑上使用linux也许不是像服务器上一样,优先追求安全和稳定,因此个人电脑使用的朋友只做个参考吧。
本文提及的系统,如没有特别声明,均采用redhat公司的redhat linux系统。
关于优化
说起优化,其实最好的优化就是提升硬件的配置,例如提高cpu的运算能力,提高内存的容量,个人认为如果你考虑升级硬件的话,建议优先提高内存的容量,因为一般服务器应用,对内存的消耗使用要求是最高的。当然这都是题外话了。
这里我们首要讨论的,是在同等硬件配置下(同一台服务器,不提升硬件的情况下)对你的系统进行优化。
作为系统管理员,我认为,首先我们要明确一个观点:在服务器上作任何操作,升级和修改任何配置文件或软件,都必须首要考虑安全性,不是越新的东西就越好,这也是为什么linux管理感觉上和windows有所不同的地方,windows首先推荐大家去使用它的最新版本软件和操作系统,其实我个人认为这是一种商业行为,作为从系统管理上来讲,这是很不好的,使用新的软件和系统可能带来新的问题,有些甚至是致命的。
因此,作为管理,我们还是应该考虑稳定的长期使用的软件版本来作为我们的版本,具体的好处我就不多说了。相信作为管理员的你应该知道的。
其实个人使用的linux最直接的一个优化就是升级内核,自己编译的内核是根据自己的系统编译而来,将得到最大的性能和最小的内核。
但是,服务器就不太一样了,当然我们也希望每一台服务器都是自己手工编译的内核,高效而精巧。但是实际和愿望是有差距的,试想一下,如果你管理100来台 linux主机,而每一台也许配置都不一样,那编译内核的一个过程将是一个浩大工程,而且从实际考虑,工作量大得难以想象。我想你也不会愿意做这种事情吧。因此,个人建议,采用官方发布的内核升级包是很好的选择。
首先,我们对新安装的系统,将做一系列升级,包括软件和内核,这是很重要的步骤,(这方面的详细情况欢迎察看我另一篇关于升级方面的文章)。
在升级好所有软件后,基本的防火墙和配置都做好以后,我们开始优化一些细节配置,如果你是老系统,那么在作本问题及的一些操作和优化你系统之前,务必被备份所有数据到其他介质。
1、虚拟内存优化
首先查看虚拟内存的使用情况,使用命令
查看当前系统的内存使用情况。
一般来说,linux的物理内存几乎是完全used。这个和windows非常大的区别,它的内存管理机制将系统内存充分利用,并非windows无论多大的内存都要去使用一些虚拟内存一样。这点需要注意。
Linux下面虚拟内存的默认配置通过命令
可以查看,显示的三个数字是当前系统的:最小内存空白页、最低内存空白页和最高内存空白。
注意,这里系统使用虚拟内存的原则是:如果空白页数目低于最高空白页设置,则使用磁盘交换空间。当达到最低空白页设置时,使用内存交换(注:这个是我查看一些资料得来的,具体应用时还需要自己观察一下,不过这个不影响我们配置新的虚拟内存参数)。
内存一般以每页4k字节分配。最小内存空白页设置是系统中内存数量的2倍;最低内存空白页设置是内存数量的4倍;最高内存空白页设置是系统内存的6倍。这些值在系统启动时决定。
一般来讲在配置系统分配的虚拟内存配置上,我个人认为增大最高内存空白页是一种比较好的配置方式,以1G的内存配置为例:
可将原来的配置比例修改为:
2048 4096 6444
通过命令
因为增加了最高空白页配置,那么可以使内存更有效的利用。
2、硬盘优化
如果你是scsi硬盘或者是ide阵列,可以跳过这一节,这节介绍的参数调整只针对使用ide硬盘的服务器。
我们通过hdparm程序来设置IDE硬盘,
使用DMA和32位传输可以大幅提升系统性能。使用命令如下:
此命令将第一个IDE硬盘的PCI总线指定为32位,使用 -c 0参数来禁用32位传输。
在硬盘上使用DMA,使用命令:
关闭DMA可以使用 -d 0的参数。
更改完成后,可以使用hdparm来检查修改后的结果,使用命令:
为了确保设置的结果不变,使用命令:# /sbin/hdparm -k 1 /dev/hda
Hdparm命令的一些常用的其他参数功能
-g 显示硬盘的磁轨,磁头,磁区等参数。
By admin
read more