实现功能:

     在Linux系统上的Nginx服务器上配置图片访问路径,通过浏览器访问指定路径中的图片,实现图片上传功能。

Linux中图片的位置:

nginx 作为图片服务器 nginx配置图片服务器_nginx

nginx.conf文件的配置:

#图片代理服务器
 server {
        listen       8089;
        server_name  192.168.16.88;

       #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /accessory/ {
            root   /home;
            autoindex on; #以文件夹的形式进行展示
        }
	location / {
	   root    html;
	   index   index.html  index.htm;	
}
}

浏览器中进行访问:

nginx 作为图片服务器 nginx配置图片服务器_IP_02

下面介绍配置中可能出现的问题:

1. 每次修改时记得重新加载nginx   命令:nginx -s reload;

2.通过浏览器访问时404错误,图片的位置如下:

nginx 作为图片服务器 nginx配置图片服务器_linux_03

   这是文件找不到错误,原因是根路径配置错误,root配置的意思是,会在root配置的目录后跟上URL,也就是会把location后面的路径拼接到root之后,我们可以把root后面的路径去掉,或者使用alias配置访问路径。

使用alias配置访问路径配置如下:

server {
        listen       80;
        server_name  localhost;

       #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /img {
            alias   /home/imgs/img;  # alias指定图片路径
            autoindex on;
        }
	location / {
	   root    html;
	   index   index.html  index.htm;	
}

浏览器进行访问:

nginx 作为图片服务器 nginx配置图片服务器_nginx_04

 

3. 把图片放的不同的目录下时,需要的配置有差别呦。当把图片放在/home目录下的文件夹中,以下可以正常访问。若放在/usr下的文件夹中,需要把配置中#user  nobody;注释打开。

nginx 作为图片服务器 nginx配置图片服务器_IP_05

在项目中,我们往往会把图片存放到nginx中实现动静分离,提高访问的速度,同时也减轻服务器的压力。

java实现图片上传到nginx

1. 添加maven依赖

<!-- 上传文件 -->
		<dependency>
			<groupId>com.jcraft</groupId>
			<artifactId>jsch</artifactId>
			<version>0.1.49</version>
		</dependency>

2. 工具类

/**
 * @ClassName: SFTP
 * @Description: sftp连接工具类
 *
 * @version 1.0.0
 */
public class Sftp {
	private transient Logger log = LoggerFactory.getLogger(this.getClass());

	private ChannelSftp sftp;

	private Session session;
	/** FTP 登录用户名 */
	private String username;
	/** FTP 登录密码 */
	private String password;
	/** 私钥 */
	private String privateKey;
	/** FTP 服务器地址IP地址 */
	private String host;
	/** FTP 端口 */
	private int port;

	/**
	 * 构造基于密码认证的sftp对象
	 * 
	 * @param userName
	 * @param password
	 * @param host
	 * @param port
	 */
	public Sftp(String username, String password, String host, int port) {
		this.username = username;
		this.password = password;
		this.host = host;
		this.port = port;
	}

	/**
	 * 构造基于秘钥认证的sftp对象
	 * 
	 * @param userName
	 * @param host
	 * @param port
	 * @param privateKey
	 */
	public Sftp(String username, String host, int port, String privateKey) {
		this.username = username;
		this.host = host;
		this.port = port;
		this.privateKey = privateKey;
	}

	public Sftp() {
	}

