• Archive by category "IT相关知识"
  • (Page 2)

Blog Archives

那些年考的那些认证

架构师的信仰系列文章,主要介绍我对系统架构的理解,从我的视角描述各种软件应用系统的架构设计思想和实现思路。

从程序员开始,到架构师一路走来,经历过太多的系统和应用。做过手机游戏,写过编程工具;做过大型Web应用系统,写过公司内部CRM;做过SOA的系统集成,写过基于Hadoop的大数据工具;做过外包,做过电商,做过团购,做过支付,做过SNS,也做过移动SNS。以前只用Java,然后学了PHP,现在用R和Javascript。最后跳出IT圈,进入金融圈,研发量化交易软件。

架构设计就是定义一套完整的程序规范,坚持架构师的信仰,做自己想做的东西。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/architect-certification/

architect-cert

前言

回忆当年在学校的生活,真是幸福,毫无生活压力;时不常逃逃课,学习自己追求的技术,享受编程乐趣。那些年考过了不少有价值的认证,都不知道自己是怎么坚持下来的,5年时间一共完成了10的认证。

回过头来,我自己都不知道当时哪里来的动力,几乎是一件不可能完成的事情。一头走来跌跌撞撞,但最终找到了自己的职业方向。

目录

  1. SCJP
  2. SCWCD
  3. XML-141
  4. Websphere-285 & websphere-286
  5. DB2-700 & DB2-701
  6. SCBCD
  7. SCDJWS
  8. SCMAD

1. SCJP

我记得学Java是从大二开始的,对于专业课完全没有兴趣,同时又觉得C的代码很丑,觉得JSP做网页很牛的样子,就开始了我的Java生涯。自己学了半年,看着书按照例子,可以写一个小程序,但总觉得摸不着门,于是假期回到北京报了一个新东方的SCJP培训班,3天课程,800元。老师很负责把Java基础整个讲了一篇,我听的特别过瘾,(当时真应该留下老师的电话,特别感谢!)。

上完课后,剩下的25天的假期,我完全就在家中对着电脑度过的。从那一刻起,我终于开始对Java入门了。在假期的倒数第二天,我去考了SCJP1.4的考试。2个半小时考试,紧张的不得了,第一次用电脑考试,全英文的试题,硬着头皮一点一点读。题目都是选择题,单选和不定项选择题,对于不定项选择题ABCDEFGH 8个选择项给你,猜对的可能性很小,不过能让参加考试的有思路上的方向。考试过程中有摄像头一直监控,考试的屋子很小,一排5个台式机,每个人有一个小格子,一张草稿纸,外面是嘈杂的市场叫卖声音,坐满了2个半小时,检查了3篇,我最后是82分考过的。

从那时起,我终于开始对自己有信心了,并坚信自己找到自己的方向。

2. SCWCD

考完SCJP,对Java的基础核心有所了解了,但还是不知道Java能干什么。想做Web开发,又要学JSP和Servlet,当时甚至都不知道,JSP与ASP,PHP的区别。按照SCWCD的考试大纲,自己准备复习。虽然,还有补习班可以去学,但动辄4000-5000元的价格,已经不是一个学生可以承担了。

通过Google,在互联网上找到一切可以学习的教程,几乎看了几百份的教程,去相关的论坛天天逛逛。10年前我逛学习网站coderanch,竟然还在: http://www.coderanch.com/forums

当时看着网站上,老外各种晒着自己的认证,真是羡慕嫉妒恨啊!我就憋着,什么时候,我也能晒出我的认证,让别人也羡慕嫉妒一下。嘿嘿。

一咬牙一跺脚用了一个学期,就在屋里把所有的SCWCD认证的相关知识都学透了。这里不得不提一句,当时我认为写的最好的参考书:“SCWCD 认证专家应考指南”。

8821265-1_w

我吃透里面每一句话,完成所有的代码实例。就这样,我在第二个假期回到北京,又考过了SCWCD的认证。

此时,开发一个网站,对于我来说已经很简单了。不仅可以做网站,还可以利用Web容器的机制,实现各种复杂的功能,比如认证和授权,定时器,JNDI等。

3. XML-141

连续考了2个SUN的认证,几乎让我破产了,都是1200元一次大本投入,好在都通过了,不然真的要哭死了。

大三的时候,学校成立了IBM俱乐部,我就报名参加了,加入俱乐部的好处是考IBM的认证从原价1000元一次,变成学生价150元一次。简单一算,考一次SUN的认证可以考8次IBM的认证,接下我的重点马上转向IBM认证。我当时应该所有人中是最大的受益者了。

