使用aws和tomcat搭建服务器过程中的一些坑.

时间:2021-01-27 18:53:22

在国外没啥事做, 考前也不愿意复习, 看到aws能免费试用一年, 于是就试着搞了搞, 就准备搭建个个人网站玩玩.

aws的注册与创建实例

首先个人感觉这个东西使用起来还是很方便的, 一开始注册完验证完银行卡手机等等一系列的东西之后, 会有一个等待时间. 之后要搭建网站, 我实际上只是使用了了其中的ES2(elastic computing cloud), 这东西实际上就是一个远程的服务器. 这里要特别注意如下几点 :

  1. 服务器地址的选择, 右上角可以选择地址, 我开始选的是美国西部, 结果卡的一比, 换了伦敦网速暴涨, 简直无敌.
  2. 安全组的设置, 创建实例过程中, 不同的地址的实例是分离的而不是共享的. 这里感觉配置参数没什么需要注意的, 除了这个安全组. 安全组中, 如果你用tomcat, 默认开启的监听端口是8080, 但是一般来说安全组中只设置了80(http), 22(ssh)这两个端口, 那么此时如果你就这样, 那么到时候你tomcat服务器开起来之后, 你会发现你尝试访问8080端口, 会出现一个巨长的等待时间然后告诉你connection time out. 这里比较烦就在于, 我当时压根不知道是tomcat没有设置好还是云服务器这边没有设置好, 所以这里特别要注意.
  3. 申请一个elastic ip, 在左下方能看到, 申请之后和你的实例绑定就行了, 实际上就是一个公用的ip地址而已.

弄完这些之后, 之后开启服务器, 即使没有绑定域名, 你也可以用这个ip地址, 或者是它提供的public DNS进行访问.

tomcat的安装

  1. 先用curl从tomcat的官网把那个安装包下来, 解压到任意目录就行了, 理论上安装就这么简单.
    2.此时进入tomcat的bin目录, ./startup即可, 然后你可以用我上面说的, 你申请的ip地址或者是public DNS尝试访问, 如果能看到tomcat说明成功了. 如果你上面安全组中没有加入8080, 那么这时候你发现页面一直在加载但就是加载不出来. 这里和那种输错端口号, 比如你这时候直接不加端口号8080, 也就是使用默认短号号进行访问又有所不同, 默认端口号进行访问的话, 会直接返回给你connection refused. (注意是直接返回, 速度很快)
  2. 但是一般来说默认的http端口是80, 所以你也可以到tomcat的conf目录下把server.xml中把协议为http的connector的端口号从8080改为80.
  3. 本来讲道理这时候./startup即可, 但是其实不然, 必须要用sudo ./startup, 这又是一个坑, 因为默认状态下低于1024的端口号必须要管理员权限才能开启, 这里的坑在于, 即使你直接./startup, 也不会有任何提示, 搞得还以为自己设置成功了. 这时候你只需要使用sudo lsof -i (list of file)这里也必须加sudo, 否则低于1024的是隐藏的, 来查看网络端口的占用情况, 如果你发现80(一般会直接写成http)已经在监听状态, 这时候说明是成功了. 如果你不加sudo启动tomcat, 是不会有这个端口在监听的. 另外,没有开启成功还有一个特征, 就是你用./shutdown关闭的时候会出现exception, 但不保证一定是这样, 反正我这种情况下失败了就是这样.

tomcat的配置

  1. 主要是 conf/server.xml中 :
    使用aws和tomcat搭建服务器过程中的一些坑.

这里讲几个重要的参数 :

  1. appBase : 不写的话默认是webapps, 值得注意的是这个并不是你项目的目录, 而是你项目目录的目录, 里面的每一个文件夹算是一个javaWeb应用. 如果你用绝对路径的话, 则为绝对路径, 如果用相对路径的话, 则是以tomcat的根目录为起点的相对路径. 所以默认情况下这个地方写的是webapps, 实际指定的是$CATALINA_HOME/webapps, 这也就能解释为什么我们一开始不设置这个文件直接开启服务器却也就能访问到页面.
  2. path 和 docBase : 就是根据path来匹配对应的目录, 实际就是设置一个虚拟目录. 比如我图中的第二个path是/proj2, 那么我只需要输入localhost/proj2实际上就匹配了目录/home/ec2-user/FredNzhlWebProj/test. 如果path=""或者"/", 那么直接匹配的是localhost, 这时候如果你上面的appBase会被直接无视. 我做了大量实验发现, docBase似乎并不能是一个相对路径而必须是一个绝对路径(尽管网上很多人说它可以是相对路径, 而且是相对appBase的相对路径). 而且docBase和appBase的路径可以没有任何关系.
  3. 另外感觉appBase更像是一个更高级的docBase, 在这个目录下的每个文件夹都是一个context, 也就是说都会被自动部署, 而docBase只是一个单独的应用, 会在appBase之后再进行部署, 所以如果两者path有重合, appBase下同名path直接被忽略.

所以总结来讲, 最简单的应该是这样(其中appBase也可以不要, 反正不要就默认webapps, 所以这种情况下那个目录无论如何都会部署) :
使用aws和tomcat搭建服务器过程中的一些坑.

或者是这种(index.html必须放在根目录的ROOT文件夹中) :
使用aws和tomcat搭建服务器过程中的一些坑.

  1. 很多网站提到了可以在conf/Catalina/domain_name 中添加xml文件里面放context, 比如对于我 :
    使用aws和tomcat搭建服务器过程中的一些坑.

文件名是xixi, 那么可以直接使用localhost/xixi进行访问的是, 与在server中不同之处在于, 在这里设置, context中的path无效, 这个path的效果由文件名代替了. 所以其实path 那一项到这里不写也可以. 这样部署也获得了一个好处, 就是如果要添加一个context, 只需要在这里多添加一个文件即可, 无需重启tomcat, 所以很方便. 据说tomcat是先扫描这个路径如果没找到合适的context才去server.xml中寻找context的. 另外如果要使用这种方式部署根目录项目, 文件名是ROOT.xml即可.

关于部署就这么多...