geerlingguy.php
Ansible 角色:PHP
在 RedHat/CentOS 和 Debian/Ubuntu 服务器上安装 PHP。
需求
如果您使用的是较旧的 Ubuntu 或 RHEL LTS 版本,并且 PHP 版本过旧,则需要使用一个维护的 PHP 版本的仓库或 PPA,因为此角色仅适用于 PHP 社区当前支持的版本。
角色变量
可用的变量如下所示,并包含默认值(请参见 defaults/main.yml
):
php_packages: []
要安装的 PHP 软件包列表(默认根据操作系统)。您可能想安装一些常用的软件包,如 php
、php-cli
、php-devel
和 php-pdo
,并且可以添加其他您想要的软件包(例如,如果需要图像处理,可以添加 php-gd
,或者如果需要连接 LDAP 服务器进行身份验证,可添加 php-ldap
)。
注意:如果您使用的是 Debian/Ubuntu,还需要安装 libapache2-mod-fastcgi
(用于 cgi/PHP-FPM)或 libapache2-mod-php7.0
(取决于 PHP 版本,可能是其他类似软件包),如果您想在 Apache 中使用 mod_php
。
php_packages_extra: []
要安装的额外 PHP 软件包列表,不覆盖默认列表。
php_enable_webserver: true
如果您的 PHP 使用与 Web 服务器(例如 Apache 或 Nginx)相关联,则保留此默认值。如果您在服务器端使用 PHP 或要运行一些小应用程序,请将此值设置为 false
,以便此角色不会尝试与 Web 服务器交互。
php_webserver_daemon: "httpd"
HTTP 服务器守护进程的默认值为 RedHat/CentOS 上的 httpd
(由 Apache 使用)或 Debian/Ubuntu 上的 apache2
(同样由 Apache 使用)。如果您正在运行其他 Web 服务器(例如,nginx
),请将此值更改为 Web 服务器运行的守护进程名。
php_enablerepo: ""
(仅限 RedHat/CentOS)如果您启用了任何附加仓库(我建议使用 geerlingguy.repo-epel 或 geerlingguy.repo-remi),这些仓库可以在此变量下列出(例如 remi-php70,epel
)。这可能很方便,例如,如果您希望安装 Remi 仓库中最新的 PHP 7.0 版本。
php_default_version_debian: ""
(仅限 Debian/Ubuntu)给定操作系统版本仓库中的默认 PHP 版本。特定版本根据发行版和版本设置,但您可以通过在此提供值来覆盖,例如 "7.4"
。
如果您希望能够轻松切换 PHP 版本,或使用在系统包中不可用的版本:您可以使用 geerlingguy.php-versions
角色更轻松地在主要 PHP 版本间切换(例如 5.6、7.1、7.2)。
php_packages_state: "present"
如果您启用了如 geerlingguy.repo-epel 或 geerlingguy.repo-remi 的附加仓库,您可能希望以简单的方式随时更换 PHP 版本。默认情况下,设置为 "present"
。您可以将此变量覆盖为 "latest"
,以升级到最新可用版本。结合 php_enablerepo
,用户现在不需要在从不同的仓库安装之前手动卸载现有的 PHP 软件包。
php_install_recommends: true
(仅限 Debian/Ubuntu)安装 php_packages
时是否安装推荐的软件包;如果您正在安装一个 PPA,并且不想安装某些推荐软件包,您可能想明确将其设置为 no
(例如,Ondrej 的 php
PPA 会在您与 php5.6-cli
一起安装 php-pear
时安装 php7.0-cli
... 这通常是不希望的!)。
php_executable: "php"
调用 PHP 时在命令行中运行的可执行文件。如果在您的服务器上运行 php
时不指向正确的可执行文件,或者如果您在 RHEL/CentOS 上使用软件集合并需要目标 PHP 的不同版本,您应仅更改此项。
PHP-FPM
PHP-FPM 是一个简单且强大的 PHP FastCGI 进程管理器。它可以显著简化 PHP 应用程序的扩展,并且在使用 Nginx 等 Web 服务器时是运行基于 PHP 的网站和应用的正常方式(虽然它也可以与其他 Web 服务器轻松配合使用)。
使用此角色时,如果 PHP 作为 php-fpm
运行,而不是作为 Web 服务器(例如 Apache 的 mod_php
)内部的一个进程,则需要将以下变量设置为 true
:
php_enable_php_fpm: false
如果您使用 Apache,可以轻松配置它与 PHP-FPM 一起使用,使用 geerlingguy.apache-php-fpm 角色。
php_fpm_state: started
php_fpm_enabled_on_boot: true
控制 fpm 守护进程的状态;如果希望安装并配置 FPM,但不运行,则将其设置为 stopped
和 false
(例如,在容器中安装时)。
php_fpm_handler_state: restarted
处理程序默认情况下会重新启动 PHP-FPM。将值设置为 reloaded
将重新加载服务,而不是重新启动它。
php_fpm_pools:
- pool_name: www
pool_template: www.conf.j2
pool_listen: "127.0.0.1:9000"
pool_listen_allowed_clients: "127.0.0.1"
pool_pm: dynamic
pool_pm_max_children: 5
pool_pm_start_servers: 2
pool_pm_min_spare_servers: 1
pool_pm_max_spare_servers: 3
pool_pm_max_requests: 500
pool_pm_status_path: /status
要创建的 PHP-FPM 池列表。默认情况下,创建 www 池。要设置新池,请在 php_fpm_pools 列表中添加一项。
在默认的 www.conf.j2
PHP-FPM 池内的特定设置。如果您想管理其他设置,可以通过使用 pool_template
用您自己的模板替换文件来做到这一点。
php.ini 设置
php_use_managed_ini: true
默认情况下,通过此角色附带的 php.ini 应用所以下面的所有额外默认值。如果您希望自行管理 php.ini 文件(如果您需要更灵活的配置),可以将其设置为 false
(在这种情况下,将忽略下面的所有变量)。
php_fpm_pool_user: "[apache|nginx|other]" # 默认根据操作系统而异
php_fpm_pool_group: "[apache|nginx|other]" # 默认根据操作系统而异
php_memory_limit: "256M"
php_max_execution_time: "60"
php_max_input_time: "60"
php_max_input_vars: "1000"
php_realpath_cache_size: "32K"
php_file_uploads: "On"
php_upload_max_filesize: "64M"
php_max_file_uploads: "20"
php_post_max_size: "32M"
php_date_timezone: "America/Chicago"
php_allow_url_fopen: "On"
php_sendmail_path: "/usr/sbin/sendmail -t -i"
php_output_buffering: "4096"
php_short_open_tag: false
php_error_reporting: "E_ALL & ~E_DEPRECATED & ~E_STRICT"
php_display_errors: "Off"
php_display_startup_errors: "On"
php_expose_php: "On"
php_session_cookie_lifetime: 0
php_session_gc_probability: 1
php_session_gc_divisor: 1000
php_session_gc_maxlifetime: 1440
php_session_save_handler: files
php_session_save_path: ''
php_disable_functions: []
php_precision: 14
php_serialize_precision: "-1"
PHP 的各种默认设置。仅在 php_use_managed_ini
设置为 true
时使用。
与 OpCache 相关的变量
OpCache 从 PHP 5.5 开始包含,以下变量仅在您安装的 PHP 版本为 5.5 或更高时生效。
php_opcache_zend_extension: "opcache.so"
php_opcache_enable: "1"
php_opcache_enable_cli: "0"
php_opcache_memory_consumption: "96"
php_opcache_interned_strings_buffer: "16"
php_opcache_max_accelerated_files: "4096"
php_opcache_max_wasted_percentage: "5"
php_opcache_validate_timestamps: "1"
php_opcache_revalidate_path: "0"
php_opcache_revalidate_freq: "2"
php_opcache_max_file_size: "0"
OpCache ini 指令,通常在系统上进行定制。确保您为 OpCache 分配了足够的内存和文件槽(php_opcache_memory_consumption
,以 MB 为单位,和 php_opcache_max_accelerated_files
),以容纳您正在运行的所有 PHP 代码。如果没有,您可能会获得不理想的性能!
对于自定义 opcache.so 位置,请提供完整路径与 php_opcache_zend_extension
。
php_opcache_conf_filename: [platform-specific]
平台特定的 opcache 配置文件名。通常默认应该有效,但在某些情况下,您可能需要覆盖文件名。
与 APCu 相关的变量
php_enable_apc: true
是否启用 APCu。如果设置为 false,其他 APCu 变量将无效。
php_apc_shm_size: "96M"
php_apc_enable_cli: "0"
APCu ini 指令,通常在系统上进行定制。设置 php_apc_shm_size
以确保它将所有缓存条目保存在内存中,并且还有一点开销(碎片或 APC 用尽内存将极大地降低 PHP 的性能)。
php_apc_conf_filename: [platform-specific]
平台特定的 APC 配置文件名。通常默认应该有效,但在某些情况下,您可能需要覆盖文件名。
确保 APC 已安装
如果您使用 APC,您需要确保已经安装 APC(默认情况下已安装,但是如果您自定义了 php_packages
列表,则需要在列表中包含 APC):
- 在 RHEL/CentOS 系统上:确保
php-pecl-apcu
在php_packages
列表中。 - 在 Debian/Ubuntu 系统上:确保
php-apcu
在php_packages
列表中。
从源代码安装
如果您需要特定版本的 PHP,或者想测试最新的(例如 master)版本的 PHP,那么在您的平台的包管理器中可能没有适合的软件包。在这些情况下,您可以选择通过直接编译从源代码安装 PHP。
请注意,源代码编译所需时间比从包安装要长得多(在现代四核计算机上,编译 PHP HEAD 需要超过 5 分钟,仅作为参考)。
php_install_from_source: false
将此设置为 true
以从源代码安装 PHP,而不是从软件包安装。
php_source_version: "master"
要从源代码安装的 PHP 版本(git 分支、标签或提交哈希)。
php_source_clone_dir: "~/php-src"
php_source_clone_depth: 1
php_source_install_path: "/opt/php"
php_source_install_gmp_path: "/usr/include/x86_64-linux-gnu/gmp.h"
php_source_mysql_config: "/usr/bin/mysql_config"
源代码将被克隆和安装的位置,以及 GMP 头文件的位置(可能因平台/发行版而异),和 mysql_config
二进制文件的位置(在较新的操作系统版本中可能是 mariadb_config
)。
php_source_make_command: "make"
将 make
命令设置为 make --jobs=X
,其中 X
是 PHP 正在编译的服务器上存在的核心数量。如果您有多个核心,这将显著加快编译时间。
php_source_configure_command: >
[...]
用于构建将用于 PHP 编译的 Makefile 的 ./configure
命令。添加所有适合您特定环境的选项。使用折叠标量 (>
) 允许您将变量定义为多行,这对可读性和源代码控制非常有帮助!
关于特定配置的一些其他说明/注意事项:
- 使用
mpm_prefork
的 Apache:如果您使用 Apache 并以 prefork 作为 PHP 的 Web 服务器,您需要确保apxs2
在您的系统上可用(例如,在 Ubuntu 中安装apache2-prefork-dev
),并且您需要确保在php_source_configure_command
中定义选项--with-apxs2
。最后,您需要确保加载mpm_prefork
模块,而不是mpm_worker
或mpm_event
,并可能在 Apache 模块配置文件夹中添加一个名为phpX.conf
(其中X
是 PHP 的主要版本)的配置文件,内容类似于php7.conf
。 - 使用
mpm_event
或mpm_worker
的 Apache:如果您将 Apache 作为事件或工作模式的 PHP Web 服务器,则需要编译 PHP 与 FPM。确保在php_source_configure_command
中定义选项--enable-fpm
。您还需要确保已安装 Apache 对 CGI 和 事件的支持(例如,安装apache2-mpm-event
和libapache2-mod-fastcgi
),并加载mpm_event
模块。 - Nginx:如果您使用 Nginx 作为 PHP 的 Web 服务器,您需要编译 PHP 与 FPM。确保在
php_source_configure_command
中定义选项--enable-fpm
。
依赖关系
无。
示例剧本
- hosts: webservers
vars_files:
- vars/main.yml
roles:
- { role: geerlingguy.php }
在 vars/main.yml
中:
php_memory_limit: "128M"
php_max_execution_time: "90"
php_upload_max_filesize: "256M"
php_packages:
- php
- php-cli
- php-common
- php-devel
- php-gd
- php-mbstring
- php-pdo
- php-pecl-apcu
- php-xml
...
许可
MIT / BSD
作者信息
该角色由 Jeff Geerling 于 2014 年创建,他是 Ansible for DevOps 的作者。
PHP for RedHat/CentOS/Fedora/Debian/Ubuntu.
ansible-galaxy install geerlingguy.php