设置
我在 Arch Linux 发行版上使用 Apache Tomcat 7,我的 webapps 目录位于/usr/share/tomcat7/webapps
。在此目录中,应该创建一个目录,并将 META-INF 和 WEB-INF 目录以及 xml 配置文件放入其中。然后,此目录将成为 webapp 的主路径。例如:
如果/usr/share/tomcat7/webapps/foo/bar.html
包含:
<!DOCTYPE html>
<html>
<body>
Hello world!
</body>
</html>
然后http://localhost:8080/foo
会显示:
Hello world!
但是,目标是将外部动态项目(在本例中由 Netbeans 分发)作为 Web 应用程序。因此,在这种情况下,我希望将我的 Web 应用程序定位在此处:(/home/user/NetbeansProjects/foo/build/web/
其中包含bar.html
)。
我想出了三种可能的方法,但没有一种起作用,而且我认为我遗漏了一些东西。
方法 1(符号链接)
我在想,让我们使用这个命令在 webapps 目录中放置一个符号链接(symbolic link):
$ ln -s /home/user/NetbeansProjects/foo/build/web /usr/share/tomcat7/webapps/foo
这似乎是最优雅的方法,但 Tomcat 无法读取目录。为什么呢?
方法 2(mount --bind)
我读到你也可以使用将一个目录重定向到另一个目录mount --bind
。所以我尝试这样做:
sudo mount --bind /usr/share/tomcat7/webapps/foo /home/user/NetbeansProjects/foo/build/web
实际上,这是唯一可行的解决方案。不幸的是,如果我再次构建项目,挂载就会消失。我已经尝试<exec/>
在 Ant 中分发项目后重新挂载目录,但由于某种奇怪的原因,这会导致 Linux 崩溃。所以这也不是一种选择。而且,每次干净构建后重新挂载似乎不是一个干净的方法。挂载实际上也不用于这种东西,所以我想解决方案不会涉及挂载。
方法 3(server.xml)
我最不想做的事情就是违背 Apache 人员的建议(看这里)其中写道:
不建议将元素直接放置在 server.xml 文件中。
那么我该怎么做呢,我采用默认的 server.xml 并将此 Context 标记添加到 Host 标记:
<Context docBase="/home/user/NetbeansProjects/foo/build/web/" path="/foo"></Context>
但是,如果我重新启动 Tomcat 服务,它就会启动失败。在日志文件中我读到:
SEVERE: Error starting static Resources
java.lang.IllegalArgumentException: Document base /home/user/NetbeansProjects/foo/build/web does not exist or is not a readable directory
因此,显然这一定是某种权限问题。由于我仔细检查了拼写错误,因此路径一定是正确的。但我无法解决这个问题,我授予 tomcat7(组:tomcat7)权限的方法如下:
chown -R tomcat7:tomcat7 /home/user/NetbeansProjects/foo/build/web
chmod -R 755 /home/user/NetbeansProjects/foo/build/web
但重新启动Tomcat之后,出现同样的错误,Tomcat无法启动。
上述哪种方法最合理?我做错了什么导致它无法发挥作用?
答案1
@Schrute 在评论中说的话(不是答案):使用选项#1(ln -s
)然后就可以了允许在 Tomcat context.xml 文件中进行链接. 对于 Tomcat 7:
<?xml version="1.0" encoding="UTF-8"?>
<Context allowLinking="true">
...
Tomcat 8:
<Context>
<Resources allowLinking="true"></Resources>
...
请勿在 Windows(或任何其他不区分大小写的文件系统)上执行此操作,因为它将禁用区分大小写检查,从而导致 JSP 源代码泄露以及其他安全问题。http://tomcat.apache.org/tomcat-8.0-doc/config/resources.html
答案2
Tomcat 无法读取方法 1 和方法 3 中的目录的确切原因对我来说仍然未知。但是,Tomcat 似乎不可能将位于下面的任何目录用作/home/user/...
Web 应用程序,即使这意味着使用符号链接链接到此位置并在目录上设置正确的权限!
虽然这可能是某种内置保护。但这仍然很奇怪,因为 Apache Tomcat 文档中没有列出此行为(如果我错了,请纠正我)。
因此,解决方案是使用除 之外的任何其他目录/home/user/...
,例如/usr/share/tomcat7/projects
应该可以工作。但话又说回来,最好直接将我的 Netbeans 分发输出设置为 webapps 目录,正如另一个人提到的那样(@用户208992)。
因此,为了解决这个问题,下面列出了使用外部 build/dist 目录使 Tomcat 与 Netbeans 协同工作所需的指令:
配置 Netbeans 将
build
和dist
目录分发到之外的目录/home/user/NetbeansProjects/project
。编辑以下文件:
/home/user/NetbeansProjects/project/nbproject/project.properties
,并更改以下行:build.dir=build dist.dir=dist
到
build.dir=/srv/tomcat/project/build dist.dir=/srv/tomcat/project/dist
请注意,您可以使用除 之外的任何目录
/home/...
来代替/srv/tomcat/project
向 Tomcat 主机添加具有适当 docBase 的 Context。
一种方法是编辑
server.xml
可能位于的配置文件/etc/tomcat7/server.xml
。在文件中添加上下文server.xml
:<Context docBase="/srv/tomcat/project/build/web/" path="/project"></Context>
确保将其放在
<Host>
-tag 内。您还可以在需要时向此标记添加属性(可重新加载、antiJARLocking 等)。或者您也可以将其放在 xml 文件中CATALINA_HOME/engine(e.g. Catalina)/hostname(e.g. localhost)/project.xml
,其中一种方法都可以。我选择指向 docBase,但如果您希望 Tomcat 使用 WAR 文件,
.../build/web/
您也可以将其设置为。.../dist/
确保 tomcat
users
与您位于同一组中。要做到这一点,例如:usermod --append --groups users tomcat7
注意:任何与 tomcat 共用的组都可以。这样 Netbeans 和 Tomcat 都可以访问同一个目录。
修复外部项目目录的所有权和权限。
sudo chown -R tomcat7:users /srv/tomcat/project sudo chmod -R 777 /srv/tomcat/project
这假定您
user
是该组的成员users
,并且是 tomcat cat /etc/passwdtomcat7
的名称。s user. You can check this in
注意:稍后您可以减少 -permissions
777
,但为了确保 Tomcat 拥有权限,您可以从最易访问的权限开始。在 Netbeans 中执行清理/构建,然后重新启动 tomcat 服务。这将应用前面步骤中的更改。
我希望这对处理类似情况的人有所帮助;在我看来,Tomcat 和权限确实很难调试。
答案3
为什么不让你的 netbeans 构建到你想要的目录?
答案4
我确实同意 lVlint67 关于分离构建和部署的观点,但我也经常在 dev URL 中使用 php/html/javascript,这种分离似乎会造成阻碍。我使用符号链接方法,但问题是必须设置权限以允许 Web 服务器读取符号链接的目标。
我用:
host:~# mkdir dev
host:~# chown me.www-data dev
host:~# chmod g+rwx dev
host:~# cd /var/www
host:~# ln -s ~/dev ./
为了使其正常工作,您必须是 www-data 组的成员,并记住让您的项目文件可由组读取,并且您的应用需要写入的任何文件都需要可由组写入。
这一切都不需要 SELinux,因此您的里程可能会根据服务器配置而有所不同。