Nignx 概述+项目应用
Nginx概述
Nginx 是高性能的Http 和反向代理服务器,处理高并发能力是十分强大的,能经受高负载的考验,可支持高达5w 个并发的连接数。
Nginx功能介绍
反向代理:
正向代理:某种情况下,代理我们去访问服务器,需要用户手动设置代理服务器的IP和端口号。
反向代理:这是用来代理服务器的,代理我们要访问的目标服务器,代理服务器接受请求,然后将请求转发给内部网络的服务器(集群化),并将从服务器上得到的结果放回给客户端,此时代理服务器对外就表现为一个服务器。
负载均衡:
多在并发情况下需要使用,其原理就是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,多台服务器集群共同完成工作任务,从而提高数据的吞吐量
动静分离
Nginx提供的动静分离是指把动态请求和静态请求分开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。
Nginx可以根据配置对不同的请求做不同的转发,这是对动态分离的基础。静态请求对应的静态资源可以直接放在Nginx做缓存。动态请求由相应的后端服务器处理。
项目中的应用(动静分离)
java+Nginx 实现文件上传
1.在pom 中加入对应的依赖
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
2.前端页面
<formaction="upphoto"method="post"
enctype="multipart/form-data">
File:<input type="file" name="file"multiple="multiple">
<!-- Desc:<input type="text" name="desc"> -->
<input type="submit" value="Submit">
</form>
3.stfp连接工具类
package com.hk.utils;
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;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
public class SFTPUtil implements AutoCloseable {
private Session session = null;
private ChannelSftp channel = null;
/**
* 连接sftp服务器
*
* @param serverIP 服务IP
* @param port 端口
* @param userName 用户名
* @param password 密码
* @throws SocketException SocketException
* @throws IOException IOException
* @throws JSchException JSchException
*/
public void connectServer(String serverIP, int port, String userName, String password) throws SocketException, IOException, JSchException {
JSch jsch = new JSch();
// 根据用户名,主机ip,端口获取一个Session对象
session = jsch.getSession(userName, serverIP, port);
// 设置密码
session.setPassword(password);
// 为Session对象设置properties
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// 通过Session建立链接
session.connect();
// 打开SFTP通道
channel = (ChannelSftp) session.openChannel("sftp");
// 建立SFTP通道的连接
channel.connect();
}
/**
* 自动关闭资源
*/
public void close() {
if (channel != null) {
channel.disconnect();
}
if (session != null) {
session.disconnect();
}
}
public List<ChannelSftp.LsEntry> getDirList(String path) throws SftpException {
List<ChannelSftp.LsEntry> list = new ArrayList<>();
if (channel != null) {
Vector vv = channel.ls(path);
if (vv == null && vv.size() == 0) {
return list;
} else {
Object[] aa = vv.toArray();
for (int i = 0; i < aa.length; i++) {
ChannelSftp.LsEntry temp = (ChannelSftp.LsEntry) aa[i];
list.add(temp);
}
}
}
return list;
}
/**
* 下载文件
*
* @param remotePathFile 远程文件
* @param localPathFile 本地文件[绝对路径]
* @throws SftpException SftpException
* @throws IOException IOException
*/
public void downloadFile(String remotePathFile, String localPathFile) throws SftpException, IOException {
try (FileOutputStream os = new FileOutputStream(new File(localPathFile))) {
if (channel == null)
throw new IOException("sftp server not login");
channel.get(remotePathFile, os);
}
}
/**
* 上传文件
*
* @param remoteFile 远程文件
* @param localFile
* @throws SftpException
* @throws IOException
*/
public void uploadFile(String remoteFile, String localFile) throws SftpException, IOException {
try (FileInputStream in = new FileInputStream(new File(localFile))) {
if (channel == null)
throw new IOException("sftp server not login");
channel.put(in, remoteFile);
}
}
}
controller层+Nginx配置文件中Nginx.conf中的配置
alias : 把当前路径下的图片都能拿到
Server_name : 是访问地址的IP
/img/:访问路径
Listen:端口号(80)
@Controller
@RequestMapping("/user")
public class EmployeeController {
/**
* 导入Jackson-Databind
*/
@PostMapping("/upphoto")
public String upPhoto(@RequestParam("file") MultipartFile[] file,HttpServletRequest request) throws IOException {
// String str ="";
// 实例化工具类,填写用户名,密码,ip地址,端口号,用来连接linux
SftpUtil sftpUtil = new SftpUtil("root", "dxt980409", "192.168.58.129", 22);
// 连接服务器
sftpUtil.login();
try {
for (MultipartFile multipartFile : file) {
System.out.println("filename:" + multipartFile.getOriginalFilename());
System.out.println("InputStream" + multipartFile.getInputStream());
// 上传文件
String path = sftpUtil.upload("/usr/src/nginx-1.12.2/imags", multipartFile.getOriginalFilename(), multipartFile.getInputStream());
request.setAttribute("ph",path);
System.out.println(path);
}
} catch (Exception e) {
// System.out.println("上传失败");
} finally {
// 释放连接
sftpUtil.logout();
}
return "WEB-INF/views/upFile.jsp";
}
}
备注
此代码为上传图片到Nginx服务器,项目中静态资源图片的展示也要从Nginx服务器获取,需要吧静态资源图片的路径改为Nginx服务器储存图片的路径。