玩命狂奔的间隙,莫忘记抬头看看前路的星光

0%

十分钟搞定NGINX+PHP+MySQL安装

前言

开始一个项目的时候,总想着用最新最牛的技术和前沿框架,例如GO语言、微服务框架等,落地的时候发现用的可能还是那一套LNPM。如果没有技术积累,贸然使用新的语言;没有那么大的业务量,直接上一个Tars之类的微服务框架,那可能会把自己加班到死,把公司或产品拖垮。选择适合自己的就好,我们十分钟搞定一个LNPM环境,开始撸代码吧!

还是以centOS系统开始,如果服务器还没有弄好,可以去腾讯云或者阿里云买一台最便宜的开始练起。不要选已经配置好的镜像,自己配置花不了多少时间,这样能让你更深入的理解自己在做什么。有的时候,走点弯路能看到更多风景,何乐不为呢?

Nginx 安装

centOS上安装nginx非常容易,入门非常简单。

安装现成的

1
2
3
4
5
6
7
8
9
10
11
12
13
yum install -y nginx

#安装完毕后,执行下面的
systemctl enable nginx #启动时自动开启nginx 服务

#启动nginx服务
systemctl start nginx.service

#停止服务
systemctl stop nginx.service

#重启服务
systemctl restart nginx.service

然后就完事了,你的nginx服务就安装完成了。具体的配置在下面的站点设置里会介绍,到这里后就可以先放一放,去安装PHP和MySQL数据库了。

自己通过nginx源代码编译

一般没这个需要,如果特别感兴趣可以自己尝试编译,加深自己的理解;

配置

暂时无需配置,等安装好php(或nodejs/java/go等其他服务后再配置不迟)

MySQL的安装和配置

首先查看系统版本,然后选择要下载的MySQL版本

1
2
cat /etc/redhat-release #查询下核心版本
CentOS Linux release 7.7.1908 (Core) #显示是7.x的

在MySQL官方YUM仓库选择系统对应的源

下载地址:https://dev.mysql.com/downloads/repo/yum/
没有找到centOS,只有如下显示的,选择 Red Hat Enterprise Linux 7的就可以了。
这里的7是和上面查询的Linux版本对应的,如果你的是6或者8,也要选择下载6或者8的。

1
2
#下载适合centOS 7.x的MySQL源地址到服务器:
wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm

安装MySQL的源包

1
sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm

源包安装完成后会得到两个MySQL的源, mysql-community-source.repo和mysql-community.repo,就可以开始真正安装MySQL啦!

安装MySQL8

1
sudo yum install mysql-server

遇到选项按y即可;
下载速度可能有点慢。。。泡杯茶慢慢等就好了。。。
如果要快,可以终止下载,改用国内的镜像下载剩下的rpm文件。

使用国内镜像加速下载

国内镜像:http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/

进入到mysql RPM缓存文件夹,从国内镜像直接wget下载到服务器,可能1分钟就搞定了。

1
2
3
4
#这个文件400多M,其他无所谓,这个真的要用国内镜像才行。
sudo wget http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/MySQL-8.0/mysql-community-server-8.0.19-1.el7.x86_64.rpm

100%[=================================>] 457,272,180 9.62MB/s in 45s

RPM下载完成后再重新执行一次:

1
2
3
4
sudo yum install mysql-server

#一系列的安装输出日志后...
Complete!

找到root账号临时密码并设置新的密码

默认会生成一个临时的密码,从输出的日志里找到临时密码,用临时密码登录mysqld服务,修改为你自己记得住的密码;
1
2
3
     cat /var/log/mysqld.log #显示日志
    #找到这么一行输出:
    A temporary password is generated for root@localhost:O&Y8&:h#<0f,

# O&Y8&:h#<0f, 这里就是我的临时密码,每次安装都不同,请看清楚自己的,不要使用我这里的。

使用这个密码登录

1
mysql -uroot -p

修改密码验证规则
1
2
set global validate_password_policy=0;
set global validate_password_length=1;

修改root密码, 这里会和8以前的版本有区别,请注意。
1
2
  mysql> ALTER user 'root'@'localhost' IDENTIFIED BY 'Your_Password'
Query OK, 0 rows affected, 1 warning (0.00 sec)

不要直接使用SQL语句修改ROOT密码,会导致authentication_string错误:
注意: 一定不要采取如下形式该密码:

1
2
3
   #以下是错误的演示,请不要效仿:
use mysql;
update user set authentication_string="newpassword" where user="root";

如果要用第三方客户端登录,密码可能需要重新设置一次,放上命令:

1
2
3
 use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword';
FLUSH PRIVILEGES;

