Overview

因为投稿论文的需要,我们要把PhosphoPrediction部署到Monash的云服务器(Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-74-generic x86_64))上,在宋老师申请了云服务器之后,Jerico帮忙搭建好了云服务器,帮我们装好了JDK1.8,并给了我访问权限,在部署的过程中遇到了一些问题,在这里记录一下。

1. ssh访问权限

之前连接服务器都是使用账号密码,这一次出于安全的考虑,关闭了账号密码访问,改为ssh key访问。因此需要先生成一个ssh key

1.1 检查ssh key是否存在

linux或者mac下,如果你的电脑已经有了ssh key,那么就会在根目录下的.ssh文件夹中,也就是~/.ssh,使用下面的命令查看这个目录:

ls -al ~/.ssh

如果存在id_rsa.pub或者id_dsa.pub,则说明已经生成了ssh key,把这个里面的文件内容添加到服务器中就可以了。因为是Jerico添加到服务器的,我只是把ssh key的内容给了他,所以如果在服务器中添加,我暂时也不清楚,以后用到了再写下来。

1.2 生成ssh key

如果你的电脑里没有生成ssh key,就需要自己用ssh工具生成一个,使用下面的命令生成:

ssh-keygen

其实使用这个命令就可以生成一个默认参数的ssh key,如果你想自己制定参数,使用下面的命令生成一个通用的唯一标示的:

ssh-keygen -t rsa -C "your_email@example.com"

这样这个ssh key以后可以作为你的唯一标示,在各种需要的场合使用。

1.3 查看ssh key

运行完上面的命令,查看.ssh这个文件夹:

ls -al ~/.ssh

会发现下面的文件:

id_rsa 
id_rsa.pub

其中id_rsa.pub中的字符串就是我们需要的ssh key

1.4 参考资料

主要参考了:

2. 部署

2.1 登录到服务器

在服务器上添加了你的电脑的ssh key之后,就可以直接使用这台电脑远程登录到服务器了,使用下面的命令登录:

ssh ubuntu@phosphopredict.erc.monash.edu.au

这里的ubuntu就是用户名,phosphopredict.erc.monash.edu.au就是服务器的地址,不需要验证密码,就可以直接登录到服务器上,并且ubuntu这个用户名已经添加了root权限,所以执行sudo操作也都免密码,非常方便。

2.2 安装JDK1.8

如果JDK1.8还没有安装,我们需要先安装JDK1.8

使用下面的命令安装:

sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
sudo apt-get install oracle-java8-installer oracle-java8-set-default -y

安装完成之后,JDK1.8会被安装在/usr/lib/jvm/java-8-oracle中,在/etc/profile 或者~/.bashrc中配置JAVA_HOME变量:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

2.3 向服务器上传文件

我们不止需要在服务器上执行程序,还需要把一些文件传到服务器上,比如要部署的程序。最方便的方式就是使用FileZilla这样的工具,可以直接把本地文件传到服务器上而不需要服务器上配置ftp

2.3.1 配置FileZilla的SFTP,使用Private Key登录

因为我们使用的是ssh key,而不是用户名密码,所以在FileZilla中,也要配置一下。

这里使用Mac下的FileZilla做一个例子,首先打开FileZilla的偏好设置,

filezilla1.png

点击连接,选中FTP下面的SFTP,就会出现上图中的界面,这里我已经添加了ssh key,没有添加的话右边是空白的。

点击添加秘钥文件,就会弹出文件选择框。因为.ssh文件夹是隐藏文件夹,所以弹出选择框没办法直接选择,一个方法是自己将.ssh中的文件移出来再选择,另一种是在弹出框后,按command+shift+g,就会出现一个新的弹出框,如下图:

filezilla2.png

这是一个通用的命令,在打开Mac的任意文件夹时,都可以使用这个命令进入任何别的文件夹。

这里我们输入~/.sshFileZilla的选择框就会进入到.ssh文件夹了。

注意:我们要选择的是id_rsa,而不是id_rsa.pub

选中id_rsa后点击确定,FileZilla会提示你

“文件‘id_rsa’的格式不是被FileZilla所支持的。您想转换此文件到FileZilla所认可的格式吗?”

回答“是”。FileZilla会接着让你选择转换后的文件名和保存位置,并且默认保存为putty的密钥文件格式(*.ppk),这里取一个你能一眼看出含义的名字就行,可以保存在.ssh文件夹中。

