nginx实战--图片服务器

实现功能:

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

Linux中图片的位置:

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;	
}
}

​

浏览器中进行访问:

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

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

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

   这是文件找不到错误,原因是根路径配置错误,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;	
}

浏览器进行访问:

 

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

在项目中,我们往往会把图片存放到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,希望可以帮助到看到的小伙伴。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx是一款开源的高性能web服务器,具有高并发、低内存消耗、稳定可靠的特点,被广泛用于构建高性能的网站和应用。 使用nginx作为web服务器,可以通过一些实战技巧来进一步优化性能。首先,可以通过调整nginx的配置文件来提高并发处理能力。可以将worker_processes参数设置为CPU核心数,以充分利用服务器的CPU资源;同时,可以通过调整worker_connections参数来增加nginx能够同时处理的连接数,提高系统的并发处理能力。 其次,可以配置nginx的反向代理功能来分发请求,并将负载均衡在多个应用服务器之间。这样可以提高系统的响应速度和可靠性,避免单个服务器负载过高导致系统崩溃。同时,可以使用nginx的缓存功能来减少对后端服务器的请求,提高系统的访问速度。 另外,使用nginx还可以进行静态资源的加速。通过配置nginx的gzip压缩和缓存功能,可以减小静态资源的传输大小并提高访问速度。此外,还可以使用nginx的文件缓存功能,将常用的静态资源缓存在内存,减少磁盘IO操作,进一步提高性能。 除了以上实战技巧,还可以通过优化应用程序的代码和数据库的设计来进一步提高性能。减少不必要的数据库查询,使用有效的缓存机制,使用适当的索引来优化数据库查询等等,都可以提升系统的性能。 综上所述,nginx高性能web服务器实战教程涉及到许多方面的内容,包括配置优化、负载均衡、缓存加速等。通过深入学习和实践这些技巧,可以构建出性能卓越的网站和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值