应用发布前得在内网的服务器上测试,之前一直都是build一个war包通过ftp上传到服务器上,然后手动发布,再测试,整个流程在正常的情况下要耗掉3分钟左右的时间。然后出现问题的话得远程调试,修改后再重复步骤一,又要耗掉3分钟左右的时间(3分钟有点久,当你打开了很多窗口的时候)......这个问题我忍了很久了。
最初为了省时,在本地搭好dns服务器, 通过nginx把域名的访问转回本地测试,在Intellij Idea中折腾了一段时间,终于让tomcat既可以在本地发布域名应用也可以在IDE调试。这种方式毕竟不适合多人合作的工作形式。而且第一次配置比较耗时,还不一定一下子就成功,因为是一种骗过Intellij Idea的手段,出现问题还要清一下缓存重启IDE,再配置。每次测试后又要还原。这个我也忍了。。。
昨天,我不想再忍了,想寻求一种比较优雅的方式。我知道tomcat每个应用都可以配置reloadable为true,当文件变更的时候会重新发布,那么只要替换掉其运行的文件就可以了。马上就想到了ftp,下面是实现方式(用vsftpd经过一番折腾后):
1. 为每个应用创建一个用户名,指定用户的主目录为应用发布后的目录。
sudo useradd -d /data/app/xxx -m xxx
sudo passwd xxx
2. 设置vsftpd
sudo mv /etc/vsftpd.conf /etc/vsftpd.conf_bak // do some backup
sudo vi /etc/vsftpd.conf:
local_enable=YES
write_enable=YES
chroot_local_user=NO //or yes
chroot_list_enable=YES //在chroot_list中指定的用户可以登录,chroot你懂的,指定了用户的根目录为上一步指定的目录
chroot_list_file=/etc/vsftpd.chroot_list //该文件指定chroot user
pam_service_name=vsftpd
allow_writeable_chroot=YES
3. echo "xxx" | tee -a /etc/vsftpd.chroot_list
4. systemctl restart vsftpd.service
经过上一步设置后可以使用xxx登录ftpserver了,多个应用可以设置多个用户。下一个问题就是ftp不能上传文件夹,what the fuck...我竟然忘记了。谷狗了一下,发现Intellij Idea有个source synchronizer的插件,是通过ftp进行源码同步的。下载后发现其不能指定非java模块的文件夹,令我感到意外的是在同一级菜单发现了另一个有意思的东西:
5. 设置ftp:
6. 查看Remote Host: 点图一的“browse remote host" 或 右边的:
点击upload就把指定的本地目录上传到服务器目录了,tomcat发现文件变更就自动重新发布了, 整个操作只需要build一下应用,点一下上传,爽死我了。。。
然而耽搁了主要的事情。。。
后续:
参考:https://serverfault.com/questions/6895/whats-the-best-way-of-handling-permissions-for-apache-2s-user-www-data-in-var
由于每次上传的新文件都没有访问权限,对此做了如下操作:
1. 新增一个组别: groupadd www
2. 给组别添加用户: usermod -a -G www xxx
3. 更新目录与文件权限:
find /data/app -type d -exec chmod 2775 {} +
find /data/app -type f -exec chmod 0664 {} +
4. 设置组别的acl,目的是使这些文件夹下新增的文件都附上可读权限(其实也可以设置umask,这里选择acl是因为不用修改系统文件,比较方便)
sudo setfacl -R -d -m g:www:rwx /data/app //递归设置文件夹acl
5. 至此,每次上传的新文件都能被访问了。不用手动chmod了。