Servidor Perfeito · 12 min read · Oct 02, 2025

O Servidor Perfeito - CentOS 7 x86_64 (nginx, Dovecot, ISPConfig 3)

O Servidor Perfeito - CentOS 7 x86_64 (nginx, Dovecot, ISPConfig 3)

Versão 1.0
Autores: Till Brehm, Srijan Kishore e Falko Timme
Siga o howtoforge no Twitter

Este tutorial mostra como preparar um servidor CentOS 7 x86_64 para a instalação do ISPConfig 3 e como instalar o ISPConfig 3 nele. O ISPConfig 3 é um painel de controle de hospedagem na web que permite configurar os seguintes serviços através de um navegador: servidor web nginx, servidor de e-mail Postfix, MySQL, servidor de nomes BIND, PureFTPd, SpamAssassin, ClamAV, Mailman e muitos mais. Desde a versão 3.0.4, o ISPConfig vem com suporte total para o servidor web nginx além do Apache; este tutorial cobre a configuração de um servidor que usa nginx, não Apache. O tutorial do servidor perfeito do ISPConfig 3 para apache está disponível aqui.

Manual do ISPConfig 3

Para aprender a usar o ISPConfig 3, recomendo fortemente baixar o Manual do ISPConfig 3.

Em cerca de 300 páginas, ele cobre o conceito por trás do ISPConfig (administradores, revendedores, clientes), explica como instalar e atualizar o ISPConfig 3, inclui uma referência para todos os formulários e campos de formulário no ISPConfig juntamente com exemplos de entradas válidas, e fornece tutoriais para as tarefas mais comuns no ISPConfig 3. Ele também descreve como tornar seu servidor mais seguro e vem com uma seção de solução de problemas no final.

1. Requisitos

Para instalar um sistema assim, você precisará do seguinte

2. Nota Preliminar

Neste tutorial, uso o nome do host server1.example.com com o endereço IP 192.168.0.100 e o gateway 192.168.0.1. Essas configurações podem diferir para você, então você deve substituí-las onde apropriado. Por favor, instale a instalação mínima do CentOS 7 a partir deste link do tutorial antes de prosseguir.

3 Instalar o editor nano e ajustar /etc/hosts

yum -y install nano wget

Em seguida, editamos /etc/hosts. Deixe-o assim:

nano /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.100   server1.example.com     server1

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

e defina o nome do host como server1.example.com:

echo ‘server1.example.com’ > /etc/hostname

4 Configurar o Firewall e instalar alguns softwares de rede básicos

(Você pode pular este capítulo se já tiver desativado o firewall no final da instalação básica do sistema.)

Quero instalar o ISPConfig no final deste tutorial, que vem com seu próprio firewall. É por isso que desativo o firewall padrão do CentOS agora. Claro, você é livre para deixá-lo ligado e configurá-lo de acordo com suas necessidades (mas então você não deve usar nenhum outro firewall mais tarde, pois provavelmente interferirá com o firewall do CentOS).

Execute

systemctl stop firewalld.service
systemctl disable firewalld.service

[root@server1 ~]# systemctl disable firewalld.service

rm ‘/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service’

rm ‘/etc/systemd/system/basic.target.wants/firewalld.service’

[root@server1 ~]#

e desative o firewall.

Para verificar se o firewall foi realmente desativado, você pode executar

firewall-cmd –state

depois. A saída deve ser assim:

[root@server1 ~]# firewall-cmd –state
not running
[root@server1 ~]#

yum -y install net-tools NetworkManager-tui

5 Desativar SELinux

SELinux é uma extensão de segurança do CentOS que deve fornecer segurança estendida. Na minha opinião, você não precisa dele para configurar um sistema seguro, e geralmente causa mais problemas do que vantagens (pense nisso depois de ter feito uma semana de solução de problemas porque algum serviço não estava funcionando como esperado, e então você descobre que tudo estava ok, apenas o SELinux estava causando o problema). Portanto, eu o desativo (isso é obrigatório se você quiser instalar o ISPConfig mais tarde).

Edite /etc/selinux/config e defina SELINUX=disabled:

nano /etc/selinux/config

# Este arquivo controla o estado do SELinux no sistema.
# SELINUX= pode assumir um desses três valores:
#     enforcing - A política de segurança do SELinux é aplicada.
#     permissive - O SELinux imprime avisos em vez de aplicar.
#     disabled - Nenhuma política do SELinux é carregada.
SELINUX=disabled
# SELINUXTYPE= pode assumir um desses dois valores:
#     targeted - Processos direcionados são protegidos,
#     mls - Proteção de Segurança de Múltiplos Níveis.
SELINUXTYPE=targeted

Depois disso, devemos reiniciar o sistema:

