“陶朱公理财致富十二则”:
1、能识人,知人善恶,账目不负
2、能接纳,礼文接待,交关者众
3、能安业,厌故喜新,商贾大病
4、能整顿,货物整齐,夺人心目
5、能敏捷,犹豫不决,终归无成
6、能讨账,勤谨不怠,取讨自多
7、能用人,因才器使,任事有赖
8、能辩论,坐财有道,阐发愚蒙
9、能办货,置货不苛,添本便经
10、能知机,售贮随时,可称名称
11、能倡率,躬行以律,亲感自生
12、能远数,多寡宽紧,酌中而行
1、能识人,知人善恶,账目不负
2、能接纳,礼文接待,交关者众
3、能安业,厌故喜新,商贾大病
4、能整顿,货物整齐,夺人心目
5、能敏捷,犹豫不决,终归无成
6、能讨账,勤谨不怠,取讨自多
7、能用人,因才器使,任事有赖
8、能辩论,坐财有道,阐发愚蒙
9、能办货,置货不苛,添本便经
10、能知机,售贮随时,可称名称
11、能倡率,躬行以律,亲感自生
12、能远数,多寡宽紧,酌中而行
新版本的php 降低错误级别:
配置php.ini
打开php.ini,把display_errors = Off 改成 display_errors = On
然后找到 error_reporting 最好设置成
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
然后保存,重启apache
service php-fpm restart
Gracefully shutting down php-fpm . done
写到日志里面去的配置:
log_errors = On
error_log = /data/logs/php/php-cli-error.log
光是:Error_reporting(E_ALL);还不行,还得:ini_set('display_errors','On');
例子:
提示:
Warning: readfile(/tmp/up.php): failed to open stream: No such file or directory in /data/www/XXXX/up.php on line 54
于是整理好后:
下面是一个哥们写的博客:http://blog.linuxphp.org/archives/221/
php错误日志,适合异步调试和线上调试
ini_set("error_reporting",E_ALL ^ E_NOTICE);
ini_set("display_errors",off);
ini_set("log_errors",On);
ini_set("error_log","d:/c");
------------------附加两句解决错误的语句----------------------
@ini_set('memory_limit','500M');
@ini_set('max_execution_time', '180');
特别注意以下顺序才行,否则仍然不会报错的,哈哈:
如果是在linux terminal下运行,可以指定一个php.ini的配置文件,如下示例:
-c <path>|<file> Look for php.ini file in this directory
特别注意:
如果是包含关系的程序,包含好几个程序文件,如果再下级文件出现错误,而你仅仅在上级加入上面的两行,下级是不会报错的,于是还得在下级加入上面的两行才行,呵呵。真是麻烦,不过没办法,有时间线上故障,搬移线上服务,直接在线上调试的时候不得不这样,否则不会出现错误,很是郁闷,不知如何下手,有了这个麻烦事麻烦点,但是已经很好了!
小知识:获取ini里面的变量:
$_ENV['SERVER_TYPE'] = ini_get("phplib.servertype");
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这个是写在PHP.ini配置文件里的是:
display_errors = On
vi /usr/local/stow/php-5.2.5/lib/php.ini
error_get_last 救人老命,php就是高,哈哈 ,值得在线上调试的时候使用!
来自:来自:http://blog.csdn.net/shaobaojie/article/details/26934809
配置php.ini
打开php.ini,把display_errors = Off 改成 display_errors = On
然后找到 error_reporting 最好设置成
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
然后保存,重启apache
service php-fpm restart
Gracefully shutting down php-fpm . done
写到日志里面去的配置:
log_errors = On
error_log = /data/logs/php/php-cli-error.log
光是:Error_reporting(E_ALL);还不行,还得:ini_set('display_errors','On');
error_reporting(E_ALL ^ E_NOTICE);ini_set('display_errors','On');
例子:
提示:
Warning: readfile(/tmp/up.php): failed to open stream: No such file or directory in /data/www/XXXX/up.php on line 54
于是整理好后:
下面是一个哥们写的博客:http://blog.linuxphp.org/archives/221/
php错误日志,适合异步调试和线上调试
ini_set("error_reporting",E_ALL ^ E_NOTICE);
ini_set("display_errors",off);
ini_set("log_errors",On);
ini_set("error_log","d:/c");
------------------附加两句解决错误的语句----------------------
@ini_set('memory_limit','500M');
@ini_set('max_execution_time', '180');
特别注意以下顺序才行,否则仍然不会报错的,哈哈:
如果是在linux terminal下运行,可以指定一个php.ini的配置文件,如下示例:
-c <path>|<file> Look for php.ini file in this directory
特别注意:
如果是包含关系的程序,包含好几个程序文件,如果再下级文件出现错误,而你仅仅在上级加入上面的两行,下级是不会报错的,于是还得在下级加入上面的两行才行,呵呵。真是麻烦,不过没办法,有时间线上故障,搬移线上服务,直接在线上调试的时候不得不这样,否则不会出现错误,很是郁闷,不知如何下手,有了这个麻烦事麻烦点,但是已经很好了!
小知识:获取ini里面的变量:
$_ENV['SERVER_TYPE'] = ini_get("phplib.servertype");
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这个是写在PHP.ini配置文件里的是:
display_errors = On
vi /usr/local/stow/php-5.2.5/lib/php.ini
error_get_last 救人老命,php就是高,哈哈 ,值得在线上调试的时候使用!
来自:来自:http://blog.csdn.net/shaobaojie/article/details/26934809
vi 中 shift + * 跳转到函数的实现处
检讨一下自己,数据结构白学了,自己楞没做出来,晕!~今天想从两个数组里选出不同的来,自己倒腾了半天也不行,找了半天发现一个函数,真真的好用,(真是该挨打了,这个函数是从一篇06年的帖子里找到的,到现在还对很多函数不熟悉,真该找个时间好好看看),array_diff($q,$s),返回值是一个数组,是两个数组中不同的那些!
curl之CURLOPT_HTTPHEADER
单个
我们在不设置host的时候提交到虚拟主机后,会出现:
Tencent:/usr/local/tads/htdocs/mhxy2010hn.act/crontab # curl "http://172.23.129.11*/user_v3/freere*g.php?act_id=109353"
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /user_v3/freereg.php was not found on this server.</p>
</body></html>
设置host后就能找到了。
curl为我们用了CURLOPT_HTTPHEADER来做host的工作:
相当于:
这样一折腾,就ok了,呵呵!
其实这个主要是解决,在线上有host指向了,但是其他的需哟又需要这个host的域名,而ip不同的情况。
—————————————————————————————————————————————————
用Curl直接模拟Host如下:
以上摘录自:http://jackxiang.com/post/4022/
单个
<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: Bytes=0-50\n"));
?>
多个curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: Bytes=0-50\n"));
?>
<?php
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: Bytes=0-50\nOtherheader: stuff\n"));
?>
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Range: Bytes=0-50\nOtherheader: stuff\n"));
?>
我们在不设置host的时候提交到虚拟主机后,会出现:
Tencent:/usr/local/tads/htdocs/mhxy2010hn.act/crontab # curl "http://172.23.129.11*/user_v3/freere*g.php?act_id=109353"
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /user_v3/freereg.php was not found on this server.</p>
</body></html>
设置host后就能找到了。
curl为我们用了CURLOPT_HTTPHEADER来做host的工作:
function curl_post($host, $data)
{
$ch = curl_init();
$res= curl_setopt ($ch, CURLOPT_URL,$host);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER,array("Host: act.*.qq.com"));
$xyz = curl_exec ($ch);
//echo $xyz;
if ($xyz == NULL) {
return 0;
}
return $xyz;
}
{
$ch = curl_init();
$res= curl_setopt ($ch, CURLOPT_URL,$host);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER,array("Host: act.*.qq.com"));
$xyz = curl_exec ($ch);
//echo $xyz;
if ($xyz == NULL) {
return 0;
}
return $xyz;
}
相当于:
172.23.129.* act.*.qq.com
这样一折腾,就ok了,呵呵!
其实这个主要是解决,在线上有host指向了,但是其他的需哟又需要这个host的域名,而ip不同的情况。
—————————————————————————————————————————————————
用Curl直接模拟Host如下:
以上摘录自:http://jackxiang.com/post/4022/
在php中,抓取https的网站,会出现错误:
Warning: file_get_contents(https://localhost/myphp/a.asp) [function.file-get-contents]: failed to open stream: Invalid argument in I:\Web\myphp\a.php on line 16
打开php.ini找到 ;extension=php_openssl.dll ,去掉双引号";" ,重启web服务器即可。
apache的可以同时启用mod_ssl模块测试
Warning: file_get_contents(https://localhost/myphp/a.asp) [function.file-get-contents]: failed to open stream: Invalid argument in I:\Web\myphp\a.php on line 16
打开php.ini找到 ;extension=php_openssl.dll ,去掉双引号";" ,重启web服务器即可。
apache的可以同时启用mod_ssl模块测试
最近在写PHP程序时,需要使浏览器在https和http之间转化,上网搜索相关信息,无奈只有最近在写PHP程序时,需要使浏览器在https和http之间转化,上网搜索相关信息,无奈只有一篇介绍用ASP实现“在http和https之间转化”的文章,于是只好行写了用PHP实现http与https转化的代码。
如果网页使用https访问,在网页开头加入以下代码:
view plainprint?
1. <?php
2. //http转化为https
3. if ($_SERVER["HTTPS"]<>"on")
4. {
5. $xredir="https://".$_SERVER["SERVER_NAME"].
6. $_SERVER["REQUEST_URI"];
7. header("Location: ".$xredir);
8. }
9. ?>
<?php //http转化为https if ($_SERVER["HTTPS"]<>"on") { $xredir="https://".$_SERVER["SERVER_NAME"]. $_SERVER["REQUEST_URI"]; header("Location: ".$xredir); } ?>
如果网页使用http访问,在网页开头加入以下代码:
view plainprint?
1. <?php
2. //https转化为http
3. if ($_SERVER["HTTPS"]=="on")
4. {
5. $xredir="http://".$_SERVER["SERVER_NAME"].
6. $_SERVER["REQUEST_URI"];
7. header("Location: ".$xredir);
8. }
9. ?>
如果网页使用https访问,在网页开头加入以下代码:
view plainprint?
1. <?php
2. //http转化为https
3. if ($_SERVER["HTTPS"]<>"on")
4. {
5. $xredir="https://".$_SERVER["SERVER_NAME"].
6. $_SERVER["REQUEST_URI"];
7. header("Location: ".$xredir);
8. }
9. ?>
<?php //http转化为https if ($_SERVER["HTTPS"]<>"on") { $xredir="https://".$_SERVER["SERVER_NAME"]. $_SERVER["REQUEST_URI"]; header("Location: ".$xredir); } ?>
如果网页使用http访问,在网页开头加入以下代码:
view plainprint?
1. <?php
2. //https转化为http
3. if ($_SERVER["HTTPS"]=="on")
4. {
5. $xredir="http://".$_SERVER["SERVER_NAME"].
6. $_SERVER["REQUEST_URI"];
7. header("Location: ".$xredir);
8. }
9. ?>
直接用file_get_contents,会报错;
程序代码$url = (https://xxx.com");
file_get_contents($url);
错误:
程序代码Warning: file_get_contents(https://xxx.com) [function.file-get-contents]: failed to open stream: No such file or directory in D:wampwwwgrabber_clientindex.php on line 3
用curl的方式是可以的:
程序代码$url = (https://xxx.com);
重点是以下两句:
=============================================================
今天项目上线,使用php的curl模块通过https访问某个文件时出错:
这是我日志里记录的信息:
2009-05-11 11:10:23 请求音频列表,错误号:60--错误描述:SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
哎,项目上线急阿,请教同事得知修改如下代码即可,添加黑体字部分就好了。
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
虽然有些简单,但是还是写下来吧,以后好作参考。
// 对HTTPS网站的访问,用到了扩展库curl
要在PHP.ini中对curl的extension前面的分号去掉,可能还要把openssl的扩展同样打开
请问如何配置curl才能支持获取https网站内容或者向https的网站提交数据 ?
Linux下编译php的时候,把openssl支持一块编译进去
--with-openssl[=DIR] Include OpenSSL support (requires OpenSSL >= 0.9.6)
--with-openssl-dir[=DIR] FTP: openssl install prefix
--with-imap-ssl[=DIR] IMAP: Include SSL support. DIR is the OpenSSL install prefix
--with-openssl-dir[=DIR] SNMP: openssl install prefix
我一般自己编译,如果你的Linux发行版带有php5-openssl包,安装好就行了
如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:
curl https://that.secure.server.com
window下的https 通过curl访问的配置:
http://618119.com/archives/2007/10/26/16.html
http://hi.baidu.com/kkwtre/blog/item/3d20fbfb9a90da204e4aea01.html
http://www.enet.com.cn/article/2011/0617/A20110617874334.shtml
=-----------------------------------------------------------------------------------------=
PHP CURL HTTPS POST:
程序代码$url = (https://xxx.com");
file_get_contents($url);
错误:
程序代码Warning: file_get_contents(https://xxx.com) [function.file-get-contents]: failed to open stream: No such file or directory in D:wampwwwgrabber_clientindex.php on line 3
用curl的方式是可以的:
程序代码$url = (https://xxx.com);
重点是以下两句:
=============================================================
今天项目上线,使用php的curl模块通过https访问某个文件时出错:
这是我日志里记录的信息:
2009-05-11 11:10:23 请求音频列表,错误号:60--错误描述:SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
哎,项目上线急阿,请教同事得知修改如下代码即可,添加黑体字部分就好了。
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout);
虽然有些简单,但是还是写下来吧,以后好作参考。
// 对HTTPS网站的访问,用到了扩展库curl
要在PHP.ini中对curl的extension前面的分号去掉,可能还要把openssl的扩展同样打开
请问如何配置curl才能支持获取https网站内容或者向https的网站提交数据 ?
Linux下编译php的时候,把openssl支持一块编译进去
--with-openssl[=DIR] Include OpenSSL support (requires OpenSSL >= 0.9.6)
--with-openssl-dir[=DIR] FTP: openssl install prefix
--with-imap-ssl[=DIR] IMAP: Include SSL support. DIR is the OpenSSL install prefix
--with-openssl-dir[=DIR] SNMP: openssl install prefix
我一般自己编译,如果你的Linux发行版带有php5-openssl包,安装好就行了
如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:
curl https://that.secure.server.com
window下的https 通过curl访问的配置:
http://618119.com/archives/2007/10/26/16.html
http://hi.baidu.com/kkwtre/blog/item/3d20fbfb9a90da204e4aea01.html
http://www.enet.com.cn/article/2011/0617/A20110617874334.shtml
=-----------------------------------------------------------------------------------------=
PHP CURL HTTPS POST:
如何设置自己的共享库目录?/etc/ld.so.conf
Cache与Store jackxiang 2010-1-27 20:29
如何设置自己的共享库目录?/etc/ld.so.conf下增加了路径,还执行了ldconfig后,还提示没找到*.so?
真是烦啊,以前也没在其他版本的linux下搞过这东西,不会是magic的问题吧?
搜索了一天,都是怎么教人设定共享库的啊
/etc/ld.so.conf
是添加一行:
/my/lib
此目录已经建立了,而且把相关的so文件也放进去了
接着
#ldconfig
在安装东西,还是提示没有找到那几个so文件
重起也不行,但要是把这些so拷到/usr/lib下就不会出现说找不到它们
大老们具体说你们是怎么解决这个自设共享库目录的????
谢了先~!~@!
缘起:
同样叫回忆未来,难免看看他的文章,实验实验,在实验
基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[原创],发现:
[root@localhost httpsqs-1.1]# /usr/bin/httpsqs -h
/usr/bin/httpsqs: error while loading shared libraries: libtokyocabinet.so.9: cannot open shared object file: No such file or directory
于是看留言也有这个问题:
# httpsqs
httpsqs: error while loading shared libraries: libtokyocabinet.so.9: cannot open shared object file: No such file or directory
安装完后出现这个哦。centos5.3 32位系统
张宴 回复于 2009-12-31 17:39
这个是tokyocabinet动态链接库找不到的问题。你可以按照以下步骤解决:
1、确认tokyocabinet是否安装成功(查看/usr/local/lib/libtokyocabinet.so.9文件是否存在)
2、如果存在,还是报这个错误,将/usr/local/lib添加到/etc/ld.so.conf文件中,然后在命令行执行/sbin/ldconfig,最后启动httpsqs
这么回事:
[root@localhost httpsqs-1.1]# vi /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib
我的原则就是:从来在模仿,从未被超越,呵呵。
HTTPSQS 如队列和出队列:
http://blog.s135.com/httpsqs/#entrymore
真是烦啊,以前也没在其他版本的linux下搞过这东西,不会是magic的问题吧?
搜索了一天,都是怎么教人设定共享库的啊
/etc/ld.so.conf
是添加一行:
/my/lib
此目录已经建立了,而且把相关的so文件也放进去了
接着
#ldconfig
在安装东西,还是提示没有找到那几个so文件
重起也不行,但要是把这些so拷到/usr/lib下就不会出现说找不到它们
大老们具体说你们是怎么解决这个自设共享库目录的????
谢了先~!~@!
缘起:
同样叫回忆未来,难免看看他的文章,实验实验,在实验
基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[原创],发现:
[root@localhost httpsqs-1.1]# /usr/bin/httpsqs -h
/usr/bin/httpsqs: error while loading shared libraries: libtokyocabinet.so.9: cannot open shared object file: No such file or directory
于是看留言也有这个问题:
# httpsqs
httpsqs: error while loading shared libraries: libtokyocabinet.so.9: cannot open shared object file: No such file or directory
安装完后出现这个哦。centos5.3 32位系统
张宴 回复于 2009-12-31 17:39
这个是tokyocabinet动态链接库找不到的问题。你可以按照以下步骤解决:
1、确认tokyocabinet是否安装成功(查看/usr/local/lib/libtokyocabinet.so.9文件是否存在)
2、如果存在,还是报这个错误,将/usr/local/lib添加到/etc/ld.so.conf文件中,然后在命令行执行/sbin/ldconfig,最后启动httpsqs
这么回事:
[root@localhost httpsqs-1.1]# vi /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib
[root@localhost httpsqs-1.1]# ldconfig
[root@localhost httpsqs-1.1]# /usr/bin/httpsqs -h
--------------------------------------------------------------------------------------------------
HTTP Simple Queue Service - httpsqs v1.1
Author: Zhang Yan (http://blog.s135.com), E-mail: net@s135.com
This is free software, and you are welcome to modify and redistribute it under the New BSD License
-l <ip_addr> interface to listen on, default is 0.0.0.0
-p <num> TCP port number to listen on (default: 1218)
-x <path> database directory (example: /opt/httpsqs/data)
-t <second> timeout for an http request (default: 1)
-d run as a daemon
-h print this help and exit
Use command "killall httpsqs", "pkill httpsqs" and "kill PID of httpsqs" to stop httpsqs.
Please note that don't use the command "pkill -9 httpsqs" and "kill -9 PID of httpsqs"!
Please visit "http://code.google.com/p/httpsqs" for more help information.
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
HTTP Simple Queue Service - httpsqs v1.1
Author: Zhang Yan (http://blog.s135.com), E-mail: net@s135.com
This is free software, and you are welcome to modify and redistribute it under the New BSD License
-l <ip_addr> interface to listen on, default is 0.0.0.0
-p <num> TCP port number to listen on (default: 1218)
-x <path> database directory (example: /opt/httpsqs/data)
-t <second> timeout for an http request (default: 1)
-d run as a daemon
-h print this help and exit
Use command "killall httpsqs", "pkill httpsqs" and "kill PID of httpsqs" to stop httpsqs.
Please note that don't use the command "pkill -9 httpsqs" and "kill -9 PID of httpsqs"!
Please visit "http://code.google.com/p/httpsqs" for more help information.
--------------------------------------------------------------------------------------------------
我的原则就是:从来在模仿,从未被超越,呵呵。
HTTPSQS 如队列和出队列:
curl "http://localhost:1218/?name=your_queue_name&opt=put&data=经过URL编码的文本消息"
curl "http://localhost:1218/?charset=utf-8&name=your_queue_name&opt=get"
curl "http://localhost:1218/?charset=utf-8&name=your_queue_name&opt=get"
http://blog.s135.com/httpsqs/#entrymore
vi /etc/security/limits.conf
[codes=php]
# End of file
* soft nofile 65535
* hard nofile 65535
* soft nofile 65535
* hard nofile 65535
[/codes]
1,说明:
ulimit用于shell启动进程所占用的资源.
2,类别:
shell内建命令
3,语法格式:
ulimit [-acdfHlmnpsStvw] [size]
4,参数介绍:
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
5.举例
在Linux下写程序的时候,如果程序比较大,经常会遇到“段错误”(segmentation fault)这样的问题,这主要就是由于Linux系统初始的堆栈大小(stack size)太小的缘故,一般为10M。我一般把stack size设置成256M,这样就没有段错误了!命令为:
ulimit -s 262140
如果要系统自动记住这个配置,就编辑/etc/profile文件,在 “ulimit -S -c 0 > /dev/null 2>&1”行下,添加“ulimit -s 262140”,保存重启系统就可以了!
阅读全文
[codes=php]
# End of file
* soft nofile 65535
* hard nofile 65535
* soft nofile 65535
* hard nofile 65535
[/codes]
1,说明:
ulimit用于shell启动进程所占用的资源.
2,类别:
shell内建命令
3,语法格式:
ulimit [-acdfHlmnpsStvw] [size]
4,参数介绍:
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
5.举例
在Linux下写程序的时候,如果程序比较大,经常会遇到“段错误”(segmentation fault)这样的问题,这主要就是由于Linux系统初始的堆栈大小(stack size)太小的缘故,一般为10M。我一般把stack size设置成256M,这样就没有段错误了!命令为:
ulimit -s 262140
如果要系统自动记住这个配置,就编辑/etc/profile文件,在 “ulimit -S -c 0 > /dev/null 2>&1”行下,添加“ulimit -s 262140”,保存重启系统就可以了!
阅读全文
中国买软件的那么多,都是正版?写软件的都不用正版。。。你怎么让别人付钱买你写的软件?当然,你在单位里,帮单位写程序那是例外,反正你也不当成一个产品来卖的。我也只是逐步在转为正版而己。好软件一定是用正版写的吗?做的不够好,别人用都不会用了。谁来破解你。
日志也是用户应该注意的地方之一。不要低估日志文件对网络安全的重要作用,因为日志文件能够详细记录系统每天发生的各种各样的事件。用户可以通过日志文件检查错误产生的原因,或者在受到攻击和黑客入侵时追踪攻击者的踪迹。
日志的两个比较重要的作用是:审核和监测。配置好的Linux的日志非常强大。对于Linux系统而言,所有的日志文件都在/var/log下。默认情况下,Linux的日志文件已经足够强大,但没有记录FTP的活动。用户可以通过修改/etc/ftpacess让系统记录FTP的一切活动。
Linux日志系统
日志对于系统的安全来说非常重要,它记录了系统每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。日志主要的功能是审计和监测。它还可以实时地监测系统状态,监测和追踪侵入者。
Linux系统一般有3个主要的日志子系统:连接时间日志、进程统计日志和错误日志。
连接时间日志
连接时间日志由多个程序执行,把记录写入到/var/og/wtmp和/var/run/utmp。ogin等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。
进程统计日志
进程统计日志由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个记录。进程统计的目的是为系统中的基本服务提供命令使用统计。
错误日志
错误日志由sysogd(8)执行。各种系统守护进程、用户程序和内核通过sysog(3)向文件/var/og/messages报告值得注意的事件。另外还有许多UNIX类程序创建日志,像HTTP和FTP这样提供网络服务的服务器也有详细的日志。
日志的两个比较重要的作用是:审核和监测。配置好的Linux的日志非常强大。对于Linux系统而言,所有的日志文件都在/var/log下。默认情况下,Linux的日志文件已经足够强大,但没有记录FTP的活动。用户可以通过修改/etc/ftpacess让系统记录FTP的一切活动。
Linux日志系统
日志对于系统的安全来说非常重要,它记录了系统每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。日志主要的功能是审计和监测。它还可以实时地监测系统状态,监测和追踪侵入者。
Linux系统一般有3个主要的日志子系统:连接时间日志、进程统计日志和错误日志。
连接时间日志
连接时间日志由多个程序执行,把记录写入到/var/og/wtmp和/var/run/utmp。ogin等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。
进程统计日志
进程统计日志由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct)中写一个记录。进程统计的目的是为系统中的基本服务提供命令使用统计。
错误日志
错误日志由sysogd(8)执行。各种系统守护进程、用户程序和内核通过sysog(3)向文件/var/og/messages报告值得注意的事件。另外还有许多UNIX类程序创建日志,像HTTP和FTP这样提供网络服务的服务器也有详细的日志。
淘宝上搜索:温度控制板
http://search1.taobao.com/browse/0/n-7---------------------------------------------g,z3blnsf73dlmnmhf----------------40--coefp-0-all-0.htm?ssid=e-p1-s15&at_topsearch=1
http://item.taobao.com/auction/item_detail-0db1-696b052bf7e4ac4f8251e28fcd26700d.htm?cm_cat=0
http://search1.taobao.com/browse/0/n-7---------------------------------------------g,z3blnsf73dlmnmhf----------------40--coefp-0-all-0.htm?ssid=e-p1-s15&at_topsearch=1
http://search1.taobao.com/browse/0/n-7---------------------------------------------g,z3blnsf73dlmnmhf----------------40--coefp-0-all-0.htm?ssid=e-p1-s15&at_topsearch=1
http://item.taobao.com/auction/item_detail-0db1-696b052bf7e4ac4f8251e28fcd26700d.htm?cm_cat=0
这个架构是目前我个人觉得比较稳妥并且最方便的架构,易于多数人接受:
前端的lvs和squid,按照安装方法,把epoll打开,配置文件照搬,基本上问题不多。
这个架构和app_squid架构的区别,也是关键点就是:加入了一级中层代理,中层代理的好处实在太多了:
1、gzip压缩
压缩可以通过nginx做,这样,后台应用服务器不管是apache、resin、lighttpd甚至iis或其他古怪服务器,都不用考虑压缩的功能问题。
2、负载均衡和故障屏蔽
nginx可以作为负载均衡代理使用,并有故障屏蔽功能,这样,根据目录甚至一个正则表达式来制定负载均衡策略变成了小case。
3、方便的运维管理,在各种情况下可以灵活制订方案。
例如,如果有人用轻量级的ddos穿透squid进行攻击,可以在中层代理想办法处理掉;访问量和后台负载突变时,可以随时把一个域名或一个目录的请求扔入二级cache服务器;可以很容易地控制no-cache和expires等header。等等功能。。。
4、权限清晰
这台机器就是不写程序的维护人员负责,程序员一般不需要管理这台机器,这样假如出现故障,很容易能找到正确的人。
对于应用服务器和数据库服务器,最好是从维护人员的视线中消失,我的目标是,这些服务只要能跑得起来就可以了,其它的事情全部可以在外部处理掉。
这个架构基于squid、nginx和lvs等技术,从架构上对bbs进行全面优化和保护,有如下特点:
1、高性能:所有的点击基本上全部由前端缓存负责,提供最快速的处理。
2、高保障度:不需考虑应用程序稳定与否、程序语言是何种、数据库是何种,都能从架构上保证稳定。
3、高可用性:对应用程序的修改达到最简化:在程序的某些地方加入清缓存的语句即可,当然还需要做页面静态化的工作和统计工作。
首先看图,这个图比较大:
这个架构的特点和一些流程的说明:
1、主域名和图片域名分离
域名分离可以使流量分离,缓存策略分离等等,好处诸多。bbs初期一定要做好规划,将图片用另外的域名独立服务,即使没有足够机器,域名也要先分开。另外,图片服务器可以使用有别于主域名的另一个域名,一个好处是可以减少读取cookie对图片服务器的压力,另一个是提高安全性,避免cookie泄露。
2、使用LVS作为前端、二级代理和数据库的访问入口
使用LVS作为入口,比其他任何一种方式都来得更优质。首先LVS的负载能力很强,因为它工作在网络协议的第4层,使用虚拟ip技术,所以它本身并不担负任何流量的处理,仅仅是一个封包转发的功能;第二,LVS的配置相对简单而且稳定,一般去调整的几率比较低,也减少了因人为等因素而出现故障;第三,LVS可以处理任何端口的负载均衡,所以它基本可以做所有服务的负载均衡和容错。在这个架构中,除了处理http的80端口之外,LVS也处理了数据库mysql的3306端口,在数据库这个应用中是采用的双机热备策略。
3、使用nginx+squid作为最前端的缓存组合
在这个架构中,是最能体现app_nginx_squid_nginx架构的优势的。在这个架构中的bbs运行在缓存上,用户每发布一张帖子,都需要使用purge指令清除该帖子的缓存,如果是squid在最前端,那么每次发布一张帖子,都需要在所有的squid中调用purge指令,这样在机器比较多的时候,purge将成为一个巨大的压力。
所以在这里将nginx放在最前端并使用手工url_hash的方式分流,将经常需要purge的帖子页面和列表页面按一个url对应一台squid的策略,分布到各台squid上,并提供了一台或一组backup的squid,个别squid出现异常时将自动使用backup的机器继续提供一段时间的服务直到其正常。在这样的架构下,purge就不再是关键问题,因为一个url只会对应到一台机器上,所以purge的时候,后端app_server找到对应的机器就可以了。
可以看到在前端中还有一台nginx(purge)的机器,这台机器是专用于purge的,只要发送purge指令和需要清除的url到这台机器,就可以找到相应的服务器并清除缓存了。另外,purge时还需要清理backup机器上的缓存,所以无论前端机器增加到多少,purge指令只会在2台机器上执行,如果backup机器使用到2-3台,purge指令就会在3-4台机器上执行,仍然在可接受范围之内。
nginx作为前端,另有的好处:
1/使用nginx的日志统计点击量非常方便
2/nginx也可作为缓存,一般可以直接负责favicon.ico和logo等固定的小图片
4、基于nginx的中层代理
nginx中层代理的优势,在:
nginx和squid配合搭建的web服务器前端系统
这篇文章中有解释。
在这个架构中,假如后端的app_server上把帖子页和列表页直接生成了静态页面,那么使用中层代理再做一次url_hash,将可以解决后端app_server的硬盘容量的压力,但是如果使用到url_hash的话,那做容错就相对麻烦了。所以建议不要采用生成静态页的方式,后端的压力一般不会非常的大,所以没有必要生成静态页。假如前端squid的命中率实在太低下,造成大量穿透,可以考虑使用二级代理暂顶。
5、基于LVS的数据库双机热备
在这个架构中,因为大量的并发和访问量都由前端的缓存处理掉了,所以后端的mysql主要压力来自于数据的写入,所以压力并不是非常大,并且负载比较稳定,一般不会随着访问量上升而提高过快,估计目前一台64位的机器,加满内存并使用高速的硬盘,前端负载数亿访问量时数据库都不会出现性能问题。在数据库这方面应主要考虑故障恢复,因为数据库崩溃的话,按照一般使用备份恢复的做法,耗时很长而且难免丢失数据,是很棘手的问题。使用双机热备的方案,出现故障时首先可由一台时刻同步着的备用数据库即刻充当主数据库,然后卸下的数据库可以有充分的时间对其进行维修,所以是个很安全有效的办法。
当然,数据库的优化还是要细心做的,参考:
mysql性能的检查和调优方法
细心地调一遍,性能会好很多。
6、图片服务器
图片服务器我在这个架构中没有特别详细的介绍,在大型的bbs系统下,图片常常会出现容灾现象——图片数量严重超过了单台前端服务器容纳能力,导致前端服务器命中率低下。处理容灾问题也是非常棘手的,往后会有更详细的介绍。
7、简单的点击量统计办法
1/使用js的script标签访问另一(台)组服务器的空文件,然后定期向数据库更新
2/在前端的nginx上直接开启日志功能,按需要统计点击量的链接规则进行记录,然后定期更新数据
1、高性能:所有的点击基本上全部由前端缓存负责,提供最快速的处理。
2、高保障度:不需考虑应用程序稳定与否、程序语言是何种、数据库是何种,都能从架构上保证稳定。
3、高可用性:对应用程序的修改达到最简化:在程序的某些地方加入清缓存的语句即可,当然还需要做页面静态化的工作和统计工作。
首先看图,这个图比较大:
这个架构的特点和一些流程的说明:
1、主域名和图片域名分离
域名分离可以使流量分离,缓存策略分离等等,好处诸多。bbs初期一定要做好规划,将图片用另外的域名独立服务,即使没有足够机器,域名也要先分开。另外,图片服务器可以使用有别于主域名的另一个域名,一个好处是可以减少读取cookie对图片服务器的压力,另一个是提高安全性,避免cookie泄露。
2、使用LVS作为前端、二级代理和数据库的访问入口
使用LVS作为入口,比其他任何一种方式都来得更优质。首先LVS的负载能力很强,因为它工作在网络协议的第4层,使用虚拟ip技术,所以它本身并不担负任何流量的处理,仅仅是一个封包转发的功能;第二,LVS的配置相对简单而且稳定,一般去调整的几率比较低,也减少了因人为等因素而出现故障;第三,LVS可以处理任何端口的负载均衡,所以它基本可以做所有服务的负载均衡和容错。在这个架构中,除了处理http的80端口之外,LVS也处理了数据库mysql的3306端口,在数据库这个应用中是采用的双机热备策略。
3、使用nginx+squid作为最前端的缓存组合
在这个架构中,是最能体现app_nginx_squid_nginx架构的优势的。在这个架构中的bbs运行在缓存上,用户每发布一张帖子,都需要使用purge指令清除该帖子的缓存,如果是squid在最前端,那么每次发布一张帖子,都需要在所有的squid中调用purge指令,这样在机器比较多的时候,purge将成为一个巨大的压力。
所以在这里将nginx放在最前端并使用手工url_hash的方式分流,将经常需要purge的帖子页面和列表页面按一个url对应一台squid的策略,分布到各台squid上,并提供了一台或一组backup的squid,个别squid出现异常时将自动使用backup的机器继续提供一段时间的服务直到其正常。在这样的架构下,purge就不再是关键问题,因为一个url只会对应到一台机器上,所以purge的时候,后端app_server找到对应的机器就可以了。
可以看到在前端中还有一台nginx(purge)的机器,这台机器是专用于purge的,只要发送purge指令和需要清除的url到这台机器,就可以找到相应的服务器并清除缓存了。另外,purge时还需要清理backup机器上的缓存,所以无论前端机器增加到多少,purge指令只会在2台机器上执行,如果backup机器使用到2-3台,purge指令就会在3-4台机器上执行,仍然在可接受范围之内。
nginx作为前端,另有的好处:
1/使用nginx的日志统计点击量非常方便
2/nginx也可作为缓存,一般可以直接负责favicon.ico和logo等固定的小图片
4、基于nginx的中层代理
nginx中层代理的优势,在:
nginx和squid配合搭建的web服务器前端系统
这篇文章中有解释。
在这个架构中,假如后端的app_server上把帖子页和列表页直接生成了静态页面,那么使用中层代理再做一次url_hash,将可以解决后端app_server的硬盘容量的压力,但是如果使用到url_hash的话,那做容错就相对麻烦了。所以建议不要采用生成静态页的方式,后端的压力一般不会非常的大,所以没有必要生成静态页。假如前端squid的命中率实在太低下,造成大量穿透,可以考虑使用二级代理暂顶。
5、基于LVS的数据库双机热备
在这个架构中,因为大量的并发和访问量都由前端的缓存处理掉了,所以后端的mysql主要压力来自于数据的写入,所以压力并不是非常大,并且负载比较稳定,一般不会随着访问量上升而提高过快,估计目前一台64位的机器,加满内存并使用高速的硬盘,前端负载数亿访问量时数据库都不会出现性能问题。在数据库这方面应主要考虑故障恢复,因为数据库崩溃的话,按照一般使用备份恢复的做法,耗时很长而且难免丢失数据,是很棘手的问题。使用双机热备的方案,出现故障时首先可由一台时刻同步着的备用数据库即刻充当主数据库,然后卸下的数据库可以有充分的时间对其进行维修,所以是个很安全有效的办法。
当然,数据库的优化还是要细心做的,参考:
mysql性能的检查和调优方法
细心地调一遍,性能会好很多。
6、图片服务器
图片服务器我在这个架构中没有特别详细的介绍,在大型的bbs系统下,图片常常会出现容灾现象——图片数量严重超过了单台前端服务器容纳能力,导致前端服务器命中率低下。处理容灾问题也是非常棘手的,往后会有更详细的介绍。
7、简单的点击量统计办法
1/使用js的script标签访问另一(台)组服务器的空文件,然后定期向数据库更新
2/在前端的nginx上直接开启日志功能,按需要统计点击量的链接规则进行记录,然后定期更新数据
系统日志
系统的日志记录提供了对系统活动的详细审计,这些日志用于评估、审查系统的运行环境和各种操作。对于一般情况 ,日志记录包括记录用户登录时间、登录地点、进行什么操作等内容,如果使用得当,日志记录能向系统管理员提供有关危害 安全的侵害或入侵试图等非常有用的信息。
BSD提供了详细的各种日志记录,以及有关日志的大量工具和实用程序。这些审计记录通常由程序自动产生,是缺 省设置的一部分,能够帮助Unix管理员来寻找系统中存在的问题,对系统维护十分有用。还有另一些日志记录,需要管理 员进行设置才能生效。大部分日志记录文件被保存在/var/log目录中,在这个目录中除了保存系统生成日志之外,还 包括一些应用软件的日志文件。当然/var目录下的其他子目录中也会记录下一些其他种类的日志记录文件,这依赖于具体 的应用程序的设置。
[code]$ ls /var/log
adduser maillog.5.gz sendmail.st.1
dmesg.today maillog.6.gz sendmail.st.10
dmesg.yesterday maillog.7.gz sendmail.st.2
httpd-access.log messages sendmail.st.3
httpd-error.log messages.0.gz sendmail.st.4
kerberos.log messages.1.gz sendmail.st.5
lastlog messages.2.gz sendmail.st.6
lpd-errs messages.3.gz sendmail.st.7
maillog messages.4.gz sendmail.st.8
maillog.0.gz messages.5.gz sendmail.st.9
maillog.1.gz news setuid.today
maillog.2.gz ppp.log setuid.yesterday
maillog.3.gz sendmail.st userlog
maillog.4.gz sendmail.st.0 wtmp [/code]
系统登录日志
系统会保存每个用户的登录记录,这些信息包括这个用户的名字、登录起始结束时间以及从何处登录入系统的等等。 它们被保存到/var/log/lastlog、/var/log/wtmp和/var/run/utmp文件中,这 三个文件以二进制格式保存了这些用户的登录数据。
其中/var/run/utmp文件中保存的是当前系统用户的登录记录,因此这个文件会随着用户进入和离开系 统而不断变化,而它也不会为用户保留很长的记录,只保留当时联机的用户记录。系统中需要查询当前用户状态的程序,如 who、w等就需要访问这个文件。utmp可能不包括所有精确的信息,某些突发错误会终止用户登录会话,当没有及时更新 utmp记录,因此utmp的记录不是百分之百的可以信赖的。
而/var/log/wtmp保存了所有的登录、退出信息,以及系统的启动、停机记录,因此随着系统正常运行 时间的增加,它的大小也会越来越大,增加的速度依赖于系统用户登录次数。因此可以利用这个日志用来查看用户的登录记录 ,last命令就通过访问这个文件来获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端 tty或时间显示相应的记录。ac命令同样也使用wtmp中的数据产生报告,但它的显示方式不同。它可以根据用户(ac -p) ,或按日期(ap -d)显示信息,这样管理员就能获得一些非常有用的反常信息,如一个平时不太活跃的用户 突然登录并连接很长时间,就有理由怀疑这个帐户被窃取了。
注意:X Window由于会同时打开多个终端窗口,因此会使得用户登录连接时间迅速增加。
lastlog文件保存的是每个用户的最后一次登录信息,包括登录时间和地点,这个文件一般只有login程 序使用,通过用户的UID,来在lastlog文件中查找相应记录,然后报告其最后一次登录时间和终端tty。然后, login程序就使用新的记录更新这个文件。
这三个文件是使用二进制格式保存的,因此不能直接查看其中的内容,而需要使用相关命令。当然也可以通过程序来 访问这三个文件,这就需要了解它们使用的数据结构。其中utmp和wtmp使用同样的数据结构,而lastlog使用 另外一个数据结构,可使用man来进行查询具体结构。如果系统的用户数量很多,那么wtmp文件的大小会迅速增加,在 系统/var文件系统空间紧张的情况下,就导致这个文件系统被占满。系统不会主动控制这个文件的大小,因此这需要管理 员的干预,需要手工及时清除,或编写shell脚本定期保存和清除。
系统还可以提供记账统计的功能,要打开系统的计账功能,需要使用accton命令,注意,accton必须跟 随记账日志文件的名字作参数,而不带参数的accton将关闭记账进程。
当打开了记账功能后,可以使用lastcomm来检查在系统中执行的所有命令的信息,包括执行的命令、执行命 令的用户、用户使用的终端tty,命令完成的时间,执行时间等。从lastcomm的输出也能帮助管理员检查可能的入 侵行为。
此外可以使用ac命令来查询用户的连接时间的报告,sa命令来查询用户消耗的处理器时间的报告。
Syslog日志记录
最初,syslog只是为了sendmail而设计的消息日志工具,由于它提供了一个中心控制点,使得sys log非常好用和易配置,因此当今很多程序都使用syslog来发送它们的记录信息。syslog是一种强大的日志记 录方式,不但可以将日志保存在本地文件中,还可以根据设置将syslog记录发送到网络上的另一台主机中。
支持syslog方式的系统启动了syslogd守护进程,这个程序从本地的Unix套接字和监听在514端 口(UDP)上的Internet套接字,来获得syslog的记录。本机中进程使用syslog系统调用发送来sy slog记录,然后由syslogd将他们保存到正确的文件或发送到网络上另一台运行syslogd主机中去。
syslogd的设置文件为/etc/syslog.conf,定义消息对应的相应目标,一条消息可以达到多 个目标,也可能被忽略。
[code]# $Id: syslog.conf,v 1.9 1998/10/14 21:59:55 nate Exp $
#
# Spaces are NOT valid fIEld separators in this file.
# Consult the syslog.conf(5) manpage.
*.err;kern.debug;auth.notice;mail.crit /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
mail.info /var/log/maillog
lpr.info /var/log/lpd-errs
cron.* /var/cron/log
*.err root
*.notice;news.err root
*.alert root
*.emerg *
!ppp
*.* /var/log/ppp.log [/code]
syslog.conf的配置可以分为两个部分,第一部分用于区分消息的类型,另一个用于设置消息发送的目的 地。通常,消息的类型包括消息的产生者,例如kern表示内核产生的消息,auth表示认证系统产生的消息,等等,还 包括消息的级别,例如emerg表示非常重要的紧急信息,alert表示系统告警状态,crit表示关键状态,err 表示一般的错误信息,warning表示警告信息,notice表示提示信息,但还不是错误,info表示一般信息, debug表示调试信息等,因此一个消息的类型可能为:kern.debug、mail.info等,但页可以使用通 配符*进行匹配。
从上面的syslog.conf的设置可以看出,系统正常运行中的很多重要的信息,如错误信息*.err、内 核调试信息kern.debuf、认证报告auth.notice等被直接输出的console中,另外还有一些比较 重要的信息被输出到/var/log/messages文件中,发送邮件的记录将被保存在/var/log/mail log文件中,打印记录为/var/log/lpd-errs等,使得管理员可以根据这些文件来查询相关记录,进行统 计或寻找系统问题。其中使用syslog记录的messages文件中包括root登录的信息、用户多次登录失败的尝 试等对系统安全相当重要的信息,因此也是系统遭受攻击之后,攻击者会根据syslog.conf中设置试图清除相关文 件中自己的登录记录。因此对于安全性要求更高的系统,可以尝试将syslog发送到另一台计算机上,或者输出到一些设 备文件中,如在打印机上立即打印输出。
系统会使用newsyslog定期检查syslog输出的messages文件和maillog文件,将旧数 据压缩保存为备份文件,如messages.1.gz等。
其他日志
除了系统登录记录和syslog记录之外,其他还有一些应用程序使用自己的记录方式。
系统每天都会自动检查系统的安全设置,包括对SetUID、SetGID的执行文件的检查,其结果将输出到/ var/log/security.today文件中,管理员可以与/var/log/security.yeste rday文件对比,寻找系统安全设置的变化。
如果系统使用sendmail,那么sendmail.st文件中以二进制形式保存了sendmail的统计 信息。
在系统启动的时候,就将内核的检测信息输出到屏幕上,这些信息可以帮助用户分析系统中的硬件状态。一般使用d mesg命令来查看最后一次启动时输出的这个检测信息。这个信息也被系统保存在/var/log/dmesg.tod ay文件中,系统中同时也存在另一个文件dmesg.yesterday,是上次的启动检测信息,对比这两个文件,就 可以了解到系统硬件和内核配置的变化。
lpd-errs记录了系统中lpd产生的错误信息。
此外,各种shell还会记录用户使用的命令历史,它使用用户主目录下的文件来记录这些命令历史,通常这个文 件的名字为.history(csh),或.bash-history等。
系统的日志记录提供了对系统活动的详细审计,这些日志用于评估、审查系统的运行环境和各种操作。对于一般情况 ,日志记录包括记录用户登录时间、登录地点、进行什么操作等内容,如果使用得当,日志记录能向系统管理员提供有关危害 安全的侵害或入侵试图等非常有用的信息。
BSD提供了详细的各种日志记录,以及有关日志的大量工具和实用程序。这些审计记录通常由程序自动产生,是缺 省设置的一部分,能够帮助Unix管理员来寻找系统中存在的问题,对系统维护十分有用。还有另一些日志记录,需要管理 员进行设置才能生效。大部分日志记录文件被保存在/var/log目录中,在这个目录中除了保存系统生成日志之外,还 包括一些应用软件的日志文件。当然/var目录下的其他子目录中也会记录下一些其他种类的日志记录文件,这依赖于具体 的应用程序的设置。
[code]$ ls /var/log
adduser maillog.5.gz sendmail.st.1
dmesg.today maillog.6.gz sendmail.st.10
dmesg.yesterday maillog.7.gz sendmail.st.2
httpd-access.log messages sendmail.st.3
httpd-error.log messages.0.gz sendmail.st.4
kerberos.log messages.1.gz sendmail.st.5
lastlog messages.2.gz sendmail.st.6
lpd-errs messages.3.gz sendmail.st.7
maillog messages.4.gz sendmail.st.8
maillog.0.gz messages.5.gz sendmail.st.9
maillog.1.gz news setuid.today
maillog.2.gz ppp.log setuid.yesterday
maillog.3.gz sendmail.st userlog
maillog.4.gz sendmail.st.0 wtmp [/code]
系统登录日志
系统会保存每个用户的登录记录,这些信息包括这个用户的名字、登录起始结束时间以及从何处登录入系统的等等。 它们被保存到/var/log/lastlog、/var/log/wtmp和/var/run/utmp文件中,这 三个文件以二进制格式保存了这些用户的登录数据。
其中/var/run/utmp文件中保存的是当前系统用户的登录记录,因此这个文件会随着用户进入和离开系 统而不断变化,而它也不会为用户保留很长的记录,只保留当时联机的用户记录。系统中需要查询当前用户状态的程序,如 who、w等就需要访问这个文件。utmp可能不包括所有精确的信息,某些突发错误会终止用户登录会话,当没有及时更新 utmp记录,因此utmp的记录不是百分之百的可以信赖的。
而/var/log/wtmp保存了所有的登录、退出信息,以及系统的启动、停机记录,因此随着系统正常运行 时间的增加,它的大小也会越来越大,增加的速度依赖于系统用户登录次数。因此可以利用这个日志用来查看用户的登录记录 ,last命令就通过访问这个文件来获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端 tty或时间显示相应的记录。ac命令同样也使用wtmp中的数据产生报告,但它的显示方式不同。它可以根据用户(ac -p) ,或按日期(ap -d)显示信息,这样管理员就能获得一些非常有用的反常信息,如一个平时不太活跃的用户 突然登录并连接很长时间,就有理由怀疑这个帐户被窃取了。
注意:X Window由于会同时打开多个终端窗口,因此会使得用户登录连接时间迅速增加。
lastlog文件保存的是每个用户的最后一次登录信息,包括登录时间和地点,这个文件一般只有login程 序使用,通过用户的UID,来在lastlog文件中查找相应记录,然后报告其最后一次登录时间和终端tty。然后, login程序就使用新的记录更新这个文件。
这三个文件是使用二进制格式保存的,因此不能直接查看其中的内容,而需要使用相关命令。当然也可以通过程序来 访问这三个文件,这就需要了解它们使用的数据结构。其中utmp和wtmp使用同样的数据结构,而lastlog使用 另外一个数据结构,可使用man来进行查询具体结构。如果系统的用户数量很多,那么wtmp文件的大小会迅速增加,在 系统/var文件系统空间紧张的情况下,就导致这个文件系统被占满。系统不会主动控制这个文件的大小,因此这需要管理 员的干预,需要手工及时清除,或编写shell脚本定期保存和清除。
系统还可以提供记账统计的功能,要打开系统的计账功能,需要使用accton命令,注意,accton必须跟 随记账日志文件的名字作参数,而不带参数的accton将关闭记账进程。
当打开了记账功能后,可以使用lastcomm来检查在系统中执行的所有命令的信息,包括执行的命令、执行命 令的用户、用户使用的终端tty,命令完成的时间,执行时间等。从lastcomm的输出也能帮助管理员检查可能的入 侵行为。
此外可以使用ac命令来查询用户的连接时间的报告,sa命令来查询用户消耗的处理器时间的报告。
Syslog日志记录
最初,syslog只是为了sendmail而设计的消息日志工具,由于它提供了一个中心控制点,使得sys log非常好用和易配置,因此当今很多程序都使用syslog来发送它们的记录信息。syslog是一种强大的日志记 录方式,不但可以将日志保存在本地文件中,还可以根据设置将syslog记录发送到网络上的另一台主机中。
支持syslog方式的系统启动了syslogd守护进程,这个程序从本地的Unix套接字和监听在514端 口(UDP)上的Internet套接字,来获得syslog的记录。本机中进程使用syslog系统调用发送来sy slog记录,然后由syslogd将他们保存到正确的文件或发送到网络上另一台运行syslogd主机中去。
syslogd的设置文件为/etc/syslog.conf,定义消息对应的相应目标,一条消息可以达到多 个目标,也可能被忽略。
[code]# $Id: syslog.conf,v 1.9 1998/10/14 21:59:55 nate Exp $
#
# Spaces are NOT valid fIEld separators in this file.
# Consult the syslog.conf(5) manpage.
*.err;kern.debug;auth.notice;mail.crit /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
mail.info /var/log/maillog
lpr.info /var/log/lpd-errs
cron.* /var/cron/log
*.err root
*.notice;news.err root
*.alert root
*.emerg *
!ppp
*.* /var/log/ppp.log [/code]
syslog.conf的配置可以分为两个部分,第一部分用于区分消息的类型,另一个用于设置消息发送的目的 地。通常,消息的类型包括消息的产生者,例如kern表示内核产生的消息,auth表示认证系统产生的消息,等等,还 包括消息的级别,例如emerg表示非常重要的紧急信息,alert表示系统告警状态,crit表示关键状态,err 表示一般的错误信息,warning表示警告信息,notice表示提示信息,但还不是错误,info表示一般信息, debug表示调试信息等,因此一个消息的类型可能为:kern.debug、mail.info等,但页可以使用通 配符*进行匹配。
从上面的syslog.conf的设置可以看出,系统正常运行中的很多重要的信息,如错误信息*.err、内 核调试信息kern.debuf、认证报告auth.notice等被直接输出的console中,另外还有一些比较 重要的信息被输出到/var/log/messages文件中,发送邮件的记录将被保存在/var/log/mail log文件中,打印记录为/var/log/lpd-errs等,使得管理员可以根据这些文件来查询相关记录,进行统 计或寻找系统问题。其中使用syslog记录的messages文件中包括root登录的信息、用户多次登录失败的尝 试等对系统安全相当重要的信息,因此也是系统遭受攻击之后,攻击者会根据syslog.conf中设置试图清除相关文 件中自己的登录记录。因此对于安全性要求更高的系统,可以尝试将syslog发送到另一台计算机上,或者输出到一些设 备文件中,如在打印机上立即打印输出。
系统会使用newsyslog定期检查syslog输出的messages文件和maillog文件,将旧数 据压缩保存为备份文件,如messages.1.gz等。
其他日志
除了系统登录记录和syslog记录之外,其他还有一些应用程序使用自己的记录方式。
系统每天都会自动检查系统的安全设置,包括对SetUID、SetGID的执行文件的检查,其结果将输出到/ var/log/security.today文件中,管理员可以与/var/log/security.yeste rday文件对比,寻找系统安全设置的变化。
如果系统使用sendmail,那么sendmail.st文件中以二进制形式保存了sendmail的统计 信息。
在系统启动的时候,就将内核的检测信息输出到屏幕上,这些信息可以帮助用户分析系统中的硬件状态。一般使用d mesg命令来查看最后一次启动时输出的这个检测信息。这个信息也被系统保存在/var/log/dmesg.tod ay文件中,系统中同时也存在另一个文件dmesg.yesterday,是上次的启动检测信息,对比这两个文件,就 可以了解到系统硬件和内核配置的变化。
lpd-errs记录了系统中lpd产生的错误信息。
此外,各种shell还会记录用户使用的命令历史,它使用用户主目录下的文件来记录这些命令历史,通常这个文 件的名字为.history(csh),或.bash-history等。
电脑比收音机简单吗?为什么拆开两者,很明显,收音机看起来还要比电脑更复杂呢?原来,好的架构好的设计在哪里都是通用的!电脑各部件缺一不可,但是绝不是只针对某一个或者某一类产品,所有不同产品的厂商都只服从一个统一的标准,这样,我们就看不出电脑中哪一个是高层了。CPU?内存?或者主板?。。。都不是,谁也不依赖谁,依赖的是一个统一的接口标准!
依赖倒转原则:抽象不应该依赖细节,细节应该依赖抽象。具体到一个实际问题编程,应该是定义好的接口,这个接口不属于哪一个具体的东西,应该是一个高层的抽象,然后就是针对接口编程,而不要对实现编程。
讲到这里,似乎世界的一切问题都迎刃而解,一切显得是那样的轻而易举!慢!一定不要自负的轻视对手,好,谁都很听话的服从这个抽象接口,那么这个抽象接口怎么来?一切都在变,难道这个抽象类就是可以违背这个哲学上绝对真理的特例家伙?他可能自身都要不停的变!完了,到哪里去找这样一根标尺呀?
标尺也是自己定义的!无非是会需要随实际情况变化吗?不要忘了,我们已经学会的绝技——开放—封闭原则。我们保证提供基本功能的接口不变,实际需求增加时,只要做开放扩展即可,面向对象的继承能帮助我们找到正确适用实际问题的方法,问题不就解决了吗?恩,这样设计总结出统一的抽象接口或者抽象类是满足我们的需求的,不过,还有关键的一点,这一系列类必须要满足一个原则:里氏代换原则:子类型必须能够替换掉他们的父类型。这个原则在许多别的情况下,并不一定是完全满足的,但是此处用做标尺的抽象类,必须要满足!子类可以扩展做更多的事情,但是父类已经定义好的接口子类必须有实现,并且也必须是做一致的事情。
依赖倒转原则说明了:好的面向对象设计不应该是依赖具体实现中的那一部分,应该是针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口。那样,高层、底层的改变都不会导致另外一部分要做变化了。
从北京去纽约喽,;-),还有陆路还要海洋,哈哈,变化再大我也不管,因为我做的是飞机!不过,你要是愿意先客车再渡轮也可以的哦~都是交通工具的抽象嘛!应该不会还有那个大侠想着依赖道路的,先穿跑鞋再换个泳衣去的吧~
依赖倒转原则:抽象不应该依赖细节,细节应该依赖抽象。具体到一个实际问题编程,应该是定义好的接口,这个接口不属于哪一个具体的东西,应该是一个高层的抽象,然后就是针对接口编程,而不要对实现编程。
讲到这里,似乎世界的一切问题都迎刃而解,一切显得是那样的轻而易举!慢!一定不要自负的轻视对手,好,谁都很听话的服从这个抽象接口,那么这个抽象接口怎么来?一切都在变,难道这个抽象类就是可以违背这个哲学上绝对真理的特例家伙?他可能自身都要不停的变!完了,到哪里去找这样一根标尺呀?
标尺也是自己定义的!无非是会需要随实际情况变化吗?不要忘了,我们已经学会的绝技——开放—封闭原则。我们保证提供基本功能的接口不变,实际需求增加时,只要做开放扩展即可,面向对象的继承能帮助我们找到正确适用实际问题的方法,问题不就解决了吗?恩,这样设计总结出统一的抽象接口或者抽象类是满足我们的需求的,不过,还有关键的一点,这一系列类必须要满足一个原则:里氏代换原则:子类型必须能够替换掉他们的父类型。这个原则在许多别的情况下,并不一定是完全满足的,但是此处用做标尺的抽象类,必须要满足!子类可以扩展做更多的事情,但是父类已经定义好的接口子类必须有实现,并且也必须是做一致的事情。
依赖倒转原则说明了:好的面向对象设计不应该是依赖具体实现中的那一部分,应该是针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口。那样,高层、底层的改变都不会导致另外一部分要做变化了。
从北京去纽约喽,;-),还有陆路还要海洋,哈哈,变化再大我也不管,因为我做的是飞机!不过,你要是愿意先客车再渡轮也可以的哦~都是交通工具的抽象嘛!应该不会还有那个大侠想着依赖道路的,先穿跑鞋再换个泳衣去的吧~