Servidor Web com Banco de Dados

Resumo:

Um servidor Web com suporte a HTML, CSS, JSP, servlet e banco de dados MySQL.

Ingredientes:

  • Um Raspberry Pi
    • Fonte de alimentação de 2 A, se for utilizar rede wireless, caso contrário, basta 1 A.
    • Java 7/8
    • Apache Tomcat 8
    • MySQL
    • Sua aplicação Web com HTML, CSS, Javascript, JSP, servlet e banco de dados MySQL.

Comandos interessantes:

$ sudo netstat -tulpn
$ sudo iwlist wlan0 scan

Configuração:

Configurações Iniciais

Instale o Raspbian normalmente e utilize o comando abaixo para configurar o seu Raspberry Pi:

$ sudo raspi-config

Configure os seguintes itens:

  • Expand Filesystem
  • Change User Password
  • Internationalisation Options
    • Change Locale ==> en_US ISO-8859-1 e pt_BR ISO-8859-1 (Default locale en_US)
    • Change Timezone ==> America, Sao_Paulo
    • Change Keyboard Layout ==> Generic 105-key (Intl) PC, English (US) - English (US, alternative international)
  • Advanced Options
    • Hostname
    • Memory Split ==> 0

Caso você esteja utilizando uma interface WiFi, configure o acesso WPA2 como mostrado a seguir. Primeiro crie uma senha de acesso à rede sem fio criptografada. A segurança que esta criptografia acrescenta é discutível uma vez que qualquer um pode utilizar a mesma string para se conectar a sua rede:

$ wpa_passphrase seu_ssid sua_senha
network={
ssid="seu_ssid"
#psk="sua_senha"
psk=banananaotemcarocoeminhaavonaotocaviolaoporqueopneudonaviofurounacamaquetiradentesmorreu
}

Edite o arquivo /etc/wpa_supplicant/wpa_supplicant.conf.

$ sudo cp /etc/wpa_supplicant/wpa_supplicant.conf{,.velho}
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

E acrescente o texto obtido anteriormente. O resultado do arquivo deverá ser semelhante a:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="seu_ssid"
        #psk="sua_senha"
        psk=banananaotemcarocoeminhaavonaotocaviolaoporqueopneudonaviofurounacamaquetiradentesmorreu
}

Obs.: você pode (e deve) remover a linha com o comentário contendo a sua senha em texto livre.

Normalmente o wpa-supplicant percebe que você modificou o arquivo de configuração e faz a conexão automaticamente. Se você for do tipo impaciente (bem-vindo ao grupo), você pode usar os comandos abaixo para reiniciar a interface wireless:

$ sudo ifdown wlan0
$ sudo ifup wlan0

Instalação do Java

Depois de instalar e configurar o sistema operacional no Raspberry Pi (incluindo as atualizações), instale o Java:

$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk

ou

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer

Instalação do Tomcat

Você pode instalar o Tomcat usando o comando apt-get como mostrado logo a seguir ou fazer uma instalação personalizada como o passo-a-passo mostrado um pouco mais abaixo.

Para instalar usando o apt-get:

$ sudo apt-get install tomcat8

Ou faça download do Apache Tomcat no formato tar.gz do site do Tomcat (óbvio). Se achar melhor, copie o link e utilize o comand wget. Neste exemplo, vamos utilizar o Tomcat v8.0.14:

$ cd Download/
$ wget http://mirror.nbtelecom.com.br/apache/tomcat/tomcat-8/v8.0.14/bin/apache-tomcat-8.0.14.tar.gz

Decompacte o pacote:

$ sudo tar xvzf apache-tomcat-8.0.14.tar.gz

Mova o conteúdo expandido para /opt/tomcat. Utilize o seguinte comando:

$ sudo mv apache-tomcat-8.0.14 /opt/tomcat

Teste o funcionamento. Para iniciar o Apache Tomcat, utilize o comando a seguir uma vez que o Apache Tomcat não foi instalado como serviço (veja nota no final):

$ sudo /opt/tomcat/bin/startup.sh

Você deverá obter o seguinte resultado:

Using CATALINA_BASE:   /opt/tomcat
Using CATALINA_HOME:   /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
Tomcat started.

Utilize o seguinte comando para desligar o Apache Tomcat

$ sudo /opt/tomcat/bin/shutdown.sh

Edite o arquivo /etc/profile:

$ sudo cp /etc/profile{,.velho}
$ sudo vi /etc/profile

Inclua o seguinte texto no final do arquivo:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-armhf
export CATALINA_HOME=/opt/tomcat

Veja como ficou o arquivo clicando aqui.

Reinicie o computador:

$ sudo reboot