reboot

6 Habilitar Repositórios Adicionais E Instalar Alguns Softwares

Vamos habilitar os repositórios EPEL em nosso sistema CentOS, pois muitos dos pacotes que vamos instalar ao longo deste tutorial não estão disponíveis nos repositórios oficiais do CentOS 7.0:

yum -y install epel-release

yum -y install yum-priorities

Edite /etc/yum.repos.d/epel.repo…

nano /etc/yum.repos.d/epel.repo

… e adicione a linha priority=10 à seção [epel]:

[epel]
name=Pacotes Extras para Linux Empresarial 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

[...]

Então atualizamos nossos pacotes existentes no sistema:

yum update

Agora instalamos alguns pacotes de software que são necessários mais tarde:

yum -y groupinstall ‘Development Tools’

7 Quota

(Se você escolheu um esquema de particionamento diferente do que eu, deve ajustar este capítulo para que a quota se aplique às partições onde você precisa dela.)

Para instalar quota, executamos este comando:

yum -y install quota

Agora verificamos se a quota já está habilitada para o sistema de arquivos onde o site (/var/www) e os dados do maildir (var/vmail) estão armazenados. Neste exemplo, tenho uma grande partição raiz, então procuro por ‘ / ‘:

mount | grep ‘ / ‘

[root@server1 ~]# mount | grep ‘ / ‘
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
[root@server1 ~]#

Se você tiver uma partição /var separada, então use:

mount | grep ‘ /var ‘

em vez disso. Se a linha contiver a palavra “ noquota “, então prossiga com os seguintes passos para habilitar a quota.

Habilitando quota na partição / (root)

Normalmente, você habilitaria a quota no arquivo /etc/fstab, mas se o sistema de arquivos for o sistema de arquivos raiz “/“, então a quota deve ser habilitada por um parâmetro de inicialização do Kernel Linux.

Edite o arquivo de configuração do grub:

nano /etc/default/grub

procure pela linha que começa com GRUB_CMDLINE_LINUX e adicione rootflags=uquota,gquota aos parâmetros da linha de comando para que a linha resultante fique assim:

[...]  
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto  vconsole.keymap=us rhgb quiet rootflags=uquota,gquota"  
[...]  

e aplique as alterações executando o seguinte comando.

cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak
grub2-mkconfig -o /boot/grub2/grub.cfg

e reinicie o servidor.

reboot

Agora verifique se a quota está habilitada:

mount | grep ‘ / ‘

[root@server1 ~]# mount | grep ‘ / ‘
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)
[root@server1 ~]#

Quando a quota está ativa, podemos ver “ usrquota,grpquota “ na lista de opções de montagem.

Habilitando quota em uma partição /var separada

Se você tiver uma partição /var separada, então edite /etc/fstab e adicione,uquota,gquota à partição / ( /dev/mapper/centos-var):

nano /etc/fstab

#
# /etc/fstab
# Criado pelo anaconda em Dom Set 21 16:33:45 2014
#
# Sistemas de arquivos acessíveis, por referência, são mantidos sob '/dev/disk'
# Veja as páginas de manual fstab(5), findfs(8), mount(8) e/ou blkid(8) para mais informações
#
/dev/mapper/centos-root /                       xfs     defaults        1 1
/dev/mapper/centos-var /var                     xfs     defaults,uquota,gquota        1 2
UUID=9ac06939-7e43-4efd-957a-486775edd7b4 /boot                   xfs     defaults        1 3
/dev/mapper/centos-swap swap                    swap    defaults        0 0

Então execute

mount -o remount /var

quotacheck -avugm
quotaon -avug

para habilitar a quota.

8 Sincronizar O Relógio Do Sistema

É uma boa ideia sincronizar o relógio do sistema com um servidor NTP ( n etwork t ime p rotocol) pela Internet. Basta executar

yum -y install ntp

e seu horário do sistema estará sempre sincronizado.

9 Instalar MariaDB

Vamos instalar o servidor e o cliente MariaDB da seguinte forma:

yum -y install mariadb mariadb-server

Queremos que o serviço Mariadb seja executado ao iniciar e iniciar o serviço como:

systemctl enable mariadb.service
systemctl start mariadb.service

Defina senhas para a conta root do MySQL:

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: linha 379: find_mysql_client: comando não encontrado

NOTA: É RECOMENDADO EXECUTAR TODAS AS PARTES DESTE SCRIPT PARA TODOS OS SERVIDORES MariaDB EM USO PRODUÇÃO!  LEIA CADA ETAPA CUIDADOSAMENTE!

Para fazer login no MariaDB para protegê-lo, precisaremos da senha atual para o usuário root.  Se você acabou de instalar o MariaDB e não definiu a senha root ainda, a senha estará em branco, então você deve apenas pressionar enter aqui. <–ENTER