XML-141,这个认证是对我计算机软件基础知识形成最大支持的一个认证,让我认识到了计算机可以变成世界,也是我所有考过的认证中最难的一个。

这个认证的难点,主要在于知识面非常广,并与现实应用结合,所以对于当时我来说特别的困难。我将近花了1个月时间,从互联网上找到所有关于XML的资料,并每天晚上偷偷跑去旁听计算机研究生的XML课程,长期泡图书馆每天都盯着一本书 XML高级编程(第2版),这是一本看上去就不可能读完的书,16开1051页。伴着有点发霉的味道,第一遍读就花了3个月。对照着上面的例子,运行了所有程序。

507302-1_w

在这个学期结束的时候,我报名了参考XML-141的考试,虽然我认为我已准备的足够充分了,但是我还是高估了自己的基础知识,好像是48分没有通过。这个打击对于我来说是巨大的,我花了一学期的时间,几乎每天是每天12小时在学习,半年的努力竟然不能给自己划一个逗号。可能当时真的是自己没有企业应用的经验,很多案例题的解决方案都出了差错。痛定思痛,从图书馆借走了,“XML高级编程(第2版)” 背着回家了继续苦读。艰苦的又过了一个假期,我把 “XML高级编程(第2版)” 这本书一共看了3遍,而且把里面很多简单介绍的框架和程序包,都去对应的官网下载并运行。这1个月的补习,让我更加了解 为什么需要XML?XML能做什么?XML可以对原来方案有什么改进?JavaEE的Web容器中的以web.xml做为配置文件的意义!

再次开学的时候,我是带来卷土重来的决心回来的。开学的第三周,我又一次去考了XML-141这个认证,并且是90分的成绩通过了。这次考试的通过,我可能就已经具备了架构师的思考方式,并且很深刻地影响了我很多年的程序设计理念。

4. Websphere-285 & websphere-286

同是这个学期,我又完成参加了 Websphere-285和websphere-286的考试。对我来说,这两个考试基本上已经难度不大了,我是在一个下午,连续考了两门了,就像高考连考一样。最后很幸运的都通过了,并且没有给自己太大的压力。

Websphere-285,主要是考Websphere的家族产品,安装和使用。而Websphere-286,有点像SCJP和XML的结合,主要考如何用Websphere家族产品,设计基于JAVA的企业级解决方案。Websphere-286的证书,又依赖于SCJP的认证,考过了以后,Websphere-285很快就寄到了,Websphere-286还需要我先把SCJP的证书传真发给美国的IBM考试中心(就两张纸花了好几十块),这样就获得了这两个证书。

5. DB2-700 & DB2-701

DB2的认证,完全是无意所获得的。大三下学期,IBM的俱乐部开始推广IBM的数据库产品DB2,我也申请到了学生用的正版软件,然后就在自己的电脑上开始了各种倒腾。之前的专业课,学过MS-SQL-Server,对数据库有所了解。不过对于DB2来说,原来的基础知识是远远不够的。在DB2创建数据库,竟然要10行左右的命令,而不是像MS-SQL-Server点一个按钮就完成了的。

建库,建缓冲区,建表空间,定义分区大小,分离表空间和索引空间,再建Schema,建用户,分配权限,完成上面的整个过程,才能开始创建表,然后建视图,定义触发器和存储过程,性能监控,SQL执行计划,再通过JDBC与Java连接。。。一大串东西走下来,内容是丰富的,过程是复杂的,还需要细心整理各种命令脚本。不过对我来说,DB2已经没有特别难度了,只要一步一步仔细地操作一下来,就可以完成了。

DB2-700如同Websphere-285一样,主要是考DB2的家族产品,产品线,安装和使用。而DB2-701就考到了,从建库到存储过程,再到SQL优化,和最后的数据库案例设计。

一个学期又完成了2个认证,到大三结束的时候,我已经有了7个认证。

6. SCDJWS

这些认证意味什么?我开始的时候,很迷茫。当初的想法,是很天真很幼稚的,以为有了认证就可以去找到一份不错的工作;以为有了认证就可以直接去做架构师。但当你去找工作的时候,亮出认证的那一刻,你会发现,招聘的考官仅仅是有点的好奇,拿着各种认证证书,简单扫一遍,然后就是放到旁边,就跟认证不存在一样,继续问着他们那些应届毕业生在课堂中应该学到的那些问题。