	/**
	 * 连接sftp服务器
	 *
	 * @throws Exception
	 */
	public void login() {
		try {
			JSch jsch = new JSch();
			if (privateKey != null) {
				jsch.addIdentity(privateKey);// 设置私钥
				log.info("sftp connect,path of private key file:{}", privateKey);
			}
			log.info("sftp connect by host:{} username:{}", host, username);

			session = jsch.getSession(username, host, port);
			log.info("Session is build");
			if (password != null) {
				session.setPassword(password);
			}
			Properties config = new Properties();
			config.put("StrictHostKeyChecking", "no");

			session.setConfig(config);
			session.connect();
			log.info("Session is connected");

			Channel channel = session.openChannel("sftp");
			channel.connect();
			log.info("channel is connected");

			sftp = (ChannelSftp) channel;
			log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));
		} catch (JSchException e) {
			log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}",
					new Object[] { host, port, e.getMessage() });
		}
	}

	/**
	 * 关闭连接 server
	 */
	public void logout() {
		if (sftp != null) {
			if (sftp.isConnected()) {
				sftp.disconnect();
				log.info("sftp is closed already");
			}
		}
		if (session != null) {
			if (session.isConnected()) {
				session.disconnect();
				log.info("sshSession is closed already");
			}
		}
	}

	/**
	 * 将输入流的数据上传到sftp作为文件
	 * 
	 * @param directory    上传到该目录
	 * @param sftpFileName sftp端文件名
	 * @param in           输入流
	 * @throws SftpException
	 * @throws Exception
	 */
	public void upload(String directory, String sftpFileName, InputStream input) throws SftpException {
		try {
			sftp.cd(directory);
		} catch (SftpException e) {
			log.warn("directory is not exist");
			sftp.mkdir(directory);
			sftp.cd(directory);
		}
		sftp.put(input, sftpFileName);
		log.info("file:{} is upload successful", sftpFileName);
		
	}
}

3. 配置文件

# 账号
linux.username=root
# 密码
linux.password=root
# ip路径
linux.ip=虚拟机路径
# 虚拟机端口号
linux.id=22
# nginx端口
linux.nginx.port=8089
# 上传根目录
linux.nginx.uploadPath=/home/accessory
# 文件上传访问路径	
linux.nginx.downPath=/accessory/

nginx的配置文件和上面第一个配置文件相同,此处省略。

4. java代码实现

@Controller
@RequestMapping("/upload")
public class FileUploadController {

	public static String USERNAME = PropertiesUtil.LINUX_USERNAME;
	public static String PASSWORD = PropertiesUtil.LINUX_PASSWORD;
	public static String IP = PropertiesUtil.LINUX_IP;
	public static Integer ID = Integer.valueOf(PropertiesUtil.LINUX_ID);
	public static String UPLOAD_PATH = PropertiesUtil.LINUX_NGINX_UPLOADPATH;
	public static String DOWN_PATH = PropertiesUtil.LINUX_NGINX_DOWNPATH;
	public static String PORT = PropertiesUtil.LINUX_NGINX_PORT;

	/**
	 * 上传文件
	 * @param carOrders
	 * @return
	 * @throws IOException 
	 */
	@RequestMapping("/img")
	@ResponseBody
	public Map<String,Object> img(MultipartFile file) throws IOException {
		//实例化工具类,填写用户名,密码,ip地址,端口号,用来连接linux
		SftpUtil sftpUtil = new SftpUtil(USERNAME, PASSWORD, IP, ID);
		//连接服务器
		sftpUtil.login();
        Map<String,Object> map = new HashMap<String,Object>();
		try {
			String picname = UUID.randomUUID().toString().replaceAll("-", "");
			String originalFilename = file.getOriginalFilename();
			String string = originalFilename.substring(originalFilename.lastIndexOf("."));
			String filename = picname+string;
			//上传文件
			System.out.println(UPLOAD_PATH+"================");
			sftpUtil.upload(UPLOAD_PATH, filename, file.getInputStream());
			String savePath = DOWN_PATH+filename;
			 
			  //返回json
            map.put("msg","ok");
            map.put("code",200);
            
            /*加不加这个都行*/
            map.put("data",new HashMap<String,Object>(){
            	{
                    put("src",savePath);
                }
            });
		} catch (Exception e) { 
			map.put("msg","error");
			map.put("code",0);
			e.printStackTrace();
			System.out.println("上传失败");
		} finally {
			//释放连接
			sftpUtil.logout();
		}
		return map;
	}
	
}

5. 前端页面正常书写,此处省略。

以上就是nginx作为图片服务器的一个小demo,希望可以帮助到看到的小伙伴。