Agora vamos cuidar das últimas etapas antes de colocar nosso servidor no ar em definitivo. Precisamos garantir que nada de ruim vai acontecer agora, porque depois que estiver em produção vai ficar complicado corrigir. E mesmo que aconteça, precisamos saber onde procurar para debugar o problema.

Nesta parte da série vamos revisar os logs e suas rotações, preparar os scripts para inicialização e parada de todos os serviços que instalamos até aqui, rebootar o servidor e ver se tudo está volta como deveria sem ninguém por a mão em nada. Se isto correr, estaremos prontos para a virada.

Logs

Durante todo o processo, fomos gentis com os logs. Aproveitamos alguns com que já existiam e criamos uns outros. Vamos ver quem é quem nesse galinheiro.

Os logs que já existiam e que aproveitamos são:

  • /var/log/maillog: todos os serviços relativos ao email que geram log usam esse arquivo. Postfix, Dovecot e SpamAssassin. O DKIMproxy não gera log.
  • /var/log/messages: o nosso script de firewall vai registrar as conexões bloqueadas neste log.
  • /var/log/syslog: o Horde registra suas mensagens aqui.

Os logs que criamos foram:

  • /var/log/ec2sgddns: contém as mensagens relativas ao nosso script de atualização de IP dinâmicos no AWS.
  • /var/log/nginx/*.log: os logs de acesso e erro do ngix são guardados nesse diretório. Lembre-se que cada servidor virtual do nginx tem o seu log de aceso separado, sendo que o do ViMbAdmin é o backend.access.log, e o do Horde é horde.access.log. Como nosso nginx não possui um servidor padrão, o log access.log não é usado para nada. O log de erros é comum a todos em error.log.
  • /var/log/php: registra as mensagens de runtime do PHP. Scripts que tiverem problemas para executar gravarão suas mensagens de erro ou aviso aqui. Esse é o lugar para procurar bugs em aplicações PHP.
  • /var/log/php-fpm: registra as mensagens do gerenciador de processos FastCGI que permite ao nginx rodar PHP. Apenas as mensagens relativas ao PHP-FPM aparecerão neste log. Aqui não haverá nada de muito interessante.
  • /var/www/backend/var/log/vimbadmin.log: log do ViMbAdmin.

Logrotate

Você está trabalhando tranquilo um dia e chega um chamado sobre um email que não funciona. Ai alguém liga e relata um problema parecido. O sistema de suporte começa a pipocar, as ligações aumentam, seu chefe liga no seu celular aos berros. Ninguém mais consegue enviar ou receber email. Você entra no servidor, roda um df -h e vê que sua partição está cheia. Futuca aqui, mexe acolá e descobre um log com 100GB. Eis a causa dos chamados. Momento cara de bunda!

Para isso não acontecer, vamos rodar os logs. Eles gostam.

Os logs que aproveitamos são rotacionados pelos sistema. Portanto não precisamos nos preocupar com eles. Vamos nos concentrar apenas nos logs que foram criados durante o processo. A menos que especificado no arquivo de rotação do log o parâmetro daily, a rotação é semanal.

Vamos usar o diretório do virador de logs do sistema operacional, o logrotate, para deixar nossos logs tontos.

Conteúdo do arquivo /etc/logrotate/aws:

/var/log/ec2sgddns {
  notifempty
  missingok
}

Conteúdo do arquivo /etc/logrotate/nginx:

/var/log/nginx/*.log {
  daily
  rotate 5
  missingok
  notifempty
  sharedscripts
  su nobody nogroup
  postrotate
    /etc/rc.d/rc.nginx rotate > /dev/null
  endscript
}

Conteúdo do arquivo /etc/logrotate/php:

/var/log/php /var/log/php-fpm {
  daily
  rotate 5
  missingok
  notifempty
  sharedscripts
  su nobody nogroup
  create 0640 nobody
  postrotate
    /etc/rc.d/rc.php-fpm reload > /dev/null
  endscript
}

Conteúdo do arquivo /etc/logrotate/vimbadmin:

/var/www/backend/var/log/vimbadmin.log {
  rotate 4
  notifempty
  missingok
  create 0640 nobody nogroup
}

Pronto. Isso dará conta da rotação dos logs que criamos. Pode continuar trabalhando tranquilo que não haverá chamados ou ligações por este motivo.

Init

Até agora, tudo o que instalamos foi iniciado na mão. Se você desligou o servidor, provavelmente teve que reiniciar todos os serviços na mão também. Mas ora, isso não é um comportamento aceitável para um servidor em produção. Servidores precisam de reboots eventuais e, quando isso ocorre, você não quer ter que lembrar o que fazer para colocar os serviços que ele presta no ar novamente.

Aqui entram os init scripts. São eles que iniciam e param os serviços quando chega a hora do boot ou desligamento.

No Slackware há um lugar muito conveniente para fazer isso. Precisamos de apenas dois scripts. Já vamos colocar o conteúdo deles no jeito. Lembre-se que eu estou me baseando no meu guia do Slackware para o AWS, por isso existe um tor aí no meio.

Conteúdo do arquivo /etc/rc.d/rc.local:

#!/bin/sh
#
# /etc/rc.d/rc.local:  Local system initialization script.
#
# Put any local startup commands in here.  Also, if you have
# anything that needs to be run at shutdown time you can
# make an /etc/rc.d/rc.local_shutdown script and put those
# commands in there.

# Start SpamAssassin
if [ -x /etc/rc.d/rc.spamd ]; then
  /etc/rc.d/rc.spamd start
fi

# Start DKIMproxy
if [ -x /etc/rc.d/rc.dkimproxy ]; then
  /etc/rc.d/rc.dkimproxy start
fi

# Start Dovecot
if [ -x /etc/rc.d/rc.dovecot ]; then
  /etc/rc.d/rc.dovecot start
fi

# Start Postfix
if [ -x /etc/rc.d/rc.dovecot ]; then
  /etc/rc.d/rc.postfix start
fi

# Start memcached
if [ -x /etc/rc.d/rc.memcached ]; then
  /etc/rc.d/rc.memcached start
fi

# Start php-fpm
if [ -x /etc/rc.d/rc.php-fpm ]; then
  /etc/rc.d/rc.php-fpm start
fi

# Start nginx
if [ -x /etc/rc.d/rc.nginx ]; then
  /etc/rc.d/rc.nginx start
fi

# Start Tor
if [ -x /etc/rc.d/rc.tor ]; then
  /etc/rc.d/rc.tor start
fi

Conteúdo do arquivo /etc/rc.d/rc.local_shutdown:

#!/bin/sh
#
# /etc/rc.d/rc.local_shutdown:  Local system shutdown script.
#
# Put any local shutdown commands in here.  Also, if you have
# anything that needs to be run at startup time you can
# make an /etc/rc.d/rc.local script and put those
# commands in there.

# Stop Tor
if [ -x /etc/rc.d/rc.tor ]; then
  /etc/rc.d/rc.tor stop
fi

# Stop nginx
if [ -x /etc/rc.d/rc.nginx ]; then
  /etc/rc.d/rc.nginx stop
fi

# Stop php-fpm
if [ -x /etc/rc.d/rc.php-fpm ]; then
  /etc/rc.d/rc.php-fpm stop
fi

# Stop memcached
if [ -x /etc/rc.d/rc.memcached ]; then
  /etc/rc.d/rc.memcached stop
fi

# Stop Postfix
if [ -x /etc/rc.d/rc.dovecot ]; then
  /etc/rc.d/rc.postfix stop
fi

# Stop Dovecot
if [ -x /etc/rc.d/rc.dovecot ]; then
  /etc/rc.d/rc.dovecot stop
fi

# Stop DKIMproxy
if [ -x /etc/rc.d/rc.dkimproxy ]; then
  /etc/rc.d/rc.dkimproxy stop
fi

# Stop SpamAssassin
if [ -x /etc/rc.d/rc.spamd ]; then
  /etc/rc.d/rc.spamd stop
fi

Altere as permissões do rc.local_shutdown:

# chmod 755 /etc/rc.d/rc.local_shutdown

E feito. Agora seu servidor sabe o que precisa subir e encerrar quando ele for ligado, desligado ou reiniciado. Agora me diga, porque diabos alguém poderia preferir um Linux com systemd quando se pode ter essa simplicidade toda? Falta de um lote pra capinar, viu!

Bom, vamos testar?

# reboot

Aguarde uns minutinhhos e a máquina deverá estar de volta. Hora de ver se tudo subiu direitinho.

Primeiro o firewall.

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  localhost            anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:submission
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:imaps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:sieve
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:3443
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8443
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere             state NEW,RELATED,ESTABLISHED

Confere? Se sim, seu servidor já sobe protegido pelo firewall local. Excelente!

Vamos ver os processos.

# ps -ef | grep 'mysql\|spam\|dkim\|dovecot\|memcached\|php\|nginx'
root       712     1  0 23:39 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/run/mysql/mysql.pid --skip-networking
root      1016     1  0 23:39 ?        00:00:02 /usr/bin/spamd -x --max-children 5 --helper-home-dir /var/lib/spamassassin -u spamd -g spamd --siteconfigpath /etc/mail/spamassassin -4 -d --pidfile=/var/run/spamd.pid
mysql     1138   712  0 23:39 ?        00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --skip-networking --log-error=/var/lib/mysql/mail.err --pid-file=/var/run/mysql/mysql.pid --socket=/var/run/mysql/mysql.sock
spamd     1212  1016  0 23:39 ?        00:00:00 spamd child
spamd     1215  1016  0 23:39 ?        00:00:00 spamd child
dkim      1216     1  0 23:39 ?        00:00:00 /usr/bin/perl -I/usr/share/perl5/vendor_perl/dkimproxy /usr/bin/dkimproxy.out --user=dkim --group=dkim --daemonize --pidfile=/var/run/dkimproxy/dkimproxy_out.pid --conf_file=/etc/dkimproxy/dkimproxy_out.conf
dkim      1219  1216  0 23:39 ?        00:00:00 /usr/bin/perl -I/usr/share/perl5/vendor_perl/dkimproxy /usr/bin/dkimproxy.out --user=dkim --group=dkim --daemonize --pidfile=/var/run/dkimproxy/dkimproxy_out.pid --conf_file=/etc/dkimproxy/dkimproxy_out.conf
dkim      1220  1216  0 23:39 ?        00:00:00 /usr/bin/perl -I/usr/share/perl5/vendor_perl/dkimproxy /usr/bin/dkimproxy.out --user=dkim --group=dkim --daemonize --pidfile=/var/run/dkimproxy/dkimproxy_out.pid --conf_file=/etc/dkimproxy/dkimproxy_out.conf
dkim      1222  1216  0 23:39 ?        00:00:00 /usr/bin/perl -I/usr/share/perl5/vendor_perl/dkimproxy /usr/bin/dkimproxy.out --user=dkim --group=dkim --daemonize --pidfile=/var/run/dkimproxy/dkimproxy_out.pid --conf_file=/etc/dkimproxy/dkimproxy_out.conf
dkim      1223  1216  0 23:39 ?        00:00:00 /usr/bin/perl -I/usr/share/perl5/vendor_perl/dkimproxy /usr/bin/dkimproxy.out --user=dkim --group=dkim --daemonize --pidfile=/var/run/dkimproxy/dkimproxy_out.pid --conf_file=/etc/dkimproxy/dkimproxy_out.conf
dkim      1224  1216  0 23:39 ?        00:00:00 /usr/bin/perl -I/usr/share/perl5/vendor_perl/dkimproxy /usr/bin/dkimproxy.out --user=dkim --group=dkim --daemonize --pidfile=/var/run/dkimproxy/dkimproxy_out.pid --conf_file=/etc/dkimproxy/dkimproxy_out.conf
root      1225     1  0 23:39 ?        00:00:00 /usr/sbin/dovecot
dovecot   1228  1225  0 23:39 ?        00:00:00 dovecot/anvil
root      1229  1225  0 23:39 ?        00:00:00 dovecot/log
nobody    1309     1  0 23:39 ?        00:00:00 memcached -l 127.0.0.1 -u nobody -m 10 -P /var/run/memcached/memcached.pid -d
root      1322     1  0 23:39 ?        00:00:00 php-fpm: master process (/etc/php-fpm/php-fpm.conf)
nobody    1324  1322  0 23:39 ?        00:00:00 php-fpm: pool www
nobody    1325  1322  0 23:39 ?        00:00:00 php-fpm: pool www
root      1344     1  0 23:39 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nobody    1346  1344  0 23:39 ?        00:00:00 nginx: worker process
dovenull  1417  1225  0 23:42 ?        00:00:00 dovecot/imap-login
root      1418  1225  0 23:42 ?        00:00:00 dovecot/config
dovecot   1420  1225  0 23:42 ?        00:00:00 dovecot/auth
root      1421  1225  0 23:42 ?        00:00:00 dovecot/ssl-params
vmail     1426  1225  0 23:42 ?        00:00:00 dovecot/imap

Se sua 'listinha' se parece com essa aí, todos os processos subiram a contento.

E por fim, as portas.

# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:time                  *:*                     LISTEN      608/inetd
tcp        0      0 *:3443                  *:*                     LISTEN      1344/nginx: master
tcp        0      0 localhost:11211         *:*                     LISTEN      1309/memcached
tcp        0      0 *:submission            *:*                     LISTEN      1304/master
tcp        0      0 localhost:10027         *:*                     LISTEN      1216/perl
tcp        0      0 localhost:10028         *:*                     LISTEN      1304/master
tcp        0      0 localhost:783           *:*                     LISTEN      1016/spamd.pid
tcp        0      0 *:auth                  *:*                     LISTEN      608/inetd
tcp        0      0 *:ssh                   *:*                     LISTEN      612/sshd
tcp        0      0 *:smtp                  *:*                     LISTEN      1304/master
tcp        0      0 localhost:9050          *:*                     LISTEN      1351/tor
tcp        0      0 *:8443                  *:*                     LISTEN      1344/nginx: master
tcp        0      0 *:sieve                 *:*                     LISTEN      1225/dovecot
tcp        0      0 *:imaps                 *:*                     LISTEN      1225/dovecot
tcp        0      0 localhost:44865         localhost:11211         TIME_WAIT   -

Ó lá, rapá! Subiu foi tudo!

Se você quiser fazer verificações adicionais, use o comando ss, telnet, olhe nos logs, veja se os sockets subiram todos, etcétera, etcétera, etcétera. Enfim, divirta-se. Você mereceu!

Seu servidor pode entrar em produção.