Como adicionar link simbólico como webapp para webapps no Tomcat 7 no Linux?

1

Configuração

Eu uso o Apache Tomcat 7 em uma distribuição Arch linux, e meu diretório webapps está localizado em /usr/share/tomcat7/webapps . Nesse diretório, deve-se criar um diretório e colocar diretórios META-INF e WEB-INF nele, com arquivos de configuração xml. Então este diretório será o caminho principal da webapp. Assim, por exemplo:

Se /usr/share/tomcat7/webapps/foo/bar.html contiver:

<!DOCTYPE html>
<html>
  <body>
    Hello world!
  </body>
</html>

Então, http://localhost:8080/foo será exibido:

Hello world!

No entanto, o objetivo é ter um projeto dinâmico externo (distribuído pelo Netbeans neste caso) como um webapp. Então, nesse caso, gostaria de localizar minha webapp aqui: /home/user/NetbeansProjects/foo/build/web/ (que contém bar.html ).

Eu criei três abordagens possíveis, mas nenhuma está funcionando e acho que estou perdendo alguma coisa.

Abordagem 1 (link simbólico)

Eu estava pensando, vamos colocar um symlink (link simbólico) no diretório webapps usando este comando:

$ ln -s /home/user/NetbeansProjects/foo/build/web /usr/share/tomcat7/webapps/foo

Essa parece ser a abordagem mais elegante, mas o Tomcat não consegue ler o diretório. Porque não?

Abordagem 2 (mount --bind)

Eu li que você também pode redirecionar um diretório para outro usando mount --bind . Então eu tentei fazer isso:

sudo mount --bind /usr/share/tomcat7/webapps/foo /home/user/NetbeansProjects/foo/build/web

Na verdade, esta é a única solução que funciona. Infelizmente, se eu construir o projeto novamente, a montagem desaparecerá. Eu já tentei remontar o diretório depois de distribuir o projeto usando <exec/> no Ant, mas isso faz o Linux travar por algum motivo estranho. Então isso não é uma opção também. Também remontar depois de cada compilação limpa não parece uma abordagem limpa. A montagem também não é realmente usada para esse tipo de coisa, então imagino que a solução não envolverá montagem.

Abordagem 3 (server.xml)

A última coisa que quero fazer é ir contra as recomendações do pessoal do Apache ( ver aqui ). O que diz:

It is NOT recommended to place elements directly in the server.xml file.

Então, o que eu faço, tomo o server.xml padrão e adiciono essa tag de contexto à tag do Host:

<Context docBase="/home/user/NetbeansProjects/foo/build/web/" path="/foo"></Context>

No entanto, se eu reiniciar o serviço do Tomcat, ele não será iniciado. Nos arquivos de log eu li:

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

Então, obviamente, isso deve ser algum tipo de problema de permissão. Como verifiquei novamente erros de ortografia, o caminho deve estar correto. Mas eu não sou capaz de resolver isso, o que eu fiz para conceder permissão ao tomcat7 (group: tomcat7) é:

chown -R tomcat7:tomcat7 /home/user/NetbeansProjects/foo/build/web
chmod -R 755 /home/user/NetbeansProjects/foo/build/web

Mas depois de reiniciar o Tomcat, o mesmo erro ocorre e o Tomcat não inicia.

Qual abordagem acima é a mais sensata, e o que estou fazendo de errado que está impedindo que ela funcione?

    
por Yeti 11.02.2014 / 18:55

5 respostas

3

O motivo exato pelo qual o Tomcat não consegue ler os diretórios, como na abordagem 1 e 3, ainda é desconhecido para mim. No entanto, parece impossível para o Tomcat usar qualquer diretório localizado em /home/user/... como um webapp, mesmo que isso signifique usar links simbólicos para vincular a esse local e definir permissões corretas nos diretórios!

Embora provavelmente seja algum tipo de proteção embutida. Ainda é estranho porque esse comportamento não está listado na documentação do Apache Tomcat (corrija-me se estiver errado).

A solução é, portanto, usar qualquer outro diretório além de /home/user/... , por exemplo. /usr/share/tomcat7/projects deve funcionar. Mas, novamente, é melhor definir minha saída de distribuição do Netbeans diretamente para o diretório webapps, conforme mencionado por outra pessoa ( @ user208992 ).

