Linux下的本地Web服务器,具有自动主机生成和PHP版本切换功能

很可能,许多habrozhitel已经熟悉了本文的某些部分,但是在购买新的工作笔记本电脑时,我决定将所有谷物收集在一起,并组织一个方便的开发工具。 我经常不得不处理许多带有不同版本PHP的小型项目,经常将旧项目转换为新版本。 遥远的过去,当我是Windows用户时,我使用OpenServer。 但是,随着转向Linux,我缺乏创建主机和切换其中版本的简单性。 因此,我不得不在Linux上提供一个更加方便的解决方案=)

目标


  1. 在撰写本文时使用当前软件
  2. 为了区分本地域,我们将使用特殊的.loc
  3. 我们使用fast-cgi通过子域实现PHP版本切换
  4. 使用vhost_aliasdnsmasq自动创建主机

到底我们有什么。 切换到
56.test.loc
Apache将以PHP 5.6.36版本启动
/var/www/test.loc/public_html/index.php
将子域更改为
72 .test.loc
将启动相同的文件,但已经使用PHP 7.2.7版本

其他版本的交付方式如下所述。

要创建另一个站点,只需在/ var / www /中创建一个.loc结尾文件夹,其中应为public_html文件夹,该文件夹是该站点的根目录

仅此而已。 无需额外的折磨,重新启动和编辑配置,我们就有一个自动系统来处理站点。

我将在基于Ubuntu18.04的LinuxMint19上进行所有测试,因此一切都将相同。

首先,我们将提供必要的程序包

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

我们Postfix设置为包子,作为一种简单的解决方案(在安装向导中,默认情况下选择所有选项),以便从本地计算机发送邮件。

由于这是本地开发,因此我是唯一的用户。 对于我来说,将项目文件夹转移到主目录更加方便。 它安装有单独的驱动器,并在我重新安装系统时迁移。 最简单的方法是创建一个链接,然后您无需在设置中更改路径,并且每个人都熟悉该路径。

我们将由Apache创建的文件夹复制到主目录,在其位置创建一个链接,而不会忘记将用户更改为自己并与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 

创建一个文件夹,在该文件夹中我们将收集不同版本的PHP源代码

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

我们还需要CGI脚本的文件夹

 sudo mkdir /var/www/cgi-bin 

和运行时文件夹相同的脚本,具有权限

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


由于该目录位于RAM中,因此我们在系统启动时添加其创建内容,为此,我们将其添加至/etc/tmpfiles.d/fcgid.conf
  #Type Path Mode UID GID Age Argument d /var/run/mod_fcgid 0755 www-data www-data - - 


我的dnsmasq-base来自包装盒,如果没有,则可以随时发货。
 sudo apt install dnsmasq 

在其配置中添加一个规则。 可以找到dnsmasq.conf配置文件, 如下所示
 sudo updatedb locate dnsmasq.conf 

或者,如果它像我的一样是NetworkManager的一部分,则在/etc/NetworkManager/dnsmasq.d/local.conf中创建一个新的配置文件。
向其添加一行以将我们的本地域重定向到本地计算机。

 address=/loc/127.0.0.1 

您还需要启用必要的Apache模块

 sudo a2enmod fcgid vhost_alias actions rewrite 

初步准备已完成,我们将继续组装各种本地版本的PHP。 对于每个版本的PHP,请执行以下4个步骤。 例如5.6.36

1.下载所需版本的源代码并将其解压缩

 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.我们从源代码中收集了必要的PHP版本,并将其放在/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.在/var/www/cgi-bin/php-5.6.36.fcgi中创建一个CGI以处理此版本

 #!/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.使文件可执行

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

5.在/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.在/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> 

好吧,就是这样。 它仍然只是重新启动apache和dnsmasq并使用

 sudo service apache2 restart sudo service network-manager restart 

放入index.php新的测试站点phpinfo()并验证一切正常。

Source: https://habr.com/ru/post/zh-CN417177/


All Articles