什么是MINIO
Minio是在Apache License v2.0下發(fā)布的對象存儲服務(wù)器匾竿。它與Amazon S3云存儲服務(wù)兼容俐镐。它最適合存儲非結(jié)構(gòu)化數(shù)據(jù)秒梳,如照片辫诅,視頻凭戴,日志文件,備份和容器/VM鏡像等炕矮。對象的大小可以從幾KB到最大5TB么夫。
DOCKER 安裝示例
docker run-p9000:9000--name minio1-e"MINIO_ACCESS_KEY=自己的access_key,相當(dāng)于用戶名"-e"MINIO_SECRET_KEY=自己的secret_key,相當(dāng)于密碼"-v/mnt/minio-data-v1:/data-v/mnt/minio-v1:/root/.minio-dminio/minio:RELEASE.2018-07-31T02-11-47Z server /data
1
使用NGINX進(jìn)行反向代理
因為服務(wù)器有其他服務(wù),并且使用的nginx作為反向代理,初始配置如下:
在/etc/nginx/conf.d下新建文件minio.conf
server{? ? listen80;? ? gzip on;? ? server_name oss.allocmem.com;? ? location / {? ? ? proxy_pass http://127.0.0.1:9000;}}
1
2
3
4
5
6
7
8
9
nginx -s relaod讓nginx重新加載
出現(xiàn)問題
在使用上面配置的用戶名和密碼進(jìn)入主頁后,上傳了自己的文件,當(dāng)點(diǎn)擊生成共享連接的時候,如下圖:
訪問這個共享連接會報錯SignatureDoesNotMatch:
原因及解決方案
錯誤提示SignatureDoesNotMatch簽名不正確,后來發(fā)現(xiàn)和nginx反向代理在做轉(zhuǎn)發(fā)的時候所攜帶的header有關(guān)系.minio在校驗signature是否有效的時候,必須從http header里面獲取host,而我們這里沒有對header作必要的處理.如果源請求未攜帶這個頭,則minio處無法獲取請求頭中的host,目前我這里測試看請求有攜帶Host,這里的機(jī)制問題出在nginx,nginx沒有把這個host轉(zhuǎn)發(fā)過去,而用ip的時候Host為 ip:port,這種情況是正常的,這應(yīng)該和nginx的默認(rèn)配置proxy_set_header Host $http_host有關(guān)系
如果不想改變請求頭“Host”的值者冤,可以這樣來設(shè)置:
proxy_set_header Host?httphost;但是,如果客戶端請求頭中沒有攜帶這個頭部档痪,那么傳遞到后端服務(wù)器的請求也不含這個頭部涉枫。這種情況下,更好的方式是使用httphost;但是腐螟,如果客戶端請求頭中沒有攜帶這個頭部愿汰,那么傳遞到后端服務(wù)器的請求也不含這個頭部。這種情況下乐纸,更好的方式是使用host變量——它的值在請求包含“Host”請求頭時為“Host”字段的值衬廷,在請求未攜帶“Host”請求頭時為虛擬主機(jī)的主域名:
我們這里的minio.conf需要添加下面代碼
proxy_set_header Host$host;
1
$host代表的是當(dāng)前虛擬主機(jī)的host,即上面配置的oss.allcmem.com.完整示例如下:
server{listen80;gzipon;server_nameoss.allocmem.com;location/ {proxy_passhttp://127.0.0.1:9000;proxy_set_headerHost$host;? ? }}