我坦率的讲,我不是学计算机的,并且当时的确不了解 教课书里的算法,不会用时间复杂度和空间复杂度去解决数据结构中树或图的问题,我也不懂C和C++。回想我学的Java的所有知识体系中,都没讲要特别地要用Java去实现这些算法,JDK中的各种基础包已经封装好了这些算法。虽然当时各不理解,也几乎没有获得大公司的offer,不过我还是相信自己选的路,因为我知道我能做什么出来。

毕业了,回到北京。通过社会招聘,投简历,很容易的就找到了一份工作。几乎是回到北京的第二天投的简历,第三天就去面试,第四天就上班了。看着别人应聘的辛苦,我的这种上班速度还是有点小快呢。

从之前的面试经历,考认证已经不再是为了找工作了。我遇到的99%考官都不知道,认证是个啥玩意,有个别人的会说,我们这里招过获得SCJP认证的人也挺一般的。所以,我觉得中国和美国在教育上的差距真的是不可逾越的鸿沟。

看到coderanch上那些晒认证的美国人,无一不是通过认证获得了与自己付出相对应的工作,而在中国知识确是无法量化的。在我大三的时候,有个印度的朋友,获得SCJP后,向我请教如何学习Websphere, DB2, SCWCD,并想继续考认证,而且目标很明确的告诉我,有了认证就可以申请去美国的读书了。再一次的心理落差,让我感觉到中国教育的落后,中国人比印度人的出路都少。

从这以后,我考认证就不以找工作为目的了,而变成了为了丰富自己的知识结构而参加的考试,从而给自己的阶段性学习划上句号。

在XML成为标准以后,WebService和SOA成为后来的大火大紫的技术热点。为了明白底层的原理,我又开始准备SCDJWS的认证考试。很庆幸的是,有了XML的基础,在学习WebService的基础的架构的时候,没让我走太多的弯路,像DOM,SAX, SOAP, WSDL, UDDI, JAXB, JAXP, XSTL, XPath, XPointor等的各种技术规范,我都快速熟练地掌握了,对于SOA的框架层次理解地更清晰。虽然工作中难以用到这些,但很多时候别人的问题我已经能通过原理做解释了。我自己已经开始构思自己未来的系统了。

就算基础很好,学习SCDJWS也花了我半年的时间,白天上班晚上学习,拿到这个认证也是不容易的。

7. SCBCD

说起EJB,曾经是Java程序员都希望追求的技术,不是因为EJB有多牛,而EJB足够复杂。在Spring出现之前,Java社区的开发都是来自于SUN, IBM, Oracle的声音,他们在尝试用Java构建整个的软件生态系统,其中EJB就是SUN的企业级应用开发规范中必须的作为核心的一部分,分为Session Bean, Entity Bean, Message Bean。当然这个方案的实体Bean部分的设计比较复杂,比今天的Hibernate的复杂度要高好几个量级。BEA公司基于EJB做的宠物商店的demo,动辄就是上万行代码,让Java程序员感觉这才“高大上”的程序开发。

9037541-1_w

后来Spring框架出现了,expert one-on-one J2EE Development without EJB 一书动摇了大型软件厂商对企业级应用的定义。越来越多的复杂应用,开始像Spring的IOC模式迁移,Java开始变得更轻更自由了,Apache中的很多项目也开始基于Spring去重新构建,或者提供或Spring集成的接口了。后来,我们常用的SSH (Struts+Spring+Hibernate) 变形成了Java的Web开始的MVC铁三角组合。

当Hibernate在持久化层获得市场上的巨大成功以后,SUN开始重新定义EJB的规定,设计EJB3.0来轻量化EJB2.x,减少开发人员的准入门槛。

此时我依然是SUN的忠实粉丝,期待着EJB3.0的改进,我又完成了SCBCD的认证考试。而讽刺的是,完成考试后,我决定了放弃所有的ORM映射的框架,用iBatis的提供的原生SQL来实现持久层调用,同时自己写了一套基于MyBatis(iBatis)的持久层工具,更快速和轻量的构建我自己的Java系统。

8. SCMAD

SCMAD 这个认证是针对 JavaME手机移动的应用开发,考这个认证就有点奇葩了。当时,只是为了丰富自己的知识,虽然做半年过手机游戏,但没有理解很深,以后也不知道有没有机会再做手机相关的应用,为了完善自己的知识结构,从而考的SCMAD。

