簡單記錄下,如有必要,將深入補充:
一、非root用戶運行Tomcat及原因
由於項目中,為了安全需要,Tomcat將禁止以root形式啟動,原因很簡單,舉個例子,一旦有人惡意將jsp文件透過某個別的漏洞傳到你的服務器中,那么你的程序運行過程中,將會遠端被別人惡意執行代碼,輕則服務器被黑,重則通過這台跳板進入你的后台,病毒式的入侵到內網的其他機器(例如大量的Redis以及MongoDB置於內網時是不設置密碼的),所以以非root的方式啟動Tomcat對於商用的環境下,是必須的。
默認的情況下,Linux中的Tomcat都由bin目錄下的catalina.sh執行,那么Tomcat的啟動用戶就由有權限啟動Tomcat的運行命令的人:
./catalina.sh start
如果希望是非root用戶啟動,可以通過遞歸改變文件主以及文件所屬的組獲得執行權限
chown -R user1 ./apache-tomcat-xxx
即如果是以root權限啟動的Tomcat服務,使用如下命令:
ps -ef|grep tomcat
查看到你的Tomcat以什么權限啟動的,看到啟動主為紅線標注角色:
那么下面我使用非root用戶啟動下:
二、非root用戶文件操作被禁止
我的問題是Web項目所有的一切功能正常使用,但是在一處與SpringMVC的MultipartFile文件接收的Controller報錯如下:
Processing of multipart/form-data request failed. /usr/local/apache-tomcat-9.0.4/work/Catalina/localhost/EDoctor/upload_50259820_2122_4f77_af6d_17f1fd261a13_00000001.tmp (Permission denied)

以及在出錯堆棧的打印中看到Permission denied和IOException其實本能想到是權限的問題,由於可以使用非root用戶運行tomcat,但是現在重點是,Tomcat中存放tmp中間文件的目錄到底在哪里?
三、解決方法
其實Tomcat中有一個work目錄,其作用的話主要有下面兩點:
- jsp運行時都要先轉換成servlet,tomcat容器啟動時會在目錄下的work目錄中生成一系列的文件夾和.java文件和編譯后的.class文件。
- jsp最終轉化為servlet,work的作用就是加快速度,如果jsp沒有變化(依據時間戳)就不再重新編譯。
可以看到大概意思是work是Tomcat的工作目錄,一般我們注重權限以為是webapp目錄下的權限問題,其實還有一個權限就是真正的中間文件生成的工作目錄:
/usr/local/apache-tomcat-9.0.4/work/Catalina/localhost/
所以只需要將該文件的目錄主修改為你想要的用戶,用該用戶啟動Tomcat就不會出現問題了。
四、總結
那么總結一下,大概就是Tomcat的用戶權限問題需要格外關注$CATALINA_HOME/work/Catalina/localhost/目錄下的文件主或組的權限問題