PHP Conference Japan 2024

Unix 系统上的 Nginx 1.4.x

本文档将介绍如何为 Nginx 1.4.x HTTP 服务器安装和配置 PHP 以及 PHP-FPM。

本指南假定您已从源代码构建了 Nginx,因此所有二进制文件和配置文件都位于 /usr/local/nginx。如果情况并非如此,并且您通过其他方式获得了 Nginx,请参阅 » Nginx Wiki 以便将本手册转换为您的设置。

本指南将介绍配置 Nginx 服务器以处理 PHP 应用程序并在端口 80 上提供服务的基础知识,如果您希望将您的设置优化到超出本文档范围,建议您学习 Nginx 和 PHP-FPM 文档。

请注意,在整个文档中,版本号已替换为“x”以确保本文档在将来保持正确,请根据需要将这些版本号替换为相应的版本号。

  1. 建议您访问 Nginx Wiki » 安装 页面以获取并在您的系统上安装 Nginx。

  2. 获取并解压缩 PHP 源代码

    tar zxf php-x.x.x
    
  3. 配置并构建 PHP。您可以在此处使用各种选项自定义 PHP,例如将启用哪些扩展。运行 ./configure --help 以获取可用选项列表。在我们的示例中,我们将使用 PHP-FPM 和 MySQLi 支持进行简单配置。

    cd ../php-x.x.x
    ./configure --enable-fpm --with-mysqli
    make
    sudo make install
    
  4. 获取配置文件并将其移动到正确的位置

    cp php.ini-development /usr/local/php/php.ini
    cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
    cp sapi/fpm/php-fpm /usr/local/bin
    
  5. 重要的是,我们要阻止 Nginx 在文件不存在时将请求传递给 PHP-FPM 后端,从而防止任意脚本注入。

    我们可以通过在 php.ini 文件中将 cgi.fix_pathinfo 指令设置为 0 来解决此问题。

    打开 php.ini

    vim /usr/local/php/php.ini
    

    找到 cgi.fix_pathinfo= 并按如下方式修改

    cgi.fix_pathinfo=0
    
  6. 必须修改 php-fpm.conf 以指定 php-fpm 必须以用户 www-data 和组 www-data 的身份运行,然后才能启动该服务

    vim /usr/local/etc/php-fpm.d/www.conf
    

    找到并修改以下内容

    ; Unix user/group of processes
    ; Note: The user is mandatory. If the group is not set, the default user's group
    ;       will be used.
    user = www-data
    group = www-data
    

    现在可以启动 php-fpm 服务

    /usr/local/bin/php-fpm
    

    本指南将不再进一步配置 php-fpm,如果您有兴趣进一步配置 php-fpm,请参阅文档。

  7. 现在必须配置 Nginx 以支持 PHP 应用程序的处理

    vim /usr/local/nginx/conf/nginx.conf
    

    修改默认位置块以使其知道必须尝试提供 .php 文件

    location / {
        root   html;
        index  index.php index.html index.htm;
    }

    下一步是确保将 .php 文件传递到 PHP-FPM 后端。在注释掉的默认 PHP 位置块下方,输入以下内容

    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    127.0.0.1:9000;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }

    重启 Nginx。

    sudo /usr/local/nginx/sbin/nginx -s stop
    sudo /usr/local/nginx/sbin/nginx
    
  8. 创建测试文件

    rm /usr/local/nginx/html/index.html
    echo "<?php phpinfo(); ?>" >> /usr/local/nginx/html/index.php
    

    现在导航到 https://127.0.0.1。现在应该显示 phpinfo()。

按照上述步骤操作后,您将拥有一个正在运行的 Nginx Web 服务器,该服务器支持 PHP 作为 FPM SAPI 模块。当然,Nginx 和 PHP 还有更多配置选项可用。有关更多信息,请在相应的源代码树中键入 ./configure --help

添加注释

用户贡献的注释 8 条注释

41
Lenny
8 年前
如果有些许不同,从源代码构建并不容易,我在一些目录和配置选项上遇到了困难。我在网上四处寻找,直到我找到这个从中文翻译过来的网站。没有其他人有解决方案。直到我更改目录(项目 2.ERROR: Unable to globalize),我才能启动 php fpm。我列出了其他问题,但我能够解决它们。请不要删除此内容,这是非常有用的信息。

原始站点(它是中文的,不是我的站点,但我想表示感谢)

(那里还有更多内容,您可以访问该站点)

blog.dream1987.top/?paged=2

安装问题

1. configure: error:. Xml2-config not found 请检查您的 libxml2 安装。

