sybase数据库


Sybase 是与 Oracle 并驾齐驱的数据库产品,在企业平台上有较多的应用.前几天,我为安装和配置Sybase 花费了很多时间过程记录下来,以供大家参考

一、软件的版本。操作系统为Centos5.4,内核版本是2.6.18。Sybase 版本是ase1253esd1xe_linux,从www.sybase.com上可以下载。这个版本不需要许可,可免费使用。

二、安装操作系统。centos的安装相对于红帽子来说差不多,因此大部分的操作就是用鼠标点击“下一步”,然后只需漫长的等待就可以完成安装。

三、系统基本配置。1 设置好网络参数,如果有不正确的地方,修改文件 /etc/sysconfig/network-scripts/ifcfg-eth0,有时在安装过程中设定的默认网关不生效,就可以在这个文件加入一行 GATEWAY=202.108.93.254 //应根据自己的实际情况设定。
                2 设定主机名。由于sybase需要以主机名来定义sybase的服务名称(如RUN_hostname),因此取一个简单的名字也是有必要的。通过修改文件 /etc/hosts 来达到目的,我的样本文件如下
[root@sybase root]# vim /etc/hosts

# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1               localhost.localdomain localhost
202.108.93.200          sybase  //这行是加上去的
待sybase安装配置完后,sybase 的主服务器名称将变成 RUN_SYBASE的样子。
              3 添加用户sybase,这个用户用来安装、配置和运行sybase数据库服务器。为安全起见,不建议使用root来安装、配置和运行sybase服务器。添加用户的命令如下:
[root@sybase /]# useradd –d /opt/sybase sybase  //指定sybase 用户的主目录
[root@sybase /]#passwd sybase   //给用户sybase设置密码
Changing password for user sybase.
New password:mygod           //密码为  mygod ,显示为星号。
Retype new password:mygod     //再输一次

  四、下载sybase安装文件ase1253esd1xe_linux.tar.gz,创建目录 /tmp/sybase,把文件ase1253esd1xe_linux保存在这个目录,而后解压该文件,解压结束后,修改目录/tmp/sybase的权限,使用户sybase可以读和执行/tmp/sybase目录下的文件。操作过程如下:
[root@sybase /]#mkdir /tmp/sybase
访问 www.sybase.com, 把文件ase1253esd1xe_linux.tar.gz保存在目录 /tmp/sybase
[root@sybase /]#cd /tmp/sybase
[root@sybase /]#tar –zxvf  ase1253esd1xe_linux.tar.gz  //解压文件
[root@sybase /]chmod –R 755 /tmp/sybase  //改变文件权限,以便于用户//sybase有权限读取和执行相
//关文件   

五、安装、配置sybase服务器。切换到sybase用户, 接着转换目录到 /tmp/sybase,执行安装脚本setup,片刻出现图形安装向导,选择安装语言,一路点击”next”按钮,直到开始复制文件;当文件复制完毕时,紧接着就需要点击 “next”进行配置服务器了。但是请注意,不要急于执行这个操作 ,暂时停下来,再开一个终端窗口,修改sybase用户的环境变量,就是把安装过程中生成的文件 /opt/sybase/SYBASE.sh的内容追加到文件 /opt/sybase/.bash_profile中,然后让这个环境变量生效。下面是操作汇总:
[root@sybase/]# startx          //启用xwindow
[root@sybase/]#xhost +        //允许用户使用xserver
[root@sybase/]# su sybase    //打开一个终端窗口,切换用户为sybase
[sybase@sybase sybase]$ cd /tmp/sybase    //转换目录
[sybase@sybase sybase]$ ./setup           // 运行sybase安装程序
[root@sybase/]# vi /opt/sybase/SYBASE.sh  //这个文件是安装sybase过程中
//自动生成的。把这个文件中的所//有内容复制到文件
// /opt/sybase/.bash_profile里。

[sybase@sybase sybase]$ cat /opt/sybase/.bash_profile  //查看环境变量
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH
unset USERNAME                //上面是默认的值

#
# Sybase Product Environment variables   //从这儿起,是由SYBASE.sh复制过//来的
#
SYBASE="/opt/sybase"
export SYBASE
SYBASE_OCS="OCS-12_5"
export SYBASE_OCS
PATH="/opt/sybase/OCS-12_5/bin":$PATH
export PATH
LD_LIBRARY_PATH="/opt/sybase/OCS-12_5/lib:/opt/sybase/OCS-12_5/lib3p":
$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
INCLUDE="/opt/sybase/OCS-12_5/include":$INCLUDE
export INCLUDE
LIB="/opt/sybase/OCS-12_5/lib":$LIB
export LIB
SYBASE_JRE="/opt/sybase/shared-1_0/JRE-1_3"
export SYBASE_JRE
PATH="/opt/sybase/JS-12_5/bin":$PATH
export PATH
SYBASE_SYSAM="SYSAM-1_0"
export SYBASE_SYSAM
LM_LICENSE_FILE="/opt/sybase/SYSAM-1_0/licenses/license.dat"
export LM_LICENSE_FILE

