web-dev-qa-db-ja.com

LinuxのTomcat 7でwebappsにシンボリックリンクをwebappとして追加する方法

セットアップ

Arch LinuxディストリビューションでApache Tomcat 7を使用しています。私のwebappsディレクトリは/usr/share/Tomcat7/webappsにあります。このディレクトリにディレクトリを作成し、XML構成ファイルを使用してその中にMETA-INFおよびWEB-INFディレクトリを配置する必要があります。次に、このディレクトリが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を含む)に配置します。


私は3つの可能なアプローチを考え出しましたが、どれも機能しておらず、何か不足していると思います。

アプローチ1(symlink)

私は考えていました、このコマンドを使用してwebappsディレクトリにシンボリックリンク(シンボリックリンク)を配置しましょう:

$ 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

実際には、これが機能する唯一のソリューションです。残念ながら、プロジェクトを再度ビルドすると、マウントが消えます。 Antで<exec/>を使用してプロジェクトを配布した後、すでにディレクトリを再マウントしようとしましたが、これにより、なんらかの理由でLinuxがクラッシュします。したがって、これもオプションではありません。また、すべてのクリーンビルド後に再マウントすることは、クリーンなアプローチではないようです。マウントもこの種のものには実際には使用されないので、ソリューションにはマウントが含まれないと思います。


アプローチ3(server.xml)

私がやりたい最後のことは、Apacheの人々の推奨に反することです( ここを参照 )。それは言う:

要素をserver.xmlファイルに直接配置することはお勧めしません。

だから私は何をしますか、私はデフォルトのserver.xmlを取り、このコンテキストタグをホストタグに追加します:

<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は起動に失敗します。


上記のどのアプローチが最も賢明です、そしてそれが機能するのを妨げている間違っていることは何ですか?

2
Yeti

アプローチ1と3のようにTomcatがディレクトリを読み取れない理由は、正確にはわかりません。ただし、シンボリックリンクを使用してこの場所にリンクし、ディレクトリに適切な権限を設定することを意味する場合でも、Tomcatは_/home/user/..._の下にあるディレクトリをWebアプリケーションとして使用することは不可能のようです。

おそらくこれはある種の組み込み保護です。この動作はApache Tomcatのドキュメントに記載されていないため、まだ奇妙です(間違っている場合は修正してください)。

したがって、解決策は_/home/user/..._以外のディレクトリを使用することです。 _/usr/share/Tomcat7/projects_が機能するはずです。ただし、ここでも、他の人(@ user208992)が述べたように、Netbeansディストリビューションの出力を直接webappsディレクトリに設定するのが最善です。

したがって、この問題を修正するために、外部のbuild/distディレクトリを使用してTomcatをNetbeansで動作させるために必要な手順のリストを次に示します。

  1. buildおよびdistディレクトリを_/home/user/NetbeansProjects/project_以外のディレクトリに配布するようにNetbeansを設定します。

    次のファイルを編集します:_/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_以外)を使用できることに注意してください。

  2. 適切なdocBaseを持つコンテキストをTomcatホストに追加します。

    これを行う1つの方法は、おそらく_server.xml_にある_/etc/Tomcat7/server.xml_構成ファイルを編集することです。 _server.xml_ファイルにコンテキストを追加します。

    _<Context docBase="/srv/Tomcat/project/build/web/" path="/project"></Context>
    _

    これを_<Host>_-タグ内に配置してください。また、必要に応じてこのタグに属性を追加できます(再ロード可能、antiJARLockingなど)。または、CATALINA_HOME/engine(e.g. Catalina)/hostname(e.g. localhost)/project.xmlのxmlファイルに配置することもできます。これらの方法のいずれかで問題ありません。

    DocBaseが_.../build/web/_を指すように選択しましたが、TomcatでWARファイルを使用する場合は、これを_.../dist/_に設定することもできます。

  3. Tomcatがあなたと同じusers- groupにあることを確認してください。これを行うには、例:

    _usermod --append --groups users Tomcat7
    _

    注:Tomcatを使用している一般的なグループで十分です。これにより、NetbeansとTomcatはどちらも同じディレクトリにアクセスできます。

  4. 外部プロジェクトディレクトリの所有権と権限を修正します。

    _Sudo chown -R Tomcat7:users /srv/Tomcat/project
    Sudo chmod -R 777 /srv/Tomcat/project
    _

    これは、あなたがuserがグループusersのメンバーであること、および_Tomcat7_がTomcat _s user. You can check this in_ cat/etc/passwd`の名前であることを前提としています。

    注:後で_777_- permissionsを減らすことができますが、Tomcatに権限を持たせるには、最もアクセスしやすい権限から始めます。

  5. Netbeansでクリーンアップ/ビルドを行い、Tomcatサービスを再起動します。これにより、前の手順の変更が適用されます。

これが同様の状況に対処している誰かに役立つことを願っています。 Tomcatと権限は、imhoをデバッグするのが本当に難しい場合があります。

4
Yeti

@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

4
GlenPeterson

Netbeansを目的のディレクトリにビルドさせてみませんか?

3
user208992

試してみる価値があるかもしれませんsetenforce 0 selinuxを無効にして、selinuxが有効になっている場合に上記のメソッドを再テストします。機能する場合は、selinuxを再度有効にして、権限の問題の追跡を開始します。


ここにはあらゆる種類のセキュリティの懸念があります...(Cent/Oracle/REHLでこのようなことをしたい場合...ほとんどのシステム管理者は、selinuxを無効にするか、監査ログを追跡するために数時間を費やす必要があると言っています)

要するに、ソフトウェアのビルドをどこにでも即座に公開することについては何もelegantありません。発生する可能性のある問題の量は、悪夢のようなものです(特にJavaおよびTomcatがバックグラウンドで潜んでいる場合))。

開発インスタンスからテストインスタンスに手動でrsyncを実行することをお勧めします。 (Tomcatの下のIE)。自動的に実行させたい場合は、ビルドスクリプトに追加します。


Ps。私はサポートドキュメントを探す時間がありません...だから:私の意見では、開発のビルドステージとデプロイステージ(ほとんどすべての場合)を組み合わせることはベストプラクティスでも「エレガント」でもありません。

1
Daniel Widrick

私はビルドとデプロイの分離について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がないため、サーバーの構成によって距離が異なる場合があります。

0
Alderin