这个认证考试的时候,已经是我工作的第三年了,我已经没有太多的时间学习了,而且会很容易被身边的其他的事情所影响。复习过程中,虽然整体内容不太多,而且自己也有了一定的实际经验,但是拖的时间很长,花了将近一年的时间复习和准备。最后,也是考试券快过期之前完成的。

从2003年底大二开始到2008年初,5年时间我一共完成了10的认证。回过头来,我自己都不知道,当时哪里来的学习动力,几乎是一件不可能完成的事情。如果没有这些认证所学的基础知识,我现在又何去何从?

一篇博客,记录自己以前的学习经历。告诫后人珍惜时间,未来的成就,都是之前的积累,爆发就在未来的某个瞬间。

转载请注明出处:
http://blog.fens.me/architect-certification/

打赏作者

用WebStorm编辑Markdown

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

关于作者

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/webstorm-markdown/

webstorm-markdown-title

前言

WebStorm是一个非常高效的开发工具,特别对于Web前端的开发。Markdown流行,因为其简化了HTML的语法,去掉了表单等复杂标签,以极简的语法只做网页展现。在WebStorem中编辑Markdown文档,是一种普遍的应用需求。

目录

  1. Markdown介绍
  2. 在WebStorem中安装Markdown插件
  3. 解决Markdown插件配置的问题

1. Markdown介绍

Markdown 是一种轻量级标记语言,创始人为约翰·格鲁伯(John Gruber)和亚伦·斯沃茨(Aaron Swartz)。它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档”。

Markdown的语法,对于没有编程经验的人,2-3个小时也可以掌握。各种语言基于的Markdown实现,都已经有了商业应用。

  • 高效,简约的设计,会让Markdown越走越远
  • 开源,免费的Liences,最后有可能会夺取微软Word软件的市场

本文不讲Markdown的语法,请大家自行查询。

Markdown的官方网站:http://daringfireball.net/projects/markdown/

2. 在WebStorem中安装Markdown插件

本来在WebStorem中安装Markdown插件很简单的事情,不知道是Idea的版本原因,还是Markdown插件设计者的原因,造成了一些使用问题,需要手动调整一些参数才正确使用。

我在这里也花了一些时间,找到了问题所在,因此写篇文章总结一下。

  • WebStorm版本:6.0.1
  • Makrdown插件版本:0.9.3

插件安装:

自动安装的截图:

webstorm-install

重起Webstorm软件,新建一个test.md文件。


APE: 测试Markdown语法
========================

Markdown语法

## INSTALL

#### 公共库安装
```{bash}
npm install
bower install
```

#### 私有库安装
```{bash}

```

## API

## demo

## License

private

我们看到,编辑器没有针对 markdown的文件进行适配,显示效果与文本文件无异。

markdown-txt

这就是问题所在!!

3. 解决Markdown插件配置的问题

经过排查发现,问题在于markdown插件没有和.md后缀的文件进行绑定!

查看文件类型的绑定:File –> Settings –> File Types –> Markdown files

markdown-files-old

增加*.md类型的绑定

markdown-files-add

然后,点击apply。

完成后,我们再打开之前编辑的test.md文件,Markdown的效果已经可以展示了。

markdown-show

底部标签text,preview可以在编辑和预览过程中切换效果,而且text也有语法高亮了。

如果想用Webstorm开发AngularJS,请参考文章:AngularJS最理想开发工具WebStorm

转载请注明出处:
http://blog.fens.me/webstorm-markdown/

打赏作者

Proftpd快速搭建FTP服务器

Ubuntu实用工具系列文章,将介绍基于Linux ubuntu的各种工具软件的配置和使用。有些工具大家早已耳熟能详,有些工具经常用到但确依然陌生。我将记录我在使用操作系统时,安装及配置工具上面的一些方法,把使用心得记录下来也便于自己的以后查找和回忆。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/linux-ftp-proftpd/

ftp-proftpd

前言

在Linux系统中,FTP服务器软件有很多,都已经成熟,像vsftpd, wu-ftp, Pure-FTPd等。但这些软件安装配置起来都比较麻烦,搭建个人的FTP服务器,还是Proftpd比较简单。

目录

  1. Proftpd介绍
  2. Proftpd安装
  3. Proftpd配置文件
  4. Proftpd使用场景
  5. 客户端访问

1. Proftpd介绍

