使用 Ubuntu 20,tomcat 9, nginx 1.18

背景

业务需求,要使用 Java 程序来上传图片,并且使用 nginx 作为文件服务器读取

步骤

安装 tomcat & nginx

以下两篇文章都有详细介绍,可以参考它们的步骤来安装

How to Install Apache Tomcat Server on Ubuntu 20.04

How To Install Nginx on Ubuntu 20.04

创建存放上传图片的目录

假设图片存放于 /a/b/upload/images,创建目录

命令:mkdir /a/b/upload/images,

然后将 images 目录的所有者和所有组改为 tomcat:tomcat

命令:chown -R tomcat:tomcat /a/b/upload/images

nginx 配置反向代理

添加配置文件

nginx 配置的路径:/etc/nginx/conf.d

在 conf.d 中,创建 image-server.conf (这个 image-server.conf 文件名可以按自己项目的需求改变),nginx.conf 就会 include 它,不需要直接修改 nginx.conf

image-server.conf 中,写入
server {
    listen 8081; # 可以按自己实际情况修改监听的端口,记得添加相应的防火墙规则、安全组等
    server_name localhost;
    
    location /images/ {
        root /a/b/upload;
    }
}

保存,返回命令行。

然后重新加载 nginx 配置

命令:sudo systemctl reload nginx.service

测试反向代理

/a/b/upload/images 添加一张图片(假设名字为 lion.png)

然后在浏览器访问 localhost:8081/images/lion.png 就能看到这张图片了

配置 tomcat catalina UMASK

由于 tomcat 的安全策略,把 tomcat 创建的文件的权限设为 640,这导致不同组的 nginx 没有读取权限

上传图片,权限为 640

然后我在网上寻找解决方案,修改 UMASK 是主流的方案。详细步骤如下:

修改 UMASK

UMASK 位于 $CATALINA_HOME,一开始我无法通过 echo $CATALINA_HOME 找到它;
后来我想到切换到根目录,然后用 find -name 'catalina.sh' 来找,结果真的找到了

catalina.sh 位于 /usr/share/tomcat9/bin

打开 catalina.sh,通过阅读它的说明,我发现不应该直接修改 catalina.sh 的内容,而是应该创建 setenv.sh,再在 setenv.sh 里面添加要设置的参数

于是,在 catalina.sh 同级目录中,创建 setenv.sh

命令:sudo vim setenv.sh,添加内容为

UMASK=0022
再重启 tomcat

命令:`sudo systemctl reload tomcat9.service

测试 tomcat 创建文件

`再次上传图片,权限已经是 644

此时,tomcat 创建的文件的权限就变成 644

参考资料

Tomcat9 File Permissions Change

Apache Tomcat 9 - Security Considerations


依斯特
14 声望1 粉丝

忘记背后,努力面前