PHP的安装和配置

yum里可能没有最新的PHP源,但是又很想要,那么可以选择直接从PHP.NET上去下载源代码安装。传送门:PHP.NET官方下载

下载PHP源代码

我选了一个7.4.4的版本,下载到服务器本地:

1
2
#可以有一个专门放下载文件的文件夹例如:/home/yourname
wget https://www.php.net/distributions/php-7.4.4.tar.gz

下载完成后,解压,进入解压完成的PHP文件夹

1
2
3
4
tar -xf php-7.4.4.tar.gz   #解压到当前目录
ls #查看目录
php-7.4.4 php-7.4.4.tar.gz
cd php-7.4.4 #进入解压好的PHP文件夹

编译前先了解下编译配置选项,开启适合自己需要的。建议不要在第三方网站和文章上去看,这里是官方的PHP configure 参数说明页面:
https://www.php.net/manual/zh/configure.about.php
https://www.php.net/manual/zh/extensions.membership.php

编译与安装PHP

安装缺少的源,避免出现错误:No package ‘oniguruma’ found

1
2
yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/o/oniguruma-5.9.5-3.el7.x86_64.rpm
yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/o/oniguruma-devel-5.9.5-3.el7.x86_64.rpm

安装PHP扩展需要的软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
yum install gcc \
gcc-c++ \
libxml2 \
libxml2-devel \
openssl \
openssl-devel \
libcurl \
libcurl-devel \
freetype \
freetype-devel \
libjpeg \
libjpeg-devel \
libpng \
libpng-devel \
libxslt \
libxslt-devel \
systemd-devel \
libicu-devel \
libedit-devel \
sqlite-devel \
enchant-devel \
libc-client-devel \
pam-devel \
epel-release \
libsodium \
libsodium-devel

将找不到的so文件做下软链接,避免出现找不到libc-client.a的错误

1
2
ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.a
ln -s /usr/lib64/libkrb5.so /usr/lib/libkrb5.so

libzip比较特别,比较新的版本是第三方编译的。可能云服务器上是没有提供。
如果不安装最新0.11.x版本的话,生成配置文件的时候是会提示找不到libzip的。
错误信息:

1
configure: error: Package requirements (libzip >= 0.11) were not met: Requested 'libzip >= 0.11' but version of libzip is 0.10.1

解决方法:
https://pkgs.org/download/libzip找最新的源,然后安装。

1
2
3
4
5
6
//安装libzip
wget http://packages.psychotic.ninja/7/plus/x86_64/RPMS//libzip-0.11.2-6.el7.psychotic.x86_64.rpm
yum localinstall libzip-0.11.2-6.el7.psychotic.x86_64.rpm
//安装libzip-devel
wget http://packages.psychotic.ninja/7/plus/x86_64/RPMS//libzip-devel-0.11.2-6.el7.psychotic.x86_64.rpm
yum localinstall libzip-devel-0.11.2-6.el7.psychotic.x86_64.rpm

生成编译PHP的配置文件,每一现是做什么的,有兴趣的可以去上面给出的链接去了解详细说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
./configure \
--prefix=/usr/local/php7 \
--enable-fpm \
--enable-calendar \
--enable-bcmath \
--with-xmlrpc \
--enable-exif \
--enable-ftp \
--with-freetype \
--with-jpeg \
--enable-gd \
--enable-mbstring \
-enable-shmop \
--enable-sockets \
--with-zlib \
--with-curl \
--with-enchant \
--with-imap \
--with-imap-ssl=/usr/bin/openssl \
--with-kerberos \
--with-mhash \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-libedit \
--enable-soap \
--with-sodium \
--with-xsl=/usr/lib64/libxslt.so

如果你遇到常见错误:

1
2
checking for libzip >= 0.11... no
configure: error: Package requirements (libzip >= 0.11) were not met:

请确保执行./configure命令和安装libzip库的身份是同一个,例如:如果是用的root安装的,那么就切换到root执行./configure

开始编译,时间根据极其配置而不同

1
make

你也可以根据建议来一次测试(测试时间有点长,不止十分钟)

1
make test

也可以直接开始安装

1
make install

安装完成,修改配置文件

1
2
3
4
5
cd /usr/local/php7/etc
sudo cp php-fpm.conf.default php-fpm.conf

cd /usr/local/php7/etc/php-fpm.d/
sudo cp www.conf.default www.conf

去掉上面php-fpm.conf中;pid = run/php-fpm.pid的分号,然后保存;

1
2
3
4
sudo vim /usr/local/php7/etc/php-fpm.conf

#去掉分号是为了让后面能够以服务来控制,生成pid文件
;pid = run/php-fpm.pid