Depois de reiniciado... Para que o Tomcat possa executar como um deamon:

$ cd $CATALINA_HOME/bin/
$ sudo tar xvfz commons-daemon-native.tar.gz
$ cd commons-daemon-1.0.15-native-src/unix/
$ sudo ./configure 
$ sudo make
$ sudo cp jsvc ../..
$ cd ../..
$ CATALINA_BASE=$CATALINA_HOME
$ cd $CATALINA_HOME
$ sudo ./bin/jsvc -classpath $CATALINA_HOME/bin/bootstrap.jar:$CATALINA_HOME/bin/tomcat-juli.jar \
                  -outfile $CATALINA_BASE/logs/catalina.out \
                  -errfile $CATALINA_BASE/logs/catalina.err \
                  -Dcatalina.home=$CATALINA_HOME \
                  -Dcatalina.base=$CATALINA_BASE \
                  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager \
                  -Djava.util.logging.config.file=$CATALINA_BASE/conf/logging.properties \
                  org.apache.catalina.startup.Bootstrap
$ sudo mkdir /var/lib/tomcat
$ sudo ln -s /opt/tomcat/webapps/ /var/lib/tomcat/webapps
$ sudo groupadd tomcat
$ sudo useradd -s /sbin/nologin -g tomcat -d $CATALINA_HOME tomcat
$ sudo passwd tomcat
$ sudo chown -R tomcat:tomcat $CATALINA_HOME
$ sudo chmod 775 $CATALINA_HOME/webapps
$ sudo ln -s /opt/tomcat/bin/catalina.sh /etc/init.d/tomcat

Modifique o arquivo catalina.sh:

$ sudo mkdir /var/lib/tomcat
$ sudo ln -s /opt/tomcat/webapps/ /var/lib/tomcat/webapps
$ sudo groupadd tomcat
$ sudo useradd -s /sbin/nologin -g tomcat -d $CATALINA_HOME tomcat
$ sudo passwd tomcat
$ sudo chown -R tomcat:tomcat $CATALINA_HOME
$ sudo chmod 775 $CATALINA_HOME/webapps
$ sudo ln -s /opt/tomcat/bin/catalina.sh /etc/init.d/tomcat

E inclua o seguinte texto logo abaixo de #!/bin/sh:

### BEGIN INIT INFO
# Provides:          tomcat
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: tomcat
# Description:       tomcat
### END INIT INFO

Veja como ficou o arquivo clicando aqui.

Atualize o script de inicialização com o comando:

$ sudo update-rc.d tomcat defaults

E assim termina a instalação manual do Tomcat (como visto, a instalação automática é muito mais simples, mas a manual é mais emocionante).

Se o Apache Tomcat tiver sido instalado como serviço, utilize os comandos abaixo para iniciar e para o serviço:

$ sudo /etc/init.d/tomcat8 start
$ sudo /etc/init.d/tomcat8 stop

--- OU ---

$ sudo service tomcat8 start
$ sudo service tomcat8 stop

Para criar um virtual host, edite o arquivo /opt/tomcat/conf/server.xml (ou /etc/tomcat8/server.xml):

$ sudo cp /opt/tomcat/conf/server.xml{,.velho}
$ sudo vi /opt/tomcat/conf/server.xml

E inclua um novo <Host> dentro de <Engine>:

<Engine ...
...
<Host name="exemplosweb.meslin.com.br" appBase="ExemplosWeb"/>
</Engine>

Veja como ficou o arquivo clicando aqui.

Crie um diretório dentro de $CATALINA_HOME com o nome base da aplicação (provavelmente o diretório é /var/lib/tomcat8). Importante: o seu usuário deve ter privilégio de escrita no diretório. A melhor forma de fazer isso é incluir o seu usuário no grupo tomcat e acrescentar permissão de escrita para o grupo:

$ sudo mkdir $CATALINA_HOME/ExemplosWeb
$ sudo chown tomcat $CATALINA_HOME/ExemplosWeb
$ sudo chgrp tomcat $CATALINA_HOME/ExemplosWeb

$ sudo chmod g+w $CATALINA_HOME/ExemplosWeb