Proftpd是一款开放源码的FTP服务器软件,它是原来世界范围使用最广泛的wu-ftpd的改进版,它修正了wu-ftpd的许多缺陷,在许多方面进行了重大的改进,其中一个重要变化就是它学习了Apache 的配置方式,使proftpd的配置和管理更加简单易懂。

有两种运行方式,独立服务器与超级服务器的子服务器。无论从安全性和稳定性,还是可配置性来说都是非常好的选择。

官方网站:http://www.proftpd.org/

2. Proftpd安装

系统环境

  • Linux Ubuntu 12.04.2 LTS 64bit server

安装Proftpd


~ sudo apt-get install proftpd

<hproftpd-install

选择“standalone”

查看proftpd状态


~ sudo /etc/init.d/proftpd status
ProFTPD is started in standalone mode, currently running.

~ ps -aux|grep ftp
proftpd   6674  0.0  0.1  94648  2092 ?        Ss   16:05   0:00 proftpd: (accepting connections)

#启动端口21
~ netstat -nltp|grep 21
tcp6       0      0 :::21                   :::*                    LISTEN      -

3. Proftpd配置文件

配置文件:/etc/proftpd/proftpd.conf


#配置服务器名
ServerName			""blog.fens.me FTP Server" 

#设置服务器运行模式,独立服务,或者被监管
ServerType			standalone 

#设置为默认服务器
DefaultServer			on 

#设置服务器进程运行使用的用户
User				proftpd

#设置服务器进程运行使用的组
Group			        nogroup

#设置关闭IPv6支持
UseIPv6			        off

#设置服务器接受请求的端口
Port				21 

#设置被动模式使用的端口范围
PassivePorts 			60000 65535

#设置用户上传文件的权限掩码
Umask				022

#设置用户被chroot锁定到的各自的Home目录
DefaultRoot			/ftp

#关闭欢迎信息显示
DeferWelcome			off 

#如果显示欢迎信息,则指定显示的文件
DisplayLogin			welcome.msg 

#指定切换文件夹时,显示的欢迎信息
DisplayChdir			.message 

#设置日志
SystemLog                       /var/log/proftp.log
TransferLog                     /var/log/proftp-transfer.log

#限定操作


<Limit SITE_CHMOD>
DenyAll
</Limit>

#设置匿名用户资源


<Anonymous "/ftp/c">
...
</Anonymous>

#配置存储目录权限


<Directory "/ftp/a/" >
<Limit ALL>
AllowUser x
AllowUser a1
DenyAll
</Limit>

<Limit CWD READ RETR DIRS>
AllowAll
</Limit>
</Directory>

Limit权限说明:

  • CWD : Change Working Directory 进入该目录
  • MKD : Make Directory 创建目录
  • RNFR : Rename from 更名
  • DELE : Delete 删除文件
  • RMD : Remove Directory 删除目录
  • READ : 可读
  • WRITE: 可写
  • STOR : 可上传
  • RETR : 可下载
  • DIRS : 允许列出目录
  • LOGIN: 允许登录
  • ALL : 全部

4. Proftpd使用场景

场景描述:某公司建立统一的FTP服务器(/ftp),公司有a部门(/ftp/a),b两个部门(/ftp/b),有独立的存储空间。

a1为a部门经理有对(/ftp/a)操作权限,a2为a部门员工只能读文件。

b1为b部门经理有对(/ftp/b)操作权限,b2为b部门员工只能读文件。

x为公司总经理,有对(/ftp)操作权限。

操作权限:


/ftp    -- x所有操作
/ftp/a  -- a1所有操作, a2只读
/ftp/b  -- b1所有操作, b2只读

命令操作:


# 创建FTP目录
sudo mkdir /ftp
sudo mkdir /ftp/a
sudo mkdir /ftp/b

# 创建用户组
sudo groupadd a
sudo groupadd b

Ubuntu系统配置nologin,与其他Linux稍有不同


~  sudo vi /etc/shells

# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
/usr/sbin/nologin

最后一行增加/usr/sbin/nologin

创建用户并设置nologin, 禁止FTP账户登陆


sudo useradd a1 -g a -s /usr/sbin/nologin
sudo useradd a2 -g a -s /usr/sbin/nologin
sudo useradd b1 -g b -s /usr/sbin/nologin
sudo useradd b2 -g b -s /usr/sbin/nologin
sudo useradd x -G a,b -s /usr/sbin/nologin

