搭建文件服务器(OSS、Nginx)与 Nginx负载均衡

一.阿里云OSS

  • 链接 https://oss.console.aliyun.com/overview

1.依赖

	<dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>

2.配置文件 aliyun.properties

aliyun.accessKeyId = .....
aliyun.accessKeySecret = ......
#bucket的名字
aliyun.bucketName=yzx-haoke
#对应下图的Endpoint
aliyun.endpoint = http://oss-cn-hangzhou.aliyuncs.com
#对应下图的Bucket域名
aliyun.urlPrefix=https://yzx-haoke.oss-cn-hangzhou.aliyuncs.com/
  • 点进任何一个bucket中 即可看到
    在这里插入图片描述
  • 测试
@SpringBootTest
@RunWith(SpringRunner.class)
public class OssTest {

    // endpoint是访问OSS的域名。如果您已经在OSS的控制台上 创建了Bucket,请在控制台上查看域名。
    // 如果您还没有创建Bucket,endpoint选择请参看文档中心的“开发人员指南 > 基本概念 > 访问域名”,
    // 链接地址是:https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/endpoint.html?spm=5176.docoss/user_guide/endpoint_region
    // endpoint的格式形如“http://oss-cn-hangzhou.aliyuncs.com/”,注意http://后不带bucket名称,
    // 比如“http://bucket-name.oss-cn-hangzhou.aliyuncs.com”,是错误的endpoint,请去掉其中的“bucket-name”。
    @Value("${aliyun.endpoint}")
    private String endpoint;

    // accessKeyId和accessKeySecret是OSS的访问密钥,您可以在控制台上创建和查看,
    // 创建和查看访问密钥的链接地址是:https://ak-console.aliyun.com/#/。
    // 注意:accessKeyId和accessKeySecret前后都没有空格,从控制台复制时请检查并去除多余的空格。
    @Value("${aliyun.accessKeyId}")
    private String accessKeyId;
    @Value("${aliyun.accessKeySecret}")
    private String accessKeySecret ;

    // Bucket用来管理所存储Object的存储空间,详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Bucket命名规范如下:只能包括小写字母,数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。
    @Value("${aliyun.bucketName}")
    private String bucketName;

    @Value("${aliyun.urlPrefix}")
    private String urlPrifix;

    // Object是OSS存储数据的基本单元,称为OSS的对象,也被称为OSS的文件。详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Object命名规范如下:使用UTF-8编码,长度必须在1-1023字节之间,不能以“/”或者“\”字符开头。
    private String stringKey="test-save-string";
    private String fileKey = "test-save-file";

    private OSS ossClient;

    @Before
    public void init(){

        // 生成OSSClient,您可以指定一些参数,详见“SDK手册 > Java-SDK > 初始化”,
        // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/init.html?spm=5176.docoss/sdk/java-sdk/get-start
        ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);

        // 判断Bucket是否存在。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
        // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
        if (ossClient.doesBucketExist(bucketName)) {
            System.out.println("您已经创建Bucket:" + bucketName + "。");
        } else {
            System.out.println("您的Bucket不存在,创建Bucket:" + bucketName + "。");
            // 创建Bucket。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            ossClient.createBucket(bucketName);
        }

        // 查看Bucket信息。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
        // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
        BucketInfo info = ossClient.getBucketInfo(bucketName);
        System.out.println("Bucket " + bucketName + "的信息如下:");
        System.out.println("\t数据中心:" + info.getBucket().getLocation());
        System.out.println("\t创建时间:" + info.getBucket().getCreationDate());
        System.out.println("\t用户标志:" + info.getBucket().getOwner() );
        System.out.println("\n");
    }

    @Test
    public void testOssSaveString() {
        // 把字符串存入OSS,Object的名称为stringKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。
        // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/upload_object.html?spm=5176.docoss/user_guide/upload_object
        InputStream is = new ByteArrayInputStream("Hello OSS".getBytes());
        ossClient.putObject(bucketName, stringKey, is);
        System.out.println("Object:" + stringKey + "存入OSS成功。");
        System.out.println("如果该bucket的访问权限是包含公共读,那么可以访问:"+urlPrifix+stringKey);
        System.out.println("\n");
    }

    @Test
    public void testOssSaveFile(){
        // 文件存储入OSS,Object的名称为fileKey。详细请参看“SDK手册 > Java-SDK > 上传文件”。
        // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/upload_object.html?spm=5176.docoss/user_guide/upload_object
        ossClient.putObject(bucketName, fileKey, new File("src\\main\\resources\\application.properties"));
        System.out.println("Object:" + fileKey + "存入OSS成功。");
        System.out.println("如果该bucket的访问权限是包含公共读,那么可以访问:"+urlPrifix+fileKey);
        System.out.println("\n");
    }

    @Test
    public void testDownloadOssObject() throws IOException {
        // 下载文件。详细请参看“SDK手册 > Java-SDK > 下载文件”。
        // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/download_object.html?spm=5176.docoss/sdk/java-sdk/manage_object
        OSSObject ossObject = ossClient.getObject(bucketName, fileKey);
        InputStream inputStream = ossObject.getObjectContent();
        StringBuilder objectContent = new StringBuilder();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        while (true) {
            String line = reader.readLine();
            if (line == null)
                break;
            objectContent.append(line).append("\n");
        }
        inputStream.close();
        System.out.println("Object:" + fileKey + "的内容是:\n" + objectContent);
        System.out.println("\n");
    }

    @Test
    public void testShowOssObjects(){
        // 查看Bucket中的Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。
        // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_object.html?spm=5176.docoss/sdk/java-sdk/manage_bucket
        ObjectListing objectListing = ossClient.listObjects(bucketName);
        List<OSSObjectSummary> objectSummary = objectListing.getObjectSummaries();
        System.out.println("您有以下Object:");
        for (OSSObjectSummary object : objectSummary) {
            System.out.println("\t" + object.getKey());
        }
        System.out.println("\n");
    }

    @Test
    public void testDelete(){
        // 删除Object。详细请参看“SDK手册 > Java-SDK > 管理文件”。
        // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_object.html?spm=5176.docoss/sdk/java-sdk/manage_bucket
        ossClient.deleteObject(bucketName, stringKey);
        System.out.println("删除Object:" + stringKey + "成功。");
        ossClient.deleteObject(bucketName, fileKey);
        System.out.println("删除Object:" + fileKey + "成功。");
        System.out.println("\n");
    }
}

4.工程使用----读取配置 并注入配置好的OSSClient

@Configuration
@PropertySource(value = {"classpath:aliyun.properties"})
@ConfigurationProperties(prefix = "aliyun")
@Data
public class AliyunConfig {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String urlPrefix;

    @Bean
    public OSSClient oSSClient() {
        return new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }
}

5.工程使用----创建文件上传响应实体类

@Data
public class PicUploadResult {

    // 文件唯一标识
    private String uid;
    // 访问路径:urlPrefix+fileName
    private String path;
    // 状态有:uploading done error removed
    private String status;
    // 服务端响应内容,如:'{"status": "success"}'
    private String response;
}

6.工程使用----使用OSS上传图片

@Service
public class PicUploadService {

    @Autowired
    private OSSClient oSSClient;

    @Autowired
    private AliyunConfig aliyunConfig;
    
	//图片后缀
    private final String[] subffixs=new String[]{"png","jpg","jpeg","gif","bmp"};

    public PicUploadResult uploadPic(MultipartFile file){
        PicUploadResult result=new PicUploadResult();
        String filename = file.getOriginalFilename();
        String fileSubbfix=filename.substring(filename.lastIndexOf(".")+1);

        if(!ArrayUtils.contains(subffixs,fileSubbfix)){
            result.setStatus("error");
            return result;
        }

        DateTime dateTime = new DateTime();
        //问价路径 没有的话oss会自动创建
        String path=dateTime.toString("yyyy")+"/"+dateTime.toString("MM")+"/"+dateTime.toString("dd")+"/"+file.getName()+"_"+System.currentTimeMillis()+"."+fileSubbfix;
        try {
        	/**
        	 * 如果需要访问时直接下载 将ContentType设为application/octet-stream
        	 * ObjectMetadata objectMetadata=new ObjectMetadata();
        	 * objectMetadata.setContentType("application/octet-stream"); 
        	 * oSSClient.putObject(aliyunConfig.getBucketName(),path,file.getInputStream(),objectMetadata); 
        	 */
            oSSClient.putObject(aliyunConfig.getBucketName(),path,file.getInputStream());
        } catch (IOException e) {
            result.setStatus("error");
            return result;
        }

        result.setStatus("done");
        //访问路径
        result.setPath(aliyunConfig.getUrlPrefix()+path);
        result.setUid(String.valueOf(System.currentTimeMillis()));

        return result;
    }

}

二.Nginx文件服务器

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
		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;

        listen       80;
        #域名
        server_name  image.yzx.com;

        location / {
            root   C:\Users\yzx\Pictures\down;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

  • 按照上面的配置方式 访问路径应该是 http://image.yzx.com/)

注意
nginx的 server 的 localtion /路径,在转发的时候会带上路径,下面给个例子

location /image {
            root   C:\Users\yzx\Pictures\down;
}

#问题一:此时寻找的路径是 /image/C:\Users\yzx\Pictures\down

location /api/upload {
                proxy_pass http://127.0.0.1:8082;
                #rewrite ^/api/(.*)$ /$1 break;
}

#此时访问的路径是:http://127.0.0.1:8082/api/upload
#问题二:如果我想只访问 http://127.0.0.1:8082 是不可以的 
#问题三:如果我想只访问 http://127.0.0.1:8082/api/ 是不可以的 

解决:使用rewrite

问题一: rewrite ^/image/(.*)$ /$1 break;
问题二: rewrite ^/api/upload/(.*)$ /$1 break;
问题三:	rewrite ^/api/upload/(.*)$ /api/$1 break;

三.Nginx负载均衡

http {
	include       mime.types;
	default_type  application/octet-stream;

	sendfile        on;
	#tcp_nopush     on;

	#keepalive_timeout  0;
	keepalive_timeout  65;
	
	#设定负载均衡的服务器列表
	upstream myservers {
	    #weigth参数表示权值,权值越高被分配到的几率越大
	    #下面表示137有3分之2几率,138有3分之1几率
	    server 192.168.64.137 weight=2;
	    server 192.168.64.138 weight=1;
	}

	server {
		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;
		
	    listen       80;
	    server_name  localhost;
	
	    location / {
		   #请求转向myservers 定义的服务器列表
	       proxy_pass http://myservers ;
	       
	       #将请求头转发给后端服务器
	       proxy_set_header Host $host;
	       #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
	       proxy_set_header X-Forward-For $remote_addr;
       
	       #其他相关配置入下,可以根据需要添加配置
	       #client_max_body_size 10m;		#允许客户端请求的最大单文件字节数
	       #client_body_buffer_size 128k;	#缓冲区代理缓冲用户端请求的最大字节数
	       #proxy_connect_timeout 90;		#nginx跟后端服务器连接超时时间(代理连接超时)
	       #proxy_send_timeout 90;			#后端服务器数据回传时间(代理发送超时)
	       #proxy_read_timeout 90;			#连接成功后,后端服务器响应时间(代理接收超时)
	       #proxy_buffer_size 4k;			#设置代理服务器(nginx)保存用户头信息的缓冲区大小
	       #proxy_buffers 4 32k;			#proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
	       #proxy_busy_buffers_size 64k;	#高负荷下缓冲大小(proxy_buffers*2)
	       #proxy_temp_file_write_size 64k;	#设定缓存文件夹大小,大于这个值,将从upstream服务器传
       
	       # root   html;
	       # index index.php index.html index.htm;
	 }
 }
  • 一个server里可以配置多个location

四.Nginx反向代理WebSocket

	server {
		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;
		
	    listen       80;
	    server_name  im.yzx.com;
	
	    location / {
	       proxy_pass http://127.0.0.1:10087 ;
	       proxy_connect_timeout 600; 
	       proxy_read_timeout 600; 
	       
	       #增加下面两项配置就可以代理socket
	       proxy_set_header Upgrade $http_upgrade; 
	       proxy_set_header Connection "upgrade";
	 }

附:Linux下安装Nginx

1.首先下载 Nginx

wget http://nginx.org/download/nginx-1.17.0.tar.gz (版本什么的自己去官网找好)

2.解压

tar -zxvf nginx-1.17.0.tar.gz

3.进入解压目录中,在编译安装之前,需要安装两个依赖:

cd nginx-1.17.0

yum -y install pcre-devel

yum -y install openssl openssl-devel

4.编译安装

./configure

make

make install

5.装好之后,进入默认安装位置,修改配置文件

vi /usr/local/nginx/conf/nginx.conf

6.执行命令

cd /usr/local/nginx/sbin

#启动 
./nginx

#重启
./nginx -s reload

#关闭
./nginx -s stop
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值