结合Filter和Servlet实现真正的静态化

设计目的:

当网站的访问量日益增多,数据库的记录日益庞大时,这时数据库的压力将会变得非常大,如果每一次的用户请求都要从数据库里取数据的话,不但不能及时响应用户的请求,还会使数据库处于一个不稳定的状态,影响网站性能。当数据库已经成为性能瓶颈时,这时候,最有效且直接的方式就是通过缓存或生成静态文件来减少数据库的读取次数,从而降低数据库的压力,提升请求的响应速度。在大型网站里,有些页面由于访问特别频繁(如:首页)或很少有变动(如:新闻详细页),特别适合生成静态页面,这里主要介绍生成静态文件的解决方案:

功能特色:

1、完全自动化,需要生成静态文件的页面在web.xml里通过正则表达式来配置即可
2、可以对每个页面设置其生成的静态文件的过期时间,以区分不同的板块和页面的重要性。(注:一般来说,首页的过期时间会短一些,而新闻详细页会长一点)
3、 生成的静态文件根据其URL存在相应的目录下,方便页面自动跳转和管理维护。
4、直接由原始的请求得到的响应流生成,而不是向本机发送一个http请求,再将响应写入一个文件,提高了速度和性能。

实现思路:

1、请求过来的URL,首先通过Filter来过滤:

1)判断它是否需要生成静态,规则通过web.xml的<filter>初始化参数获得
2)判断文件是否存在和是否过期,如果存在且未过期,则直接forward到该静态文件输出;如果不存在或已过期,则将请求转发给Servlet,由它来生成静态文件

2、如果需要生成静态,则请求转到Servlet:

1)Servlet接到请求后,首先根据请求的URL路径来生成对应的目录,如:url为:http://www.ryanote.com/archives/102,那么生成的目录为<html_dir>/archives,其中<html_dir>为存放静态文件的地址,生成的静态文件名为88.html
2)通过HttpServletResponseWrapper来包装Response,并将请求返回的内容写入到静态文件里。
3)将生成的静态文件输出

配置文件代码:

web.xml:


	convertToHtmlFilter
	com.ryanote.filters.ConvertToHtmlFilter
	
url
/root/index.htm|trade/tradeCenter.htm
	
	
expiredSeconds
1000|2000
	


	convertToHtmlFilter
	*.htm
	REQUEST
	FORWARD

.........

	convertToHtmlServlet
	com.ryanote.servlet.ConvertToHtmlServlet


	convertToHtmlServlet
	/ConvertToHtml

Linux下安装FTP服务器(vsftpd)(一)

今天因为要部署一个web项目,但是打好的war包在另外一台服务器,怎么样才能把那个war包搞到本地的服务器上,答案自然是FTP了.网上找了一下,都是推荐使用vsftpd(very secure FTP deamon),既然人家叫非常安全的FTP,那还是有必要研究一下,于是我就开始安装这个安全的FTP:),下面是我整理的详细步骤:

1.安装vsftpd:

$ sudo aptitude install vsftpd

2.配置vsftpd:

1)先将配置文件备份一下,以免出错: $ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
2)在这里只是介绍最简单的配置,所以vsftpd.conf文件里大部分可以先不用改动,将local_enable的注释去掉即可
3)为了使用虚拟用户,还要加上如下几句:

guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd_user_conf  #为以后做准备

3.配置PAM(Pluggable Authentication Modules)

出于安全考虑,而不共享本地的用户论证信息,取之的是采用自己的独立数据库来认证虚拟用户
1)安装:$ sudo aptitude install db4.6-util
2)新建一个文件:login.txt,内容:

ryan
ryanote

奇数行为用户名,用户的下一行为密码
3) 转换为Berkeley DB格式

$ sudo db4.6_load -T -t hash -f login.txt /etc/vsftpd_login.db
$ sudo chmod 600 /etc/vsftpd_login.db
$ rm login.txt

4)编辑/etc/pam.d/vsftpd,注释掉原有内容,加入如下几行:

auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login

5)重启vsftpd,虚拟用户即生效
$ sudo invoke-rc.d vsftpd restart

到此,用户ryan就可以用ryanote这个密码登录了.

先讲到这里,关于如何配置上传功能,以及分用户配置权限,下回分解!

Linux下Apache与Tomcat的集成

今天想在Ubuntu下集成Apache和Tomcat,结果找了网上的文章,大部分都是直接使用sudo apt-get install 这种方式的,这种方式下载安装虽然方便,但文件存放地址却有点乱,对我这种初学者来说,要配置的话反而更麻烦,于是我整理了网上的部分文章,自己去下载了apache,tomcat,jk的安装包,手动安装这几个模块,并把自己集成的过程整理出来,供像我这样的初学者参考,以少走弯路.

