[关闭]
@yangfch3 2017-03-12T15:47:31.000000Z 字数 5278 阅读 2196

Apache 配置笔记

Server


安装

macOS

macOS 自带了 Apache 环境,一些重要的目录和路径如下:

  1. Apache 配置目录:/etc/apache2/
  2. Apache 主配置文件:/etc/apache2/httpd.conf
  3. Apache 虚拟主机配置文件:/etc/apache2/extra/httpd-vhosts.conf

    macOS 下的虚拟主机配置文件是通过 include 的形式被主配置文件引入的:Include /private/etc/apache2/extra/httpd-vhosts.conf

  4. Apache 默认 Web 服务目录:/Library/WebServer/Documents/

  5. Apache 默认日志路径:/private/var/log/apache2/
  6. hosts 文件路径:/etc/hosts

常用命令:

  1. 开启 Apache 服务(macOS 默认自动运行):apachectl start
  2. 重启 Apache 服务:apachectl restart
  3. 停止 Apache 服务:apachectl stop
  4. 检验 Apache 服务是否已开启:sudo lsof -nP -iTCP -sTCP:LISTEN | grep httpd

Linux(Debian 8)

Debian 系(Debian、Ubutun)下安装:

  1. sudo apt-get install apache2

RedHat 系(RedHat、CentOS)下:

  1. yum install apache2

解惑先行:httpd 与 Apache 区别

常用路径(Linux 下的 Apache 要么叫做)

  1. Apache 配置目录:/etc/apache2/
  2. Apache 主配置文件:/etc/apache2/apache2.conf
  3. Apache 虚拟主机配置文件:没有单独的虚拟主机配置文件,虚拟主机直接在主配置文件中配置
  4. Apache 默认 Web 服务目录:/var/www
  5. Apache 默认日志路径:/var/log/apache2/
  6. hosts 文件路径:/etc/hosts

常用命令:

  1. 开启 Apache 服务(macOS 默认自动运行):(sudo) service apache2 start
  2. 重启 Apache 服务:(sudo) service apache2 restart
  3. 停止 Apache 服务:(sudo) service apache2 stop
  4. 检验 Apache 服务是否已开启:
    1. 检查进程:ps -ef |grep apache2 ps -aux | grep apache
    2. 检查端口:netstat -an | grep :80 curl [ip]:80

以上的 (sudo) service apache2(sudo) /etc/init.d/apache2 没有什么区别,都表示 apache2 服务


配置

Apache 的配置文件的组织形式有以下两种机制:

  1. 机制一:所有有关服务器的设置集中在一个文件
  2. 机制二:根据功能分组,将功能配置分离在不同的配置文件中,然后在主文件中使用 include 机制来引入

配置可以总结为三部分:

三部分的说明:

  1. Global Environment —— 全局环境配置,决定Apache服务器的全局参数
  2. Main server configuration —— 主服务配置,相当于是 Apache 中的默认 Web 站点,如果我们的服务器中只有一个站点,那么就只需在这里配置就可以了。
  3. Virtual Hosts —— 虚拟主机,虚拟主机不能与 Main Server 主服务器共存,当启用了虚拟主机之后,Main Server 就不能使用了

Apache 在不同系统下的差异

在 macOS 下的 Apache 叫做 httpd,在 Debian 下则仍叫做 apache(以下统称 Apache)。

同时在不同系统下 Apache 的目录结构也存在较大的差异,在 Debian 下:

  1. /etc/apache2/
  2. |-- apache2.conf
  3. | `-- ports.conf
  4. |-- mods-enabled
  5. | |-- *.load
  6. | `-- *.conf
  7. |-- conf-enabled
  8. | `-- *.conf
  9. |-- sites-enabled
  10. | `-- *.conf

在 CentOS 下:

  1. ├── conf
  2.    ├── httpd.conf
  3.    └── magic
  4. ├── conf.d
  5.    ├── autoindex.conf
  6.    ├── php.conf
  7.    ├── README
  8.    ├── userdir.conf
  9.    └── welcome.conf
  10. ├── conf.modules.d
  11.    ├── 00-base.conf
  12.    ├── 00-dav.conf
  13.    ├── 00-lua.conf
  14.    ├── 00-mpm.conf
  15.    ├── 00-proxy.conf
  16.    ├── 00-systemd.conf
  17.    ├── 01-cgi.conf
  18.    └── 10-php.conf
  19. ├── logs -> ../../var/log/httpd
  20. ├── modules -> ../../usr/lib64/httpd/modules
  21. └── run -> /run/httpd