#设置账户密码
echo -e "a1:123" | sudo chpasswd
echo -e "a2:123" | sudo chpasswd
echo -e "b1:123" | sudo chpasswd
echo -e "b1:123" | sudo chpasswd
echo -e "x:123" | sudo chpasswd

#设置目录权限
sudo chown x /ftp
sudo chown a1:a /ftp/a
sudo chmod 770 /ftp/a
sudo chmod g+s /ftp/a
sudo chown b1:b /ftp/b
sudo chmod 770 /ftp/b
sudo chmod g+s /ftp/b

修改配置文件:/etc/proftpd/proftpd.conf


~ sudo vi /etc/proftpd/proftpd.conf

ServerName "blog.fens.me FTP Server"
ServerType standalone
DefaultServer on
Port 21
Umask 022
MaxInstances 30
User proftpd
Group nogroup
DefaultRoot /ftp
AllowOverwrite on

SystemLog /var/log/proftp.log
TransferLog /var/log/proftp-transfer.log

<Directory "/ftp/*">
<Limit CWD READ>
AllowAll
</Limit>
</Directory>

<Directory "/ftp/a/" >
<Limit ALL>
AllowUser x
AllowUser a1
DenyAll
</Limit>

<Limit CWD READ RETR DIRS>
AllowAll
</Limit>
</Directory>

<Directory "/ftp/b/" >
<Limit ALL>
AllowUser x
AllowUser b1
DenyAll
</Limit>

<Limit CWD READ RETR DIRS>
AllowAll
</Limit>
</Directory>

<Limit SITE_CHMOD>
DenyAll
</Limit>

重新服务器


~ sudo /etc/init.d/proftpd restart
 * Stopping ftp server proftpd        [ OK ]
 * Starting ftp server proftpd 

5. 客户端访问

客户端命令行:Win7 64bit Command

模拟a1用户登陆:


~ ftp

#建立连接
ftp> open 192.168.1.201
连接到 192.168.1.201。
220 ProFTPD 1.3.4a Server (blog.fens.me FTP Server) [::ffff:192.168.1.201]
用户(192.168.1.201:(none)): a1
331 Password required for a1
密码:
230 User a1 logged in

#查看目录 
ftp> dir
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrws---   2 a1       a            4096 Nov  3 12:59 a
drwxrws---   2 b1       b            4096 Nov  3 12:25 b
226 Transfer complete
ftp: 收到 116 字节,用时 0.00秒 58.00千字节/秒。

ftp> cd a
250 CWD command successful

ftp> pwd
257 "/a" is the current directory

ftp> dir
200 PORT command successful
150 Opening ASCII mode data connection for file list
-rw-r--r--   1 a2       a           55723 Nov  3 12:56 36kryunjiasu.docx
-rw-r--r--   1 a1       a               4 Nov  3 12:24 test.txt
226 Transfer complete
ftp: 收到 139 字节,用时 0.00秒 69.50千字节/秒。

#上传文件
ftp> put c:\22.log
200 PORT command successful
150 Opening ASCII mode data connection for 22.log
226 Transfer complete
ftp: 发送 120 字节,用时 0.06秒 2.18千字节/秒。

#下载文件
ftp> get test.txt
200 PORT command successful
150 Opening ASCII mode data connection for test.txt (4 bytes)
226 Transfer complete
ftp: 收到 5 字节,用时 0.00秒 5000.00千字节/秒。

#尝试访问B目录,出错
ftp> cd ../b
550 ../b: No such file or directory

#退出
ftp> bye
221 Goodbye.

模拟a2用户登陆:


~ ftp

#建立连接
ftp> open 192.168.1.201
连接到 192.168.1.201。
220 ProFTPD 1.3.4a Server (blog.fens.me FTP Server) [::ffff:192.168.1.201]
用户(192.168.1.201:(none)): a2
331 Password required for a2
密码:
230 User a2 logged in

#查看目录 
ftp> dir
200 PORT command successful
150 Opening ASCII mode data connection for file list
drwxrws---   2 a1       a            4096 Nov  3 13:09 a
drwxrws---   2 b1       b            4096 Nov  3 12:25 b
226 Transfer complete
ftp: 收到 116 字节,用时 0.00秒 116.00千字节/秒。

#上传文件,出错
ftp> put c:\11.log
200 PORT command successful
550 11.log: Operation not permitted

#下载文件
ftp> get 22.log
200 PORT command successful
150 Opening ASCII mode data connection for 22.log (114 bytes)
226 Transfer complete
ftp: 收到 120 字节,用时 0.00秒 120000.00千字节/秒。

