??xml version="1.0" encoding="utf-8" standalone="yes"?> 数据库链接 常见的问题: 1. 数据库意外重启后Q原先的数据库连接池能自动废弃老的无用的链接,建立新的数据库链?/span> 2. |络异常中断后,原先的徏立的tcp链接Q应该能q行自动切换。比如网站演习中的交换机重启会导致网l瞬?/span> 3. 分布式数据库中间Ӟ比如cobar会定时的空闲链接异常关闭,客户端会出现半开的空闲链接?/span> 大致思考解x\Q?/span> 1. sql心蟩?/span>(d?/span>) 2. 拉K接尝试一下,发现处理p|丢弃链接Q探Lh会失败几个 (牺牲我Q完成大我的_) 3. 讄合理的空闲链接的时旉Q避免半开链接(懒模式,解决半开链接) 下面我们来看看,?/span>dbcp中是如何实现?/span> sql心蟩?/span> sql validate配置 <property name="testWhileIdle"><value>true</value></property> <property name="testOnBorrow"><value>false</value></property> <property name="testOnReturn"><value>false</value></property> <property name="validationQuery"><value>select sysdate from dual</value></property> <property name="validationQueryTimeout"><value>1</value></property> <property name="timeBetweenEvictionRunsMillis"><value>30000</value></property> <property name="numTestsPerEvictionRun"><value>16</value></property> 参数说明 dbcp是采用了commons-pool做ؓ其连接池理Q?/span>testOnBorrow,testOnReturn, testWhileIdle?/span>pool是提供的几种校验机制Q通过外部钩子的方式回?/span>dbcp的相x据库链接(validationQuery)校验, dbcp相关外部钩子c:PoolableConnectionFactory,l承?/span>common-pool PoolableObjectFactory , dbcp通过GenericObjectPoolq一入口Q进行连接池?/span>borrow,return处理?/span> 具体参数描述Q?/span> 1. testOnBorrow : 明思义Q就是在q行borrowObjectq行处理ӞҎ(gu)到的connectionq行validateObject校验 2. testOnReturn : 明思义Q就是在q行returnObject对返回的connectionq行validateObject校验Q个得对数据库连接池的管理意义不?/span> 3. testWhileIdle : x的重点,GenericObjectPool中针对pool理Qv了一?/span>异步Evict的TimerTask定时U程q行控制(可通过讄参数 timeBetweenEvictionRunsMillis>0),定时对线E池中的链接q行validateObject校验Q对无效的链接进行关闭后Q会调用ensureMinIdleQ适当建立链接保证最的minIdleq接数?/span> 4. timeBetweenEvictionRunsMillis,讄的EvictU程的时_单位msQ大?才会开启evict查线E?/span> 5. validateQueryQ?代表查的sql 6. validateQueryTimeoutQ?代表在执行检查时Q通过statement讄Qstatement.setQueryTimeout(validationQueryTimeout) 7. numTestsPerEvictionRunQ代表每ơ检查链接的数量Q徏议设|和maxActive一样大Q这hơ可以有效检查所有的链接. Sql心蟩查几Ҏ(gu)考: 1.性能问题?/span> 目前|站的应用大部分的瓶颈还是在I/Oq一块,大部分的I/Oq是在数据库的这一层面上,每一个请求可能会调用10来次SQL查询Q如果不C务,一个请求会重复获取链接Q如果每ơ获取链?比如在testOnBorrow都进行validateObjectQ性能开销不是很能接受Q可以假定一ơSQL操作消毫0.5~1ms(一般走了网l请求基本就q数) 2Q成本和收益 |站异常数据库重启,|络异常断开的频率是非常低的Q一般也在数据库升U,演习l护时才会进行,而且一般也是选在晚上Q访问量相对比较低的hQ而且一般会有h员值班xQ所以异步的validateObject是可以接受,但一个前提需要确保能保证在一个合理的旉D内Q数据库能完成自动重联?/span> h探雷 相关配置 dbcp自n默认支持Q不需要配|?/span> 原理描述 common-pools通过borrowObject , returnObject完成q接的获取和释放Q正常的情况是一ơ请求中borrow和return是一对的Q有借就有还?/span> 但在准备returnObjectӞdbcp会做一件事Q就是看看这个object是否已经是坏了的Q如果坏了就直接丢了Q就直接l丢弃了?/span> 代码层面Q?/span> Q? 在dbcp中PoolingDataSource(实现DataSource接口)调用 PoolableConnection(dbcp connnection相关的pool delegate操作)q行相应关闭Ӟ会检?/span>_conn.isClosed()Q针对DataSource如果isClosedq回?true的则不调用returnObjectQ直接丢弃了链接?/span> Q? _conn.isClosed()是否保险Q从jdk的api描述中: A connection is closed if the method close has been called on it or if certain fatal errors have occurred. 里面提供两种情况Q一U就是被调用了closedҎ(gu)Q另一U就是出C些异常,说的比较含糊?/span> I闲链接?/span> 相关配置 <property name="minEvictableIdleTimeMillis"><value>18000000</value></property> <property name="removeAbandoned"><value>true</value></property> <property name="removeAbandonedTimeout"><value>180</value></property> 参数说明 1.minEvictableIdleTimeMillis dbcp默认?0分,需要开启异步线EEvictQ否则不生效。原理很单,是通过一个异步线E,每次查connnection上一ơ用的旉戻I看看是否已经过q个timeout旉讄?/span> 2. removeAbandoned , removeAbandonedTimeoutQ主要是用于在出现链接紧张时候,会扫描一些链接未过removeAbandonedTimeout旉q未被释放,会主动的关闭该链接?/span> 适用情况 1. 我们使用的cobar后端会有定时关闭I闲链接的操作,默认的空闲链接timeout旉?时Q和其他oracle , mysql各不相同Q所以设|好q个I闲链接的timeout旉q是挺重? 2. 一般会是几U情况出现需要removeAbandonedQ * 代码未在finally释放connection , 不过我们都用sqlmapClientTemplateQ底层都有链接释攄q程 * 遇到数据库死?/span>。以前遇到过后端存储q程做了锁表操作Q导致前台集中q接池全都被block住,后箋的业务处理因为拿不到链接所有都处理p|了?/span> 聊聊c3p0配置 q有我们配置的c3p0所谓的自动重连的3个参敎ͼ <prop key="acquireRetryAttempts">30</prop> <prop key="acquireRetryDelay">1000</prop> <prop key="breakAfterAcquireFailure">false</prop> 个h觉得是一个误?/span>Q这几个配置只是在从q接池获取链接时Q获取失败多试几次Q因为我们从pool从获取链接最多只会等待固定timeout旉?/span> 如果要达到自动重q的效果Q必要c3p0支持h探雷或者是sql心蟩查功能,能自动的剔除无效的链接。 可见c3p0官方文描述Q?a >http://www.mchange.com/projects/c3p0/index.html#configuring_recovery 最后: Dbcp是我们以后数据库驱动选择的趋势,最后我们如何选择如何自动重连Q这个也得根据我们的应用场景而定。比如只ȝwebpȝQ后C务系l,dpȝ可能处理方式׃同?/span> 只读WebpȝQ可采取h探雷的策略,也就p|q接池个数的hQ失败了面h一ơ就好?/span> 后台业务pȝQ一般业务都涉及数据库的写操作,很多数据不可重入Q一ơ处理失败后只能靠手工q预处理。这时候得考虑是否需要用sql心蟩查,比如testOnBorrow或者testWhileIdle.
]]>
]]>
]]>
安装:
./configure
make
make install
2. 开启rsync服务Q修?etc/xinetd.d/rsync
disable = no # replace <yes>
重启xinetd 服务
service xinetd restart
3. 配置server端,/etc/rsyncd.conf
# touch rsyncd.conf
# vi rsyncd.conf
uid = ljh #表示以什么用戯?注意必须保该用hҎ(gu)块的d权限
gid = ljh
use chroot = false
max connectionts = 6
read only = no
pid file = /home/ljh/server/rsync/rsynnd.pid
lock file = /home/ljh/server/rsync/rsyncd.lock
log file = /home/ljh/server/rsync/rsyncd.log
[test]
comment = test
path = /home/ljh/server/rsync/data/test
ignore error
list = true
#auth users = ljh
#secrets file = /home/ljh/server/rsync/passwd/rsyncd.passwd
4. 客户端配|?br />
讉Kremote rsync列表
rsync rsync://10.0.64.162/test
单的执行同步命o
sync -auv --delete --password-file=/home/admin2/soft/rsync/passwd/rsyncd.passwd ~/rysnc/* ljh@10.0.64.162::test
比较实际的例子:
echo "hello" > /tmp/password.txt ;chmod 600 /tmp/password.txt
cp /home/ewalletbops/fatrix/crm/* /home/ewalletbops/fatrix/putxml/search
rsync -azv /home/ewalletbops/bops-daemon/bin/adxml/search/ /home/ewalletbops/fatrix/putxml/search
rsync -auv --delete --password-file=/tmp/password.txt /home/ewalletbops/fatrix/putxml/search yangzhen@127.0.0.1::everest/adxml
rm /tmp/password.txt
1.?JAVA_HOME/jre/lib/fonts/ 下徏立个目录 fallback
2.?fallback 里弄个中文字体最单ln一下就好了
比如Q?/p>
ln -s /usr/share/fonts/truetype/arphic/uming.ttf $JAVA_HOME/jre/lib/fonts/fallback/
问题描述QJava 应用E序的中文无法显C,呈现方块状?/p>
原因分析QJava 应用E序无法扑ֈ可供昄中文的字体?/p>
解决Ҏ(gu)Q首先,保pȝ里安装了 JDK 1.5.0_06Q如果安装的?JRE 1.5.0_06Q那么卸?JREQ再安装 JDK。然后下?fireflysung 1.3.0Q?解压后将其中?ttf 文g丢到pȝ字体目录/usr/share/fontsQ再?fc-cache -f -v 跑一遍,让系l知道这个字体。最后,是转到 JDK 安装目录的jre/lib/fonts 中,使用下面的命令来完成?/p>
mkdir fallback cd fallback ln -s /usr/share/fonts/fireflysung.ttf mkfontdir mkfontscale
SUID ?Set User ID, SGID ?Set Group ID的意思?/p>
UNIX下可以用ls -l 命o来看到文件的权限。用ls命o所得到的表C法的格式是cMq样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这U表C方法一共有十位Q?/p>
9 8 7 6 5 4 3 2 1 0
- r w x r - x r - x
W?位表C文件类?可以为p、d、l、s、c、b?Q?/p>
p表示命名道文g
d表示目录文g
l表示W号q接文g
-表示普通文?/p>
s表示socket文g
c表示字符讑֤文g
b表示块设备文?/p>
W?-6位?-3位?-0位分别表C文件所有者的权限Q同l用L权限Q其他用L权限Q其形式为rwxQ?/p>
r表示可读Q可以读出文件的内容
w表示可写Q可以修Ҏ(gu)件的内容
x表示可执行,可运行这个程?/p>
没有权限的位|用-表示
例子Q?/p>
ls -l myfile昄为:
rwxr-x-- 1 foo staff 7734 Apr 05 17:07 myfile
表示文gmyfile是普通文Ӟ文g的所有者是foo用户Q而foo用户属于staffl,文g只有1个硬q接Q长度是7734个字节,最后修Ҏ(gu)???7:07?/p>
所有者f(xi)ooҎ(gu)件有d执行权限Qstaffl的成员Ҏ(gu)件有d执行权限Q其他的用户对这个文件没有权限?/p>
如果一个文件被讄了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:
1?rwsr-xr-x 表示SUID和所有者权限中可执行位被设|?/p>
2?del>rwSrr- 表示SUID被设|,但所有者权限中可执行位没有被设|?/p>
3?rwxr-sr-x 表示SGID和同l用h限中可执行位被设|?/p>
4?del>rw-r-Sr- 表示SGID被设|,但同l用h限中可执行位没有被社
其实在UNIX的实CQ文件权限用12个二q制位表C,如果该位|上的值是
1Q表C有相应的权限:
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
W?1位ؓSUID位,W?0位ؓSGID位,W?位ؓsticky位,W?-0位对应于上面的三lrwx位?/p>
11 10 9 8 7 6 5 4 3 2 1 0
上面?rwsr-xr-x的gؓQ?1 0 0 1 1 1 1 0 1 1 0 1
rw-r-Sr-的gؓQ?0 1 0 1 1 0 1 0 0 1 0 0
l文件加SUID和SUID的命令如下:
chmod u+s filename 讄SUID?/p>
chmod u-s filename LSUID讄
chmod g+s filename 讄SGID?/p>
chmod g-s filename LSGID讄
另外一U方法是chmod命o用八q制表示Ҏ(gu)的设|。如果明白了前面?2位权限表C法也很单?/p>
二、SUID和SGID的详l解?/p>
׃SUID和SGID是在执行E序Q程序的可执行位被设|)时v作用Q而可执行位只Ҏ(gu)通文件和目录文g有意义,所以设|其他种cL件的SUID和SGID位是没有多大意义的?/p>
首先讲普通文件的SUID和SGID的作用。例子:
如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命o昄如下Q?/p>
-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfileM用户都可以执行这个程序。UNIX的内核是Ҏ(gu)什么来定一个进E对资源的访问权限的呢?是这个进E的q行用户的(有效QIDQ包?user id和group id。用户可以用id命o来查到自q或其他用Luser id和group id?/p>
除了一般的user id 和group id外,q有两个UC为effective 的idQ就是有效idQ上面的四个id表示为:uidQgidQeuidQegid。内怸要是Ҏ(gu)euid和egid来确定进E对资源的访问权限?/p>
一个进E如果没有SUID或SGID位,则euid=uid egid=gidQ分别是q行q个E序的用Luid和gid。例如kevin用户的uid和gid分别?04?02Qfoo用户的uid和gid?200Q?01Qkevinq行myfileE序形成的进E的euid=uid=204Qegid=gid=202Q内核根据这些值来判断q程对资源访?的限Ӟ其实是kevin用户对资源访问的权限Q和foo没关pR?/p>
如果一个程序设|了SUIDQ则euid和egid变成被运行的E序的所有者的uid和gidQ例如kevin用户q行myfileQeuid=200Qegid=201Quid=204Qgid=202Q则q个q程h它的属主foo的资源访问权限?/p>
SUID的作用就是这P让本来没有相应权限的用户q行q个E序Ӟ可以讉K他没有权限访问的资源。passwd是一个很鲜明的例子?/p>
SUID的优先比SGID高,当一个可执行E序讄了SUIDQ则SGID会自动变成相应的egid?/p>
下面讨论一个例子:
UNIXpȝ有一?dev/kmem的设备文Ӟ是一个字W设备文Ӟ里面存储了核心程序要讉K的数据,包括用户的口令。所以这个文件不能给一般的用户dQ权限设为:cr-r---- 1 root system 2, 1 May 25 1998 kmem
但ps{程序要读这个文Ӟ而ps的权限设|如下:
-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps
q是一个设|了SGID的程序,而ps的用hbinQ不是rootQ所以不能设|SUID来访问kmemQ但大家注意了,bin和root 都属于systeml,而且ps讄了SGIDQ一般用h行psQ就会获得systeml用L权限Q而文件kmem的同l用L权限是可读,所以一?用户执行ps没问题了。但有些Qؓ什么不把psE序讄为root用户的程序,然后讄SUID位,不也行吗Q这的确可以解决问题Q但实际中ؓ什?不这样做呢?因ؓSGID的风险比SUID得多,所以出于系l安全的考虑Q应该尽量用SGID代替SUID的程序,如果可能的话。下面来说明一?SGID对目录的影响。SUID对目录没有媄响。如果一个目录设|了SGID位,那么如果M一个用户对q个目录有写权限的话Q他在这个目录所建立的文?的组都会自动转ؓq个目录的属L在的l,而文件所有者不变,q是属于建立q个文g的用戗?/p>
三、关于SUID和SGID的编E?/p>
和SUID和SGID~程比较密切相关的有以下的头文g和函敎ͼ
#include
#include
uid_t getuid(void);
uid_t geteuid(void);
gid_t getgid (void);
gid_t getegid (void);
int setuid (uid_t UID);
int setruid (uid_t RUID);
int seteuid (uid_t EUID);
int setreuid (uid_t RUID,uid_t EUID);
int setgid (gid_t GID);
int setrgid (gid_t RGID);
int setegid (git_t EGID);
int setregid (gid_t RGID, gid_t EGID);
具体q些函数的说明在q里׃详细列出来了,要用到的可以用man查?/p>
SUID/SGID :
假如你有文ga.txt
#ls -l a.txt
-rwxrwxrwx
#chmod 4777 a.txt
-rwsrwxrwx ======>注意s位置
#chmod 2777 a.txt
-rwxrwsrwx ======>注意s位置
#chmod 7777 a.txt
-rwsrwxswt ======>出现了t,t的作用在内存中尽量保存a.txt,节省pȝ再加载的旉.
现在再看前面讄 SUID/SGID作用:
#cd /sbin
#./lsusb
...
#su aaa(普通用?
$./lsusb
...
是不是现在显C出错?
$su
#chmod 4755 lsusb
#su aaa
$./lsusb
... 现在明白了吗Q本来是只有root用户才能执行的命令,加了SUID?普通用户就可以像root一L用,权限提升了。上面是对于文g来说的,对于目录也差不多Q?/p>
目录的S属性得在该目录下创徏的Q何文件及子目录属于该目录所拥有的组Q目录的T属性得该目录的所有者及root才能删除该目录。还有对 于s与SQ设|SUID/SGID需要有q行权限Q否则用ls -l后就会看到S,证明你所讄的SUID/SGID没有起作用?/p>
Why we need suid,how do we use suid?
r -- 读访?/p>
w -- 写访?/p>
x -- 执行许可
s -- SUID/SGID
t -- sticky?/p>
那么 suid/sgid是做什么的Q?Z么会有suid位呢Q?/p>
要想明白q个Q先让我们看个问题:如果让每个用h改自q密码Q?/p>
用户修改密码Q是通过q行命opasswd来实现的。最l必要修改/etc/passwd文gQ而passwd的文件的属性是Q?/p>
#ls -l /etc/passwd
rw-rr- 1 root root 2520 Jul 12 18:25 passwd
我们可以看到passwd文g只有对于root用户是可写的Q而对于所有的他用h说都是没有写权限的?那么一个普通的用户如何能够通过q行passwd命o修改q个passwd文g呢?
Z解决q个问题QSUID/SGID便应q而生。而且AT&T对它甌了专利?呵呵?/p>
SUID和SGID是如何解册个问题呢Q?/p>
首先Q我们要知道一点:q程在运行的时候,有一些属性,其中包括 实际用户ID,实际lID,有效用户ID,有效lID{?实际用户ID和实际组ID标识我们是谁Q谁在运行这个程?一般这2个字D在登陆时决定,在一个登陆会话期_ q些值基本上不改变?/p>
而有效用户ID和有效组ID则决定了q程在运行时的权限。内核在军_q程是否有文件存取权限时Q是采用了进E的有效用户ID来进行判断的?/p>
知道了这点,我们来看看SUID的解决途径Q?/p>
当一个程序设|了为SUID位时Q内核就知道了运行这个程序的时候,应该认ؓ是文件的所有者在q行q个E序。即该程序运行的时候,有效用户ID是该E序的所有者。D个例子:
[root@sgrid5 bin]# ls -l passwd
-r-s-s-x 1 root root 16336 Feb 14 2003 passwd
虽然你以test登陆pȝQ但是当你输入passwd命o来更改密码的时候,׃passwd讄了SUID位,因此虽然q程的实际用户ID 是test对应的IDQ但是进E的有效用户ID则是passwd文g的所有者root的ID,因此可以修改/etc/passwd文g?/p>
让我们看另外一个例子?/p>
ping命o应用q泛Q可以测试网l是否连接正常。ping在运行中是采用了ICMP协议Q需要发送ICMP报文。但是只有root用户才能建立ICMP报文Q如何解册个问题呢Q同P也是通过SUID位来解决?/p>
[root@sgrid5 bin]# ls -l /bin/ping
-rwsr-sr-x 1 root root 28628 Jan 25 2003 /bin/ping
我们可以试一下,如果Lping的SUID位,再用普通用户去q行命oQ看会怎么栗?/p>
[root@sgrid5 bin]#chmod u-s /bin/ping
[root@sgrid5 bin]# ls -l ping
-rwxr-xr-x 1 root root 28628 Jan 25 2003 ping
[root@sgrid5 bin]#su test
[test@sgrid5 bin]$ ping byhh.net
ping: icmp open socket: Operation not permitted
SUID虽然很好了解决了一些问题,但是同时也会带来一些安全隐(zhn)?/p>
因ؓ讄?SUID 位的E序如果被攻?通过~冲区溢出等斚w),那么hacker可以拿到root权限?/p>
因此在安全方面特别要注意那些讄了SUID的程序?/p>
通过以下的命令可以找到系l上所有的讄了suid的文Ӟ
[root@sgrid5 /]# find / -perm -04000 -type f -ls
对于q里Z么是4000Q大家可以看一下前面的st_mode的各bit的意义就明白了?/p>
在这些设|了suid的程序里Q如果用不上的,最好取消该E序的suid位?/p>
SUID和SGIDQ主要作用是用于当非某个文g的所有?或组)执行(或操作目?文gӞ可以暂时获得该文件所有者的权限?br />
SBIT的作用在于访问控Ӟ当它Ҏ(gu)个目录设|此属性后Q该目录下的所有文Ӟ即其它人有w属性,都不得对其更名、移动、删除?/p>
讄Ҏ(gu)Q?br />
如果你已l掌握了?八进?数字来表C权限的规则Q再l合chmod命oq行讄很单了。以下是SUID/SGID/Sticky BitU定对应的八q制数|
ȝQ?/span>
1QSet UIDQ当文gpȝ?所有者权限组?的可执行位被s(即rws------)取代Ӟ构成Ҏ(gu)权限规定Set UIDQ简USUID。仅对系l中的二q制可执行文件设|有效,而且不可对Shell Script施加讄?br />
2QSet GIDQ当所有者所在的用户l?group)的权限组合中可执行位被s所取代?例如--rws--)Q便构成Set GID的权限设|。SGID可以针对二进制文件或目录q行讄?br />
3QSticky BitQ当文gpȝ"其他(others)"的权限组合中可执行位被t所取代?例如------rwt)Q便构成Sticky Bit的权限设|。它只对目录有效?
SUID Q?4
SGID Q?2
SBIT Q?1
讄时我们把表示Ҏ(gu)权限的数字放在其他三位数字权限的前面?/p>
介绍Q?/p>
在META-INF/services目录下保存的是service provider的配|文件?服务在应用中会是一个接?更多的是抽象c??br /> 一个类服务器提供者实C一个服务类。这cȝ服务提供cd以以扩展的Ş式发布到q_上。所以,jar文g引入了扩展目录,同样你也可以服务提供者加入classpath提供讉K?/p>
服务都是表现Z个积累,而一个服务提供者通常是集成或实现了服务定义类。服务提供类通常不会像代理类一样ؓ了正常提供服务而包含了h者的许多信息。服务提供类一般們于高集成?br /> 对这cL务提供类的唯一强制性要求就是必L一个无参的构造函数?/p>
provider 配置文g
META-INF/services目录作ؓprovider配置文g的存放\径。provider配置文g中必L全类?包含package)。配|文件可以存在space tab 换行{字W?#作ؓ注释?br />
注意Qprovider配置文g必须是以UTF-8~码?/p>