Portanto, para corrigir esse problema, aqui está uma lista de instruções necessárias para que o Tomcat trabalhe com o Netbeans usando um diretório externo build / dist:

  1. Configure o Netbeans para distribuir os diretórios build e dist para um diretório fora de /home/user/NetbeansProjects/project .

    Edite o seguinte arquivo: /home/user/NetbeansProjects/project/nbproject/project.properties e altere as linhas:

    build.dir=build
    dist.dir=dist
    

    para

    build.dir=/srv/tomcat/project/build
    dist.dir=/srv/tomcat/project/dist
    

    Observe que você pode usar qualquer diretório (diferente de /home/... ) em vez de /srv/tomcat/project

  2. Adicione um contexto com um docBase adequado ao host Tomcat.

    Uma maneira de fazer isso é editar o arquivo de configuração server.xml , provavelmente localizado em /etc/tomcat7/server.xml . Adicione um contexto no arquivo server.xml :

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

    Certifique-se de colocar isso dentro da <Host> -tag. Além disso, você pode adicionar atributos a essa tag quando necessário (recarregável, anti-JARLocking, etc.). Ou você também pode colocar no arquivo xml em CATALINA_HOME/engine(e.g. Catalina)/hostname(e.g. localhost)/project.xml , uma dessas abordagens vai ficar bem.

    Eu escolho apontar o docBase para .../build/web/ , mas você também pode definir isso para .../dist/ se quiser que o Tomcat use o arquivo WAR.

  3. Certifique-se de que o tomcat esteja no mesmo grupo users -group que você é. Para fazer isso, por exemplo:

    usermod --append --groups users tomcat7
    

    Nota: Qualquer grupo comum que você tenha com o tomcat será suficiente. Dessa forma, o Netbeans e o Tomcat podem acessar o mesmo diretório.

  4. Corrigir propriedade e permissões do diretório do projeto externo.

    sudo chown -R tomcat7:users /srv/tomcat/project
    sudo chmod -R 777 /srv/tomcat/project
    

    Isso pressupõe que você user é membro do grupo users e tomcat7 é o nome do tomcat s user. You can check this in cat / etc / passwd '.

    Observação: mais tarde, você pode reduzir as 777 -permissions, mas, para garantir que o Tomcat tenha permissões, você pode começar com as permissões mais acessíveis.

  5. Limpe / crie no Netbeans e reinicie o serviço do tomcat. Isso aplicará as alterações das etapas anteriores.

Espero que isto seja útil para alguém que lide com uma situação semelhante; Tomcat e permissões podem ser muito difíceis de depurar imho.

    
por 11.02.2014 / 23:14
3

Por que você não deixa seus netbeans construírem no diretório desejado?

    
por 11.02.2014 / 20:49
1

Pode valer a pena tentar setenforce 0 desativar o selinux e testar novamente seus métodos acima se o selinux estiver ativado. Se funcionar, reative o selinux e comece a rastrear os problemas de permissões.

Há todos os tipos de preocupações de segurança aqui ... (Se você quisesse fazer algo assim em Cent / Oracle / REHL ... a maioria dos administradores diria que você terá que desativar o selinux ou passar várias horas procurando o log de auditoria)

Para encurtar a história, não há nada elegant sobre a publicação instantânea de uma compilação de software em qualquer lugar. A quantidade de problemas que podem potencialmente surgir são coisas de pesadelos (especialmente com o java e o tomcat escondidos em segundo plano).

Você pode fazer bem rsync manualmente de sua instância de desenvolvimento para uma instância de teste. (IE sob Tomcat). Se você quer que isso aconteça automaticamente .. Você pode adicioná-lo ao script de construção.

Não tenho tempo para procurar documentação de apoio ... então: Na minha opinião, não é uma prática recomendada nem "elegante" combinar os estágios de desenvolvimento e implementação (em quase todos os casos).

    
por 11.02.2014 / 19:10
1

O que @Schrute disse em um comentário (não uma resposta): Use a opção nº 1 ( ln -s ) e apenas permite vincular no arquivo context.xml do Tomcat . Para o Tomcat 7:

<?xml version="1.0" encoding="UTF-8"?>
<Context allowLinking="true">
...

Tomcat 8:

<Context>
    <Resources allowLinking="true"></Resources>
...

NÃO FAÇA ISSO NO WINDOWS (ou qualquer outro sistema de arquivos que não diferencia maiúsculas de minúsculas), pois ele desabilitará as verificações de maiúsculas e minúsculas, permitindo a divulgação do código-fonte JSP, entre outros problemas de segurança. link

    
por 16.09.2014 / 18:28
0

Eu concordo com o lVlint67 em separar o Build e Deploy, mas eu também trabalho com php / html / javascript em uma URL de desenvolvimento onde a separação parece estar no caminho. Eu uso o método symlink, mas o problema é que as permissões devem ser definidas para permitir que o servidor da web leia o destino do symlink.

Eu uso:

host:~# mkdir dev
host:~# chown me.www-data dev
host:~# chmod g+rwx dev
host:~# cd /var/www
host:~# ln -s ~/dev ./

Para que isso funcione, você precisa ser um membro do grupo www-data e lembre-se de manter os arquivos do projeto legíveis por grupo, e todos os arquivos para os quais o aplicativo precisa gravar precisarão ser gravados por grupo.

Isso tudo é sem o SELinux, então sua milhagem pode variar dependendo da configuração do seu servidor.

    
por 11.02.2014 / 19:56