49. Instalando e configurando LAMP: plataforma de desenvolvimento web de código aberto

LAMP stack

LAMP é um acrônimo para o conjunto de soluções, softwares e tecnologias (stack) de código aberto mais frequentemente usados pelas aplicações mais populares na web. Ou seja, é uma plataforma de desenvolvimento web de código aberto que usa Linux como sistema operacional, Apache como servidor Web, MySQL (ou MariaDB) como sistema de gerenciamento de banco de dados relacional e PHP (ou Perl e Python) como linguagem de script orientada a objetos. No Windows é chamado de WAMP, no Macintosh de MAMP e no Solaris de SAMP.

Linux

Parto do pressuposto que você está utilizando um Sistema Operacional Linux Debian ou derivado.

Apache

Apache HTTP Server ("httpd"), também chamado de Apache2, é o servidor web (http), é ele que permite exibir páginas web no navegador. Instalamos com um:

$ sudo apt install apache2

Agora vamos configurar nosso servidor:

$ sudoedit /etc/apache2/apache2.conf

Procurar:

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Alterar para:

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

Melhorando a segurança:

$ sudoedit /etc/apache2/conf-available/security.conf

Essas opções abaixo não são contíguas, mas são fáceis de achar, o arquivo é curto:

ServerTokens OS
ServerSignatures on
#RedirectMatch 404 /\.git
#RedirectMatch 404 /\.svn

Alterar para:

ServerTokens Prod
ServerSignatures off
RedirectMatch 404 /\.git
RedirectMatch 404 /\.svn

Melhorando a indexação

Seria interessante que, quando você optar por listar um diretório no seu servidor, que as pastas sejam listadas primeiro, e os arquivos depois:

$ sudoedit /etc/apache2/mods-available/autoindex.conf

Procurar:

IndexOptions FancyIndexing VersionSort HTMLTable NameWidth=* DescriptionWidth=* Charset=UTF-8

Alterar para:

IndexOptions FancyIndexing VersionSort HTMLTable NameWidth=* DescriptionWidth=* Charset=UTF-8 FoldersFirst

Permissões e proprietário

Definindo proprietário e permissões das pastas, para facilitar a administração:

$ sudo chown -R www-data:www-data /var/www/html
$ sudo chmod 775 -R /var/www/html
$ sudo adduser $USER www-data

Todos os sites recomendam isso feito acima: definir o proprietário e grupo como sendo www-data, de modo que o usuário e membros desse grupo tenham permissões totais (77) e os outros permissões de leitura e execução (5). Por fim, seu usuário padrão de sistema fará parte deste grupo www-data e, em tese, terá permissões plenas.

Eu não fiz isso, eu preferi definir a pasta /var/www/html par ao meu usuário mesmo.

Outras configurações úteis do Apache:

Habilitar o modo de rescrita de para usar URLs amigáveis:

$ sudo a2enmod rewrite

Habilitar mod_ssl:

$ sudo a2enmod ssl

Habilitar o Expires: útil para melhorar o tempo de carregamento do site:

$ sudo a2enmod expires

Habilitar a compressão GZip:

$ sudo a2enmod deflate

Reiniciando

Agora só nos resta finalizar a configuração do Apache reiniciando o serviço:

$ sudo systemctl restart apache2

MySQL / MariaDB

Nosso banco de dados. O MariaDB é um fork do MySQL, e é considerado superior em muitos aspectos, e também bastante compatível. Os comandos são praticamente os mesmos, e você pode importar um banco de dados em outro. Acho melhor instalar logo o MariaDB, se não estiver disponível, aí sim instale o MySQL. Uma solução simples é usar "pipe duplo" (|| = ou) para dizer: "instale isso, se não conseguir instale esse outro".

$ sudo apt install mariadb-server || sudo apt install mysql-server

Configurando:

$ sudo mysql_secure_installation

Responda o questionário dessa forma:

Enter current password for root (enter for none): ******
Switch to unix_socket authentication [Y/n]        n (se já tiver root)
Change the root password? [Y/n]                   n (se já tiver root)
Remove anonymous users? [Y/n]                     y
Disallow root login remotely? [Y/n]               y (só conecta em localhost)
Remove test database and access to it? [Y/n]      y
Reload privilege tables now? [Y/n]                y

Você pode começar verificando o status do serviço MariaDB: se não estiver habilitado (enable), habilite-o, se não estiver iniciado (running) inicie-o ou, se já estiver rodando, reinicie-o.

$ sudo systemctl status mariadb
$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb
$ sudo systemctl restart mariadb

Agora que está configurado de forma básica, deveríamos criar uma conta de administrador, para não ter que ficar logando como root, porque isso é perigoso. O administrador terá os mesmos poderes do root. No nosso exemplo será adminserver. Recomenda-se não usar um nome óbvio para essa conta.

Primeiro teremos que logar como root. Podemos fazê-lo de duas formas: uma com sudo e outra sem.

$ sudo mysql -u root

ou

$ mysql -u root -p

No primeiro caso, você digita sua senha para superusuário, no segundo digita a senha fornecida no questionário acima. Dentro do MariaDB, crie o administrador extra, substituindo adminserver e senha. Todos os sites sobre MySQL mostram os comandos em caixa alta, isso deve ser uma herança dos sistemas antigos, tipo Cobol, mas você não precisa fazer isso hoje em dia.

> GRANT ALL ON *.* TO 'adminserver'@'localhost' IDENTIFIED BY 'senha' WITH GRANT OPTION;
> FLUSH PRIVILEGES;
> exit
$ sudo systemctl restart mariadb

Vamos entrar com o administrador que não é o root, aquele criado acima:

