基于Ubuntu安装PHP7.4 + Nginx + MySQL

PHP7.4正式版已经发布!本文详细记录了基于Ubuntu安装PHP7.4 + Nginx + MySQL来搭建WEB服务器的过程。

PHP7.4支持箭头函数、代码预加载等新特性,详细了解PHP7.4的新特性请点击:php7.4新特性

安装之前

按照惯例更新软件列表:

1
sudo apt-get update

安装PHP7.4

  1. 下载PHP 7.4的源代码到Ubuntu上:

    1
    wget https://www.php.net/distributions/php-7.4.0.tar.gz

    如果下载速度太慢,可以使用PHP 7.4国内高速下载地址:

    1
    wget https://gz-1257226027.cos.ap-guangzhou.myqcloud.com/php-7.4.0.tar.gz
  2. 解压,进入php7.4源代码目录:

    1
    2
    tar zxvf php-7.4.0.tar.gz
    cd php-7.4.0/
  3. 先安装PHP需要的依赖

    1
    2
    3
    4
    sudo apt-get install libzip-dev bison autoconf build-essential pkg-config git-core\
    libltdl-dev libbz2-dev libxml2-dev libxslt1-dev libssl-dev libicu-dev libpspell-dev\
    libenchant-dev libmcrypt-dev libpng-dev libjpeg8-dev libfreetype6-dev libmysqlclient-dev\
    libreadline-dev libcurl4-openssl-dev librecode-dev libsqlite3-dev libonig-dev
  4. 配置PHP安装参数

    1
    ./configure --prefix=/usr/local/php7 --with-config-file-scan-dir=/usr/local/php7/etc/php.d --with-config-file-path=/usr/local/php7/etc --enable-mbstring --enable-zip --enable-bcmath --enable-pcntl --enable-ftp --enable-xml --enable-shmop --enable-soap --enable-intl --with-openssl --enable-exif --enable-calendar --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-opcache --enable-fpm --enable-session --enable-sockets --enable-mbregex --enable-wddx --with-curl --with-iconv --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib-dir=/usr --with-freetype-dir=/usr --enable-gd-jis-conv --with-openssl --with-pdo-mysql=mysqlnd --with-gettext=/usr --with-zlib=/usr --with-bz2=/usr --with-recode=/usr --with-xmlrpc --with-mysqli=mysqlnd
  5. 执行编译安装

    1
    sudo make install

    如果编译过程中提示内存不足:

    virtual memory exhausted: Cannot allocate memory
    Makefile:921: recipe for target ‘ext/fileinfo/libmagic/apprentice.lo’ failed
    make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1

    请先给服务器添加虚拟内存,参考: 为Linux添加虚拟内存Swap

  6. 复制配置文件

    1
    2
    3
    sudo cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
    sudo cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
    sudo cp php.ini-production /usr/local/php7/etc/php.ini
  7. 添加环境变量,编辑 /etc/profile,文件末尾添加一行:

    1
    PATH=/usr/local/php7/bin:/usr/local/php7/sbin:$PATH
  8. 使环境变量生效:

    1
    source /etc/profile
  9. 将php添加到sudo环境变量,编辑 /etc/sudoers文件中的 Defaults secure_path,后面加上PHP路径:

    1
    /usr/local/php7/bin:/usr/local/php7/sbin:
  10. 启动php-fpm

    1
    sudo php-fpm

    如果提示找不到用户组nobody的gid:

    [15-Nov-2019 15:53:49] ERROR: [pool www] cannot get gid for group ‘nobody’
    [15-Nov-2019 15:53:49] ERROR: FPM initialization failed

    就要先创建nobody用户组:

    1
    sudo groupadd nobody

    再重新执行sudo php-fpm即可启动。

  11. 使用php -v命令查看php版本:

    1
    2
    3
    4
    # php -v
    PHP 7.4.0 (cli) (built: Nov 28 2019 13:38:00) ( NTS )
    Copyright (c) The PHP Group
    Zend Engine v3.4.0, Copyright (c) Zend Technologies