[sybase@sybase sybase]$ source .bash_profile  //使sybase的环境变量立即生效
切换窗口到前面的图形安装向导,点击”Next”按钮执行下一步操作,就可以顺利完成配置。值得注意的是:如果环境变量不做处理,可以安装成功,但是配置服务器的时候就会毫无例外的失败,这是配置sybase的关键之处。还有一个地方值得注意,就是sybase服务的端口号,最好是把它记录下来,因为用客户端连的时候需要指明端口号(默认值大致为5000,备份服务器5001,监控服务器5002,xp服务器5003)。

六、sybase数据库的启动。配置完sybase后,安装的服务器都会自己启动。但是,大多数情况下,需要手工启动sybase..以sybase用户登陆系统,执行命令 /opt/sybase/ASE12_5/install/startserver启动sybase.

七、安装sybase客户端。为了方便的操作和维护sybase数据库,sybase公司提供了一个基于windows系统的客户端软件pcclinet_1253.zip,把它下载到windows的机器里,解压后安装即可。

八、从客户端连接sybase数据库服务器。在上面安装sybase客户端的windows 机器启动程序sybase central.

点击菜单项“连接”---“使用Adaptive Server Enterprise连接”,填写Server name,Host name,Port number,正确的话,很快就连上了,可以方便的添加数据库和表等各种操作了。

网站分析工具——Httpwatch(网站优化必备)


网站架设完毕,实际管理运维的人,却未必是网站代码的编写人员。所以,对页面结构、文件内容的设置,往往无从下手。这是一个分析网站header的工具。简单,一目了然。这样,对自己网站的情况,便有所知晓了。

A.      工具介绍:
a)    IE强劲插件

                         i.     网站内容结构、网站webserver分析工具

                       ii.     能够收集并显示网页深层信息

b)    使用条件:关闭IE,先安装

c)     通过本机浏览器发送的http请求进行页面抓包分析及监控

d)    可以对页面展示并整合分析

************************************************

B.      工具使用说明:
a)    清除缓存:在IE的“工具”选项中选择“文件夹选项”,删除cookies和临时文件。

b)    点击Httpwatch的选项“Record”,保证请求访问的过程处于可记录状态。

c)     在IE中输入要分析的网站域名,回车。

d)    访问情况即可被记录。
************************************************

C.      工具栏选项介绍:
a)    Stop:停止访问的记录

b)    Clear:清除访问的记录

c)     View:视图,观看的选项

d)    Summary:被选中的时候,显示的是整个页面被访问的概要情况。日志总结(请求数量),历时总时长,网络路由跳数,下载数据的字节数,上传数据的字节数,http压缩减少的字节数,解析查找次数,TCP连接数。

e)    Find:查找。可以根据需要在不同请求数据中查询上行下行的关键字所在位置。

f)      Filter:过滤器。帮助分析网站动静态比例分配,特别是对在页面的URL比较多的。可以选择不同类型的内容,包含特定关键字的URL,以及头文件,http返回码等。

g)    Save:保存记录的数据和导出格式。

h)    Help:帮助选项。

************************************************

D.      窗口选项说明(上层):
a)         Started:请求URL的开始时间

b)         Time Chart:请求耗损时间中各项时间的具体情况(请求,解析,建连,发送,等待,阻塞,接收等)

c)         Time: 请求URL的耗损时间

d)         Sent:客户端向服务器发起请求的字节数

e)         Received:服务器返回客户端的字节数

f)          Method:用户请求的方式

g)         Result:cache设备对用户请求的处理方式(HTTP返回码)

h)         Type:服务器返回客户端的命令

i)           URL:具体对应的URL。

************************************************

E.       窗口选项说明(下层)
a)         Overview:对各个URL的总体情况描述

b)         Header:分为两部分。

                         i.     Headers Sent:客户端向服务器发起的数据包包头信息;

                       ii.     Headers Received:服务器向客户端回复的数据包包头信息;

1.    (Status-Line):状态项,包括协议类型,http返回码和状态;

2.    Cache-control:是否可以被缓存(public可以;private和no-cache不可以;max-age表示可被缓存的时间长)

3.    Expires:过期时间,优先级低于cache-control中的max-age。

4.    Cache-encoding:文件的编码格式(gzip等,表示有经过压缩)

5.    Age:从最近一次被cache到节点的时刻到本次请求发起的时刻直接的时间长。

6.    Connection:获取数据后是否保持连接(keep-alive:获取后保持连接,这样在下次请求发起时可以减少解析和建连等耗费的时间,比如28;close:数据传输结束之后释放本次连接,下次再解析建立连接。)

7.    Accept-ranges:文件单位,一般是字节。

8.    Content-length:文件大小。

9.    Content-location:此URL内容所在的实际位置/来源。

10. Content-type:文件类型(文本,图片,aspx等)

11. Date:本次请求到达时的,服务器系统时间。