$ mysql -u adminserver -p

Listar bancos de dados:

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| phpmyadmin         |
| sys                |
+--------------------+
5 rows in set (0,002 sec)

Acessar (usar) um banco de dados:

MariaDB [(none)]> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Listar tabelas de um banco de dados:

MariaDB [mysql]> SHOW TABLES;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| column_stats              |
| columns_priv              |
           (...)
| transaction_registry      |
| user                      |
+---------------------------+
50 rows in set (0,000 sec)

Esse lista usuários do banco "mysql". Se já estiver conectado ao banco (USE mysql;), você poderá omitir "mysql", digitando apenas SELECT user FROM user;.

MariaDB [mysql]> SELECT user FROM mysql.user;
+---------------+
| User          |
+---------------+
| mariadb.sys   |
| phpmyadmin    |
| root          |
+---------------+
3 rows in set (0,001 sec)

A mesma coisa, mas com uma lista mais detalhada:

MariaDB [mysql]> SELECT User, Host, authentication_string, Grant_priv FROM mysql.user;
+---------------+-----------+-------------------------------------------+------------+
| User          | Host      | authentication_string                     | Grant_priv |
+---------------+-----------+-------------------------------------------+------------+
| mariadb.sys   | localhost |                                           | N          |
| phpmyadmin    | localhost | *1DE1BE60A6A010CD16BC4DC9FC2E71A863571302 | Y          |
| root          | localhost | *EEFADA5095EA8B09CEBCD9411933393377AA392A | Y          |
+---------------+-----------+-------------------------------------------+------------+
3 rows in set (0,001 sec)

Outros comandos básico muito úteis:

Parece que está tudo funcionando? Então vamos criar um usuário capaz de acessar um banco de dados específico. Com poderes de acesso total somente àquele banco de dados. Isso será útil para aplicações como Wordpress e MediaWiki.

> GRANT ALL ON banco_de_dados.* TO 'novo_usuário'@'localhost' IDENTIFIED BY 'senha' WITH GRANT OPTION;
> FLUSH PRIVILEGES;

Para alterar a senha:

> ALTER USER 'usuário'@'host' IDENTIFIED BY 'senha';

Para encerrar, pode ser que você precisa deletar um usuário. Para identificar o host, só usar aquele comando de listar usuários mostrado nos nossos testes:

> DROP USER 'usuário'@'host';

Instalando e configurando o phpMyAdmin

O phpMyAdmin é um excelente gerenciador de banco de dados para servidores. Facilita muito o trabalho de editar, criar e apagar bancos de dados e tabelas, além de adicionar ou remover campos e dados. Evita ter que rodar comandos SQL no terminal, o que pode ser pouco produtivo.

$ sudo apt install phpmyadmin
  • Na seleção do web server, escolha apache2. Aviso: quando o prompt aparecer, o "apache2" estará destacado, mas não estará selecionado. Se você apertar a tecla ESPAÇO para selecionar o Apache, o instalador não irá mover os arquivos necessários durante a instalação. Aperte as teclas ESPAÇO, TAB e, então, ENTER para selecionar o Apache.
  • Selecione "Yes" quando indagado se usará o dbconfig-common para configurar o banco de dados.
  • Será solicitado que escolha e confirme a senha do aplicativo MySQL para o usuário phpmyadmin.

Habilite mbstring:

$ sudo phpenmod mbstring

Alternativamente, você pode usar php -m para listar todos os módulos ativos. Se o mbstring estiver na lista ele estará ativo.

Reinicie o Apache, porque configuramos o phpMyAdmin para funcionar com ele:

$ sudo systemctl restart apache2

Acesse pelo url http://localhost/phpmyadmin.

PHP

Desculpem, não vou falar de Perl e Python. Vamos instalar o PHP:

$ sudo apt install php libapache2-mod-php php-mysql

Vamos configurar o mínimo necessário para usar o PHP de forma adequada. Procure pelo arquivo php.ini, a localização dele dependerá da versão instalada do PHP, a minha é a 8.4, então ele está em /etc/php/8.4/apache2/php.ini. A melhor forma de encontrá-lo será usando comando locate:

Se procurarmos apenas pelo php.ini vamos achar muitas versões, mas queremos apenas aquela relacionada com apache2:

$ locate apache2/php.ini
/etc/php/8.4/apache2/php.ini

E vamos editá-lo:

$ sudoedit /etc/php/8.4/apache2/php.ini

Procure por essas configurações (não contíguas):

;date.timezone =
;intl.default_locale =
upload_max_filesize = 2M
post_max_size = 8M
;max_input_vars = 1000

E altere para:

date.timezone = America/Sao_Paulo
intl.default_locale = pt_BR.UTF-8
upload_max_filesize = 200M
post_max_size = 200M
max_input_vars = 5000

Repare que os ponto-vírgula ";" são comentários, retire-os da frente daquelas propriedades que vamos alterar. Nas propriedades com valores em bytes, podemos usar as diretivas PHP para valores de bytes abreviados: K (para Kilobytes), M (para Megabytes) e G (para Gigabytes), todos insensíveis a maiúsculas e minúsculas. Números sem letras são bytes puros. 1M é igual a um Megabyte ou 1.048.576 bytes. 1K é igual a um Kilobyte ou 1.024 bytes. Reinicie.

$ sudo systemctl restart apache2

Desinstalando versões antigas do PHP

Para desinstalar uma versão antiga do PHP no seu sistema:

$ sudo apt purge php8.2\*

Pode ser preciso remover também os arquivos de configuração:

$ sudo rm -r /etc/php/8.2

Comentários