在 macOS 下:

  1. .
  2. ├── extra
  3.    ├── httpd-autoindex.conf
  4.    ├── httpd-autoindex.conf~previous
  5.    ├── httpd-dav.conf
  6.    ├── httpd-dav.conf~previous
  7.    ├── httpd-default.conf
  8.    ├── httpd-default.conf~previous
  9.    ├── httpd-info.conf
  10.    ├── httpd-info.conf~previous
  11.    ├── httpd-languages.conf
  12.    ├── httpd-languages.conf~previous
  13.    ├── httpd-manual.conf
  14.    ├── httpd-manual.conf~previous
  15.    ├── httpd-mpm.conf
  16.    ├── httpd-mpm.conf~previous
  17.    ├── httpd-multilang-errordoc.conf
  18.    ├── httpd-multilang-errordoc.conf~previous
  19.    ├── httpd-ssl.conf
  20.    ├── httpd-ssl.conf~previous
  21.    ├── httpd-userdir.conf
  22.    ├── httpd-userdir.conf~previous
  23.    ├── httpd-vhosts.conf
  24.    ├── httpd-vhosts.conf~previous
  25.    └── proxy-html.conf
  26. ├── httpd.conf
  27. ├── httpd.conf.pre-update
  28. ├── httpd.conf~previous
  29. ├── magic
  30. ├── mime.types
  31. ├── original
  32.    ├── extra
  33.       ├── httpd-autoindex.conf
  34.       ├── httpd-dav.conf
  35.       ├── httpd-default.conf
  36.       ├── httpd-info.conf
  37.       ├── httpd-languages.conf
  38.       ├── httpd-manual.conf
  39.       ├── httpd-mpm.conf
  40.       ├── httpd-multilang-errordoc.conf
  41.       ├── httpd-ssl.conf
  42.       ├── httpd-userdir.conf
  43.       ├── httpd-vhosts.conf
  44.       └── proxy-html.conf
  45.    └── httpd.conf
  46. ├── other
  47.    └── php5.conf
  48. └── users
  49. └── Guest.conf

概览:中英文注解

我的 Gist

各系统下 PHP 与 Apache 如何关联

现在,我们的系统中已经安装好了 Apache 与 PHP,那么现在就需要让这二者发生关联了。

问题:如何让 Apache 识别对 .php 的请求,然后交由系统中已安装的 PHP 解释器来执行 .php 文件,再交由 Apache 返还给客户端?

所以最终要做的就是让我们的 Apache 与系统中的 PHP 发生联系。我们来看一下各个系统下 Apache 和 PHP 是怎样发生联系的。

CentOS 下:
image_1ban7cpn2hvg1j5kg92107dhe19.png-117.1kB

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

Debian 下:
image_1ban7hqmi17uq1ikbddk10oh1gkm.png-44.6kB

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

macOS 下:
image_1ban7sundmv2jstf5t1n8s9b13.png-42kB

php5 模块的加载是在主文件 httpd.conf 内(默认注释掉,不启用),这里的 php5.conf 是对 PHP 行为的具体规定。

链接

Apache 配置 PHP

使用 php 和 php-apache

首先,安装 软件包 phpphp-apache

然后,开启 PHP,在 Apache 配置文件中添加如下行:

最后,重启 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 和 mod_proxy_fcgi

首先,安装 phpphp-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

  1. # /etc/httpd/conf/extra/php-fpm.conf
  2. <FilesMatch \.php$>
  3. SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
  4. </FilesMatch>
  5. # /etc/httpd/conf/httpd.conf
  6. Include conf/extra/php-fpm.conf

同时如果你的配置文件中有下列行,移除或注释它们,因为这种模式下不需要:

  1. LoadModule php7_module modules/libphp7.so
  2. Include conf/extra/php7_module.conf

然后,你可以去配置 php-fpm/etc/php/php-fpm.d/www.conf

最后,重启 Apache 服务和 php-fpm 服务(httpd.servicephp-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

使用 apache2-mpm-worker 和 mod_fcgid

首先,安装 mod_fcgidphp-cgi 模块。

然后,……(见链接


扩展链接

Apache_HTTP_Server
FastCgi 与 PHP-fpm 之间是个什么样的关系
CGI入门

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注