用Proftpd我们快速建立了一个公司内部的FTP服务器,比wu-ftpd要方便。

转载请注明出处:
http://blog.fens.me/linux-ftp-proftpd/

打赏作者

自己搭建VPS系列文章 之 动态IP解析

自己搭建VPS系列文章,介绍了如何利用自己的计算机资源,通过虚拟化技术搭建VPS。

在互联网2.0时代,每个人都有自己的博客,还有很多专属于自己的互联网应用。这些应用大部分都是互联网公司提供的。对于一些有能力的开发人员(geek)来说,他们希望做一些自己的应用,可以用到最新最炫的技术,并且有自己的域名,有自己的服务器。这时就要去租一些互联网上的VPS主机。VPS主机就相当于是一台远程的计算机,可以部署自己的应用程序,然后申请一个域名,就可以正式发布在互联网上了。本站“@晒粉丝” 就使用的Linode主机VPS在美国达拉斯机房。

其实,VPS还可以自己搭建的。只要我们有一台高性能的服务器,一个IP地址,一个路由。可以把一台高性能的服务器,很快的变成5台,10台,20台的虚拟VPS。我们就可以在自己的VPS上面的,发布各种的应用,还可以把剩余的服务器资源租给其他的互联网使用者。 本系列文章将分为以下几个部分介绍:“虚拟化技术选型”,“动态IP解析”,“在Ubuntu上安装KVM并搭建虚拟环境”,“VPS内网的网络架构设计”,“VPS租用云服务”。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javascript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/vps-ip-dns

vps-ip-dns

目录

  1. 什么时候会用到动态IP解析
  2. 环境准备
  3. 实现原理
  4. 动手实践

1. 什么时候会用到动态IP解析?

家用PC通过PPPoE(宽带连接)拨号上网,如果一天二天没有关机,我们会神奇的发现IP变了。通过PPPoE获得的IP并不是固定的,每隔一段时间IP会被重新分配一次。

创业初期租不起外面的服务器,所以只好把服务器放在家中,面向互联网用户提供服务。但如果IP天天变,我们总不能天天盯着,发现变了人工去修改对应用的域名重新绑定新IP。这个时候,就会想到动态IP解析技术了。这个领域最有名的程序就是“花生壳”。其实这个技术实现起来并不复杂,接下来我们自己开发一套动态IP解析的程序。

2. 环境准备:

  • 1台内网服务器A (拨号上网) (xx.xx.xx.xx),linux(cron, bash, curl)
  • 1台固定IP的外网服务器B(173.255.193.179) :  linux(bind9, PHP)
  • 1个域名:wtmart.com

动态IP解析

3. 实现原理:

  1. 把域名绑定到服务器B: ip.wtmart.com ==> 173.255.193.179
  2. 在服务器B创建一个web应用收集请求,并写入本地文件
  3. 服务器A每分钟向服务器B发送请求,告诉服务器B,服务器A的IP是什么。
  4. 服务器B收到A的IP,发现变化写入本地文件存储,并更新本地域名服务器(bind9),用新IP指向lin.wtmart.com
  5. 客户端机器C,手动选择DNS服务设置173.255.193.179。
  6. 客户端机器C,SSH远程登陆服务器A,ssh root@lin.wtmart.com

4. 下面我们一步一步实践一下:

1). 把域名绑定到服务器B: ip.wtmart.com ==> 173.255.193.179

wtmart.com的域名是从godaddy.com上面购买的,通过dnspod做域名解析,难得的好服务。

wtmart

注: 这里我们只需要关注ip.wtmart.com 其他的设置不用关心。

2). 在服务器B创建一个web应用收集请求,并写入本地文件

创建PHP程序


~ /deploy/dyip# pwd
/root/deploy/dyip
~ /deploy/dyip# ls -l
-rw-r--r-- 1 root root 38 Jun 2 13:40 getip.php
-rw-r--r-- 1 root root 13 Jun 12 03:52 ip
-rw-r--r-- 1 root root 807 Jun 2 15:52 sendip.php

接收IP的PHP脚本,sendip.php

~ vi sendip.php

<?php
#http://lin.wtmart.com/sendip.php?pwd=xxx
$content = file_get_contents('ip');
if ($_GET["pwd"] == 'xxx'){//简单认证
$ip = $_SERVER["REMOTE_ADDR"];
if ($content != $ip) {
$file = fopen('ip', 'w');
$result = fwrite($file, $ip);
fclose($file);

if ($fwrite === false) {
echo "update error!<br/>";
} else {
echo "Change to " . $ip;
echo "<br/>Write to DNS server";
}
} else {
echo "No change " . $ip;
}

} else {
echo "Sorry,you don't have permission<br/>";
echo "Server ip: " . $content;
}

