@yangfch3
2017-03-12T15:47:31.000000Z
字数 5278
阅读 4739
Server
macOS 自带了 Apache 环境,一些重要的目录和路径如下:
/etc/apache2//etc/apache2/httpd.confApache 虚拟主机配置文件:/etc/apache2/extra/httpd-vhosts.conf
macOS 下的虚拟主机配置文件是通过
include的形式被主配置文件引入的:Include /private/etc/apache2/extra/httpd-vhosts.conf
Apache 默认 Web 服务目录:/Library/WebServer/Documents/
/private/var/log/apache2//etc/hosts常用命令:
apachectl startapachectl restartapachectl stopsudo lsof -nP -iTCP -sTCP:LISTEN | grep httpdDebian 系(Debian、Ubutun)下安装:
sudo apt-get install apache2
RedHat 系(RedHat、CentOS)下:
yum install apache2
常用路径(Linux 下的 Apache 要么叫做)
/etc/apache2//etc/apache2/apache2.conf/var/www/var/log/apache2//etc/hosts常用命令:
(sudo) service apache2 start(sudo) service apache2 restart(sudo) service apache2 stopps -ef |grep apache2 ps -aux | grep apachenetstat -an | grep :80 curl [ip]:80以上的
(sudo) service apache2与(sudo) /etc/init.d/apache2没有什么区别,都表示apache2服务
Apache 的配置文件的组织形式有以下两种机制:
include 机制来引入配置可以总结为三部分:
三部分的说明:
Global Environment —— 全局环境配置,决定Apache服务器的全局参数Main server configuration —— 主服务配置,相当于是 Apache 中的默认 Web 站点,如果我们的服务器中只有一个站点,那么就只需在这里配置就可以了。Virtual Hosts —— 虚拟主机,虚拟主机不能与 Main Server 主服务器共存,当启用了虚拟主机之后,Main Server 就不能使用了在 macOS 下的 Apache 叫做 httpd,在 Debian 下则仍叫做 apache(以下统称 Apache)。
同时在不同系统下 Apache 的目录结构也存在较大的差异,在 Debian 下:
/etc/apache2/|-- apache2.conf| `-- ports.conf|-- mods-enabled| |-- *.load| `-- *.conf|-- conf-enabled| `-- *.conf|-- sites-enabled| `-- *.conf
在 CentOS 下:
├── conf│ ├── httpd.conf│ └── magic├── conf.d│ ├── autoindex.conf│ ├── php.conf│ ├── README│ ├── userdir.conf│ └── welcome.conf├── conf.modules.d│ ├── 00-base.conf│ ├── 00-dav.conf│ ├── 00-lua.conf│ ├── 00-mpm.conf│ ├── 00-proxy.conf│ ├── 00-systemd.conf│ ├── 01-cgi.conf│ └── 10-php.conf├── logs -> ../../var/log/httpd├── modules -> ../../usr/lib64/httpd/modules└── run -> /run/httpd
在 macOS 下:
.├── extra│ ├── httpd-autoindex.conf│ ├── httpd-autoindex.conf~previous│ ├── httpd-dav.conf│ ├── httpd-dav.conf~previous│ ├── httpd-default.conf│ ├── httpd-default.conf~previous│ ├── httpd-info.conf│ ├── httpd-info.conf~previous│ ├── httpd-languages.conf│ ├── httpd-languages.conf~previous│ ├── httpd-manual.conf│ ├── httpd-manual.conf~previous│ ├── httpd-mpm.conf│ ├── httpd-mpm.conf~previous│ ├── httpd-multilang-errordoc.conf│ ├── httpd-multilang-errordoc.conf~previous│ ├── httpd-ssl.conf│ ├── httpd-ssl.conf~previous│ ├── httpd-userdir.conf│ ├── httpd-userdir.conf~previous│ ├── httpd-vhosts.conf│ ├── httpd-vhosts.conf~previous│ └── proxy-html.conf├── httpd.conf├── httpd.conf.pre-update├── httpd.conf~previous├── magic├── mime.types├── original│ ├── extra│ │ ├── httpd-autoindex.conf│ │ ├── httpd-dav.conf│ │ ├── httpd-default.conf│ │ ├── httpd-info.conf│ │ ├── httpd-languages.conf│ │ ├── httpd-manual.conf│ │ ├── httpd-mpm.conf│ │ ├── httpd-multilang-errordoc.conf│ │ ├── httpd-ssl.conf│ │ ├── httpd-userdir.conf│ │ ├── httpd-vhosts.conf│ │ └── proxy-html.conf│ └── httpd.conf├── other│ └── php5.conf└── users└── Guest.conf
见 我的 Gist
现在,我们的系统中已经安装好了 Apache 与 PHP,那么现在就需要让这二者发生关联了。
问题:如何让 Apache 识别对 .php 的请求,然后交由系统中已安装的 PHP 解释器来执行 .php 文件,再交由 Apache 返还给客户端?
所以最终要做的就是让我们的 Apache 与系统中的 PHP 发生联系。我们来看一下各个系统下 Apache 和 PHP 是怎样发生联系的。
CentOS 下:

10-php.conf是对php5模块的加载,php.conf是对 PHP 行为的具体规定。
Debian 下:

php5.load用于加载php5模块,php5是对 PHP 行为的具体规定。
macOS 下:

php5模块的加载是在主文件httpd.conf内(默认注释掉,不启用),这里的php5.conf是对 PHP 行为的具体规定。
见 链接
首先,安装 软件包 php 和 php-apache。
然后,开启 PHP,在 Apache 配置文件中添加如下行:
加载 php(5, 7) 模块:将这一行放在 LoadModule 列表中 LoadModule dir_module modules/mod_dir.so 之后的任意地方:
LoadModule php7_module modules/libphp7.so
引入 php(5, 7) 模块配置文件:将这一行放到 Include 列表的末尾:
Include conf/extra/php7_module.conf
最后,重启 Apache 相关服务
注意:
php-apache中包含的libphp7.so不支持mod_mpm_event,仅支持mod_mpm_prefork(FS#39218)。需要在/etc/httpd/conf/httpd.conf中注释掉:# LoadModule mpm_event_module modules/mod_mpm_event.so同时取消下面行的注释:
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so不然将发生下面的错误:
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP. AH00013: Pre-configuration failed httpd.service: control process exited, code=exited status=1
首先,安装 php 和 php-fpm 两个程序包。
然后,在配置文件中启用代理模块:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
引入 php-fpm 模块的配置文件:/etc/httpd/conf/extra/php-fpm.conf
# /etc/httpd/conf/extra/php-fpm.conf<FilesMatch \.php$>SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"</FilesMatch># /etc/httpd/conf/httpd.confInclude conf/extra/php-fpm.conf
同时如果你的配置文件中有下列行,移除或注释它们,因为这种模式下不需要:
LoadModule php7_module modules/libphp7.soInclude conf/extra/php7_module.conf
然后,你可以去配置 php-fpm:/etc/php/php-fpm.d/www.conf。
最后,重启 Apache 服务和 php-fpm 服务(httpd.service 和 php-fpm.service)
Note: Unlike the widespread setup with ProxyPass, the proxy configuration with SetHandler respects other Apache directives like DirectoryIndex. This ensures a better compatibility with software designed for libphp7, mod_fastcgi and mod_fcgid. If you still want to try ProxyPass, experiment with a line like this:
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/srv/http/$1
首先,安装 mod_fcgid 和 php-cgi 模块。
然后,……(见链接)