安装Nginx

  1. Nginx官网下载页面下载主线版本的Nginx源码,本次下载的是nginx-1.17.6。

    1
    wget http://nginx.org/download/nginx-1.17.6.tar.gz

    随后解压源代码、进入源代码目录:

    1
    2
    tar zxvf nginx-1.17.6.tar.gz
    cd nginx-1.17.6/
  2. 先安装依赖

    1
    sudo apt-get install build-essential libtool libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev
  3. 配置、编译和安装nginx

    1
    2
    3
    ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module
    make
    sudo make install
  4. 配置软连接(启动、关闭nginx时就不用输入nginx的完整路径)

    1
    sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
  5. 启动nginx

    1
    sudo nginx

    没有任何输出,说明启动成功。

  6. 测试是否可以访问
    在浏览器输入Ubuntu的IP地址,可以看到Welcome to nginx!说明启动成功。
    也可以使用命令行curl 127.0.0.1,正常情况能够看到HTML代码,说明nginx正常运行:

    1
    2
    3
    4
    5
    6
    7
    ubuntu@VM-35-226-ubuntu:~/nginx-1.17.6$ curl 127.0.0.1
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
    ......
  7. 常用操作和路径
    nginx安装目录/usr/local/nginx
    网站根目录/usr/local/nginx/html/
    nginx日志目录/usr/local/nginx/logs/
    nginx配置文件/usr/local/nginx/conf/nginx.conf

    启动nginxsudo nginx
    关闭nginxsudo nginx -s stop
    重启nginxsudo nginx -s reload

    配置HTTPS、gzip压缩等常用功能参考:Nginx常用配置

配置nginx解析PHP

编辑nginx的配置文件:

1
sudo vim /usr/local/nginx/conf/nginx.conf

找到下面这段代码:

1
2
3
4
location / {
root html;
index index.html index.htm;
}

在后面添加一段:

1
2
3
4
5
6
7
8
9
location ~ \.php(.*)$  {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}

保存后,保存后重新启动nginx:

1
sudo nginx -s reload

在网站根目录创建一个php文件:

1
sudo vi /usr/local/nginx/html/index.php

写入以下php代码并保存:

1
2
<?php
phpinfo();

在浏览器中输入服务器的IP地址看到phpinfo信息说明配置解析PHP成功。

安装Mariadb数据库

Mariadb是MySQL数据库的一个分支,API和命令行大部分兼容MySQL。

  1. 使用apt安装mariadb数据库:

    1
    sudo apt-get install mariadb-server mariadb-client
  2. 执行数据库初始化安装:

    1
    sudo mysql_secure_installation

    根据提示设置数据库root用户密码、是否允许外网访问等。提示信息如下:
    Enter current password for root: 输入当前数据库root用户密码,直接回车即可。
    Set root password?: 是否设置root用户密码,输入Y,随后输入并确认root密码。
    Remove anonymous users?: 是否移除匿名数据库用户,根据自己需求选择
    Disallow root login remotely?:是否禁止root用户远程登录,根据自己需求选择
    Remove test database and access to it?:是否删除测试数据库test,自己选择
    Reload privilege tables now?:是否刷新数据库权限表,选Y

  1. 尝试使用mysql -u root -p登录数据库,输入刚才设置的密码后提示错误如下:

    1
    2
    3
    $ mysql -u root -p
    Enter password:
    ERROR 1698 (28000): Access denied for user 'root'@'localhost'

    原因是数据库默认使用Linux系统的用户来登录数据库,需要将登录方式修改为密码登录。

    解决方法:
    使用sudo mysql -u root登录数据库,在数据库中依次执行以下语句,修改登录方式并刷新权限:

    mysql
    1
    2
    3
    4
    use mysql #切换到mysql数据库
    update user set plugin='mysql_native_password'; #修改plugin字段
    flush privileges; #刷新权限
    exit; #退出数据库

    再次输入mysql -u root -p即可通过密码登录数据库,无需root权限执行。

  2. mariadb配置文件目录和常用命令
    mariadb配置文件保存在多个位置:
    /etc/mysql/mariadb.cnf
    /etc/mysql/mariadb.conf.d/
    /etc/mysql/conf.d/

    mariadb常用命令:
    启动mariadb: sudo systemctl start mariadb
    关闭mariadb:systemctl stop mariadb
    设置mariadb开机启动:sudo systemctl enable mariadb