Instalação do Apache no Amazon Linux 2023 + Let’s Encrypt

Instalando o Apache

Atualizando os programas instalados

sudo dnf update -y

Instalando o Apache e módulos necessários.

sudo dnf install -y httpd mod_ssl

Caso seja necessário, o comando abaixo cria o arquivo que carrega o mod_ssl.so

sudo echo “LoadModule ssl_module modules/mod_ssl.so” > /etc/httpd/conf.modules.d/00-ssl.conf

Configurando o Apache a iniciar com o sistema operacional

sudo systemctl enable httpd

Verificando se realmente ele está executando

sudo systemctl is-enabled httpd

Nesse momento o Apache já está funcionando.
Acessando http://localhost ou http://seudominio.com  deve aparecer a mensagem “It works!”.

Estrutura de arquivos do Apache

Documento root: /var/www/html
Arquivos de configuração: /etc/httpd
Arquivo de configuração do Apache: /etc/httpd/conf/httpd.conf
Arquivo de configuração do virtualhost (seu site). Se ele não existir, você deve criá-lo:
/etc/httpd/conf.d/seusite.conf

Conteúdo inicial do arquivo seusite.conf:

<VirtualHost *:80>

</VirtualHost>

Atenção

Se você for utilizar o Let’s Encrypt, não adicione configurações de redirecionamento no arquivo acima. O Certbot, no processo de instalação do certificado pode causar erro, argumentando que ele poderia gerar loops de redirect. Isso acontece porque ele em seu processo cria a configuração de redirecionamento de HTTP para HTTPS.

Instalando o Certbot para geração de certificado digital

A Let’s Encrypt utiliza a ferramenta Certbot para automatizar a geração do certificado. Logo, precisamos instalar o Certbot no Amazon Linux. A instalação fica mais fácil utilizando o Pip, o gerenciador de pacote do Python.

Para instalar o Pip, o Certbot e gerar o certificado, basta seguir o passo a passo da documentação: https://certbot.eff.org/instructions?ws=apache&os=pip

Configurando o redirecionamento de www.dominio.com para dominio.com

Essa configuração está considerando que o seu domínio utiliza https://

Zona de DNS

Criar no zona de DNS um registro CNAME apontando o www.dominio.com para dominio.com. Exemplo no Route 53 da AWS: 

Módulo Rewrite do Apache

O rewrite_module já vem habilitado no arquivo /etc/httpd/conf.modules.d/00-base.conf .
Caso não esteja, você só precisa adicionar ao arquivo 00-base.conf, a linha abaixo:

LoadModule rewrite_module modules/mod_rewrite.so

Adicionar configuração no arquivo meudominio-le-ssl.conf, dentro da seção
<VirtualHost *:443>[..]</VirtualHost> :

<Directory /var/www/html>
    Options FollowSymLinks
    AllowOverride All
    Order Allow,Deny
    Allow from all
</Directory>

Criando o redirecionamento

Criando o arquivo .htaccess

sudo vim /var/www/html/.htaccess

Conteúdo do arquivo .htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

Referências

Instalando drive PDO PHP do SQL Server no Linux

Instalando o PHP

sudo add-apt-repository ppa:ondrej/php -y
sudo apt-get update
sudo apt-get install php8.1 php8.1-dev php8.1-xml -y --allow-unauthenticated

Instalando os pré requisitos (Ubuntu 16.04 18.04 20.04 22.04)

sudo curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

sudo curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list > /etc/apt/sources.list.d/mssql-release.list

Instalando o ODBC do SQL Server 17

sudo apt update
sudo ACCEPT_EULA=Y apt install -y msodbcsql17
sudo apt install unixodbc-dev

Opcional: Para usar ferramentas como BCP e SQLcmd

sudo ACCEPT_EULA=Y apt-get install -y mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

Instalando o driver PDO do SQL Server no PHP

sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv

Setando a configuração do driver

sudo printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/8.1/mods-available/sqlsrv.ini

