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

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
Postar um comentário