2.3.2 FileZilla连接服务器

添加了ssh key之后,我们就可以使用FileZilla连接服务器:

filezilla3.png

这里的主机名就是服务器的地址,协议选择SFTP,端口可以不填,用户名选择跟ssh一样的ubuntu,密码可以不填或者随便写一个,因为我们的登录凭证是ssh key而不是密码。

点击连接,就可以登录到服务器上了,之后就可以跟服务器互传文件了。

注意,尽管我们的账号拥有root权限,不是root账号,所以上传文件时只能传到ubuntu这个账号的目录下,不能传到别的系统目录下,比如/var/www中。

2.3.3 参考资料

主要参考了下面的资料:

2.4 部署tomcat7

我们要部署的tomcat版本号为7,本来我自己去官网下了一个版本,打算上传到服务器上用,但是在修改端口号的时候遇到了一个问题,网上给的方法都是基于直接从ubuntu软件源安装的tomcat,这个后面再说,我们这里也直接从ubuntu的软件源安装tomcat7

下面提到tomcat,有时候用了tomcat7,特指我们安装的版本号为7tomcat,有时候用了tomcat,泛指tomcat服务器,其实没什么区别,就是想指代更明确点。

2.4.1 从ubuntu软件源安装tomcat7

  1. 安装authbind

     sudo apt-get install authbind
    

    由于我们接下来需要将tomcat7绑定到80端口上,但是非root用户无法绑定1024以下的端口,因此还需要借助于authbind

  2. 安装tomcat7:

     sudo apt-get install tomcat7 
    

    这种方式安装的tomcat7并没有安装tomcat7-docs, tomcat7-examples,and tomcat7-admin,所以你看到的tomcat首页也会是非常简洁的一个页面,跟自己从官网下载的tomcat7默认显示页面有所不同。

  3. 安装之后tomcat7的主目录在/var/lib/tomcat7,查看这个目录,有下面的文件:

     common  conf  logs  server  shared  webapps  work
    

    其中conf中存放的是tomcat的配置文件,logs存放的是tomcat的log日志,需要在tomcat上运行的程序,直接放到webapps中就好了。

    跟自己下载的tomcat7最大的区别在于,这里没有bin文件夹,也就没有了启动和关闭tomcat7shell脚本,由于是ubuntu系统安装的,所以ubuntu统一放在了/etc/init.d里了。

  4. 除了主目录,在/etc/default/中,还有一个叫tomcat7的配置文件,我们后面还会提到。

2.4.2 运行tomcat7

直接使用

sudo /etc/init.d/tomcat7 [start|stop|restart|try-restart|force-reload|status]

就可以运行tomcat7,这里有两个地方需要注意:

  • 需要使用sudo运行,获得root权限。

  • [ ]里面是可以选择的tomcat7的命令,比如要启动tomcat7,直接使用

      sudo /etc/init.d/tomcat7 start
    

    就可以了,其他几个同理。

也可以使用下面的命令运行tomcat7

sudo service tomcat7 [start|stop|restart|try-restart|force-reload|status]

对比下这两个命令应该就能明白,ubuntu会把安装的系统软件,比如apache2tomcat7mysql等的可执行程序放在/etc/init.d/文件夹中,这个文件夹下的可执行程序都有一个别名,叫service,所以你可以执行sudo /etc/init.d/tomcat7 start,也可以执行sudo service tomcat7 start,这个service的名字不只是为了简化而取个别名,从它的字面意思也看得出来,能放在/etc/init.d/中的都可以算作系统服务,所以才会叫做service

/etc/init.d/中的很多程序(或者说多数程序)都会随系统开机自启动,因为是系统服务嘛,至于开机这个过程中运作的原理,单独再写一篇介绍,这里不再展开了。

2.4.3 启动tomcat7报找不到JAVA_HOME or JRE

当你安装好了tomcat7时,系统已经自动启动了tomcat7,这时候应该就可以通过http://phosphopredict.erc.monash.edu.au:8080/访问到tomcat了,其中http://phosphopredict.erc.monash.edu.au为服务器的网址,8080端口为tomcat的默认端口号。

但是这时候我并没有访问到tomcat,使用

netstat -antu