1.安装Apache

  1. 去http://httpd.apache.org/下载apache的安装包,点这里下载
  2. 把文件存放在某个目录里,如~/soft
  3. 解压: tar -zxvf  httpd-2.2.15.tar.gz
  4. 转到解压后的目录里(~/soft/httpd-2.2.15)
    配置: ./configure –prefix=/usr/local/httpd
    注:1)该命令要有超级用户权限才能运行; 2)–prefix用来设定apache的安装目录,但此时并没生成指定的目录,该目录在install的时候才生成
  5. 编译:make
  6. 安装:make install
  7. 安装好后,打开<install_dir>/conf/httpd.conf(<install_dir>为安装目录),配置两个属性:
    1)Listen 80
    2)ServerName localhost
  8. 转到 <install_dir>/bin,运行 ./apachectl configtest来测试安装是否成功,如果显示Syntax OK,则表示成功.另外,apachectl start/stop分别为启动和终止apache
  9. 访问http://localhost,如果出现It works!字样,恭喜你,apache已经安装成功了!

2.安装Tomcat

Tomcat安装比较简单,从这里下载,解压后就可以用了

3.安装JK插件

  1. 下载,注意系统版本要一致.
  2. 把下载到的mod_jk-1.2.28-httpd-2.2.X.so拷贝到<install_dir>/modules
  3. 创建workers.properties文件并拷贝到<install_dir>/conf,内容如下:
    worker.list=worker1
    worker.worker1.port=8009
    worker.worker1.host=localhost #tomcat服务器地址
    worker. worker1.type=ajp13
    worker.worker1. lbfactor=1
  4. 修改Apache的配置文件httpd.conf,在最后面加上如下的内容:
    LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.X.so
    JkWorkersFile conf/workers.properties
    JkLogFile logs/mod_jk.log
    JkLogLevel debug
    JkMount /*.jsp worker1

最后,访问http://localhost/index.jsp,如果出现tomcat的默认主页,说明集成成功喽!!

Linux下的svn命令大全

1、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
2、往版本库中添加新的文件
svn add file
例如:svn add test.php(添加test.php)
svn add *.php(添加当前目录下所有的php文件)
3、将改动的文件提交到版本库
svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)
例如:svn commit -m “add test file for my test“ test.php
简写:svn ci
4、加锁/解锁
svn lock -m “LockMessage“ [--force] PATH
例如:svn lock -m “lock test file“ test.php
svn unlock PATH
5、更新到某个版本
svn update -r m path
例如:
svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。
svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)
svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)
简写:svn up
6、查看文件或者目录状态
1)svn status path(目录下的文件和子目录的状态,正常状态不显示)
【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】
2)svn status -v path(显示文件和子目录状态)
第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。
简写:svn st
7、删除文件
svn delete path -m “delete test fle“
例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”
或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种
简写:svn (del, remove, rm)
8、查看日志
svn log path
例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化
9、查看文件详细信息
svn info path
例如:svn info test.php
10、比较差异
svn diff path(将修改的文件与基础版本比较)
例如:svn diff test.php
svn diff -r m:n path(对版本m和版本n比较差异)
例如:svn diff -r 200:201 test.php
简写:svn di
11、将两个版本之间的差异合并到当前文件
svn merge -r m:n path
例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)
12、SVN 帮助
svn help
svn help ci
——————————————————————————
以上是常用命令,下面写几个不经常用的
——————————————————————————
13、版本库下的文件和目录列表
svn list path
显示path目录下的所有属于版本库的文件和目录
简写:svn ls
14、创建纳入版本控制下的新目录
svn mkdir: 创建纳入版本控制下的新目录。
用法: 1、mkdir PATH…
2、mkdir URL…
创建版本控制的目录。
1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增
调度,以待下一次的提交。
2、每个以URL指定的目录,都会透过立即提交于仓库中创建。
在这两个情况下,所有的中间目录都必须事先存在。
15、恢复本地修改
svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:
用法: revert PATH…
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复
被删除的目录
16、代码库URL变更
svn switch (sw): 更新工作副本至不同的URL。
用法: 1、switch URL [PATH]
2、switch –relocate FROM TO [PATH...]
1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将
服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的
方法。
2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动
(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系。
17、解决冲突
svn resolved: 移除工作副本的目录或文件的“冲突”状态。
用法: resolved PATH…
注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的
相关文件,然后让 PATH 可以再次提交。
18、输出指定文件或URL的内容。
svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。
svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)

Linux下的vi(vim)命令大全

vi是Linux上最常用的文本编辑工具,做为每个linux下的开发人员都有必要熟练掌握它,这篇手册是从网上转载下来的,作为今后学习的参考,以后如果有新的命令或技术我会及时更新的.

进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename….filename :打开多个文件,依次编辑

移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字j至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾

屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行

删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
dd:删除当前行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本

搜索及替换命令 :
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换

选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息

最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指
定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行。

Page 3 of 512345