解决方案

apt-get install libxml2-dev



2.Warning: Declaration of PEAR_Installer :: download () should be compatible with & PEAR_Downloader :: download ($ params) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR /Installer.php on line 43

Warning: Declaration of PEAR_PackageFile_Parser_v2 :: parse () should be compatible with PEAR_XMLParser :: parse ($ data) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib.phar/PEAR/PackageFile/ Parser / v2.php on line 113
[PEAR] Archive_Tar - already installed: 1.3.13
[PEAR] Console_Getopt - already installed: 1.3.1
[PEAR] Structures_Graph- already installed: 1.0.4

Warning: Declaration of PEAR_Task_Replace :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Replace.php on line 31
[PEAR] XML_Util - already installed: 1.2.3

Warning: Declaration of PEAR_Task_Windowseol :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Windowseol.php on line 76

Warning: Declaration of PEAR_Task_Unixeol :: init () should be compatible with PEAR_Task_Common :: init ($ xml, $ fileAttributes, $ lastVersion) in phar: ///root/php-7.0.0alpha1/pear/install-pear-nozlib. phar / PEAR / Task / Unixeol.php on line 76
[PEAR] PEAR - already installed: 1.9.5

解决方案

未找到解决方法 (http://pear.php.net/bugs/bug.php?id=20554)

3. 启动 php-fpm

1.ERROR: failed to open configuration file '/usr/local/etc/php-fpm.conf': No such file or directory (2)
ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf'
ERROR: FPM initialization failed

解决方案

将 php-fpm.conf 文件从源文件复制到该位置。

cp /root/php-7.0.0alpha1/sapi/fpm/php-fpm.conf /usr/local/etc/php-fpm.conf

2.ERROR: Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' (ret = 2) from /usr/local/etc/php-fpm.conf at line 125.
ERROR: failed to load configuration file '/usr/local/etc/php-fpm.conf'
ERROR: FPM initialization failed

解决方案

编辑 /usr/local/etc/php-fpm.conf 文档引入了 * .conf 部分,更改为正确的路径 include = / usr / local / etc / php-fpm.d / *. Conf

如果没有 /usr/local/etc/php-fpm.d 目录,请创建该目录。

3.WARNING: Nothing matches the include pattern '/usr/local/etc/php-fpm.d/*.conf' from /usr/local/etc/php-fpm.conf at line 125.
ERROR:. No pool defined 至少必须在配置文件中指定一个池部分
ERROR: failed to post process the configuration
ERROR: FPM initialization failed

解决方案

cp www.conf.default www.conf

4.ERROR: [pool www] can not get gid for group 'nobody'
ERROR: FPM initialization failed

解决方案

打开 www.conf 文件,将用户和组用户更改为 nginx 默认设置,通常默认为 www-data。
8
uanaoeng at outlook dot com
5 年前
当我运行以下命令启动 php-fpm 时
/usr/local/bin/php-fpm

我收到以下错误信息
Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' (ret=2) from /usr/local/etc/php-fpm.conf at line 143.

要修复此错误,请执行以下操作
使用文本编辑器将文件 "/usr/local/etc/php-fpm.conf" 中的字符串 "include=NONE/etc/php-fpm.d/*.conf" 更改为 "include=etc/php-fpm.d/*.conf"。

之后,我再次尝试启动 php-fpm,并再次收到错误信息
Nothing matches the include pattern '/usr/local/etc/php-fpm.d/*.conf' from /usr/local/etc/php-fpm.conf at line 143.

要修复此错误,请执行以下操作
cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
9
Leon Nguyen vnlab
3 年前
为了以最高速度、最少资源最大化服务器性能,我决定从最小的基于 Linux/Unix 的操作系统(我的 Linux 发行版是基于 rpm 的软件包)手动编译 PHP 8

我的系统已成功由 PHP 8.0.9 提供支持 - 启用了 Opcache/JIT 和其他几个 PHP 扩展模块。以下是一些经验,可以为您节省几个小时的研究时间。

1. 在第 (3) 步 - 配置和构建 PHP 之前 - 为了确保不发生错误,您可以参考我的预备库。

sudo dnf install \
gcc gcc-c++ make cmake autoconfig \
zlib zlib-devel pcre pcre-devel \
libxml2-devel libxslt-devel \
bzip2-devel curl-devel libzip-devel\
sqlite-devel \
systemd-devel \
openssl-devel \
libffi-devel \
libpng libpng-devel libwebp libwebp-devel libjpeg libjpeg-devel libXpm libXpm-devel \
freetype-devel \
gmp-devel \
libldb-devel \
libc-client libc-client-devel \
openldap openldap-devel \
oniguruma oniguruma-devel \
net-snmp-devel readline-devel unixODBC-devel \
uw-imap uw-imap-devel uw-imap-static uw-imap-utils \
libicu-devel \
enchant2 enchant2-devel \
gd gd-devel \
libsodium libsodium-devel \
libtidy libtidy-devel

即使在以后手动构建 PHP 扩展包时,您在执行 ./configure, make && make install 命令时也可能不会收到错误。

2. 在第 5 步 - 修改 php.ini 之前 - 您可以使用此命令仔细检查当前的 PHP 正在读取哪个 php.ini 文件:

php -ini | grep php.ini
# 我的结果。它与教程不同。
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => /usr/local/lib/php.ini
2
timy.shark
2 年前
感谢这个教程的巨大努力,非常感谢,以下是我的笔记,如果可能对任何人有帮助,考虑到在 WSL2 容器上的默认安装。
注意:为 Laravel 框架添加了 composer。
这些内容不能按原样复制粘贴,需要有选择性,因为某些命令旁边有注释。
此外,由于与我当前环境不匹配,我注释掉了 # 原始编辑者编写的一些默认值。

sha256sum php-x.x.x.tar.gz => e847745fd66fc8c57fac993a609fefcded93fddccd225f0620a26bb5ae5753c3
tar zxf php-x.x.x
sudo apt install build-essential
sudo apt install -y composer nginx pkgconf libxml2-dev libsqlite3-dev zlib1g-dev
cd php-x.x.x
./configure --enable-fpm --with-mysqli <==感谢您安装 PHP。
make <== 需要一段时间
sudo make test <== 可选,推荐
sudo make install <= /usr/local/bin /usr/local/php
sudo cp php.ini-development /usr/local/lib/php.ini
sudo cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf
sudo cp sapi/fpm/php-fpm /usr/local/bin
sudo vim /usr/local/php/php.ini <= cgi.fix_pathinfo=0
sudo vim /usr/local/etc/php-fpm.d/www.conf <= user=www-data group=www-data
sudo vim sapi/fpm/php-fpm.conf <= 编辑 include=etc/php-fpm.d/*.conf <- 相对路径
sudo cp sapi/fpm/php-fpm.conf /usr/local/etc
/usr/local/bin/php -v <= $PATH$ 优先使用 /usr/local/bin /usr/local/lib/php.ini
sudo /usr/local/bin/php-fpm <= 启动服务
sudo vim /etc/nginx/sites-available/default <= 编辑 server {} 下的以下内容
location / {
#root html;
#index index.php index.html index.htm;
}
location ~* \.php$ {
#fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

*重启 nginx (root /var/www/html) 如果 root 路径不存在,默认是:/usr/share/nginx/html
sudo nginx -t <= 测试 Nginx 配置文件
sudo service nginx reload
sudo service nginx stop
sudo service nginx start <= [OK]

php-fpm 需要作为一个服务运行,或者手动杀死进程 ps -aux | grep php-fpm ; kill <pid>
5
Akash Kumar Sharma
8 年前
如果您遇到 "File not found" 错误,请在 PHP 位置块 "location ~* \.php$ { }" 中添加 "root ROOT_DIR_LOCATION" 指令,其中 ROOT_DIR_LOCATION 是根目录,如 "/usr/share/nginx/html"。
2
nguyentienlong88 at gmail dot com
9 年前
在第 3 步,执行 "sudo make install" 命令后
如果 pear.php.net (https) 有问题。需要在 Makefile 中更改这一行(从 https 改为 http)
PEAR_INSTALLER_URL = http://pear.php.net/install-pear-nozlib.phar
3
1097625354 at qq dot com
6 年前
cp php/php.ini-development php/lib/php.ini
cp php/etc/php-fpm.conf.default php/etc/php-fpm.conf
cp php/etc/php-fpm.d/www.conf.default php/etc/php-fpm.d/www.conf
1
610010559 at qq dot com
5 年前
在 Linux 系统中,如果您想将 php-fpm 服务添加到系统服务中,这很容易做到,因为 php 提供了相关的 shell 脚本。

在 make 和 make install 之后;进入源代码包 sapi/fpm/init.d.php-fpm ;在 Linux 系统中键入代码。
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

然后您可以使用 "php-fpm {start|stop|force-quit|restart|reload|status|configtest}" 命令更方便地控制您的 php-fpm 程序。
To Top