查看端口号,发现8080端口号并未启动。尝试着启动tomcat7,发现报了找不到JAVA_HOME or JRE的错误。很奇怪,因为Jerico已经配置好了JDK`,使用

java -version

可以看到下面的信息:

java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

我尝试着在~/.bashrc/etc/environment中添加了JAVA_HOMEJRE_HOME:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

重启服务器之后发现还是报同样的错误,由于不太清楚sudo service tomcat7 restart是在哪个层面上读取JAVA_HOME的,所以也不知道应该在哪里设置JAVA_HOME了。

我检查了/etc/default/tomcat7这个文件,发现下面这几行:

# The home directory of the Java development kit (JDK). You need at least
# JDK version 1.5. If JAVA_HOME is not set, some common directories for
# OpenJDK, the Sun JDK, and various J2SE 1.5 versions are tried.
#JAVA_HOME=/usr/lib/jvm/openjdk-6-jdk

都是注释掉的,我去掉了最后一句话的注释,改成:

JAVA_HOME=/usr/lib/jvm/java-8-oracle

直接指定了tomcat7执行时的JAVA_HOME,重启tomcat7,一切正常,使用

netstat -antu

看到8080端口已经在列表里,在浏览器中通过http://phosphopredict.erc.monash.edu.au:8080/,就可以访问到tomcat的欢迎界面。

2.4.4 部署PhosphoPredictiontomcat7

直接将PhosphoPrediction.war扔到/var/lib/tomcat7/webqpps中就可以了,因为支持热部署,所以在浏览器中,通过:http://phosphopredict.erc.monash.edu.au:8080:PhosphoPrediction,就可以访问到PhosphoPrediction这个网站。

这时候查看/var/lib/tomcat7/webqpps,会发现除了PhosphoPrediction.war,还有一个PhosphoPrediction文件夹,这个文件夹就是tomcat自动从PhosphoPrediction.war解压出来的网站,此时就可以删除PhosphoPrediction.war了。

但是这个网址很不美观,我们想要去掉8080端口来访问网站。

2.4.5 将tomcat7端口号设置为80

默认情况下,如果你装了Apache,那么Apache会占用80端口号,但是因为这台云服务器就是PhosphoPrediction的专有服务器,因此直接将80端口绑定到tomcat7上就可以了。

  1. /var/lib/tomcat7/conf中,找到server.xml(如果是系统安装的tomcat7,也可以在/etc/tomcat7中找到server.xml,编辑server.xml

     <Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            URIEncoding="UTF-8"
            redirectPort="8443" />
    

    将上面的这句配置的端口号改了,改为:

     <Connector port="80" protocol="HTTP/1.1"
            connectionTimeout="20000"
            URIEncoding="UTF-8"
            redirectPort="8443" />
    

    如果你是把端口号改成8888之类的,现在重启tomcat7服务器就可以了,但是改成80的话这样还不够,因为非root用户无法绑定1024以下的端口

  2. 找到/etc/default/tomcat7这个配置文件,编辑,将最后一句话:

     #AUTHBIND=no
    

    去掉注释,并改为:

     AUTHBIND=yes 
    

    允许tomcat借助authbind绑定端口号80

  3. authbind分配权限,逐条运行下面的命令

     sudo touch /etc/authbind/byport/80  
     sudo touch /etc/authbind/byport/443  
     sudo chmod 0755 /etc/authbind/byport/80  
     sudo chmod 0755 /etc/authbind/byport/443  
     sudo chown tomcat7:tomcat7 /etc/authbind/byport/80  
     sudo chown tomcat7:tomcat7 /etc/authbind/byport/443
    

    具体的作用,贴上一段参考:

    Create authbind bind permission files for ports 80 and 443. Authbind will loop through the directory structure and try to find a byPort file referencing the port number attempting to be bound. Authorization will be granted if the user attempting to bind has execute permission.

  4. 重启tomcat7,使用

     netstat -antu
    

    查看,发现80端口已经在列表里了。现在我们可以使用http://phosphopredict.erc.monash.edu.au:PhosphoPrediction访问PhosphoPrediction了。

    * 如果网址后面不加端口号,默认就是80端口号。

  5. 关于第一步中,为什么ubuntu系统安装的tomcat7会有两个地方有server.xml,是因为ubuntu系统安装tomcat7时,配置文件统一放在了/etc中,tomcat7的配置文件也就在/etc/tomcat7中了,但是为了照顾用户习惯,很多用户都是自己下载官方版的,里面就有conf文件夹,忽然没了很不习惯,因此tomcat7中依然保留了conf这个文件夹,在/var/lib/tomcat7中使用

     ls -l
    

会看到下面的信息:

    total 24
    drwxr-xr-x  6 root    root    4096 Dec 21 22:11 ./
    drwxr-xr-x 45 root    root    4096 Dec 21 22:11 ../
    drwxr-xr-x  3 tomcat7 tomcat7 4096 Dec 21 22:11 common/
    lrwxrwxrwx  1 root    root      12 Jun 20  2015 conf -> /etc/tomcat7/
    lrwxrwxrwx  1 root    root      17 Jun 20  2015 logs -> ../../log/tomcat7/
    drwxr-xr-x  3 tomcat7 tomcat7 4096 Dec 21 22:11 server/
    drwxr-xr-x  3 tomcat7 tomcat7 4096 Dec 21 22:11 shared/
    drwxrwxr-x  4 tomcat7 tomcat7 4096 Dec 21 23:51 webapps/
    lrwxrwxrwx  1 root    root      19 Jun 20  2015 work -> ../../cache/tomcat7/

会发现tomcat7中的目录其实就是个软连接,指向真实的文件夹/etc/tomcat7,同样,logs也被放在了/var/logs/tomcat7中,work也被放进了/var/cache/tomcat7中。

这其实是个通用的方式,系统安装的软件会把这个软件的各个部分分拆放到系统的各个对应的文件夹里统一管理。

2.4.6 更进一步

既然这台云服务器是PhosphoPrediction的专有服务器,http://phosphopredict.erc.monash.edu.au:PhosphoPrediction访问PhosphoPrediction这个网址看起来还是不够简洁,改成http://phosphopredict.erc.monash.edu.au就完美了。

目前http://phosphopredict.erc.monash.edu.au为什么访问到的是tomcat7的欢迎界面呢?

打开/var/lib/tomcat7/webapps文件夹,会发现里面除了我们的网站,还有一个叫ROOT的文件夹,ROOT里面的index.html就是tomcat7的欢迎界面。所以,ROOT就是tomcat的默认网站。

要修改tomcat的默认网站有两种方式,第一种不说了,用到再说,我采用的就是第二种,简单粗暴:删掉ROOT文件夹,或者改个名字,然后把PhosphoPrediction改名为ROOT

现在,就可以使用http://phosphopredict.erc.monash.edu.au访问PhosphoPrediction了。

2.4.7 补充

我们在新的Ubuntu16.04服务器上安装tomcat7时,均出现安装失败。

~$ sudo apt-get install tomcat7
Setting up tomcat7 (7.0.68-1ubuntu0.1) ...Job for tomcat7.service failed because the control process exited with error code. See "systemctl status tomcat7.service" and "journalctl -xe" for details.invoke-rc.d: initscript tomcat7, action "start" failed.dpkg: error processing package tomcat7 (--configure): subprocess installed post-installation script returned error exit status 1Errors were encountered while processing: tomcat7N: Ignoring file '20auto-upgrades.ucf-dist' in directory '/etc/apt/apt.conf.d/' as it has an invalid filename extensionE: Sub-process /usr/bin/dpkg returned an error code (1)

虽然会报错,但是,其实这时候已经安装上了。只不过是JAVA_HOME没有配置好,所以无法启动。启动便会报错:

* tomcat7.service   Loaded: not-found (Reason: No such file or directory)   Active: failed (Result: exit-code) since Tue 2017-05-02 05:38:14 UTC; 1min 9s agoMay 02 05:38:14 bastion6 systemd[1]: Starting LSB: Start Tomcat....May 02 05:38:14 bastion6 tomcat7[2047]:  * no JDK or JRE found - please set JAVA_HOMEMay 02 05:38:14 bastion6 systemd[1]: tomcat7.service: Control process exited, code=exited status=1May 02 05:38:14 bastion6 systemd[1]: Failed to start LSB: Start Tomcat..May 02 05:38:14 bastion6 systemd[1]: tomcat7.service: Unit entered failed state.May 02 05:38:14 bastion6 systemd[1]: tomcat7.service: Failed with result 'exit-code'.May 02 05:39:16 bastion6 systemd[1]: Stopped LSB: Start Tomcat..

只需要打开/etc/default/tomcat7,添加一句话:

JAVA_HOME=/usr/lib/jvm/java-8-oracle

再运行就正常了。

2.4.8 参考资料

主要参考了下面的资料: