一.阿里云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