Digite a senha atual para root (pressione enter para nenhum): <–ENTER
OK, senha usada com sucesso, prosseguindo…

Definir senha root? [Y/n] <–ENTER
Nova senha: <–suasenhadomariadb
Reinsira a nova senha: <–suasenhadomariadb
Senha atualizada com sucesso!
Recarregando tabelas de privilégios..
… Sucesso!

Por padrão, uma instalação do MariaDB tem um usuário anônimo, permitindo que qualquer um faça login no MariaDB sem precisar ter uma conta de usuário criada para eles.  Isso é destinado apenas para testes e para facilitar a instalação.  Você deve removê-los antes de entrar em um ambiente de produção.

Remover usuários anônimos? [Y/n] <–ENTER
… Sucesso!

Normalmente, o root deve ser permitido apenas conectar-se a partir de ‘localhost’.  Isso garante que alguém não possa adivinhar a senha root pela rede.

Desabilitar login remoto do root? [Y/n] <–ENTER
… Sucesso!

Por padrão, o MariaDB vem com um banco de dados chamado ‘test’ que qualquer um pode acessar.  Isso também é destinado apenas para testes e deve ser removido antes de entrar em um ambiente de produção.

Remover banco de dados de teste e acesso a ele? [Y/n] <–ENTER

  • Removendo banco de dados de teste…
    … Sucesso!
  • Removendo privilégios no banco de dados de teste…
    … Sucesso!

Recarregar as tabelas de privilégios garantirá que todas as alterações feitas até agora tenham efeito imediato.

Recarregar tabelas de privilégios agora? [Y/n] <–ENTER
… Sucesso!

Limpando…

Tudo pronto!  Se você completou todas as etapas acima, sua instalação do MariaDB agora deve estar segura.

Obrigado por usar o MariaDB!
[root@server1 ~]#

10 Instalar Dovecot

Dovecot pode ser instalado da seguinte forma:

yum -y install dovecot dovecot-pigeonhole dovecot-mysql

Crie um arquivo dovecot-sql.conf vazio e um link simbólico:

touch /etc/dovecot/dovecot-sql.conf
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf

Agora crie os links de inicialização do sistema e inicie o Dovecot:

systemctl enable dovecot.service
systemctl start dovecot.service

11 Instalar Postfix

Postfix pode ser instalado da seguinte forma:

yum -y install postfix

Em seguida, desative o Sendmail e inicie o Postfix:

systemctl enable mariadb.service
systemctl start mariadb.service
systemctl stop sendmail.service
systemctl disable sendmail.service
systemctl enable postfix.service
systemctl restart postfix.service

12 Instalar Getmail

Getmail pode ser instalado da seguinte forma:

yum -y install getmail

13 Instalar Amavisd-new, SpamAssassin e ClamAV

Para instalar amavisd-new, spamassassin e clamav, execute o seguinte comando:

yum -y install amavisd-new spamassassin clamav clamd clamav-update unzip bzip2 unrar perl-DBD-mysql

Edite o arquivo de configuração freshclam /etc/freshclam.conf

nano /etc/freshclam.conf

e comente a linha “Exemplo”

[….]

[….]

Então iniciamos freshclam, amavisd e clamd.amavisd:

sa-update
freshclam
systemctl enable amavisd.service

14 Instalar Nginx, PHP5 (PHP-FPM) e Fcgiwrap

O Nginx está disponível como um pacote para CentOS 7.0 (do EPEL) que podemos instalar da seguinte forma:

yum -y install nginx

Se o Apache2 já estiver instalado no sistema, pare-o agora…

systemctl stop httpd.service

… e remova os links de inicialização do sistema do Apache:

systemctl disable httpd.service

Então criamos os links de inicialização do sistema para o nginx e o iniciamos:

systemctl enable nginx.service
systemctl start nginx.service

(Se tanto o Apache2 quanto o nginx estiverem instalados, o instalador do ISPConfig 3 perguntará qual você deseja usar - responda nginx neste caso. Se apenas um desses dois estiver instalado, o ISPConfig fará a configuração necessária automaticamente.)

Podemos fazer o PHP5 funcionar no nginx através do PHP-FPM (PHP-FPM (FastCGI Process Manager) é uma implementação alternativa do PHP FastCGI com alguns recursos adicionais úteis para sites de qualquer tamanho, especialmente sites mais movimentados). Podemos instalar php-fpm junto com php-cli e alguns módulos PHP5 como php-mysql que você precisa se quiser usar MySQL em seus scripts PHP da seguinte forma:

yum -y install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-magickwand php-mbstring php-mcrypt php-mssql php-snmp php-soap php-tidy

