- java上傳文件可以設(shè)置訪(fǎng)問(wèn)權(quán)限 File類(lèi)
部分代碼
File uploadPath = new File(imgPath+path);
if(!uploadPath.exists()) {
uploadPath.mkdirs();
}
//Process process = Runtime.getRuntime().exec("chmod 777 -R " + uploadPath);
log.info( process.toString());
String uploadFileName = path+"/"+ getUUID()+"."+imgend;
File uploadFile = new File(imgPath+uploadFileName);
uploadFile.setExecutable(true,false);//設(shè)置可執(zhí)行權(quán)限
uploadFile.setReadable(true,false);//設(shè)置可讀權(quán)限
uploadFile.setWritable(true,false);//設(shè)置可寫(xiě)權(quán)限
其中java執(zhí)行shell腳本方式
Process process = Runtime.getRuntime().exec("chmod 777 -R " + uploadPath);
不知道為啥沒(méi)生效
此種方式雖然對(duì)當(dāng)前文件起作用 但是對(duì)于遞歸創(chuàng)建的文件夾并不起作用
uploadFile.setExecutable(true,false);//設(shè)置可執(zhí)行權(quán)限
uploadFile.setReadable(true,false);//設(shè)置可讀權(quán)限
uploadFile.setWritable(true,false);//設(shè)置可寫(xiě)權(quán)限
后來(lái)發(fā)現(xiàn) tomcat是用root用戶(hù)啟動(dòng)的,nginx也是root用戶(hù)啟動(dòng)的 查看文件夾 也是root用戶(hù)有所有權(quán)限
后來(lái)發(fā)現(xiàn)是nginx的配置問(wèn)題 nginx的worker process 用戶(hù)并非root
Nginx用戶(hù)權(quán)限
在nginx.conf文件的第一行一般是設(shè)置用戶(hù)的地方(編譯安裝nginx時(shí)的參數(shù)--user=<user>也是指定用戶(hù)的地方)嘴高,如 user www www;
如不指定默認(rèn)是nobody. 這里用戶(hù)的設(shè)置又有什么意義呢?主要是指定執(zhí)行nginx的worker process的用戶(hù)冯键,linux里所有程序都是文件,都具有權(quán)限問(wèn)題庸汗,這個(gè)指定的用戶(hù)對(duì)特定的文件有沒(méi)有權(quán)限訪(fǎng)問(wèn)或執(zhí)行惫确,就是這個(gè)用戶(hù)的意義。
先來(lái)了解一下 Nginx的用戶(hù)管理 :
(1) Nginx在以L(fǎng)inux service腳本啟動(dòng)時(shí)夫晌,通過(guò)start-stop-domain啟動(dòng)雕薪,會(huì)以root權(quán)限運(yùn)行daemon進(jìn)程。
(2) 然后daemon進(jìn)程讀取/etc/nginx/nginx.conf文件中的user配置選項(xiàng)晓淀,默認(rèn)這里的user=nginx所袁,也就是用nginx用戶(hù)啟動(dòng)worker process。403錯(cuò)誤就是因?yàn)閚ginx用戶(hù)沒(méi)有權(quán)限訪(fǎng)問(wèn)我當(dāng)前開(kāi)發(fā)用的用戶(hù)目錄凶掰,/home/dean/work/resources燥爷。
解決方法是將user=nginx替換成root蜈亩,然后重新啟動(dòng)nginx,可以了前翎。
其他方法也試過(guò)稚配,比如給/home/dean/work/resources目錄設(shè)置777權(quán)限,比如將nginx用戶(hù)加入root組港华,都不行道川。所以當(dāng)開(kāi)發(fā)的時(shí)候,就用user=root配置吧立宜。至于產(chǎn)品環(huán)境下冒萄,resouces目錄完全可以放到nginx用戶(hù)目錄下,所以問(wèn)題不大橙数。
舉例2:訪(fǎng)問(wèn)速度慢 nobody用戶(hù)導(dǎo)致
nobody 是系統(tǒng)用戶(hù),是一個(gè)不能登陸的帳號(hào)尊流,一個(gè)特殊用途的用戶(hù) ID ,一些服務(wù)進(jìn)程如apache,aquid等都采用一些特殊的帳號(hào)來(lái)運(yùn)行灯帮,比如nobody,news,games等等崖技。一般來(lái)說(shuō) uid < 500 的都是系統(tǒng) ID 。
Linux 系統(tǒng)為了安全钟哥,很多操作和服務(wù)的運(yùn)行都不是運(yùn)行在 root 用戶(hù)下面的迎献,而是一個(gè)專(zhuān)用的 ID ,這個(gè) ID 一般就是 nobody 腻贰,這樣就可以把每個(gè)服務(wù)運(yùn)行的情況隔離出來(lái)忿晕。保證不會(huì)因?yàn)榉?wù)器程序的問(wèn)題而讓服務(wù)器程序成了黑客的直接操作源(黑客拿下了服務(wù)器程序,也僅僅是 nobody 用戶(hù)而不是 root 用戶(hù))银受。同時(shí)也不會(huì)影響其他用戶(hù)的數(shù)據(jù)。
服務(wù)器程序提權(quán)有專(zhuān)用的辦法來(lái)防止惡意使用的鸦采。
除了 nobody 宾巍,常見(jiàn)的還有 ftp 、ssh 什么的渔伯。有的不是用來(lái)跑服務(wù)顶霞,而是用來(lái)占坑,主要是用用戶(hù)組的權(quán)限管理進(jìn)行權(quán)限設(shè)置锣吼,這個(gè)時(shí)候會(huì)有一個(gè)占坑用的同名 ID 加入到用戶(hù)組选浑。這種情況好像主要是為了兼容掺出。
問(wèn)題描述:
上午業(yè)務(wù)人員反映匿级,系統(tǒng)響應(yīng)很慢秩冈,界面要刷新很久才出得來(lái)棍厂。查后臺(tái)也沒(méi)有報(bào)什么錯(cuò)慎菲,我們系統(tǒng)是用nginx做負(fù)載均衡爸吮。慣性地不走負(fù)載均衡而直接訪(fǎng) 問(wèn)單節(jié)點(diǎn)應(yīng)用钙态,發(fā)現(xiàn)響應(yīng)很快述呐,很正常。初步定位問(wèn)題出在nginx上疹吃,然后查nginx日志蹦疑,發(fā)現(xiàn)有很多錯(cuò)誤,錯(cuò)誤中有“13: Permission denied”這個(gè)信息萨驶,明顯是權(quán)限問(wèn)題歉摧,很奇怪,之前運(yùn)行都很正常啊腔呜。后來(lái)一問(wèn)才知道叁温,維護(hù)人員做了操作。
系統(tǒng)上nginx安裝時(shí)使用的是root用戶(hù)育谬,也是用root用戶(hù)啟動(dòng)的券盅,所以要修改配置的時(shí)候需要使用root用戶(hù),管理上不方便膛檀,所以維護(hù)人員 心血來(lái)潮修改了nginx的權(quán)限(后來(lái)知道他是使用這個(gè)命令修改的權(quán)限chown -R user:group $nginxdir)锰镀。就是將nginx的用戶(hù)和組都換掉了,但是這樣為什么會(huì)造成“響應(yīng)慢”呢咖刃?
問(wèn)題原因及解決:
前面提到在linux上有些應(yīng)用程序的一些進(jìn)程會(huì)默認(rèn)使用nobody這個(gè)用戶(hù)來(lái)啟動(dòng)泳炉,以保安全。nginx有兩種進(jìn)程嚎杨,除主進(jìn)程之外的工作進(jìn)程都 是用nobody這個(gè)用戶(hù)啟動(dòng)的(nginx工作進(jìn)程的數(shù)量使用worker_processes這個(gè)參數(shù)來(lái)設(shè)定)花鹅。而工作進(jìn)程要訪(fǎng)問(wèn)nginx下這兩個(gè) 目錄client_body_temp和proxy_temp(這兩個(gè)目錄按我的理解是緩存一些靜態(tài)文件,比如圖片或者css文件什么的枫浙,以提高 nginx訪(fǎng)問(wèn)速度)刨肃,權(quán)限變更后,造成工作進(jìn)程訪(fǎng)問(wèn)不了這兩個(gè)目錄下的內(nèi)容箩帚,造成某些圖片和連接打不開(kāi)真友,就像響應(yīng)很慢一樣。將權(quán)限變更一下就OK了紧帕。