其实建站方面的东西都没怎么接触,老师教了一个学期的汤姆猫了,也没讲到实战。正好有公网IP和几台服务器,自己耐不住了,开始玩吧。
用MyEclipse + Tomcat + Maven 建了一个服务器。这个很简单, Maven 不是必须的,但是它看上去很潮,所以我在不了解它是干什么的情况下用了,它也给我带来了很多麻烦,希望在后期的项目管理上它能让我看到这些弯路没有白走。不用Maven的话路过第一步。
1. Maven 部署。前两篇博客写过Maven 和 Tomcat了, Maven是有自带Tomcat的。内置Tomcat配置成功之后 我还是换了自己的Tomcat. 因为 Maven不太懂,内置的Tomcat插件不太会配置。还是独立的比较熟悉。这其中并没有问题,上一篇日志完全能解决 这一步骤的所有问题。 很纠结的一个问题是用Maven 直接点发tomcat:run 发布的话他会发到 Tomcat /webapps /MSSH 目录下, 也就是说访问的时候必须要加包名了 http://xxxx/MSSH/ 我不懂它为什么这样,不过可以 手动拉到 Webapps/ROOT 目录下,这样就不用输入了, 开始不太懂 项目发布成功了却404,也找不到,郁闷死了,纠结了一天没想到是访问路径问题。至于为什么要是输入这个地址,请仔细查看UserController.java的@RequestMapping注解的配置,这是属于spingMVC的注解,不太懂其拦截-转发的过程。先放过这个问题吧
我的域名为例,没有的话直接IP,包名是zpy.现在已经可以通过www.98ki.com:8080/zpy访问网站。
现在想做两件事,第一,省去8080直接访问,第二,省去包名直接访问
2.省去8080直接访问。计算机中80端口可以默认访问,也就是说 如果 把Tomcat的8080改成80,就可以通过www.98ki.com/zpy访问。有些计算机可以直接改,我的Ubuntu12.4不行, 从哪个版本之后 就把1024以下的端口禁用了,root应该可以用,只是我不是root,80端口不能用的话Tomcat会报permission denied. 过了80端口权限的忽视下面。找了很多种解决办法 ,网上说把/etc/default/tomcat文件里authbind 改成yes.可怜我都没有这个文件 ,想了想人家是用apt-get install 的,我就一压缩包解压到/opt了, 这又发愁了,愁大发了 一百度 ubuntu 8080转80 全都是这一个版本。 然后发现iptable这个词。这就扯到linux比较专业的东西了,我也不会阿。于是就找了一个端口转发的代码 ,也就是访问80的时候默认跳到8080。
iptables -t nat -A PREROUTEING -p tcp --dport 80 -j DNAT --to x.x.x.x:8080
其实这样做有点曲线救国的意思了,我的解决办法是直接用root来跑tomcat. sudo su 一下而已。
但是这个重启之后好像就。。要想永久生效,需要继续执行(ubuntu环境):iptables-save > /etc/iptables.rules
新建一个bash脚本
- #!/bin/bash
- iptables-restore < /etc/iptables.rules
保存到/etc/network/if-pre-up.d/目录下
BTW:如果是配置外部服务器,则把第2步换为执行iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
IPtables进阶学习:
1.iptables -t nat -I OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080
结果:访问本地localhost正常转发,访问外部网络全部被重定向到本地localhost:8080
原因: 本机访问请求时,本地进程产生的报文将进入OUTPUT链,因为当前请求包的端口是80,于是重定向道8080,注意是所有数据包。
2.iptables -t nat -I OUTPUT -p tcp -s 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
结果:访问本地localhost正常转发,访问外部网络正常没特殊处理
原因:类似上例,但多了一个规则:需匹配数据包源地址-s 127.0.0.1。但实际上,访问外部网络时实际数据包在经过这个链时的源地址是本机ip,而不是回路ip(127.0.0.1),所以相当于本规则对访问外部网络时无效。
3.iptables -t nat -I OUTPUT -p tcp -s 非回路网卡ip --dport 80 -j REDIRECT --to-port 8080
结果:访问本地localhost无法转发,访问外部网络全部被重定向到本地localhost:8080
原因:和上例类似,规则匹配了对外访问的数据包,从而被重定向。
4.iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
结果:访问本地localhost正常转发,访问外部网络正常没特殊处理
原因:本地应用的ip被匹配上,所以访问本地应用时,数据包将被重定向道8080
5.iptables -t nat -I OUTPUT -p tcp -s 127.0.0.1 -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
结果:访问本地localhost正常转发,访问外部网络正常没特殊处理
原因:2,4操作的原因结合。
6.iptables -t nat -I PREROUTING -p tcp -s 127.0.0.1 -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 8080
结果:访问本地localhost无法转发,访问外部网络正常没特殊处理
原因:本地连接指的是在本机上,用 127.0.0.1 或者本机 IP 来访问本机的端口。本地连接的数据包不会通过网卡,而是由内核处理后直接发给本地进程。这种数据包在 iptables 中只经过 OUTPUT 链,而不会经过 PREROUTING 链(原文点此)。即:PREROUTING isn't used by the loopback interface(讨论贴)。
知识点:
iptables基本介绍:http://wiki.centos.org/HowTos/Network/IPTables(是centos版)
iptables全面介绍:
http://lesca.me/archives/iptables-tutorial-structures-configuratios-examples.html
http://blog.chinaunix.net/uid-307943-id-3559357.html
iptables原理:http://my.oschina.net/javagg/blog/3239
iptables数据包流向 :
以本地为目的的包 数据包 ----> mangle prerouting -------> nat prerouting -------> mangle input -------> filter input
以本地为源的包 数据包 -------> mangle output -------> nat output -------> filter output -------> mangle postrouting -------> nat postrouting
经过本地转发的包 数据包 -------> mangle prerouting -------> nat prerouting -------> mangle forward -------> filter forward -------> mangle postrouting -------> nat postrouting
好了,8080省了。
3.去掉包名直接通过 www.98ki.com 访问
这个比较简单,或者发布的时候手动选择Tomcat/webapps/ROOT, 或者弄完之后 拉进去。