Nginx反向代理实现图片上传到Ubuntu服务器

Posted Kira~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx反向代理实现图片上传到Ubuntu服务器相关的知识,希望对你有一定的参考价值。

之前用Apache搭建了一个静态图片服务器,服务器搭建步骤见这篇博客
https://blog.csdn.net/weixin_44996854/article/details/117046225
但只实现了通过网址从服务器获取图片的功能,而且每次只能根据网址获取单张图片,并不能上传文件到服务器。要实现图片的上传,就需要再新建一个图片处理的服务器,而其他服务器可以通过这个服务器来上传图片和获取图片,这就涉及到了多台服务器的相互配合,而使用nginx的反向代理功能可以很方便地解决这个问题。

  1. Nginx的下载和安装
  2. 图片操作服务器的搭建
    新建一个SpringBoot服务器,端口设为8200,作为操作图片的服务器,主要代码如下:
@RestController
@RequestMapping(value = "upload")
public class API {
    /**
     * 访问服务器文件路径端口
     */
    @Value(value = "${filePath}")
    private String imgPath;
    /**
     * 服务器保存文件路径
     */
    @Value(value = "${uploadHost}")
    private String uploadHost;

    @GetMapping("/")
    public String welcome() {
        return "welcome to pic_server";
    }

    /**
     * 项目host路径
     */
    @PostMapping(value = "/upImg")
    public JSONObject upImg(@RequestBody String json) {
        JSONObject jsonObject = new JSONObject();
        byte[] bfile = JSONObject.parseObject(json).getBytes("data");
        String fileName = JSONObject.parseObject(json).getString("fileName");
        byte2File(bfile, uploadHost, fileName);
        if (json.isEmpty()) {
            return null;
        }
        try {
            System.out.println("上传成功");
            jsonObject.put("data", imgPath + fileName);
            return jsonObject;
        } catch (Exception e) {
            System.out.println("上传失败");
            jsonObject.put("message", e.toString());
        }
        return jsonObject;
    }

    //byte数组转file文件方法
    public static void byte2File(byte[] bfile, String filePath, String fileName) {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try {
            File dir = new File(filePath);
            if (!dir.exists() && !dir.isDirectory()) {//判断文件目录是否存在
                dir.mkdirs();
            }
            file = new File(filePath + fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(bfile);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                if (bos != null) {
                    bos.close();
                }
                if (fos != null) {
                    fos.close();
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
            }
        }
    }
}

application文件内容如下:

server.port=8200
#访问服务器文件路径端口
filePath=http://hikari.top/images/
#服务器保存文件路径
uploadHost=/usr/share/images/
  1. 修改Nginx的配置文件
    Nginx的总配置文件是 /etc/nginx/下的nginx.conf文件,文件中可以看到下面代码
    在这里插入图片描述
    图中第一行代表配置文件会加载conf.d下的所有后缀为.conf的文件。因此我们在conf.d文件夹下新建一个new_file.conf文件,并添加如下代码
server {
        listen       80;
        server_name  你的服务器域名;

        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
            proxy_pass http://127.0.0.1:8080/; #(这里最后的“/”不能少,否则会出错)
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
        }
        location /images {
            proxy_pass http://127.0.0.1:8100/images/;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
        }
        location /pic_server {
            proxy_pass http://127.0.0.1:8200/;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
        }
}

这里我们设置了三个转发,从上往下分别是主服务器,Apache静态图片服务器,图片操作服务器。配置完成之后使用如下命令重新加载nginx文件

sudo nginx -s reload

就可以通过网址的方式访问到这几个服务器了,分别对应如下:

网址服务器地址服务器名称
www.域名地址/images/http://127.0.0.1:8100/images/主服务器
www.域名地址/http://127.0.0.1:8080/静态图片服务器
www.域名地址/pic_server/http://127.0.0.1:8200/图片操作服务器
  1. 主服务器新建PictureController类并添加如下代码
@RestController
@CrossOrigin
public class PictureController {
    @PostMapping(value = "/upload")
    @ResponseBody
    public String upload(@RequestParam("file") MultipartFile file) {
        if (file.isEmpty()) {
            return "失败";
        }
        JSONObject postData = new JSONObject();
        String fileName = file.getOriginalFilename();//上传的文件名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));//获取后缀
        fileName = UUID.randomUUID() + suffixName;//生成唯一文件名
        try {
            byte[] fileBytes = file.getBytes();//转换为byte数组
            postData.put("fileName",fileName);
            postData.put("data",fileBytes);
            RestTemplate client = new RestTemplate();
            //FilePath是你服务端的项目接口路径
            JSONObject json = client.postForEntity("http://你得服务器地址/pic_server/upload/upImg", postData, JSONObject.class).getBody();
            System.out.println("上传成功");
            return (String) json.get("data");//返回文件下载地址
        } catch (IOException | JSONException e) {
            System.out.println(e.toString());
        }
        System.out.println("上传失败");
        return "失败";
    }
}

客户端通过访问/upload路径就可以实现图片的上传了。

以上是关于Nginx反向代理实现图片上传到Ubuntu服务器的主要内容,如果未能解决你的问题,请参考以下文章

Nginx反向代理实现图片上传到Ubuntu服务器

nginx反向代理

Nginx# 上传图片大小限制反向代理MySQL反向代理Redis

Nginx# 上传图片大小限制反向代理MySQL反向代理Redis

七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

nginx反向代理