Servidor web local no Linux, com aumento automático de host e alternância de versão PHP

Provavelmente, algumas partes deste artigo já são familiares para muitos habrozhitel, mas em conexão com a compra de um novo laptop de trabalho, decidi reunir todos os grãos e organizar uma ferramenta conveniente para o desenvolvimento. Muitas vezes tenho que trabalhar com muitos projetos pequenos, com diferentes versões do PHP, traduzir frequentemente projetos antigos para novas versões. No passado distante, quando eu era usuário do Windows, eu usava o OpenServer. Mas com a mudança para o Linux, eu não tinha a simplicidade de criar os hosts e alternar as versões que estavam nele. Portanto, tive que criar uma solução ainda mais conveniente no Linux =)

Objetivos


  1. Use o software atual no momento da escrita
  2. Para distinguir entre domínios locais, usaremos um domínio .loc especial
  3. Implementamos a troca de versão do PHP através de um subdomínio usando o fast-cgi
  4. Criação automática de host com vhost_alias e dnsmasq

O que temos no final. Ao mudar para
56.test.loc
O Apache será lançado com a versão 5.6.36 do PHP
/ var / www / test.loc /public_html/index.php
Alterando o subdomínio para
72 .test.loc
o mesmo arquivo será lançado, mas já com o PHP versão 7.2.7

Outras versões são entregues da mesma maneira descrita abaixo.

Para criar outro site, basta criar em / var / www / a pasta com o final .loc , dentro do qual deve estar a pasta public_html que é a raiz do site

Só isso. Como sem tormentos adicionais, reinicializações e configurações de edição, temos um sistema automático para trabalhar com sites.

Vou testar tudo isso no LinuxMint19, é baseado no Ubuntu18.04, para que tudo seja o mesmo.

Primeiro, iremos fornecer os pacotes necessários

sudo apt update sudo apt install build-essential pkg-config libxml2-dev libfcgi-dev apache2 libapache2-mod-fcgid postfix 

Definimos o Postfix como um bun, como uma solução simples (no assistente de instalação, selecione tudo por padrão) para enviar e-mails da máquina local.

Como este é um desenvolvimento local e eu sou o único usuário. É mais conveniente transferir a pasta do projeto para o meu diretório pessoal. Ele é montado em uma unidade separada e migra quando eu reinstalo o sistema. A maneira mais fácil é criar um link, então você não precisa alterar o caminho nas configurações e o caminho é familiar a todos.

Copiamos a pasta criada pelo Apache no diretório inicial, criamos um link em seu lugar, sem esquecer de mudar o usuário para si mesmo e trocar grupos com o Apache.

 sudo mv /var/www/ ~/www sudo ln -s ~/www /var/www sudo chown $USER:$USER -R ~/www sudo usermod -a -G www-data $USER sudo usermod -a -G $USER www-data 

Crie uma pasta na qual coletaremos fontes PHP para diferentes versões

 sudo mkdir /usr/local/src/php-build 

Também precisamos de pastas para scripts CGI

 sudo mkdir /var/www/cgi-bin 

E pasta de tempo de execução para os mesmos scripts, com direitos

 sudo mkdir /var/run/mod_fcgid sudo chmod 777 /var/run/mod_fcgid 


E como o diretório que temos está na RAM, adicionaremos sua criação na inicialização do sistema, para isso, adicionaremos ao /etc/tmpfiles.d/fcgid.conf
  #Type Path Mode UID GID Age Argument d /var/run/mod_fcgid 0755 www-data www-data - - 


Meu dnsmasq-base vem da caixa; caso contrário, ele sempre pode ser entregue.
 sudo apt install dnsmasq 

Adicione uma regra à sua configuração. Você pode encontrar o arquivo de configuração dnsmasq.conf como este
 sudo updatedb locate dnsmasq.conf 

Ou, se ele, como o meu, fizer parte do NetworkManager, crie um novo arquivo de configuração no /etc/NetworkManager/dnsmasq.d/local.conf
Adicione uma linha a ela para redirecionar nosso domínio local para a máquina local.

 address=/loc/127.0.0.1 

Você também precisa ativar os módulos Apache necessários

 sudo a2enmod fcgid vhost_alias actions rewrite 

Após a preparação preliminar, prosseguimos para a montagem de várias versões locais do PHP. Para cada versão do PHP, execute as 4 etapas a seguir. Por exemplo, 5.6.36

1. Baixe o código fonte da versão desejada e descompacte-o

 cd /usr/local/src/php-build sudo wget http://pl1.php.net/get/php-5.6.36.tar.bz2/from/this/mirror -O php-5.6.36.tar.bz2 sudo tar jxf php-5.6.36.tar.bz2 

2. Coletamos a versão necessária do PHP a partir da fonte e a colocamos em /opt/php-5.6.36

 sudo mkdir /opt/php-5.6.36 cd php-5.6.36 sudo ./configure --prefix=/opt/php-5.6.36 --with-config-file-path=/opt/php-5.6.36 --enable-cgi sudo make sudo make install sudo make clean 

3. Crie um CGI para lidar com esta versão em /var/www/cgi-bin/php-5.6.36.fcgi

 #!/bin/bash PHPRC=/opt/php-5.6.36/php.ini PHP_CGI=/opt/php-5.6.36/bin/php-cgi PHP_FCGI_CHILDREN=8 PHP_FCGI_MAX_REQUESTS=3000 export PHPRC export PHP_FCGI_CHILDREN export PHP_FCGI_MAX_REQUESTS exec /opt/php-5.6.36/bin/php-cgi 

4. Tornando o arquivo executável

 sudo chmod +x /var/www/cgi-bin/php-5.6.36.fcgi 

5. Adicione uma ação para lidar com cada versão no /etc/apache2/mods-available/fcgid.conf

 <IfModule mod_fcgid.c> AddHandler fcgid-script fcg fcgi fpl Action application/x-httpd-php-5.6.36 /cgi-bin/php-5.6.36.fcgi AddType application/x-httpd-php-5.6.36 .php #Action application/x-httpd-php-7.2.7 /cgi-bin/php-7.2.7.fcgi #AddType application/x-httpd-php-7.2.7 .php FcgidIPCDir /var/run/mod_fcgid FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm FcgidConnectTimeout 20 <IfModule mod_mime.c> AddHandler fcgid-script .fcgi </IfModule> </IfModule> 

6. Adicione uma regra para processar cada versão no /etc/apache2/sites-available/000-default.conf

 <VirtualHost *:80> # ServerNam ServerAlias *.loc #  CGI  ScriptAlias /cgi-bin /var/www/cgi-bin # DocumentRoot VirtualDocumentRoot /var/www/%2+/public_html #     <Directory /var/www/*.loc/> Options +ExecCGI -Indexes AllowOverride All Order allow,deny Allow from all <FilesMatch \.php$> #       <If "%{SERVER_NAME} =~ /56\..*?\.loc/"> SetHandler application/x-httpd-php-5.6.36 </If> <Else> # ,    ,    SetHandler application/x-httpd-php-7.2.7 </Else> </FilesMatch> </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> 

Bem, é isso. Resta apenas reiniciar o apache e o dnsmasq e usar

 sudo service apache2 restart sudo service network-manager restart 

Coloque no novo site de teste index.php phpinfo () e verifique se tudo funciona.

Source: https://habr.com/ru/post/pt417177/


All Articles