Em seguida, abrimos /etc/php.ini…

nano /etc/php.ini

… e mudamos o relatório de erros (para que os avisos não sejam mais exibidos):

[...]
;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting = E_ALL & ~E_NOTICE
[...]

Também defina cgi.fix_pathinfo=0:

nano /etc/php.ini

[...]
; cgi.fix_pathinfo fornece suporte *real* para PATH_INFO/PATH_TRANSLATED para CGI.  O comportamento anterior do PHP era definir PATH_TRANSLATED como SCRIPT_FILENAME e não entender o que é PATH_INFO.  Para mais informações sobre PATH_INFO, veja as especificações cgi.  Definir isso como 1 fará com que o PHP CGI corrija seus caminhos para se conformar à especificação.  Um valor de zero faz com que o PHP se comporte como antes.  O padrão é 1.  Você deve corrigir seus scripts para usar SCRIPT_FILENAME em vez de PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]

(Leia http://wiki.nginx.org/Pitfalls para descobrir por que você deve fazer isso.)

Além disso, para evitar erros como

[08-Aug-2011 18:07:08] PHP Warning: phpinfo(): Não é seguro confiar nas configurações de fuso horário do sistema. Você é obrigado a usar a configuração date.timezone ou a função date_default_timezone_set(). Caso você tenha usado algum desses métodos e ainda esteja recebendo este aviso, você provavelmente digitou incorretamente o identificador do fuso horário. Selecionamos ‘Europe/Berlin’ para ‘CEST/2.0/DST’ em vez disso em /usr/share/nginx/html/info.php na linha 2

… em /var/log/php-fpm/www-error.log quando você chama um script PHP em seu navegador, você deve definir date.timezone em /etc/php.ini:

[...]
[Date]
; Define o fuso horário padrão usado pelas funções de data
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]

Em seguida, crie os links de inicialização do sistema para php-fpm e inicie-o:

systemctl enable php-fpm
systemctl restart php-fpm

O PHP-FPM é um processo daemon (com o script de inicialização /etc/init.d/php-fpm) que executa um servidor FastCGI na porta 9000.

Para obter suporte CGI no nginx, instalamos o Fcgiwrap.

O Fcgiwrap é um wrapper CGI que deve funcionar também para scripts CGI complexos e pode ser usado para ambientes de hospedagem compartilhada porque permite que cada vhost use seu próprio diretório cgi-bin.

Como não há pacote fcgiwrap para CentOS 7.0, devemos construí-lo nós mesmos. Primeiro, instalamos algumas dependências:

yum -y install fcgi-devel

Agora podemos construir o fcgiwrap da seguinte forma:

cd /usr/local/src/
git clone git://github.com/gnosek/fcgiwrap.git
cd fcgiwrap
autoreconf -i
./configure
make
make install

Isso instala o fcgiwrap em /usr/local/sbin/fcgiwrap.

Em seguida, instalamos o pacote spawn-fcgi que nos permite executar o fcgiwrap como um daemon:

yum -y install spawn-fcgi

Abra /etc/sysconfig/spawn-fcgi…

nano /etc/sysconfig/spawn-fcgi

… e modifique o arquivo da seguinte forma:

# Você deve definir algumas opções de trabalho antes que o serviço "spawn-fcgi" funcione.
# Se SOCKET aponta para um arquivo, então este arquivo é limpo pelo script de inicialização.
#
# Veja spawn-fcgi(1) para todas as opções possíveis.
#
# Exemplo :
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"

FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=apache
FCGI_GROUP=apache
FCGI_EXTRA_OPTIONS="-M 0770"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

Agora adicione o usuário nginx ao grupo apache:

usermod -a -G apache nginx

Crie os links de inicialização do sistema para spawn-fcgi…

chkconfig spawn-fcgi on

… e inicie-o da seguinte forma:

systemctl start spawn-fcgi

Agora você deve encontrar o socket fcgiwrap em /var/run/fcgiwrap.socket, pertencente ao usuário e grupo apache (alguns scripts, por exemplo, Mailman, esperam ser executados pelo usuário/grupo apache, é por isso que não executamos spawn-fcgi como usuário/grupo nginx, mas em vez disso adicionamos nginx ao grupo apache).

14.1 Versões Adicionais do PHP

A partir do ISPConfig 3.0.5, é possível ter várias versões do PHP em um servidor (selecionáveis através do ISPConfig) que podem ser executadas através do FastCGI e PHP-FPM. O procedimento para construir versões adicionais do PHP no CentOS é descrito neste tutorial: Como Usar Múltiplas Versões do PHP (PHP-FPM & FastCGI) Com ISPConfig 3 (CentOS 6.3)

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.