简单认证是防止其他人,访问时IP被修改。

查看IP的PHP脚本,getip.php


~ vi getip.php
<?php
echo file_get_contents('ip');

IP写入到本地文件,ip


~ vi ip
116.24.133.86

现在116.24.133.86就是服务器A,所用的IP地址,这个地址每天都会改变。

配置PHP环境,我在这里就跳过了,也可以使用其他语言的程序。

 

3). 服务器A每分钟向服务器B发送请求,告诉服务器B,服务器A的IP是什么 

在服务器A,设置cron定时器。

*/1 * * * * curl http://ip.wtmart.com/sendip.php?pwd=xxx

通过curl实现每分钟,发送一次请求。

 

4). 服务器B收到A的IP,发现变化写入本地文件存储,并更新本地域名服务器(bind9),用新IP指向lin.wtmart.com

刚才的 sendip.php的脚本已经实现了,写入本地文件存储,接下来我们改一下sendip.php实现配置本地域名服务器(bind9)

修改sendip.php,增加rebind方法


~ vi sendip.php

<?php
#http://lin.wtmart.com/sendip.php?pwd=xxx
$content = file_get_contents('ip');
if ($_GET["pwd"] == 'xxx'){//简单认证
$ip = $_SERVER["REMOTE_ADDR"];
if ($content != $ip) {
$file = fopen('ip', 'w');
$result = fwrite($file, $ip);
fclose($file);

if ($fwrite === false) {
echo "update error!<br/>";
} else {
echo "Change to " . $ip;
echo "<br/>Write to DNS server";
rebind($ip);
}
} else {
echo "No change " . $ip;
}

} else {
echo "Sorry,you don't have permission<br/>";
echo "Server ip: " . $content;
}

# lin 在最后一行
function rebind($ip){
$f = "/etc/bind/db.wtmart.com";
$str=file_get_contents($f);
$a=preg_replace('/\\nlin(.+?)\\n/',"\nlin IN A ".$ip."\n",$str);
echo $a;
file_put_contents($f,$a);
exec('/etc/init.d/bind9 restart');
}

安装并配置域名服务器bind9


~ sudo apt-get install bind9

~ cd /etc/bind

# 打开域名转身的配置
~ vi named.conf.options
forwarders {
      8.8.8.8;
      8.8.4.4;
};

# 设置wtmart.com域
~ vi named.conf.local
zone "wtmart.com" {
     type master;
     file "/etc/bind/db.wtmart.com";
};

# 增加ip域名指向本地IP(服务器B),lin的域名指向服务器A的IP
~ vi db.wtmart.com
$TTL    604800
@       IN      SOA     wtmart.com. root.wtmart.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      wtmart.com.
@       IN      A       173.255.193.179
@       IN      AAAA    ::1

ip      IN      A       173.255.193.179

lin    IN    A    116.24.133.86

注: lin的域名,必须写到最后一行,并且上下都有空行。sendip.php中rebind方法。

重启bind9域名服务器


sudo /etc/init.d/bind9 restart

5). 客户端机器C,手动选择DNS服务设置173.255.193.179
linux配置DNS
linux-dns

win7配置DNS
win-dns

6). 客户端机器C,SSH远程登陆服务器A,ssh root@lin.wtmart.com
win7中命令行登陆
win-ssh

我们完成了 动态IP解析。 通过域名服务器(bind9),我们把动态IP和域名进行绑定。

另外,可能还有一些更简单的需求,比如服务器A的web工程,像这个功能我们在服务器B,配置一个nginx反向代理就可以实现了。

对于创业初期服务器放在家里的同学,希望对你们有用。

转载请注明出处:
http://blog.fens.me/vps-ip-dns

打赏作者

putty连接超时

用Putty进行SSH连接的时候,如果几分钟没动,就会出现断线的情况,然后Putty客户端就死了。

为了解决这个问题,我们需要让客户端与Server端,一直保持发包状态,就可以避免Putty断线的情况。

操作如下:

putty –>Connection –> Seconds Between keepalives –>60

putty

设置每60秒建立一次通信,这样就算我们长时间不动Putty客户端,也不会自己断线了。