- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经在我的服务器上安装了 5.6 和 7.0 这两个版本的 php。我可以在版本之间切换,但我想通过 vhost 设置 php 版本。默认版本是 php 5.6。下面是我的虚拟主机示例:
<VirtualHost *:80>
ServerName example.com
DocumentRoot "/var/www
PHPINIDir /etc/php/7.0/cli/
<Directory "var/www">
AllowOverride all
DirectoryIndex index.php
</Directory>
</VirtualHost>.
phpinfo()
仍然显示 5.6 版本,但加载的配置文件来自 php 7.0。我正在使用 Debian 8。
最佳答案
首先,apache中没有办法同时启用两个不同的mod_php,所以我描述了通过mod_fcgid和SUexec来配置php-fastcgi的方法。此外,我假设您从 dotteb 安装 php7.0。
首先,您需要安装所需的包:
# apt-get install libapache2-mod-fcgid php5-cgi php7.0-cgi apache2-suexec
然后我们需要启用必需的 apache 模块并禁用不需要的:
# a2enmod suexec
# a2dismod php5
# a2dismod php7.0
然后创建用户和虚拟主机目录:
# useradd site1 -s /sbin/nologin -d /var/www/html/site1 -m
# useradd site2 -s /sbin/nologin -d /var/www/html/site2 -m
PHP 脚本将从这些用户处执行。因此建议拥有该用户和组的所有站点数据。
然后我们创建一个 php runners - 我们不能只使用 /usr/bin/php5-cgi
,SUExec 出于安全原因将禁止它:脚本运行器应该驻留在 SUExec 文档根目录中,它可以通过在 AP_DOC_ROOT 行中运行 suexec -V
# /usr/lib/apache2/suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="www-data"
-D AP_LOG_EXEC="/var/log/apache2/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=100
-D AP_USERDIR_SUFFIX="public_html"
SUexec 还会检查脚本运行器的权限,所以我们将这个运行器放在网站所有者主目录的子目录 cgi-bin 中(您可以将此名称更改为任何其他名称,这只是约定):
# mkdir -p /var/www/html/site1/cgi-bin /var/www/html/site2/cgi-bin
然后为第一个站点创建运行程序(使用 php5):
# cat <<-EOF >/var/www/html/site1/cgi-bin/php
#!/bin/sh
exec /usr/lib/cgi-bin/php5
EOF
您还可以为 php 或特定的 php.ini 指定额外的环境参数(通过导出环境变量,例如 PHP_FCGI_MAX_REQUESTS
)
然后是第二个站点(使用 php7):
# cat <<-EOF >/var/www/html/site2/cgi-bin/php
#!/bin/sh
exec /usr/lib/cgi-bin/php7.0
EOF
在脚本运行器上设置可执行标志:
# chmod 755 /var/www/html/site2/cgi-bin/php /var/www/html/site1/cgi-bin/php
文档根目录和测试脚本:
# mkdir -p /var/www/html/site1/data /var/www/html/site2/data
# echo -e "<?php\nphpinfo();" > /var/www/html/site1/data/test.php
# echo -e "<?php\nphpinfo();" > /var/www/html/site2/data/test.php
设置站点中文件的所有权:
# chown -R site1:site1 /var/www/html/site1
# chown -R site2:site2 /var/www/html/site2
最后我们为两个站点创建虚拟主机,首先是 site1:
# cat <<EOF > /etc/apache2/sites-available/site1.conf
<VirtualHost *:80>
ServerName site1.example.com
DocumentRoot "/var/www/html/site1.data"
<IfModule mod_fcgid.c>
SuexecUserGroup site1 site1
<Directory /var/www/html/site1/data>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/html/site1/cgi-bin/php .php
Order allow,deny
Allow from all
</Directory>
</IfModule>
</VirtualHost>
EOF
然后是 site2
# cat <<EOF > /etc/apache2/sites-available/site2.conf
<VirtualHost *:80>
ServerName site2.example.com
DocumentRoot "/var/www/html/site2/data"
<IfModule mod_fcgid.c>
SuexecUserGroup site2 site2
<Directory /var/www/html/site2/data>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/html/site2/cgi-bin/php .php
Order allow,deny
Allow from all
</Directory>
</IfModule>
</VirtualHost>
EOF
然后只需通过a2ensite site1
和a2ensite site2
启用站点,最后重启apache:systemctl restart apache2
。如果一切正常 - apache 应该成功重启,你可以通过浏览器检查这个主机是否有不同版本的 php 或者只是 curl curl -s -H 'Host: site1.example.com' http://localhost/测试.php
如果出现问题,您始终可以检查 systemctl status apache
的输出(以防 apache 未启动),或 /var/log/apache2/suexec.log
(以防您看到 500 Internal server error),或/var/log/apache2/error.log(以防一般错误)。
希望对你有帮助
关于vhost 的 Php 版本,apache2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38699846/
如何注释掉 vhosts 文件中的一段文本? 我是否必须在每一行前面放置磅/哈希符号 (#)? 最佳答案 是的,您必须在要注释掉的所有行之前放置磅/哈希符号 ( # )。没有“块注释”标签/符号。 某
我正在尝试通过非标准端口(8787)上的 Apache(ubuntu 14.04 LTS 上的 v2.4.7)为 2 个站点提供服务。这是为了适应代理设置(我让 nginx 在同一台专用服务器上的端口
我有一个现有的服务器,该服务器运行良好,使用 nginx 和 ISPconfig 托管多个站点。不过我已经创建了一个新网站并希望使用 Laravel。 我已经通过 Composer 成功安装了 Lar
我们正在运行一个为我们的客户使用自定义子域的 PHP 站点,因此我们在 Apache(版本 2.2.3)中使用通配符 VHost 实现了通配符 SSL 证书。这些子域 PHP 网络应用程序还在我们的
我已经尝试了数十种指南并阅读了大量信息,但我仍然找不到解决我的问题的方法。我已经卸载、重新安装并检查并仔细检查了每个可能的问题。 问题依旧。无论我做了什么更改,文档根目录始终显示为 c:\wamp\w
我已经在 CentOS 6.4 上安装了 apache 并配置了我的虚拟主机。 但是,当我重新启动 apache(使用此命令:sudo service httpd restart)时,它警告我“警告:
使用带有 connect.vhost 指令的 node.js 作为路由器而不是使用 proxy_pass 的 NGINX 有哪些优点/缺点? 最佳答案 连接虚拟主机 优点 相当简单 只需担心一台服务器
我有 2 个虚拟主机文件:1 个在端口 443 上包含我们所有站点的管理 URL,1 个在端口 80 上包含我们所有站点的主 URL。 apache 知道这两个文件,如 apachectl -S 所示
这是我的第一个站点,我尝试使用 Dokku 在 Digital Ocean 上部署 Rails 应用程序。 这是默认值 Dokku install在托管在 Digital Ocean 上的基本 Ubu
我的 VPS 上有两个子域,我在我的 DNS 中注册了两个子域,指向同一个 IP 地址。 安装的版本是服务器版本:Ubuntu 12.04 的 Apache/2.4.7。 我已经启用了带有 a2ens
我的问题是 Apache 随机加载一个非默认虚拟主机而不是我要求它加载的域。我已经尝试了我在这个网站上找到的所有解决方案并通过搜索,但似乎没有任何东西可以解决这个问题。 背景: 这是一个托管在流行云平
我的 VPS 上安装了 Apache。它托管了一个站点,我们称之为 demo.com(位于/var/www/html/demo.com),但我也有/var/www/html 中的文件,我想通过指向我的
php_admin_value open_basedir "/var/www/html/web/yourcharmstyle.com/htdocs/:/tmp/" 该行的含义和作用是什么?谢
在 vhosts 中有以下配置。当我通过 MAMP 运行它时,它总是返回 500 错误。不知道出了什么问题。停止 mamp 并使用 valet 运行它。 laravel 网站运行成功。 bootstr
我正在使用 Laravel 宅基地。对于一个项目,我需要一个特殊的 vhost 配置,我应该在哪里定义它? 最佳答案 您将一个新的文件夹映射添加到 Homestead.yml 的“sites”块中,如
我有一个 angular 应用程序,我在本地使用 apache 提供服务。我的 vhosts.conf 是: ServerName my.app.com DirectoryIndex ind
我在 Windows 上遇到了 Apache (2.2) 的问题。 我基本上有 2 个 Wordpress 项目。其中 1 个在 1 个(子)域(sub1.mydomain.com)上运行,1 个在另
rabbitmqadmin list vhosts 显示消息但没有队列。为什么有可能? 当我运行 Celery 时,它仍然以某种方式接收消息。如何查看存储消息的队列名称?我想念什么? dmugtasi
Stack Overflow 的新手。 所以我在 Digital Ocean droplet 上使用 Express( Node 9)托管我的网站。我正在使用 express-vhost 所以我可以检
有没有一种方法可以在 tomcats server.xml 或其他地方添加虚拟主机条目,而无需像网络服务器等支持的重新加载信号那样重新启动 tomcat 服务器 我正在为 railo appserve
我是一名优秀的程序员,十分优秀!