sudo printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/8.1/mods-available/pdo_sqlsrv.ini

Habilitando a configuração

sudo phpenmod -v 8.1 sqlsrv pdo_sqlsrv

Se estiver usando Apache, ele deve ser reiniciado

sudo service apache2 restart

Referências

Configurando variáveis de ambiente no Apache

Criando no um arquivo separado com somente com as variáveis

sudo vim /etc/apache2/conf-available/env-vars.conf

Definindo as variáveis no arquivo

SetEnv PASS_DB "senhaBemForte"
SetEnv USER_DB "stringAleatoria"
SetEnv TESTE "olha o teste"

Habilitando a configuração

sudo a2enconf env-vars

Reiniciando o Apache

sudo systemctl reload apache2

Observações

  • Fique atento às brechas de segurança da sua aplicação. As variáveis criadas podem ser acessadas via <?=phpinfo();?> , leia esse post.
  • Se você estiver usando o PHP-FPM essas variáveis não serão enxergadas pelo PHP.

Referências

    • https://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv
    • https://docstore.mik.ua/orelly/linux/apache/ch04_06.htm
    • https://www.doppler.com/blog/configuring-php-applications-using-environment-variables
    • https://stackoverflow.com/questions/6554583/how-secure-is-storing-db-variables-with-setenv-or-in-php-ini
    • https://imasters.com.br/desenvolvimento/protegendo-seus-dados-utilizando-variaveis-de-ambiente
    • https://www.linode.com/community/questions/23444/how-do-i-access-environment-variables-set-in-conf-file-in-php-code

    Instalando o Apache2 e configurando SSL/TLS

    Instalando o Apache2

    sudo apt install apache2

    Copie os arquivos do seu projeto para o Document root do Apache: /var/www/html

    Altere as permissões de dono e grupo para o usuário do apache: 

    sudo chown -R www-data:www-data /var/www/html/

    Aplicando URL Rewriting

    Avalie se para o seu caso o rewrite é aplicável.
    Ativando o mod_rewrite

    sudo a2enmod rewrite

    Apache rodando sem SSL/TLS, edite o arquivo:

    /etc/apache2/sites-available/000-default.conf

    Dentro do bloco de código <VirtualHost *:80> </VirtualHost> , insira a configuração a seguir. O bloco deve ficar mais ou menos assim:

    <VirtualHost *:80>
      <Directory />
        Options FollowSymLinks
        AllowOverride All
      </Directory>
      <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Order Allow,Deny
        Allow from all
      </Directory>
    </VirtualHost>

    Apache rodando com SSL/TLS, edite o arquivo:

    /etc/apache2/sites-available/000-default-ssl.conf

    Obs: Pode haver variação no nome desse arquivo dependendo de como foi configurado o ssl/tls.

    Dentro do bloco de código <VirtualHost *:443> </VirtualHost>, insira a configuração abaixo:

    <VirtualHost *:443>
      <Directory />
        Options FollowSymLinks
        AllowOverride All
      </Directory>
      <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Order Allow,Deny
        Allow from all
      </Directory>
    </VirtualHost>

    Reinicie o Apache2

    sudo systemctl restart apache2

    Configurando a criptografia na comunicação  (certificado digital/HTTPS/TLS/SSL)


    Com Let’s Encrypt

    Siga os passos descritos no site da organização https://letsencrypt.org/getting-started/ .Geralmente instalar usando o https://certbot.eff.org/ dá certo.

    Observação

    Quando tentei instalar o certificado em instâncias da AWS, utilizando o DNS público da instância, exemplo ec2-52-548-54-242.compute-1.amazonaws.com, não deu certo.

    Criando o seu certificado

    Habilitando o módulo ssl

    sudo a2enmod ssl

    Reiniciando o Apache2

    sudo systemctl restart apache2

    Criando a pasta onde ficará armazenado os arquivos do certificados:

    sudo mkdir /etc/apache2/ssl

    Criando os arquivos da chave e certificado

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

    Durante o processo de criação, irão aparecer algumas perguntas para você responder, a mais importante é “Common Name (e.g. server FQDN or YOUR name)”, insira o nome do seu domínio ou o IP público do seu servidor WEB.

    Edite o arquivo de configuração do ssl:

    sudo vim /etc/apache2/sites-available/default-ssl.conf

    Sem os comentários, ele deve estar mais ou menos assim:

    <IfModule mod_ssl.c>
       <VirtualHost _default_:443>
       	ServerAdmin webmaster@localhost
       	DocumentRoot /var/www/html
       	ErrorLog ${APACHE_LOG_DIR}/error.log
       	CustomLog ${APACHE_LOG_DIR}/access.log combined
       	SSLEngine on
       	SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
       	SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
       	<FilesMatch "\.(cgi|shtml|phtml|php)$">
               	SSLOptions +StdEnvVars
       	</FilesMatch>
       	<Directory /usr/lib/cgi-bin>
               	SSLOptions +StdEnvVars
       	</Directory>
       </VirtualHost>
    </IfModule>

    Edite o arquivo para ele ficar assim:

    <IfModule mod_ssl.c>
    	<VirtualHost default:443>
        	 ServerAdmin admin@example.com
        	 ServerName your_domain.com
        	 ServerAlias www.your_domain.com
        	 DocumentRoot /var/www/html
        	 ErrorLog ${APACHE_LOG_DIR}/error.log
        	 CustomLog ${APACHE_LOG_DIR}/access.log combined
        	 SSLEngine on SSLCertificateFile /etc/apache2/ssl/apache.crt
        	 SSLCertificateKeyFile /etc/apache2/ssl/apache.key
        	<FilesMatch ".(cgi|shtml|phtml|php)$">
            	SSLOptions +StdEnvVars
        	</FilesMatch>
        	<Directory /usr/lib/cgi-bin>
            	SSLOptions +StdEnvVars
        	</Directory>
    	</VirtualHost>
    </IfModule>

    Habilitando a configuração

    sudo a2ensite default-ssl.conf

    Reiniciando o Apache2

    sudo systemctl restart apache2

    Ativando redirecionamento HTTP para HTTPS

    Ativando o redirecionamento usando virtualHost

    Edite o arquivo:

    sudo vim /etc/apache2/sites-available/000-default.conf

    Adicione a linha no bloco <VirtualHost *:80> </VirtualHost> e salve.

    Redirect / https://seu-dominio-aqui.com

    Reiniciando o Apache2

    sudo systemctl restart apache2

    Trabalhando as permissões de arquivo

    Alterando a propriedade e grupo da pasta /var/www/html/ para o usuário do apache: 

    sudo chown -R www-data:www-data /var/www/html/

    Alterando as permissões de acesso da pasta.
    Obs: Esse nível de acesso pode variar conforme a sua necessidade.

    sudo chmod -R 750 /var/www/html/

    Debugando problemas

    Para acompanhar as requisições que estão chegando:

    tail -f /var/log/apache2/access.log

    Para acompanhar os erros:

    tail -f /var/log/apache2/error.log

    Referências

    Criando alias no Linux

    Alias são “apelidos” que podemos dar a um comando, que geralmente é grande e queremos evitar de digitar toda vez. No meu caso é cd /var/www/html.

    Para saber quais alias estão ativos, use o comando: 

    alias

    Para criar um alias novo:

    alias <apelido>=”<comando a ser executado>”

    Exemplo usando o meu caso:

    alias @=”cd /var/www/html”  OU  alias www=”cd /var/www/html”

    Ao digitar @ ou www, e pressionar Enter no terminal, o comando cd /var/www/html será executado.

    Para excluir um aliás:

    unalias <nome do alias>

    Exemplo: 

    unalias www

    Para deixar persistente o alias no seu usuário do S.O, crie o arquivo /home/seu-user/.bash_aliases e insira no arquivo os alias criados.

    Exemplo de arquivo .bash_aliases:

    alias @="cd /var/www/html"
    alias ..="cd ../"

    Referências: