安装 mysql 运行命令:
sudo apt-get install mysql-server mysql-client在安装 nginx 之前,如果你已经安装 apache2 先删除在安装 nginx:
service apache2 stop
update-rc.d -f apache2 remove
sudo apt-get remove apache2
我们必须通过 才能让php5正常工作,安装命令:
sudo apt-get install php5-fpmphp-fpm是一个守护进程。
安装mysql和gd扩展
sudo apt-get install curl libcurl3 libcurl3-dev php5-curl
可以通过访问oracle凯发k8网页登录官网下载,或者直接通过命令行下载。
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
在系统中添加环境变量,主要是path、classpath和java_home。
lxh@ubuntu:~$ sudo vim ~/.profile
在文件最后加入
export java_home=/usr/lib/jvm/jdk1.8.0_25/export jre_home=/usr/lib/jvm/jdk1.8.0_25/jre
export classpath=.:$java_home/lib/dt.jar:$java_home/lib/tools.jar:$java_home/lib:$jre_home/lib:$classpath
export path=$java_home/bin:$path
保存退出,并通过命令使脚本生效:
lxh@ubuntu:~$ $source ~/.profile
在有的系统中会预装openjdk,系统默认使用的是这个,而不是刚才装的。所以这一步是通知系统使用oracle的jdk,非openjdk。
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_25/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.8.0_25/bin/javac 300
sudo update-alternatives --config java
因为我是在虚拟机中安装的ubuntu 14.04,默认不安装openjdk,所以没有需要选择的jdk版本。如果是在物理机上安装的ubuntu版本,会出现几个候选项,可用于替换 java (提供 /usr/bin/java)。
====================================
2)添加权限
$ sudo chmod x nginx
3)服务方式启动 如果配置服务前已启动,执行以下命令停止nginx。
$ sudo service nginx stop
4)启动nginx
$ sudo service nginx start
pastingnginx出现connect() to unix:/var/run/php5-fpm.sock failed (13: permission denied)的错误
处理方式是:编辑/etc/php5/fpm/pool.d/www.conf文件,
将以下的注释去掉:
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
然后重启php5-fpm
$ sudo service php5-fpm restart
ubuntu 14.04快速搭建svn服务器及日常使用
svn相关命令了解
svn:命令行客户端
svnadmin:用来创建、调整或修复版本库的工具
svnserve:svn服务程序
svndumpfilter:过滤svn版本库转储数据流的工具
svnsync:svn数据同步工具,实现另外存一份相同的
svnlook:用来查看办本科中不同的修订版和事务
直接安装
# apt-get install subversion
创建版本库
# sudo mkdir /app/svn
# sudo svnadmin create /app/svn/prj
配置版本库
# sudo vi svnserve.conf #将以下参数去掉注释
[general]
anon-access = none #匿名访问权限,默认read,none为不允许访问
auth-access = write #认证用户权限
password-db = passwd #用户信息存放文件,默认在版本库/conf下面,也可以绝对路径指定文件位置
authz-db = authz
# sudo vi passwd #格式是用户名=密码,采用明文密码
[users]
xiaoming = 123
zhangsan = 123
lisi = 123
# sudo vi authz
[groups] #定义组的用户
manager = xiaoming
core_dev = zhangsan,lisi
[repos:/] #以根目录起始的repos版本库manager组为读写权限
@manager = rw
[repos:/media] #core_dev对repos版本库下media目录为读写权限
@core_dev = rw
备份与恢复
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
### 增量备份 ###
# 先完整备份
svnadmin dump /app/svn/prj -r 0:100 > yymmdd_incremental_backup.svn
# 再增量备份
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 内存优化
linux下修改jvm内存大小
要添加在tomcat 的bin 下catalina.sh 里,位置cygwin=false前 。注意引号要带上,红色的为新添加的.
# 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 判断字符串是否包含另外一个字符串
fn:containsignorecase 判断字符串是否包含另外一个字符串(大小写无关)
fn:endswith 判断字符串是否以另外字符串结束
fn:escapexml 把一些字符转成xml表示,例如 <字符应该转为< ${fn:escapexml(param:info)}
fn:indexof 子字符串在母字符串中出现的位置 ${fn:indexof(name, "-")}
fn:join 将数组中的数据联合成一个新字符串,并使用指定字符格开 ${fn:join(array, ";")}
fn:length 获取字符串的长度,或者数组的大小 ${fn:length(shoppingcart.products)}
fn:replace 替换字符串中指定的字符 ${fn:replace(text, "-", "?")}
fn:split 把字符串按照指定字符切分 ${fn:split(customernames, ";")}
fn:startswith 判断字符串是否以某个子串开始
fn:substring 获取子串 ${fn:substring(zip, 6, -1)}
fn:substringafter 获取从某个字符所在位置开始的子串 ${fn:substringafter(zip, "-")}
fn:substringbefore 获取从开始到某个字符所在位置的子串 ${fn:substringbefore(zip, "-")}
fn:tolowercase 转为小写 ${fn.tolowercase(product.name)}
fn:touppercase 转为大写字符 ${fn.uppercase(product.name)}
fn:trim 去除字符串前后的空格 ${fn.trim(name)}
函数
描述
fn:contains(string, substring)
如果参数string中包含参数substring,返回true
fn:containsignorecase(string, substring)
如果参数string中包含参数substring(忽略大小写),返回true
fn:endswith(string, suffix)
如果参数 string 以参数suffix结尾,返回true
fn:escapexml(string)
将有特殊意义的xml (和html)转换为对应的xml character entity code,并返回
fn:indexof(string, substring)
返回参数substring在参数string中第一次出现的位置
fn:join(array, separator)
将一个给定的数组array用给定的间隔符separator串在一起,组成一个新的字符串并返回。
fn:length(item)
返回参数item中包含元素的数量。参数item类型是数组、collection或者string。如果是string类型,返回值是string中的字符数。
fn:replace(string, before, after)
返回一个string对象。用参数after字符串替换参数string中所有出现参数before字符串的地方,并返回替换后的结果
fn:split(string, separator)
返回一个数组,以参数separator 为分割符分割参数string,分割后的每一部分就是数组的一个元素
fn:startswith(string, prefix)
如果参数string以参数prefix开头,返回true
fn:substring(string, begin, end)
返回参数string部分字符串, 从参数begin开始到参数end位置,包括end位置的字符
fn:substringafter(string, substring)
返回参数substring在参数string中后面的那一部分字符串??
fn:substringbefore(string, substring)
返回参数substring在参数string中前面的那一部分字符串
fn:tolowercase(string)
将参数string所有的字符变为小写,并将其返回
fn:touppercase(string)
将参数string所有的字符变为大写,并将其返回
fn:trim(string)
在jsp中 使用el表达式时,不可以使用java提供的功能,比如indexof()等。
报错
the function valueof must be used with a prefix when a default namespace is not specified
语法结构
*
*
* “host”: 被代理的服务器的ip
* “port”: 被代理服务器的端口,默认是80
如:
再如:
负载均衡的例子,例如有8个squid缓存,需要用lighttpd做负载均衡
当一个服务器宕机后,它上面的请求将被转移给其他设备server
如何为代码选择开源许可证,这是一个问题。
世界上的开源许可证,大概有。很少有人搞得清楚它们的区别。即使在最流行的六种----、、、、和----之中做选择,也很复杂。
乌克兰程序员,画了一张分析图,说明应该怎么选择。这是我见过的最简单的讲解,只用两分钟,你就能搞清楚这六种许可证之间的最大区别。
下面是我制作的中文版,请点击看大图。
如果你有两个具有很多相同属性的javabean,一个很常见的情况就是struts里的po对象(持久对象)和对应的actionform,例如 teacher和teacherform。我们一般会在action里从actionform构造一个po对象,传统的方式是使用类似下面的语句对属性逐个赋值:
如果teacher和teacherform间存在名称不相同的属性,则beanutils不对这些属性进行处理,需要程序员手动处理。例如 teacher包含modifydate(该属性记录最后修改日期,不需要用户在界面中输入)属性而teacherform无此属性,那么在上面代码的 copyproperties()后还要加上一句:
怎么样,很方便吧!除beanutils外还有一个名为propertyutils的工具类,它也提供copyproperties()方法,作用与 beanutils的同名方法十分相似,主要的区别在于后者提供类型转换功能,即发现两个javabean的同名属性为不同类型时,在支持的数据类型范围内进行转换,而前者不支持这个功能,但是速度会更快一些。beanutils支持的转换类型如下:
* 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
这里要注意一点,java.util.date是不被支持的,而它的子类java.sql.date是被支持的。因此如果对象包含时间类型的属性,且希望被转换的时候,一定要使用java.sql.date类型。否则在转换时会提示argument mistype异常。
三、优缺点:
apache jakarta commons项目非常有用。我曾在许多不同的项目上或直接或间接地使用各种流行的commons组件。其中的一个强大的组件就是beanutils。我将说明如何使用beanutils将local实体bean转换为对应的value 对象:
上面的代码从alocal对象复制属性到avalue对象。它相当简单!它不管local(或对应的value)对象有多少个属性,只管进行复制。我们假设local对象有100个属性。上面的代码使我们可以无需键入至少100行的冗长、容易出错和反复的get和set方法调用。这太棒了!太强大了!太有用了!
beanutils.copyproperties 与 propertyutils.copyproperties 都是拷贝对象属性的方法,beanutils 支持类型转换,而 propertyutils 不支持。但是 beanutils 不允许对象的属性值为 null,propertyutils 可以拷贝属性值 null 的对象。
如果对象属性值为 null,beanutils.copyproperties 方法会报 commons.beanutils.conversionexception: no value specified 错误。
现在,还有一个坏消息:使用beanutils的成本惊人地昂贵!我做了一个简单的测试,beanutils所花费的时间要超过取数据、将其复制到对应的 value对象(通过手动调用get和set方法),以及通过串行化将其返回到远程的客户机的时间总和。所以要小心使用这种威力!
methodutils类使用方法:
1,查看apache进程:
ps aux | grep httpd | grep -v grep | wc -l
2,查看80端口的tcp连接:
netstat -tan | grep "established" | grep ":80" | wc -l
3,通过日志查看当天ip连接数,过滤重复:
cat access_log | grep "24/jul/2007" | awk '{print $2}' | sort | uniq -c | sort -nr
4,当天ip连接数最高的ip都在干些什么(原来是蜘蛛):
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,当天访问页面排前10的url:
cat access_log | grep "24/jul/2007:00" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
6,用tcpdump嗅探80端口的访问看看谁最高
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,查看某一时间段的ip连接数:
grep "2006:0[7-8]" www20060723.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l
删除jsp编译后的空行办法如下:
1. 支持jsp 2.1 ,在每个要去空行的页面里包含下面代码:
- <%@ page trimdirectivewhitespaces="true" %>
在 tomcat 6.0.14下测试jsp编译成功
2. 支持servlet 2.5 , 即 web.xml的 xsd版本为2.5,在web.xml中加入如下代码
- <jsp-config>
- <jsp-property-group>
- <url-pattern>*.jspurl-pattern>
- <trim-directive-whitespaces>truetrim-directive-whitespaces>
- jsp-property-group>
- jsp-config>
在tomcat 6.0.14下测试jsp编译成功
3. tomcat 5.5.x ,在tomcat安装目录/conf/web.xml中找到名叫"jsp"的servlet,添加下面一段代码:
- <init-param>
- <param-name>trimspacesparam-name>
- <param-value>trueparam-value>
- init-param>
本人测过
trimspaces should white spaces in template text between actions or directives be trimmed? [false]
在实际操作中我加入了5.5的配置到页面中并反复启动了几次tomcat但是还是没有成功,后来才想到jsp已经编译成servlet了所以没有能改变,进入到tomcat中的work目录把已经进行jsp编译的class全部删除,哇哈哈,整个世界清净了,成功删除空行
在
catalina.bat
找到
set debug_opts=
set jpda=
在下面添加
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 (jdk1.6.0_02\lib):输入
localhost:1090
用户名 口令 为空
进入 即可 查看
可是,如果通过了多级反向代理的话,x-forwarded-for的值并不止一个,而是一串ip值,究竟哪个才是真正的用户端的真实ip呢?
答案是取x-forwarded-for中第一个非unknown的有效ip字符串。
如:
x-forwarded-for:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
用户真实ip为: 192.168.1.110
为了确定你的linux环境下程序会使用的字体文件,先跑跑这个程序:from others
解决的办法是:
编辑/etc/profile文件,在最后加入export catalina_opts='-djava.awt.headless=true'
即可