??xml version="1.0" encoding="utf-8" standalone="yes"?> 安装 MySQL q行命o(h)Q?/p>
sudo apt-get install mysql-server mysql-client 在安?Nginx 之前Q如果你已经安装 Apache2 先删除在安装 nginxQ?/p>
service apache2 stop 我们必须通过 PHP-FPM 才能让PHP5正常工作Q安装命令:(x) php-fpm是一个守护进E?br />
sudo apt-get install curl libcurl3 libcurl3-dev php5-curl 可以通过讉KOracle官网下蝲Q或者直接通过命o(h)行下载?/p>
在系l中d环境变量Q主要是PATH、CLASSPATH和JAVA_HOME?/p>
在文件最后加?/p>
保存退出,q过命o(h)使脚本生效:(x) 在有的系l中?x)预装OpenJDKQ系l默认用的是这个,而不是刚才装的。所以这一步是通知pȝ使用Oracle的JDKQ非OpenJDK?/p>
因ؓ(f)我是在虚拟机中安装的Ubuntu 14.04Q默认不安装OpenJDKQ所以没有需要选择的JDK版本。如果是在物理机上安装的Ubuntu版本Q会(x)出现几个候选项Q可用于替换 java (提供 /usr/bin/java)?/p>
==================================== 配置版本?/strong> # sudo vi passwd #格式是用户名=密码Q采用明文密?span class="Apple-converted-space"> 备䆾与恢?/strong> # 备䆾 Linux下修改JVM内存大小 要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false?。注意引可带上,U色的ؓ(f)新添加的.
安装 Nginx
update-rc.d -f apache2 remove
sudo apt-get remove apache2安装 PHP5
安装mysql和GD扩展
安装 JDK8
lxh@ubuntu:~$ wget -c http://download.oracle.com/otn-pub/java/jdk/8u11-b12/jdk-8u25-linux-x64.tar.gz
解压安装
lxh@ubuntu:~$ mkdir -p /usr/lib/jvm
lxh@ubuntu:~$ sudo mv jdk-8u25-linux-x64.tar.gz /usr/lib/jvm
lxh@ubuntu:~$ cd /usr/lib/jvm
lxh@ubuntu:~$ sudo tar xzvf jdk-8u25-linux-x64.tar.gz
lxh@ubuntu:~$ sudo vim ~/.profile
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$PATHlxh@ubuntu:~$ $source ~/.profile
配置默认JDK版本
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_25/bin/javac 300
sudo update-alternatives --config java
~译安装nginx
1. 下蝲最新版nginx
2.解压
3. 安装
启动nginx
1)使用?/etc/init.d/ 目录下创建名?nginx 文gQ注意没有后~名,以下内容复制到该文件中Q感谢提供脚本的兄弟Q?/span>
/usr/local/nginx/sbin/nginx
2 #用来Nginx注册为系l服务的脚本
3 #Author CplusHua
4 #http://www.219.me
5 #chkconfig: - 85 15
6 set -e
7 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
8 DESC="Nginx Daemon"
9 NAME=nginx
10 DAEMON=/usr/local/nginx/sbin/$NAME
11 SCRIPTNAME=/etc/init.d/$NAME
12 #守护q程不存在就退?br />
13 test -x $DAEMON ||exit 0
14 d_start(){
15 $DAEMON ||echo -n "aready running"
16 }
17 d_stop(){
18 $DAEMON -s quit || echo -n "not running"
19 }
20 d_reload(){
21 $DAEMON -s reload || echo -n "could not reload"
22 }
23 case "$1" in
24 start)
25 echo -n "Starting $DESC: $NAME"
26 d_start
27 echo "."
28 ;;
29 stop)
30 echo -n "Stopping $DESC: $NAME"
31 d_stop
32 echo "."
33 ;;
34 reload)
35 echo -n "Reloading $DESC: configurationg.."
36 d_reload
37 echo "reloaded."
38 ;;
39 restart)
40 echo -n "Restarting $DESC: $NAME"
41 d_stop
42 sleep 3
43 d_start
44 echo "."
45 ;;
46 *)
47 echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2
48 exit 3
49 ;;
50 esac
51
52 exit 0
2)d权限
$ sudo chmod +x nginx
3)服务方式启动 如果配置服务前已启动Q执行以下命令停止Nginx?
$ sudo service nginx stop
4)启动Nginx
$ sudo service nginx start
pastingnginx出现connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied)的错?
处理方式是:(x)~辑/etc/php5/fpm/pool.d/www.conf文gQ?br />
以下的注释L:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
然后重启php5-fpm
$ sudo service php5-fpm restart
Ubuntu 14.04快速搭建SVN服务器及(qing)日常使用
SVN相关命o(h)了解
svnQ命令行客户?
svnadminQ用来创建、调整或修复版本库的工具
svnserveQsvn服务E序
svndumpfilterQ过滤svn版本库{储数据流的工?
svnsyncQsvn数据同步工具Q实现另外存一份相同的
svnlookQ用来查看办本科中不同的修订版和事务
直接安装
# apt-get install subversion
创徏版本?/strong>
# sudo mkdir /app/svn
# sudo svnadmin create /app/svn/prj
# sudo vi svnserve.conf #以下参数去掉注?span class="Apple-converted-space" style="font-weight: normal;">
[general]
anon-access = none #匿名讉K权限Q默认readQnoneZ允许讉K
auth-access = write #认证用户权限
password-db = passwd #用户信息存放文gQ默认在版本?conf下面Q也可以l对路径指定文g位置
authz-db = authz
[users]
xiaoming = 123
zhangsan = 123
lisi = 123
# sudo vi authz
[groups] #定义l的用户
manager = xiaoming
core_dev = zhangsan,lisi
[repos:/] #以根目录起始的repos版本库managerlؓ(f)d权限
@manager = rw
[repos:/media] #core_dev对repos版本库下media目录写权?span class="Apple-converted-space">
@core_dev = rw
启动svn服务
# sudo svnserve -d -r /app/svn
# 查看是否启动成功Q可看的监听3690端口
# sudo netstat -antp |grep svnserve
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 28967/svnserve
# 如果惛_闭服务,可用pkill svnserve
讉Ksvn
# 讉Krepos版本库地址
svn://192.168.1.100/prj
svnadmin dump备䆾
# 完整备䆾
svnadmin dump /app/svn/prj > YYmmdd_fully_backup.svn
# 完整压羃备䆾
svnadmin dump /app/svn/prj | gzip > YYmmdd_fully_backup.gz
# 备䆾恢复
svnadmin load /app/svn/prj < YYmmdd_fully_backup.svn
zcat YYmmdd_fully_backup.gz | svnadmin load repos
### 增量备䆾 ###
# 先完整备?br />
svnadmin dump /app/svn/prj -r 0:100 > YYmmdd_incremental_backup.svn
# 再增量备?br />
svnadmin dump /app/svn/prj -r 101:200 --incremental > YYmmdd_incremental_backup.svn
svnadmin hotcopy备䆾
svnadmin hotcopy /app/svn/prj YYmmdd_fully_backup --clean-logs
# 恢复
svnadmin hotcopy YYmmdd_fully_backup /app/svn/prj
Tomcat 内存优化
# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:PermSize=64M -XX:MaxPermSize=128m"
cygwin=false
]]>fn:contains 判断字符串是否包含另外一个字W串 <c:if test="${fn:contains(name, searchString)}">
fn:containsIgnoreCase 判断字符串是否包含另外一个字W串(大小写无? <c:if test="${fn:containsIgnoreCase(name, searchString)}">
fn:endsWith 判断字符串是否以另外字符串结?<c:if test="${fn:endsWith(filename, ".txt")}">
fn:escapeXml 把一些字W{成XML表示Q例?<字符应该转ؓ(f)< ${fn:escapeXml(param:info)}
fn:indexOf 子字W串在母字符串中出现的位|?${fn:indexOf(name, "-")}
fn:join 数l中的数据联合成一个新字符Ԍq用指定字W格开 ${fn:join(array, ";")}
fn:length 获取字符串的长度Q或者数l的大小 ${fn:length(shoppingCart.products)}
fn:replace 替换字符串中指定的字W?${fn:replace(text, "-", "?")}
fn:split 把字W串按照指定字符切分 ${fn:split(customerNames, ";")}
fn:startsWith 判断字符串是否以某个子串开?<c:if test="${fn:startsWith(product.id, "100-")}">
fn:substring 获取子串 ${fn:substring(zip, 6, -1)}
fn:substringAfter 获取从某个字W所在位|开始的子串 ${fn:substringAfter(zip, "-")}
fn:substringBefore 获取从开始到某个字符所在位|的子串 ${fn:substringBefore(zip, "-")}
fn:toLowerCase 转ؓ(f)写 ${fn.toLowerCase(product.name)}
fn:toUpperCase 转ؓ(f)大写字符 ${fn.UpperCase(product.name)}
fn:trim 去除字符串前后的I格 ${fn.trim(name)}
函数
描述
fn:contains(string, substring)
如果参数string中包含参数substringQ返回true
fn:containsIgnoreCase(string, substring)
如果参数string中包含参数substringQ忽略大写Q,q回true
fn:endsWith(string, suffix)
如果参数 string 以参数suffixl尾Q返回true
fn:escapeXml(string)
有Ҏ(gu)意义的XML (和HTML)转换为对应的XML character entity codeQƈq回
fn:indexOf(string, substring)
q回参数substring在参数string中第一ơ出现的位置
fn:join(array, separator)
一个给定的数组array用给定的间隔Wseparator串在一Pl成一个新的字W串q返回?br style="margin: 0px; padding: 0px; list-style-type: none;" />
fn:length(item)
q回参数item中包含元素的数量。参数Itemcd是数l、collection或者String。如果是Stringcd,q回值是String中的字符数?br style="margin: 0px; padding: 0px; list-style-type: none;" />
fn:replace(string, before, after)
q回一个String对象。用参数after字符串替换参数string中所有出现参数before字符串的地方Qƈq回替换后的l果
fn:split(string, separator)
q回一个数l,以参数separator 为分割符分割参数stringQ分割后的每一部分是数组的一个元?br style="margin: 0px; padding: 0px; list-style-type: none;" />
fn:startsWith(string, prefix)
如果参数string以参数prefix开_(d)q回true
fn:substring(string, begin, end)
q回参数string部分字符? 从参数begin开始到参数end位置Q包括end位置的字W?br style="margin: 0px; padding: 0px; list-style-type: none;" />
fn:substringAfter(string, substring)
q回参数substring在参数string中后面的那一部分字符??
fn:substringBefore(string, substring)
q回参数substring在参数string中前面的那一部分字符?br style="margin: 0px; padding: 0px; list-style-type: none;" />
fn:toLowerCase(string)
参数string所有的字符变ؓ(f)写Qƈ其q回
fn:toUpperCase(string)
参数string所有的字符变ؓ(f)大写Qƈ其q回
fn:trim(string)
在jsp?使用EL表达式时Q不可以使用java提供的功能,比如indexOf(){?br style="margin: 0px; padding: 0px; list-style-type: none;" />
<c:if test="${Boolean.valueOf(requestScope.addresult)==false}">
报错
The function valueOf must be used with a prefix when a default namespace is not specified
语法l构
*
*
* “port”: 被代理服务器的端口,默认?0
如:(x)
再如Q?/p>
负蝲均衡的例子,例如?个squid~存Q需要用lighttpd做负载均?/p>
当一个服务器宕机后,它上面的h被转移l其他设备server
如何Z码选择开源许可证Q这是一个问题?/p>
世界上的开源许可证Q大概有上百U?/a>。很有人搞得清楚它们的区别。即使在最行的六U?---GPL?a target="_blank">BSD?a target="_blank">MIT?a target="_blank">Mozilla?a target="_blank">Apache?a target="_blank">LGPL----之中做选择Q也很复杂?/p>
乌克兰程序员Paul BagwellQ画了一张分析图Q说明应该怎么选择。这是我见过的最单的讲解Q只用两分钟Q你p搞清楚这六种许可证之间的最大区别?/p>
下面是我制作的中文版Q请点击看大图?/p>
如果你有两个h很多相同属性的JavaBeanQ一个很常见的情况就是Struts里的PO对象Q持久对象)(j)和对应的ActionFormQ例?Teacher和TeacherForm。我们一般会(x)在Action里从ActionForm构造一个PO对象Q传l的方式是用类g面的语句对属性逐个赋|(x)
如果Teacher和TeacherForm间存在名UC相同的属性,则BeanUtils不对q些属性进行处理,需要程序员手动处理。例?Teacher包含modifyDateQ该属性记录最后修Ҏ(gu)期,不需要用户在界面中输入)(j)属性而TeacherForm无此属性,那么在上面代码的 copyProperties()后还要加上一句:(x)
怎么P很方便吧Q除BeanUtils外还有一个名为PropertyUtils的工L(fng)Q它也提供copyProperties()Ҏ(gu)Q作用与 BeanUtils的同名方法十分相|主要的区别在于后者提供类型{换功能,卛_C个JavaBean的同名属性ؓ(f)不同cdӞ在支持的数据cd范围内进行{换,而前者不支持q个功能Q但是速度?x)更快一些。BeanUtils支持的{换类型如下:(x)
* java.lang.BigDecimal
* java.lang.BigInteger
* boolean and java.lang.Boolean
* byte and java.lang.Byte
* char and java.lang.Character
* java.lang.Class
* double and java.lang.Double
* float and java.lang.Float
* int and java.lang.Integer
* long and java.lang.Long
* short and java.lang.Short
* java.lang.String
* java.sql.Date
* java.sql.Time
* java.sql.Timestamp
q里要注意一点,java.util.Date是不被支持的Q而它的子cjava.sql.Date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.Datecd。否则在转换时会(x)提示argument mistype异常?
三、优~点Q?
Apache Jakarta Commons目非常有用。我曑֜许多不同的项目上或直接或间接C用各U流行的commonslg。其中的一个强大的lg是BeanUtils。我说明如何用BeanUtilslocal实体bean转换为对应的value 对象Q?
上面的代码从aLocal对象复制属性到aValue对象。它相当单!它不localQ或对应的valueQ对象有多少个属性,只管q行复制。我们假设local对象?00个属性。上面的代码使我们可以无需键入臛_100行的冗长、容易出错和反复的get和setҎ(gu)调用。这太棒了!太强大了Q太有用了!
BeanUtils.copyProperties ?PropertyUtils.copyProperties 都是拯对象属性的Ҏ(gu)QBeanUtils 支持cd转换Q?PropertyUtils 不支持。但?BeanUtils 不允许对象的属性gؓ(f) nullQPropertyUtils 可以拯属性?null 的对象?
如果对象属性gؓ(f) nullQBeanUtils.copyProperties Ҏ(gu)?x)?commons.beanutils.ConversionException: No value specified 错误?
现在Q还有一个坏消息Q用BeanUtils的成本惊人地昂贵Q我做了一个简单的试QBeanUtils所p的时间要过取数据、将其复制到对应?value对象Q通过手动调用get和setҎ(gu)Q,以及(qing)通过串行化将其返回到q程的客h的时间d。所以要心使用q种威力Q?
MethodUtilscM用方?
1,查看apacheq程:
ps aux | grep httpd | grep -v grep | wc -l
2,查看80端口的tcpq接:
netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l
3,通过日志查看当天ipq接敎ͼqo(h)重复:
cat access_log | grep "24/Jul/2007" | awk '{print $2}' | sort | uniq -c | sort -nr
4,当天ipq接数最高的ip都在q些什?原来是蜘?:
cat access_log | grep "24/Jul/2007:00" | grep "61.135.166.230" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
5,当天讉K面排前10的url:
cat access_log | grep "24/Jul/2007:00" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
6,用tcpdump嗅探80端口的访问看看谁最?br />
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr
接着从日志里查看该ip在干?
cat access_log | grep 220.181.38.183| awk '{print $1"\t"$8}' | sort | uniq -c | sort -nr | less
7,查看某一旉D늚ipq接?
grep "2006:0[7-8]" www20060723.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l
删除JSP~译后的I办法如下Q?/strong>
1. 支持JSP 2.1+ Q在每个要去I的页面里包含下面代码Q?/p>
- <%@ page trimDirectiveWhitespaces="true" %>
?Tomcat 6.0.14下测试JSP~译成功
2. 支持servlet 2.5+, ?web.xml?XSD版本?.5Q在web.xml中加入如下代?/p>
- <jsp-config>
- <jsp-property-group>
- <url-pattern>*.jsp</url-pattern>
- <trim-directive-whitespaces>true</trim-directive-whitespaces>
- </jsp-property-group>
- </jsp-config>
在tomcat 6.0.14下测试JSP~译成功
3. Tomcat 5.5.x+Q在Tomcat安装目录/conf/web.xml中找到名?jsp"的servletQ添加下面一D代码:(x)
- <init-param>
- <param-name>trimSpaces</param-name>
- <param-value>true</param-value>
- </init-param>
本h过
trimSpaces Should white spaces in template text between actions or directives be trimmed? [false]
在实际操作中我加入了5.5的配|到面中ƈ反复启动了几ơtomcat但是q是没有成功Q后来才惛_JSP已经~译成servlet了所以没有能改变Q进入到tomcat中的work目录把已l进行JSP~译的class全部删除Q哇哈哈Q整个世界清净了,成功删除I
?
catalina.bat
扑ֈ
set DEBUG_OPTS=
set JPDA=
在下面添?/p>
set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
保存
通过startup。bat启动 tomcat
启动jconsole Qjdk1.6.0_02\libQ:(x)输入
localhost:1090
用户?口o(h) 为空
q入 卛_ 查看
可是Q如果通过了多U反向代理的话,X-Forwarded-For的值ƈ不止一个,而是一Ԍp|I竟哪个才是真正的用L(fng)的真实IP呢?
{案是取X-Forwarded-For中第一个非unknown的有效IP字符丌Ӏ?br />
如:(x)
X-Forwarded-ForQ?92.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
用户真实IP为:(x) 192.168.1.110
Z定你的Linux环境下程序会(x)使用的字体文Ӟ先跑跑这个程序:(x)from others
解决的办法是Q?br />~辑/etc/profile文gQ在最后加入export CATALINA_OPTS='-Djava.awt.headless=true'
卛_