添加PHP-FPM到全局的环境变量,在/etc/profile.d新建一个php.sh脚本

1
sudo vim /etc/profile.d/php.sh

在php.sh里添加环境变量,并保存

1
2
export PHP7_HOME=/usr/local/php7
export PATH=$PHP7_HOME/sbin:$PHP7_HOME/bin:$PATH

关掉命令窗口,再打开连上服务器,查看是否生效

1
echo $PATH

创建随服务器启动的服务

1
sudo vim /usr/lib/systemd/system/php-fpm.service

如果按照上面的操作过来的,直接复制粘贴保存一下脚本到php-fpm.service即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=php-fpm - Hypertext Preprocessor
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/php7/var/run/php-fpm.pid
ExecStart=/usr/local/php7/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
PrivateTmp=false


[Install]
WantedBy=multi-user.target

启用开机自动启动

1
systemctl enable php-fpm.service

手动打开

1
systemctl start php-fpm.service

没有出错的话,就完成啦。当然如果你需要有更多自定义的配置和优化,就需要根据自己项目的情况,去深入了解php的各种配置选项的含义了。如果要全部熟悉一遍,可能要花掉好几天的时间去了解.

安装缺少的扩展

正式开始做项目的时候,可能会遇到缺少某些扩展的问题。不用着急,事后是可以继续安装的。

  1. 先把扩展下载到服务器,地址按照你的习惯放就可以了。

  2. 生成编译扩展库的配置文件

    这里推荐使用绝对路径,如果安装了多个PHP的话。

    1
    /usr/local/php7/bin/phpize  ./configure --with-php-config=/usr/local/php7/bin/php-config
  3. 安装可能缺少的autoconf

    如果遇到错误如下:

    1
    2
    Cannot find autoconf. Please check your autoconf installation and the
    $PHP_AUTOCONF environment variable. Then, rerun this script.

    就需要先安装autoconf。

    1
    sudo yum install autoconf

    安装完毕后,再重新执行配置文件生成的代码。

  4. 编译和安装

    1
    2
    ./configure
    make & make install

1.复制php.ini

1
sudo cp ../php.ini-production  /usr/local/php7/lib/php/php.ini

1.编辑php.ini 打开zip模块

1
zlib.output_compression = On

添加要动态加载的zip模块

1
extension=zip.so

保存,重启php-fpm服务,你以为马上就能看到zip模块,其实并没有,其他模块都能比较正常的编译好,这个不生效。。
zip扩展的安装还需要继续:

  1. 下载libzip并使用cmake3编译。

    如果没有cmake3,则需要先安装。

    1
    2
    yum install cmake3
    ln -s /usr/lib/cmake3 /usr/lib/cmake

    安装cmake3,并软链接到/usr/lib/cmake,不然有些软件会出错。

  2. 使用yum安装编译好的zip模块文件

    1
    yum install php74-php-pecl-zip
  3. 重启php-fpm,这回真的好了。。

配置一个站点

一个服务器可以添加N个站点,只要域名指向正确都没问题;下面添加一个最简单的PHP站点:

新建一个文件夹放网站的文件

例如:/mnt/www/myblog

新建一个index.php文件,内容:

1
2
3
4
5
<?php

phpinfo();

?>

在nginx的配置文件中增加一个虚拟主机的配置文件

1
vim /etc/nginx.d/vhost/myblog.conf

编辑该配置文件

1
2
3
4
5
6
7
server {
listen 80;
server_name example.com www.example.com;
location ~ \.php$ {
root /site_path/;
fastcgi_pass 127.0.0.1:9000; #php-fom进程监听的IP地址和端口
include fastcgi_params;

重启ningx服务或者reload配置文件

1
sudo systemctl reload nginx.service

在浏览器里查看是否生效

在浏览器里输入你绑定的网址,就能看到php的配置信息了。
看完后记得删掉这个文件,避免泄露服务器的信息。

写在最后

算算时间,从一个全新的服务器开始,一步步操作演示和编写,我至少花了8个小时;希望我消耗的时间,能够为大家节约更多时间;十分钟手动完成所有配置好像有点难,不过熟练了的话半个小时内完成,还是没问题的。
做好之后,可以备份为一个镜像,下次可以直接从镜像生成,就真的不到十分钟就可以完成了!
如果想要更深入的对php和nginx进行配置,那么就需要对照文档仔细阅读理解了。不管如何,千里之行始于足下。可以从比较直观感受到的写hellworld代码开始,在遇到问题的时候,针对性实际的问题,来修改配置会更容易记忆深刻和理解。

一开始了解太多是件很残酷的事情哈!