一、概述
目前由于行内网络规划以及安全的原因,不能直接从应用区域直接访问第三方SFTP文件服务器,只能允许代理服务器网络区域出去,也就是SFTP正向代理转发到第三方的SFTP文件服务器,而我们使用的代理应用软件则是开源的nginx。以前搞过正向代理HTTP,而没有尝试过正向代理SFTP,其实也就是TCP协议。为了满足应用需求,我们需要搭建nginx正向代理SFTP服务应用。
二、Nginx编译安装步骤
1、首先,要准备的是软件,可以在网上下载,http://nginx.org/en/download.html,我安装的是nginx1.14.2
参考安装教程
1.https://www.jianshu.com/p/e236985fecd7
2.https://www.jianshu.com/p/5dcd1e027e17
三.在另一台服务器上安装SFTP,服务器IP是 192.168.35.13
四.接着修改配置文件,在/usr/local/nginx/conf目录下,找到nginx.conf配置文件
添加以下内容
新增这个模块:
stream {
upstream sftp {
hash $remote_addr consistent;
server 192.168.35.13:22 max_fails=3 fail_timeout=60s;
}
server {
listen 90; #端口可以自己定义
proxy_connect_timeout 60s;
proxy_timeout 30s;
proxy_pass sftp;
}
}
PS:这个模块一定要放在http外面
五.eclipse导入maven项目,修改配置文件,maven版本(apache-maven-3.5.4.rar)
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.42</version>
</dependency>
六.测试
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
public class SftpTest {
public static void main(String[] args) throws JSchException, FileNotFoundException, SftpException {
int port = 90;
String password = "sftp";
String username = "sftp";
String host = "192.168.35.11";
JSch jsch = new JSch();
Session session = jsch.getSession(username,host, port);
session.setPassword(password);
skipHostKeyChecking(session);
setTimeout(session);
session.connect();
ChannelSftp sftp = null;
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
sftp.cd("/file");
File file = new File("D:/aaaa.txt");
sftp.put(new FileInputStream(file), file.getName());
disconnect(sftp, session);
}
/**
* @param session
* @throws
* @Title: skipHostKeyChecking
* @Description: "StrictHostKeyChecking"如果设为"yes",ssh将不会自动把计算机的密匙加入
* "$HOME/.ssh/known_hosts"文件,且一旦计算机的密匙发生了变化,就拒绝连接。
*/
static void skipHostKeyChecking(Session session) {
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
}
static void setTimeout(Session session) throws JSchException {
session.setTimeout(8000); // 设置timeout时间
}
static void disconnect( ChannelSftp sftp,Session sshSession)
{
if (sftp != null)
{
if (sftp.isConnected())
{
sftp.disconnect();
}
}
if (sshSession != null)
{
if (sshSession.isConnected())
{
sshSession.disconnect();
}
}
}
}