12. Etag:根据文件头header信息由混序或者哈希算法得到的标签。一旦文件有变动更改,标签一定发生变化。

13. Last-modified:文件的上一次/最近一次的修改时间。

14. Server:客户端设备情况(服务器类型和版本)

15. X-cache/via:由哪个公司的哪个节点服务器提供服务,节点是否有缓存

16. X-powerd-by:脚本语言。

c)         Cache:对应URL的cache具体情况(请求前后在cache中的变化,过期,最后修改时间,上一次cache更新时间,上一次接入时间,标签,hit数)

d)         Query String:请求字符串(不一定每个URL都有)

e)         POST Data:客户端发起的请求数据(不一定每个URL都有)

f)          Content:对应URL的具体内容信息

g)         Stream:以流的形式显示信息

************************************************

F.       实用价值:
l  缓存管理

l  网页摘要

l  Cookies管理

l  消息头的发送/接收

l  字符

l  目录……

除了IE浏览器上的httpwatch以后,还有火狐浏览器的firebug也很常用,有兴趣的可以了解一下

url链接


http://www.kuqin.com/web/20090105/32563.html    网站加速:Cache为王篇
http://blog.csdn.net/booboo2006/archive/2010/11/04/5987707.aspx  Web前端-HTTP Cache-control
http://woodpecker.org.cn/abyteofpython_cn/chinese/  简明 Python 教程
http://www.seozac.com/seobook/  SEO教程

PUTTY 的session备份与恢复

每次重装系统后,putty的session就没有了,需要重新设置,能不能保存之,待下次恢复?

答案是可以的,putty的session设置保存在注册表中:
HKEY_CURRENT_USER\Software\SimonTatham
打开注册表,选中这一项,选择导出,就完成备份了

下次重装系统时,只需要导入注册表就可以了。

其他putty相关文章 http://mylinux.5d6d.com/search.php?action=tag&name=putty

结合linux内核源码理解3次握手状态

SYN_RECV状态,顾名思义,是收到SYN包后应该置的状态。关于SYN_RECV状态,受某些教科书的误导,我以前一直理解为服务器收到SYN包后应该置此状态。也没细想到底是置那个socket的状态,最近在看三次握手协议在linux内核中的实现时,才仔细思考这个问题应该是置连接套接字的状态而非监听套接字的状态。
通常,SYN包只用于TCP三次握手协议中。常见的tcp三次握手协议过程(当然还有同时连接、
半连接等其它一些情况)如下:
1、client SYN包---> server
2、client <---SYN包/ACK包 server
3、client ACK包---> server
根据tcp状态图,对应下述4个状态的变化
a、client发送完毕,状态变成SYN_SEND;
b、server收到SYN报并发送ack确认包和SYN包,状态变为SYN_RECV
c、client发送ack包完毕,状态变成ESTABLISHED
d、server发送ack包完毕,状态变成ESTABLISHED

