在尝试了很多不同的解决方案后,我来这里寻求帮助。
我在 apache HTTPD 中有一个 Web 应用程序,它为同一台服务器中的 Tomcat 中的前端提供服务,并且有一个 Java 应用程序。
问题是 Tomcat 创建的文件无法被 Apache 读取。我的意思是,用户可以在 appache 服务器中上传文件,它会将文件发送到 Tomcat 服务器,Tomcat 服务器会处理一些信息并将文件存储在公共文件夹中,以便 Apache 可以读取它。问题是 Apache 在这些文件上会得到 403。
如果我在 img/ 目录(存储文件的位置)中运行 chmod -R 777,我就可以访问这些文件,但是每次我上传新文件时,HTTPD 都无法访问该文件,直到我运行该命令。
我创建了一个名为 webusers 的组,并将 tomcat 和 apache 用户添加到其中。
如果我在该目录上运行 ln -l,我会得到(对于旧文件)
drwsrwsrwx. 2 tomcat webusers 4096 Aug 16 08:50 337
但是当我上传新文件时,我得到:
drwxr-s---. 2 tomcat webusers 4096 Aug 16 14:44 33f
如果我尝试在浏览器中打开,我会得到
禁止
您无权访问此服务器上的 /assets/img/cars/brands/33f1d3f1-0e4b-4924-acc1-11e28bed08a8/c_h_1.jpg。
我尝试了多次 chown -R / chmod -R 7777 都没有成功,你能帮我让 apache 可以读取 tomcat 创建的文件吗?
答案1
如果 Apache 仅用作 Tomcat 的前端,最简单的答案就是让 Apache 子进程作为 Tomcat 运行。我不确定您的 CentOS 版本,但看了几件事后发现默认的 Apache2 包似乎会在 中创建一个配置文件。/etc/httpd/conf/httpd.conf
从那里您要找到配置参数User
。在我的环境中,我有类似的东西:
User www-user
Group www
但您的设置可能会有所不同。将 更改User
为您的 Tomcat 用户,并将 更改Group
为与 Tomcat 用户相同的组。同样,我不确定 Apache 配置文件的位置 - 您可能需要搜索一下。更改此设置后,您必须重新启动 Apache 才能使其生效。
答案2
假设您正在使用 Java 上传文件。
File f = new File("/path/to/image/image_name.jpg);
f.setExecutable(true, false);
f.setWritable(true, false);
f.setReadable(true, false);
现在您可以从 apache 和 tomcat 访问您的文件。