@yangfch3
2017-03-12T23:47:31.000000Z
字数 5278
阅读 4239
Server
macOS 自带了 Apache 环境,一些重要的目录和路径如下:
/etc/apache2/
/etc/apache2/httpd.conf
Apache 虚拟主机配置文件:/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 start
apachectl restart
apachectl stop
sudo lsof -nP -iTCP -sTCP:LISTEN | grep httpd
Debian 系(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 stop
ps -ef |grep apache2
ps -aux | grep apache
netstat -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.conf
Include conf/extra/php-fpm.conf
同时如果你的配置文件中有下列行,移除或注释它们,因为这种模式下不需要:
LoadModule php7_module modules/libphp7.so
Include 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
模块。
然后,……(见链接)