在linux内核中,上述几个状态对应为TCP_SYN_SEND、TCP_SYN_RECV、TCP_ESTABLISHED.
RFC793中关于SYN_RECV状态的描述如下:
SYN-RECEIVED - represents waiting for a confirming connection
request acknowledgment after having both received and sent a
connection request.
从上面可以看出,这个状态是在本端接收到对端连接请求,并发送连接对端请求后,等待对端应答时所置的状态。所以,本质上连接的过程是双方请求应答的来回,应该称四次握手,只是常见的应用以c/s模式为主,而linux、包括绝大部分操作系统都把服务器端的应答和请求封装在一个包里面。
但在linux内核中,却是在监听套接字收到了客户端的ACK包后,才创建连接套接字并初始化为TCP_SYN_RECV状态,如下函数调用关系:
tcp_v4_rcv-->tcp_v4_do_rcv-->tcp_v4_hnd_req-->tcp_check_req-->
tcp_v4_syn_recv_sock-->tcp_create_openreq_child...
struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req, struct sk_buff *skb)
{
struct sock *newsk = sk_alloc(PF_INET, GFP_ATOMIC, 0); /*创建连接sock结构*/

if(newsk != NULL) {
struct tcp_opt *newtp;
...
memcpy(newsk, sk, sizeof(*newsk));
newsk->state = TCP_SYN_RECV; /*置初始状态为SYN_RECV*/

//以下为一些初始化newsk结构的操作
...
}
这里似乎都正常了,但还有一点,服务器收到ACK包后,状态应该改为连接状态,而此时连接套接字的状态还是TCP_SYN_RECV
原因在于现在对ack包还没处理完,^_^,如下:
int tcp_v4_do_rcv(struct sock *sk, struct sk_buff *skb)
{
...
if (sk->state == TCP_LISTEN) { //此处是监听套接字的状态
struct sock *nsk = tcp_v4_hnd_req(sk, skb); //获得了上面讲的连接套接字
if (!nsk)
goto discard;

if (nsk != sk) { //显然监听与连接套接字不等
if (tcp_child_process(sk, nsk, skb)) //此处调用tcp_rcv_state_process置套接字为连接建立状态
goto reset;
return 0;
}
}
...
}

可见,在linux内核中,SYN_RECV状态的保持时间是非常短暂的(也很难创建条件让此状态保持),这也是我们实际应用中通过netstat基本看不到这个状态的原因。

ctime atime mtime 三个时间的比较

ctime 是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改的。

atime 是在读取文件或者执行文件时更改的

mtime 是在写入文件时随文件内容的更改而更改的。

FastDFS-1.22 安装


1 下载
cd /usr/local/src/
wget  http://fastdfs.googlecode.com/files/FastDFS_v1.22.tar.gz

2 安装libevent
【要想支持web,得需要配置libevent-1.4x...
下载地址为:http://down1.chinaunix.net/distfiles/libevent-1.4.9-stable.tar.gz
需要注意的是,编译libevent的时候,需要指定 --prefix=/usr】

3 安装配置fastdfs
tar zxvf FastDFS_v1.22.tar.gz
cd FastDFS

vim make.sh  
找到
#WITH_HTTPD=1  //支持web
#WITH_LINUX_SERVICE=1  //安装成操作系统的服务
需要把这两行的#去掉

./make.sh && ./make.sh install

4 修改配置文件
FastDFS 分为三种角色(跟踪器 tracker ; 存储器 storage; 客户端 client),三种角色的配置文件时不相同的,需要注意的是,三种角色都需要编译安装fastdfs,即执行前三步,作为client是可以不打开WITH_HTTPD=1这个功能的。当编译安装完fastdfs后,自动会在/etc/fdfs下面生成client.conf  http.conf  mime.types  storage.conf  tracker.conf 这些文件的,只要我们稍微改动一下就可以了。 分别介绍三种角色的配置文件:
tracker :
disabled=false
bind_addr=
port=22122
network_timeout=60
base_path=/FastDFS
max_connections=256

# the method of selecting group to upload files
# 0: round robin
# 1: specify group
# 2: load balance, select the max free space group to upload file
store_lookup=2

# which group to upload file
# when store_lookup set to 1, must set store_group to the group name
store_group=group1

# which storage server to upload file
# 0: round robin (default)
# 1: the first server order by ip address
store_server=0

# which path(means disk or mount point) of the storage server to upload file
# 0: round robin
# 2: load balance, select the max free space path to upload file
store_path=0

# which storage server to download file
# 0: round robin (default)
# 1: the source storage server which the current file uploaded to
download_server=0

# reserved storage space for system or other applications.
# if the free(available) space of any stoarge server in
# a group <= reserved_storage_space,
# no file can be uploaded to this group.
# bytes unit can be one of follows:
### G or g for gigabyte(GB)
### M or m for megabyte(MB)
### K or k for kilobyte(KB)
### no unit for byte(B)
reserved_storage_space = 4GB

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

#unix group name to run this program,
#not set (empty) means run by the group of current user
run_by_group=

#unix username to run this program,
#not set (empty) means run by current user
run_by_user=

# allow_hosts can ocur more than once, host can be hostname or ip address,
# "*" means match all ip addresses, can use range like this: 10.0.1.[1-15,20] or
# host[01-08,20-25].domain.com, for example:
# allow_hosts=10.0.1.[1-15,20]
# allow_hosts=host[01-08,20-25].domain.com
allow_hosts=*

# sync log buff to disk every interval seconds
# default value is 10 seconds
sync_log_buff_interval = 10

# check storage server alive interval
check_active_interval = 120

# thread stack size, should > 512KB
# default value is 1MB
thread_stack_size=1MB

#HTTP settings
http.disabled=false
http.server_port=80

#use "#include" directive to include http other settiongs
#include /etc/fdfs/http.conf

注:等改完tracker.conf后就可以启动了,在启动前,需要去建立basedir /FaseDFS 目录,否则启动不了服务
启动方法: /etc/init.d/fdfs_trackerd start

storage:
disabled=false
group_name=group1
bind_addr=
port=23000
network_timeout=60
heart_beat_interval=30
stat_report_interval=60
base_path=/FastDFS
max_connections=256

# when no entry to sync, try read binlog again after X milliseconds
# 0 for try again immediately (not need to wait)
sync_wait_msec=200

# after sync a file, usleep milliseconds
# 0 for sync successively (never call usleep)
sync_interval=0

# sync start time of a day, time format: Hour:Minute
# Hour from 0 to 23, Minute from 0 to 59
sync_start_time=00:00

# sync end time of a day, time format: Hour:Minute
# Hour from 0 to 23, Minute from 0 to 59
sync_end_time=23:59

# path(disk or mount point) count, default value is 1
store_path_count=1

# store_path#, based 0, if store_path0 not exists, it's value is base_path
# the paths must be exist
store_path0=/FastDFS
#store_path1=/home/yuqing/fastdfs2

# subdir_count  * subdir_count directories will be auto created under each
# store_path (disk), value can be 1 to 256, default value is 256
subdir_count_per_path=256

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
tracker_server=58.215.87.170:22122
tracker_server=124.238.249.138:22122

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

#unix group name to run this program,
#not set (empty) means run by the group of current user
run_by_group=

#unix username to run this program,
#not set (empty) means run by current user
run_by_user=

# allow_hosts can ocur more than once, host can be hostname or ip address,
# "*" means match all ip addresses, can use range like this: 10.0.1.[1-15,20] or
# host[01-08,20-25].domain.com, for example:
# allow_hosts=10.0.1.[1-15,20]
# allow_hosts=host[01-08,20-25].domain.com
allow_hosts=*

# the mode of the files distributed to the data path
# 0: round robin(default)
# 1: random, distributted by hash code
file_distribute_path_mode=0

# valid when file_distribute_to_path is set to 0 (round robin),
# when the written file count reaches this number, then rotate to next path
# default value is 100
file_distribute_rotate_count=100

# call fsync to disk when write big file
# 0: never call fsync
# other: call fsync when written bytes >= this bytes
# default value is 0 (never call fsync)
fsync_after_written_bytes=0

# sync log buff to disk every interval seconds
# default value is 10 seconds
sync_log_buff_interval=10

# sync binlog buff / cache to disk every interval seconds
# this parameter is valid when write_to_binlog set to 1
# default value is 60 seconds
sync_binlog_buff_interval=60

# thread stack size, should > 512KB
# default value is 1MB
thread_stack_size=1MB

# if check file duplicate, when set to true, use FastDHT to store file indexes
# 1 or yes: need check
# 0 or no: do not check
# default value is 0
check_file_duplicate=0

# namespace for storing file indexes (key-value pairs)
# this item must be set when check_file_duplicate is true / on
key_namespace=FastDFS

# set keep_alive to 1 to enable persistent connection with FastDHT servers
# default value is 0 (short connection)
keep_alive=0

# you can use "#include filename" (not include double quotes) directive to
# load FastDHT server list, when the filename is a relative path such as
# pure filename, the base path is the base path of current/this config file.
# must set FastDHT server list when check_file_duplicate is true / on
# please see INSTALL of FastDHT for detail
##include /home/yuqing/fastdht/conf/fdht_servers.conf


#HTTP settings
http.disabled=false
http.server_port=80
http.trunk_size=256KB

#use #include directive to include HTTP other settiongs
#include http.conf

client:
network_timeout=60
base_path=/FastDFS

tracker_server=58.215.87.170:22122
tracker_server=124.238.249.138:22122

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info


#HTTP settings
http.tracker_server_port=80

#use #include directive to include HTTP other settiongs
#include http.conf

网站性能优化

网站性能优化
http://www.dudo.org/article/WebDev/214.htm

squid 服务器读取出现104 connection reset by peer 解决方法

在CDN 系统中squid 充当着举足轻重的作用,要保证cdn 网站加速系统,就要保护squid 的正常工作,下对squid 服务器读取出现104 connection reset by peer  如下图所示




这个原因是由什么引起的呢?经过在百度、google中查到说是开启了防火墙,或者说是查看访问日志。没有明显的解决方法。经过些天的努力,总算功夫没有白费,终于找到了解决方法。

  出现这种错误的原因有两个方面:

   1.机房的开启了防火墙,把CDN 系统中的squid 服务器地址拒绝掉了,也就是所说的CC防护,把CC防护关掉OK了。

   2. 就是网站的源服务器的开启了windows 防火墙,或者瑞星之类的软件防火墙也拒绝掉了squid服务器的IP,软件防护墙比较容易解决,做一个IP策略就可以了。希望遇到这种情况的同志们,对你们有所帮助

nginx出现 500 Internal Server Error

vi /etc/nginx/nginx.conf
events {
    worker_connections  1024;
}
调整为
events {
    worker_connections  10240;
}
在Linux中打开了太多文件(Too many open files)的解决方法[root@lxadmin nginx]# cat /proc/sys/fs/file-max
8192
文件系统最大可打开文件数
[root@lxadmin nginx]# ulimit -n
1024
程序限制只能打开1024个文件
使用[root@lxadmin nginx]# ulimit -n 8192调整一下
或者永久调整打开文件数 可在启动文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx无效)

