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>
          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>
          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

      • https://httpd.apache.org/download.cgi
      • https://e-tinet.com/linux/servidor-apache/
      • https://www.tecmint.com/redirect-http-to-https-on-apache/
      • https://www.digitalocean.com/community/tutorials/how-to-create-a-ssl-certificate-on-apache-for-ubuntu-14-04
      • https://book.cakephp.org/4/en/installation.html

      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: 

      Docker: Comandos basicos

      O processo de instalação no Ubuntu e derivados você pode encontrar aqui e para Windows aqui.

      Sintaxe do comando Docker: 

      usuario@host# docker [OPTIONS] COMMAND [ARG...]

      O docker é uma CLI (comand-line interface).

      usuario@host# docker --version
      Docker version 19.03.5, build 633a0ea838

      O –version é uma opção. Para ver outras opções execute o comando man docker

      usuario@host# docker run hello-world

      O run é um comando do docker. Ao executar esse comando, caso a imagem hello-world não exista na sua máquina, o docker solicita ao docker hub e baixa a imagem

      Listar os containers em execução

      docker ps

      Listar todos os containers da máquina

      docker ps -a

      Na saída do comando, cada coluna tem seu significado:
      IMAGE -> imagem que esse container utilizou 
      COMMAND -> O comando que foi executado
      PORTS -> Se o container estiver respondendo em uma porta, aparecerá aqui.
      NAMES -> Se não for dado um nome ao container o docker dará um nome a ele.

      Listar as imagens da minha máquina

      docker images

      Na saída do comando, cada coluna tem seu significado:
      REPOSITORY -> Nome da imagem
      TAG -> versão da imagem

      Criar um container com interatividade, terminal e dando um nome

      docker run -ti --name [nome] [nome-da-imagem] /bin/bash

      Exemplo: docker run -ti –name desenvolvimento ubuntu /bin/bash

      O /bin/bash é um comando que eu posso executar ao rodar o container.

      O –name [nome] é um nome que você pode dar para o container.

      Criar e executar um container em background (demon)

      docker run -d [imagem]

      Criar um container com limitação de memória

      docker run -ti --memory 512m --name teste ubuntu 

      Criar um container a partir de uma versão específica de imagem

      docker run [nome-da-imagem]:[versao]
      Exemplo: docker run centos:7

      Finalizar o container por dentro

      CTRL+D

      Esse atalho finaliza o  processo principal do container e por conseguinte encerra o finaliza.

      Sair do container sem finalizar

      CTRL+P+Q

      Entrar em um container já em execução

      docker attach [CONTAINER ID | NOME-CONTAINER]

      Dar um STOP no container

      docker stop [CONTAINER ID | NOME-CONTAINER]

      Dar um START em um container ‘stopado’

      docker start [CONTAINER ID | NOME-CONTAINER]

      Dar um PAUSE no container

      docker pause [CONTAINER ID | NOME-CONTAINER]

      Despausar um container

      docker unpouse  [CONTAINER ID | NOME-CONTAINER]

      Saber o consumo de recursos do container

      docker stats  [CONTAINER ID | NOME-CONTAINER]

      Saber o consumo dos processos rodando no container

      docker top [CONTAINER ID | NOME-CONTAINER]

      Listar os logs do container

      docker logs [CONTAINER ID | NOME-CONTAINER]

      Remover um container

      docker rm [CONTAINER ID | NOME-CONTAINER]

      Se o container estiver em execução você precisa acrescentar o parametro -f:

      docker rm -f [CONTAINER ID | NOME-CONTAINER]

      Saber todas as informações sobre um container

      docker inspect [CONTAINER ID | NOME-CONTAINER]

      Criar um container passando um volume

      docker run -ti -v /volume [nome-da-imagem] [comando]

      Descobrir onde está o diretório no HOST-DOCKER que foi criado o volume

      docker inspect -f {{.Mounts}} [CONTAINER ID | NOME-CONTAINER]

      Criar um container mapeando um diretório local para um volume dentro do container

      docker run -ti -v /diretorio-no-host-docker:/volume [nome-da-imagem] [comando]

      Referências

      Descomplicando o docker v1 (Linux Tips)