Java Web 项目部署记录

最近把自己做的一个 Java Web 项目后端部署在了 Linux 服务器上,这是项目地址,发布地址:http://111.231.171.22/index.jsp ,由于是以学习后端为目的,所以整个项目的没有前端部分,整个项目需要依靠 Chrome 插件 Restlet Client 才可以进行测试运行。

下面主要整理一下自己在部署时遇到的值得关注的地方。

服务器账号

高配置的云服务器价格比较贵,阿里云和腾讯云都提供了学生套餐,基本都是 10元/月左右,比较实惠。我申请了一台腾讯云的学生服务器,进入控制台,如下图。

假设公网 IP 为 1.2.3.4,打开 Linux 终端,输入 ssh root@1.2.3.4,输入购买服务器时 root 密码,连接服务器。个人学习使用时,使用 root 账号没有问题,但在公司等实际场景中,每个人都会有自己的个人账号,并对不同的目录、文件等拥有不同的权限,这样操作的安全性更高。新建一个用户的过程是(以 harry 为例):

1
2
3
user add -d /usr/harry -m harry
cd /usr/harry
passwd harry

然后输入两次密码,进行确认。之后,用 Vim 打开 /etc/sudoers,找到 “ root ALL=(ALL) ALL” 这一行,在下面加上 “ harry ALL=(ALL) ALL” ,保存,一个有 sudo 权限的新用户就创建完成了。

JDK 的安装

在配置 JDK 之前,首先检查购买的 Linux 服务器中有没有事先安装 OpenJDK 等,先执行rpm -qa | grep jdk 搜索自带的 JDK,然后用 sudo yum remove xxx 卸载(xxx为搜索到的结果)。

从 Oracle 官网下载用 wget 下载 JDK 包时,单纯写入 JDK 的 URL 是不够的,还需要在后面加上身份验证信息的 AuthParam 字段,完整的下载路径获取如下图所示。

例如,应输入:sudo wgethttps://download.oracle.com/otn/java/jdk/8u211-b12/478a62b7d4e34b78b671c754eaaf38ab/jdk-8u211-linux-x64.rpm?AuthParam=1561270126_aed4242c4a96bcf24d65badddd2ac8ee (仅用于示范)

MySQL 用户设置

环境配置还需要安装 MySQL,直接使用 yum 源下载。下载后,用 root 进入 MySQL,输入 select user,host,password from mysql.user; 查看数据库用户,初始情况下都是没有密码的,因此要设置一下。初始状态下,我的用户和 host 名如下图。

可以看到第二个 host 名显示时使用了转义字符 \。

对于第一个用户,输入 set password for root@localhost = password("yourpassword") ,到第二个用户时,输入 set password for root@vm\_0\_5\_centos= password("yourpassword") 却会报错,提示 SQL 语句有语法错误。原来不仅需要为通配符加上转义字符,还要给整个语句加反勾号 ` `,也就是数字键 1 左边的键。正确的输入是:

云服务器安全组设置

在服务器上部署好项目,却发现无法访问80或者8080端口,连 ping 也不通,原因之一是未配置安全组,导致服务器一个端口也没有开放出来。在腾讯云选择 更多—>安全组—>配置安全组,可以选择默认提供的安全组配置,也可以自行定义入站、出站规则,如下图所示。不推荐开放所有端口,最好是根据项目所需,一个个地开放。

FTP 服务设置

项目中需要通过 FTP 进行图片上传等功能,要安装 vsftpd,并配置一个 FTP 服务器用户和密码。部署项目并在线上测试时,发现上传的图片 URL 无法打开,根据 Nginx 配置的文件存放路径里也没有图片。遇到这个错误时我一筹莫展,最后尝试从 Tomcat 日志中寻找线索。果然,在 Tomcat 路径下的 logs/catalina.out 中,发现 FTP 服务器连接失败。原来,在项目中,我将 FTP 服务器的 IP、用户和密码放在了一个 .properties 文件里,其中的信息都是我在本地测试时用到的,IP 填的是 127.0.0.1,肯定是不对的。如下图。

所以,修改文件内容,和线上服务器里配置的一样。每一次改完 Java 项目,需要提交并 push 至线上仓库,然后再次通过 Shell 脚本更新远程 Linux 服务器中的代码,再编译,发布。然后,再次查看日志,发现这个连接失败的错误没了,不过连接超时的错误出现了。

一个可能是 vsftpd 的设置出了问题。进入修改 /etc/vsftpd/vsftpd.conf 文件,重点关注的字段有:

1
2
3
4
5
write_enable=YES      #定义写权限
listen_port=61001 #监听端口
ftp_data_port=61002 #数据端口
pasv_min_port=61001 #随机最小端口
pasv_max_port=62000 #随机最大端口

如像上面配置了端口之后,还要去 /etc/sysconfig/iptablesi 修改防火墙配置,添加如下内容:

1
2
-A OUTPUT -p tcp --sport 4000:5000 -j ACCEPT
-A INPUT -p tcp --dport 4000:5000 -j ACCEPT

设置好以后,重启 vsftpd 和 iptables。

Linux 文件权限

连接超时的这个错误比较棘手,会引发问题的地方很多。我进入 FTP 目录中,还是没有看到应该上传的图片。因此,我想到了文件权限的问题。由于线上图片的上传都是通过新建的 FTP 用户进行的,那假如新用户没有此文件夹的写入权限,FTP 上传也就失败了。于是为这个用户赋予权限:

1
2
3
sudo chown ftpuser img/
sudo chgrp ftpuser img/
sudo chmod g+w img/

Nginx 配置负载均衡

项目中还用到了 Tomcat 集群,为了区别标志,检验配置是否成功,网站首页刷新还会有两个 Tomcat 的标识。使用 Nginx 反向代理本地的两个 Tomcat 服务,并且达到负载均衡的效果。编辑它的 nginx.conf 文件,默认为服务器轮询方式,添加如下内容:

1
2
3
4
upstream 111.231.171.22{
server 127.0.0.1:8080;
server 127.0.0.1:9080;
}

由于两个 Tomcat 均部署在同一台机器上,所以 IP 地址直接填写本地的。而假如不在一台机器上,上述 IP 地址可以写成内网 IP(公网 IP 也可以,但是服务速度会很慢)。