本文来自:http://www.lihaixin.com/2008/11/ ... rver-error-884.html

FastDFS php 扩展模块安装

1 安装FastDFS 1.22  http://mylinux.5d6d.com/thread-65-1-1.html

2 安装php扩展
cd  /usr/local/src/FastDFS/php_client/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

3 修改配置文件
vim /usr/local/php/etc/php.ini
添加:
extension = fastdfs_client.so
fastdfs_client.tracker_group_count = 1
fastdfs_client.tracker_group0 = /etc/fdfs/client.conf
注: /etc/fdfs/cliet.conf 其实就是client的配置文件,详细内容见http://mylinux.5d6d.com/thread-65-1-1.html
4 cp ../conf/http.conf /etc/fdfs/
5 测试
/usr/local/php/bin/php -m  如果看到fastdfs_client 说明配置成功了。
此时就可以执行  /usr/local/php/bin/php fastdfs_test.php

xenu中名词解释

* Broken links, ordered by link *损坏的链接,按链接顺序,列出网站中的中断连接(该链接的对象不存在,如http://mylinux.5d6d.com/www.gzzzjz.com/images/ysfw.jpg地址,每个中断链接下列出了存在这些中断链接的网页地址
* Broken links, ordered by page *损坏的链接,按网页顺序,表示网页中存在中断链接的网页,并在网页下方标出中断连接的地址
* List of redirected URLs *转向网址列表 列出重新转向定位的网址
* List of valid URLs you can submit to a search engine *名单有效的URL ,您可以提交到搜索引擎
* Site Map of HTML pages with a Title *包含一个标题的网页地图
* Broken page-local links *中断当地链接
* Orphan files *孤儿档案,孤立文件
* Statistics for managers *监督统计,对所有类型的网址进行统计

xenu的局限性:
1、只能测试链接存不存在,但无法验证链接的正确性;
2、若输入https://的地址,则无法测试;

TIME_WAIT 很多

Socket TIME_WAIT 问题

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

会得到类似下面的结果,具体数字会有所不同:

LAST_ACK 1
SYN_RECV 14
ESTABLISHED 79
FIN_WAIT1 28
FIN_WAIT2 3
CLOSING 5
TIME_WAIT 1669

状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

也就是说,这条命令可以把当前系统的网络连接状态分类汇总。

下面解释一下为啥要这样写:

一个简单的管道符连接了netstat和awk命令。

------------------------------------------------------------------

每个TCP报文在网络内的最长时间,就称为MSL(Maximum Segment Lifetime),它的作用和IP数据包的TTL类似。

RFC793指出,MSL的值是2分钟,但是在实际的实现中,常用的值有以下三种:30秒,1分钟,2分钟。

注意一个问题,进入TIME_WAIT状态的一般情况下是客户端,大多数服务器端一般执行被动关闭,不会进入TIME_WAIT状态,当在服务器端关闭某个服务再重新启动时,它是会进入TIME_WAIT状态的。

举例:
1.客户端连接服务器的80服务,这时客户端会启用一个本地的端口访问服务器的80,访问完成后关闭此连接,立刻再次访问服务器的80,这时客户端会启用另一个本地的端口,而不是刚才使用的那个本地端口。原因就是刚才的那个连接还处于TIME_WAIT状态。
2.客户端连接服务器的80服务,这时服务器关闭80端口,立即再次重启80端口的服务,这时可能不会成功启动,原因也是服务器的连接还处于TIME_WAIT状态。


检查net.ipv4.tcp_tw当前值,将当前的值更改为1分钟:
[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
[root@aaa1 ~]#

vi /etc/sysctl
增加或修改net.ipv4.tcp_tw值:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

使内核参数生效:
[root@aaa1 ~]# sysctl -p

[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

用netstat再观察正常


这里解决问题的关键是如何能够重复利用time_wait的值,我们可以设置时检查一下time和wait的值
#sysctl -a | grep time | grep wait
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

问一下TIME_WAIT有什么问题,是闲置而且内存不回收吗?

是的,这样的现象实际是正常的,有时和访问量大有关,设置这两个参数: reuse是表示是否允许重新应用处于TIME-WAIT状态的

socket用于新的TCP连接; recyse是加速TIME-WAIT sockets回收

Q: 我正在写一个unix server程序,不是daemon,经常需要在命令行上重启它,绝大
多数时候工作正常,但是某些时候会报告"bind: address in use",于是重启失
败。

A: Andrew Gierth
server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。至于
TIME_WAIT状态,你无法避免,那是TCP协议的一部分。

Q: 如何避免等待60秒之后才能重启服务

A: Erik Max Francis

使用setsockopt,比如

--------------------------------------------------------------------------
int option = 1;

if ( setsockopt ( masterSocket, SOL_SOCKET, SO_REUSEADDR, &option,
sizeof( option ) ) < 0 )
{
die( "setsockopt" );
}
--------------------------------------------------------------------------

Q: 编写 TCP/SOCK_STREAM 服务程序时,SO_REUSEADDR到底什么意思?

A: 这个套接字选项通知内核,如果端口忙,但TCP状态位于 TIME_WAIT ,可以重用
端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,
指明"地址已经使用中"。如果你的服务程序停止后想立即重启,而新套接字依旧
使用同一端口,此时 SO_REUSEADDR 选项非常有用。必须意识到,此时任何非期
望数据到达,都可能导致服务程序反应混乱,不过这只是一种可能,事实上很不
可能。

一个套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端
口。SO_REUSEADDR 仅仅表示可以重用本地本地地址、本地端口,整个相关五元组
还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。必须慎重使
用 SO_REUSEADDR 选项。

Q: 在客户机/服务器编程中(TCP/SOCK_STREAM),如何理解TCP自动机 TIME_WAIT 状
态?

A: W. Richard Stevens <1999年逝世,享年49岁>

下面我来解释一下 TIME_WAIT 状态,这些在<>
中2.6节解释很清楚了。

MSL(最大分段生存期)指明TCP报文在Internet上最长生存时间,每个具体的TCP实现
都必须选择一个确定的MSL值。RFC 1122建议是2分钟,但BSD传统实现采用了30秒。

TIME_WAIT 状态最大保持时间是2 * MSL,也就是1-4分钟。

IP头部有一个TTL,最大值255。尽管TTL的单位不是秒(根本和时间无关),我们仍需
假设,TTL为255的TCP报文在Internet上生存时间不能超过MSL。

TCP报文在传送过程中可能因为路由故障被迫缓冲延迟、选择非最优路径等等,结果
发送方TCP机制开始超时重传。前一个TCP报文可以称为"漫游TCP重复报文",后一个
TCP报文可以称为"超时重传TCP重复报文",作为面向连接的可靠协议,TCP实现必须
正确处理这种重复报文,因为二者可能最终都到达。

一个通常的TCP连接终止可以用图描述如下:

client server
FIN M
close -----------------> (被动关闭)
ACK M+1
<-----------------
FIN N
<----------------- close
ACK N+1
----------------->

为什么需要 TIME_WAIT 状态?

假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重发
最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止连
接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面
临重发最终ACK的情形。

{
scz 2001-08-31 13:28

先调用close()的一方会进入TIME_WAIT状态
}

此外,考虑一种情况,TCP实现可能面临先后两个同样的相关五元组。如果前一个连
接处在 TIME_WAIT 状态,而允许另一个拥有相同相关五元组的连接出现,可能处理
TCP报文时,两个连接互相干扰。使用 SO_REUSEADDR 选项就需要考虑这种情况。

为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?

如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。
第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第二
个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT
状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被
丢弃。建立第二个连接的时候,不会混淆。

A: 小四

在Solaris 7下有内核参数对应 TIME_WAIT 状态保持时间

# ndd -get /dev/tcp tcp_time_wait_interval
240000
# ndd -set /dev/tcp tcp_time_wait_interval 1000

缺省设置是240000ms,也就是4分钟。如果用ndd修改这个值,最小只能设置到1000ms,
也就是1秒。显然内核做了限制,需要Kernel Hacking。

# echo "tcp_param_arr/W 0t0" | adb -kw /dev/ksyms /dev/mem
physmem 3b72
tcp_param_arr: 0x3e8 = 0x0
# ndd -set /dev/tcp tcp_time_wait_interval 0

我不知道这样做有什么灾难性后果,参看<>的声明。

Q: TIME_WAIT 状态保持时间为0会有什么灾难性后果?在普遍的现实应用中,好象也
就是服务器不稳定点,不见得有什么灾难性后果吧?



Linux 内核源码 /usr/src/linux/include/net/tcp.h 中

#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to successfully
* close the socket, about 60 seconds */

最好不要改为0,改成1。端口分配是从上一次分配的端口号+1开始分配的,所以一般
不会有什么问题。端口分配算法在tcp_ipv4.c中tcp_v4_get_port中。

pure-ftpd 的编译安装及配置文件

下载最新的pure-ftp源码包pure-ftpd-1.0.20.tar.bz2   
# wget http://syslab.comsenz.com/downlo ... ftpd-1.0.21.tar.bz2
#tar jxvf pure-ftpd-1.0.21.tar.bz2
#cd pure-ftpd-1.0.21
./configure \
"--prefix=/usr/local/pureftpd" \
"--without-inetd" \
"--with-altlog" \
"--with-puredb" \
"--with-throttling" \
"--with-largefile" \
"--with-peruserlimits" \
"--with-tls" \
"--with-language=simplified-chinese"

#make && make install

起动
法一:用参数
/usr/local/pureftpd/sbin/pure-ftpd -S 21 -c 20 -C 1 -E -u 100 -R -t:800 -a 0  &

-S 端口
-c 最大用户数
-C 线程数
-E Anonymous logins are prohibited
-u Don't allow uids below <uid> to log in
-R Disallow users (even non-anonymous ones) usage of the CHMOD command
-t:800 下载800k,上传无限制
-a 0 除gid 0的组,限制用户再主目录。

法二:用配置文件
#mkdir /usr/local/pureftpd/etc
#cd configuration-file
#cp pure-ftpd.conf /usr/local/pureftpd/etc/pure-ftpd.conf
#cp pure-config.pl  /usr/local/pureftpd/sbin/pure-config.pl

#chmod 755 /usr/local/pureftpd/sbin/pure-config.pl
启动命令: /usr/local/pureftpd/sbin/pure-config.pl /usr/local/pureftpd/etc/pure-ftpd.conf

当然要修改配置文件,英文说明也不是很难。
下面是我的配置文件:
____________________________________

ChrootEveryone              yes
BrokenClientsCompatibility  no
MaxClientsNumber            50
Daemonize                   yes
MaxClientsPerIP             8
VerboseLog                  no
DisplayDotFiles             yes
AnonymousOnly               no
NoAnonymous                 no
SyslogFacility              ftp
DontResolve                 yes
MaxIdleTime                 15
PureDB                        /usr/local/pureftpd/etc/pureftpd.pdb
LimitRecursion              2000 8
AnonymousCanCreateDirs      no
MaxLoad                     4
AntiWarez                   yes
Umask                       133:022
MinUID                      100
AllowUserFXP                no
AllowAnonymousFXP           no
ProhibitDotFilesWrite       no
ProhibitDotFilesRead        no
AutoRename                  no
AnonymousCantUpload         no
PIDFile                     /usr/local/pureftpd/var/run/pure-ftpd.pid
MaxDiskUsage               99
CustomerProof              yes


#######接下来该建立用户了###############

# /usr/local/pureftpd/bin/pure-pw useradd ftp_test -u www -d /data/wwwroot其中,-u 将虚拟用户 ftp_test 与系统用户 www 关联在一起。-d 参数使 ftp_test 只能访问其主目录。执行完上述命令后,会提示输入密码。
# /usr/local/pureftpd/bin/pure-pw mkdb

Crontab用法

名称 : crontab

使用权限 : 所有使用者

使用方式 :

crontab file [-u user]-用指定的文件替代目前的crontab。

crontab-[-u user]-用标准输入替代目前的crontab.

crontab-1[user]-列出用户目前的crontab.

crontab-e[user]-编辑用户目前的crontab.

crontab-d[user]-删除用户目前的crontab.

crontab-c dir- 指定crontab的目录。

crontab文件的格式:M H D m d cmd.

基本格式 :

*  *  *  *  *  command

分  时  日  月  周      命令

M: 分钟(0-59)。每分钟用*或者 */1表示

H:小时(0-23)。(0表示0点)

D:天(1-31)。

m: 月(1-12)。

d: 一星期内的天(0~6,0为星期天)。

cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量


说明 :

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数 :

crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)

crontab -r : 删除目前的时程表

crontab -l : 列出目前的时程表

crontab file [-u user]-用指定的文件替代目前的crontab。

时程表的格式如下 :

f1 f2 f3 f4 f5 program

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。

当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推

当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推

当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推

当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推

使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。

例子 :

#每天早上7点执行一次 /bin/ls :

0 7 * * * /bin/ls

在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :

0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 [email protected] :

0 17 * * 1-5 mail -s "hi" [email protected] < /tmp/maildata

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"

20 0-23/2 * * * echo "haha"

注意 :

当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之后加上 > /dev/null 2>&1 即可

例子2 :

#每天早上6点10分

10 6 * * * date

#每两个小时

0 */2 * * * date

#晚上11点到早上8点之间每两个小时,早上8点

0 23-7/2,8 * * * date

#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * mon-wed date

#1月份日早上4点

0 4 1 jan * date

范例

$crontab -l 列出用户目前的crontab.

/usr/lib/cron/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在,而有另外一个文件/usr/lib/cron/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先,如果都不存在,只有超级用户可以安排作业。

crontab文件的一些例子:

30 21 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart

上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart

上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart

每一小时重启apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart

晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart

每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart

一月一号的4点重启apache

例子:

每两个时间值中间使用逗号分隔。

除了数字还有几个个特殊的符号就是”*”、”/”和”-”、”,”,*代表所有的取值范围内的数字,”/”代表每的意思,”*/5″表示每5个单位,”-”代表从某个数字到某个数字,”,”分开几个离散的数字。

每天早上6点

0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

每两个小时

0 */2 * * * echo "Have a break now." >> /tmp/test.txt

晚上11点到早上8点之间每两个小时,早上八点

0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3 command line

1月1日早上4点

0 4 1 1 * command line

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。

2.编辑/etc/crontab 文件配置cron

cron 服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号

HOME=/        //使用者运行的路径,这里是根目录

# run-parts

01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本

02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本

22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本

42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

二、cron 定时

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:




/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:

在/etc/rc.d/rc.local这个脚本的末尾加上:

/sbin/service crond start

现在Cron这个服务已经在进程里面了,我们就可以用这个服务了,Cron服务提供以下几种接口供大家使用:

1、直接用crontab命令编辑

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数

crontab -l //列出某个用户cron服务的详细内容

crontab -r //删除某个用户的cron服务

crontab -e //编辑某个用户的cron服务


比如说root查看自己的cron设置:crontab -u root -l

再例如,root想删除fred的cron设置:crontab -u fred -r

在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

这个格式的前一部分是对时间的设定,后面一部分是要执行的命令,如果要执行的命令太多,可以把这些命令写到一个脚本里面,然后在这里直接调用这个脚本就可以了,调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定,前面五个*号代表五个数字,数字的取值范围和含义如下:

分钟 (0-59)

小時 (0-23)

日期 (1-31)

月份 (1-12)

星期 (0-6)//0代表星期天

除了数字还有几个个特殊的符号就是"*"、"/"和"-"、",",*代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。