$ ls -l $CATALINA_HOME
total 132
drwxr-xr-x 2 tomcat tomcat  4096 Oct 25  2014 bin
drwxr-xr-x 3 tomcat tomcat  4096 Aug 11 23:51 conf
drwxrwxr-x 3 tomcat tomcat  4096 Aug 16 22:56 ExemplosWeb
drwxr-xr-x 2 tomcat tomcat  4096 Oct 25  2014 lib
-rw-r--r-- 1 tomcat tomcat 56977 Sep 24  2014 LICENSE
drwxr-xr-x 2 tomcat tomcat 12288 Aug 18 23:06 logs
-rw-r--r-- 1 tomcat tomcat  1397 Sep 24  2014 NOTICE
-rw-r--r-- 1 tomcat tomcat  6779 Sep 24  2014 RELEASE-NOTES
-rw-r--r-- 1 tomcat tomcat 16204 Sep 24  2014 RUNNING.txt
drwxr-xr-x 2 tomcat tomcat  4096 Oct 25  2014 temp
drwxrwxr-x 8 tomcat tomcat  4096 Aug  1 22:53 webapps
drwxr-xr-x 3 tomcat tomcat  4096 Oct 25  2014 work

E faça o deployment do arquivo ROOT.war nele.

Por padrão, o Tomcat se instala escutando a porta 8080, que não é a porta padrão HTTP. Opcionalmente, você pode modificar a porta para 80, que é a porta padrao. Edite o arquivo /var/lib/tomcat8/conf/server.xml, substituindo todas as portas 8080 por 80 (HTTP) e todas as portas 8443 por 443 (HTTPS).

$ sudo vi /var/lib/tomcat8/conf/server.xml

Por motivo de segurança (???), o Tomcat não se permite escutar a porta 80. Para habilitá-lo, edite o arquivo /etc/default/tomcat8.

$ sudo cp /etc/default/tomcat8{,.velho}
$ sudo vi /etc/default/tomcat8

Remova o comentário da linha com AUTHBIND e coloque o seu valor como yes como mostrado a seguir:

# If you run Tomcat on port numbers that are all higher than 1023, then you
# do not need authbind.  It is used for binding Tomcat to lower port numbers.
# (yes/no, default: no)
AUTHBIND=yes

Também é necessário que você instale e configure o authbind como mostrado a sequir:

$ sudo apt-get install authbind
$ sudo touch /etc/authbind/byport/80
$ sudo chmod 500 /etc/authbind/byport/80
$ sudo chown tomcat8 /etc/authbind/byport/80
$ sudo touch /etc/authbind/byport/443
$ sudo chmod 500 /etc/authbind/byport/443
$ sudo chown tomcat8 /etc/authbind/byport/443

Ops... se você quiser facilitar a sua vida, crie um link simbólico do diretório de deployment para dentro (ou abaixo) do seu diretório HOME.

$ sudo ln -s /opt/tomcat/ExemplosWeb ~/webappsExemplosWeb 
$ ls -l 
total 28 
lrwxrwxrwx 1 root root 23 Oct 27 2014 webappsExemplosWeb -> /opt/tomcat/ExemplosWeb

--- OU --- (verifique qual é o seu diretório de deployment)

$ sudo ln -s /var/lib/tomcat8/ExemplosWeb ~/webappsExemplosWeb
$ ls -l
total 0
lrwxrwxrwx 1 root root 28 Dec 20 23:08 webappsExemplosWeb -> /var/lib/tomcat8/ExemplosWeb

Instalação do MySQL

A instalação do MySQL é simples:

$ sudo apt-get install mysql-server

Nas versões atuais do MySQL, edit o arquivo /etc/mysql/mysql.conf.d/mysqld.cnf:

$ sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf{,.velho}
$ sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

Nas versões mais antigas, edite o arquivo /etc/mysql/my.cnf:

$ sudo cp /etc/mysql/my.cnf{,.velho}
$ sudo vi /etc/mysql/my.cnf

Modifique a linha bind-address da seção [mysqld] para:

bind-address = 0.0.0.0

Veja como ficou o arquivo clicando aqui.

Libere acesso a porta através do comando iptable mostrado a seguir:

$ sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

Nas versões atuais do MySQL, pode ser necessário desligar o plugin de validação de senha (veja o primeiro comando dentro do MySQL). Dê permissão para o administrador administrar o servidor através de qualquer computador:

$ mysql -u root -p
mysql> uninstall plugin validate_password;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'ROOT'@'%' IDENTIFIED BY 'alert' with grant option;
mysql> set password for 'ROOT'@'%' = PASSWORD('MINHA_SENHA_DO_ADMINISTRADOR');

Se for necessário, crie um novo usuário (ATENÇÃO: o username é case-sensitive):

mysql> create user 'aluno'@'localhost' identified by 'SENHA_QUASE_SECRETA_DO_ALUNO';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'aluno'@'localhost';

mysql> GRANT ALL PRIVILEGES ON *.* TO 'aluno'@'%' IDENTIFIED BY 'SENHA_QUASE_SECRETA_DO_ALUNO';

mysql> FLUSH PRIVILEGES;

Reinicie o serviço:

$ sudo service mysql stop
$ sudo service mysql start

E pronto...