我有两个 AWS-EC2 Linux 实例。
一个用于 DB 和 doc 文件,另一个用于运行 java 应用程序的 tomcat。
我有一个场景,用户可以下载文件,即位于第二个实例上的文件。
我谷歌了一下,我得到了一些选项,比如 NFS、FTP 等,我不确定哪一个在性能和安全性方面都很好。
谢谢。

请您参考如下方法:

利用现有服务的一种方法是 SCP。

首先,生成 key 对:

$ ssh-keygen -b 4096 -C "tomcat-servlet-key" 

将Tomcat实例上的私钥保存为/path/to/my-key,并将/path/to/my-key.pub的内容复制到文件存储实例上的/home/fileowner/.ssh/authorized_keys。 (有关如何添加 fileowner 用户并确保 fileowner 对要提供的文件具有读取权限的信息,请参阅 AWS docs on adding users。)

您可以使用Ant Scp task让 servlet 代码中的事情变得更容易:

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import org.apache.tools.ant.Project; 
import org.apache.tools.ant.taskdefs.optional.ssh.Scp; 
import com.google.common.io.Files; 
 
public class ScpServlet extends HttpServlet { 
 
    private static final String SERVER_2_USER = "fileowner"; 
    private static final String SERVER_2_PRIVATE_IP = "10.0.0.xyz"; 
    private static final String PRIVATE_KEY_FILE = "/path/to/my-key"; 
 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
        Scp scp = new Scp(); 
        scp.setProject(new Project()); 
        scp.setRemoteFile(SERVER_2_USER + '@' + SERVER_2_PRIVATE_IP + ":/tmp/hello.txt"); 
        File outfile = File.createTempFile("hello", ".txt"); 
        try { 
            scp.setLocalTofile(outfile.getAbsolutePath()); 
            scp.setKeyfile(PRIVATE_KEY_FILE); 
            scp.setHost(SERVER_2_PRIVATE_IP); 
            scp.setUsername(SERVER_2_USER); 
            scp.setTrust(true); 
            scp.execute(); 
            response.setContentType("text/plain"); 
            try (OutputStream out = response.getOutputStream()) { 
                Files.asByteSource(outfile).copyTo(out); 
            } 
        } finally { 
            outfile.delete(); 
        } 
    } 
 
} 

您可以将文件存储实例锁定在仅允许 VPC 中其他实例访问的安全组中。

此解决方案有一个不必要的中间步骤,即将文件复制到 Tomcat 实例上的磁盘,以便从那里提供服务,但您也许可以扩展 Scp 任务以将字节保留在内存中。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!