第20章 使用 LNMP 架构部署动态网站环境
章节简述
LNMP 动态网站部署架构是一套由Linux+Nginx+MySQL+PHP 组成的动态网站系统解决方案,具有免费、高效、可扩展性强且资源消耗低等优良特性,深受开发者的喜爱。本章将深入对比使用源码包安装服务程序与使用RPM 软件包安装服务程序的优劣,详细讲解如何手工编译源码包并安装各个服务程序。最后,我们将使用目前最流行的 WordPress 博客系统, 验证整个架构的部署效果。
作为本书的最后一章,刘遄老师不仅期望各位读者在完成本书的学习后,能顺利获得心仪的高薪工作,更希望你能够运用书中的知识搭建自己的博客或论坛系统,并以此为平台, 把在工作中积累的 Linux 经验和技巧分享给更多人,为开源社区的发展贡献一份力量,共同推动开源的美好未来。
20.1 源码包程序
本书第 1 章曾讲到,在 RPM(红帽软件包管理器)技术出现之前,Linux 系统运维人员只能通过源码包的方式来安装各种服务程序,这是一件非常烦琐且极易消耗时间与耐心的事情。而且在安装、升级、卸载程序时,还要考虑与其他程序或函数库的相互依赖关系,这就要求运维人员不仅要掌握更多的 Linux 系统理论知识以及高超的实操技能,还需要有极好的耐心,才能成功安装好一个源码包。考虑到本书的读者大多是刚入门或准备入门的运维新人, 所以在前面的章节中,我们一直采用软件仓库的方式来安装服务程序。
然而,现在依然有很多软件程序只有源码包的形式。如果只会使用 dnf 命令安装程序, 面对只有源码包的软件时会很被动,只能等待第三方将其转换为 RPM 软件包后使用,或者寻找有RPM 软件包形式的替代软件。由此可见,如果运维人员只会使用软件仓库来安装服务程序,将会形成知识短板,对今后的运维工作带来不利。
本着不能让自己的读者在运维工作中吃亏的想法,接下来会详细讲解如何使用源码包安装服务程序。
其实,使用源码包安装程序有下面两个明显的优势。
源码包的可移植性非常好,几乎可以在任何 Linux 系统中安装使用,而 RPM 软件包是针对特定系统和架构编写的指令集,必须严格地符合执行环境才能顺利安装(即只会“生硬地”安装服务程序)。
使用源码包安装程序时会有一个编译过程,因此能更好地适应安装主机的系统环境, 运行效率和优化程度都会强于使用 RPM 软件包安装的程序。也就是说,可以将采用源码包安装服务程序的方式看作针对系统的“量体裁衣”。
一般来讲,在安装软件时,如果能通过软件仓库来安装,就用 dnf 命令搞定它;反之则去寻找合适的 RPM 软件包来安装;如果实在没有资源可用,那就只能使用源码包来安装了。使用源码包安装服务程序的过程看似复杂,其实在归纳汇总后只需要 4~5 个步骤即可完成安装。接下来会对每一个步骤进行详解。
Tips :
需要提前说明的是,在使用源码包安装程序时,会输出大量过程信息,这些信息通常意义不大,因此本章会省略这部分输出信息而不作特殊备注,请大家在操作时以实际输出为准。
第 1 步:下载及解压源码包文件。为了便于在网络中传输,源码包文件通常会在归档后使用 gzip 或 bzip2 等格式进行压缩,因此一般会具有.tar.gz 或.tar.bz2 的后缀。要想使用源码包安装服务程序,首先需要解压其中的内容,然后切换到源码包文件所在的目录中。
root@linuxprobe:~# tar xzvf FileName.tar.gz
root@linuxprobe:~# cd DirectoryName
第 2 步:编译源码包代码。在正式使用源码包安装服务程序之前,还需要使用编译脚本针对当前系统进行一系列的评估工作,包括对源码包文件、软件之间及函数库之间的依赖关系、编译器、汇编器及链接器进行检查。我们还可以根据需要来追加--prefix 参数,以指定稍后源码包程序的安装路径,从而对服务程序的安装过程更加可控。当编译工作结束后, 如果系统环境符合安装要求,一般会自动在当前目录下生成一个 Makefile 安装文件。
root@linuxprobe:~# ./configure --prefix=/usr/local/program
第 3 步:生成二进制安装程序。刚刚生成的 Makefile 文件中会保存与系统环境、软件依赖关系和安装规则等相关的内容,接下来便可以使用 make 命令,根据 Makefile 文件提供的合适规则编译,生成真正可供用户安装服务程序的二进制可执行文件了。
root@linuxprobe:~# make
第 4 步:运行二进制的服务程序安装包。由于不需要再检查系统环境,也不需要再编译代码,因此运行二进制的服务程序安装包应该是速度最快的步骤。如果在源码包编译阶段使用了--prefix 参数,此时服务程序就会被安装到该参数指定的目录;如果没有自行使用参数定义目录的话,一般会被默认安装到/usr/local/bin 目录中。
root@linuxprobe:~# make install
第 5 步:清理源码包临时文件。由于在安装服务程序的过程中进行了代码编译的工作, 因此在安装后目录中会遗留下很多临时垃圾文件,本着尽量不要浪费磁盘存储空间的原则, 可以使用 make clean 命令对临时文件进行彻底的清理。
root@linuxprobe:~# make clean
估计有读者会有疑问,为什么同样是安装一个服务程序,源码包的编译工作(configure)与生成二进制文件的工作(make)会使用这么长的时间,而采用 RPM 软件包安装就特别有效率呢?其实原因很简单,在 RHCA 认证的 RH401 考试中,会要求考生写一个 RPM 软件包。刘遄老师会在本书的进阶篇中讲到,其实 RPM 软件包就是把软件的源码包和一个针对特定系统、架构、环境编写的安装规则打包到一起的指令集。因此,为了让用户都能使用这个软件包来安装程序,通常一个软件程序会发布针对多种架构(例如 i386、x86_64 等架构)的 RPM 软件包来让用户选择。而源码包的软件作者肯定希望自己的软件能够被安装到更多的系统上面,被更多的用户所了解、使用,因此便会在编译阶段(configure)来检查用户当前系统的情况,然后制定出一份可行的安装方案,所以会占用很多的系统资源,需要更长的等待时间。
20.2 LNMP动态网站架构
LNMP 动态网站部署架构是一套由 Linux+Nginx+MySQL+PHP 组成的动态网站系统解决方案(其各自的 Logo 见图 20-1)。LNMP 中的字母 L 指的是 Linux 系统,不仅可以是 RHEL、CentOS Stream、Fedora,还可以是 Debian、Ubuntu 等系统。本书的配套站点 https://www.linuxprobe. com 就是基于 LNMP 部署的,运行一直很稳定,访问速度也很快。
图20-1 LNMP动态网站部署架构涉及的软件的Logo
在使用源码包安装服务程序之前,首先要让安装主机具备编译程序源码的环境。这需要具备 C 语言、C++语言、Perl 语言的编译器,以及各种常见的编译支持函数库程序。因此请先配置妥当软件仓库,然后将Development Tools 软件包组安装上,最后把下面列出的这些软件包都统统安装上(省略输出信息):
root@linuxprobe:~# dnf groupinstall -y "Development Tools"
root@linuxprobe:~# dnf install -y libxcrypt-compat libxml2-devel sqlite-devel libcurl-devel
如果条件允许,建议适当增大虚拟机的内存上限,让稍后的编译过程更快一些。而且由于接下来还需要从外部网络中获取 Nginx、MySQL、PHP 及 WordPress 等一系列的安装包, 因此需要配置虚拟机,将其连接到互联网。
将已经调整为桥接模式的网卡,通过 nmtui 或 nm-connection-editor 命令修改为以 DHCP 模式自动获取网络信息,如图 20-2 所示。此时,大多数情况下虚拟机可以接入互联网。若依然不可访问互联网,则考虑外部环境是否有特殊的限制,然后将虚拟机内的网卡配置成与物理机的一致即可。
root@linuxprobe:~# ping -c 4 www.linuxprobe.com
PING www.linuxprobe.com.w.kunlunno.com (202.97.231.16) 56(84) bytes of data.
64 bytes from www.linuxprobe.com (202.97.231.16): icmp_seq=1 ttl=55 time=27.5 ms
64 bytes from www.linuxprobe.com (202.97.231.16): icmp_seq=2 ttl=55 time=27.10 ms
64 bytes from www.linuxprobe.com (202.97.231.16): icmp_seq=3 ttl=55 time=27.4 ms
64 bytes from www.linuxprobe.com (202.97.231.16): icmp_seq=4 ttl=55 time=28.9 ms
--- www.linuxprobe.com.w.kunlunno.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 27.354/27.913/28.864/0.593 ms
图20-2 设置网卡为DHCP自动获取模式
刘遄老师已经把安装LNMP 动态网站部署架构所需的 5 个软件源码包和 1 个用于检查效果的博客系统软件包上传到与本书配套的站点服务器上。大家可以在Windows 系统中下载后通过 ssh 服务传送到打算部署 LNMP 动态网站架构的 Linux 服务器中,也可以直接在 Linux 服务器中使用 wget 命令下载这些源码包文件。为了更好地找到它们,可统一放到/lnmp 目录下保存:
root@linuxprobe:~# mkdir /lnmp
root@linuxprobe:~# cd /lnmp
root@linuxprobe:/lnmp# wget https://www.linuxprobe.com/Software/rpcsvc-proto-1.4.4.tar.xz
root@linuxprobe:/lnmp# wget https://www.linuxprobe.com/Software/pcre-8.45.tar.gz
root@linuxprobe:/lnmp# wget https://www.linuxprobe.com/Software/nginx-1.27.4.tar.gz
root@linuxprobe:/lnmp# wget https://www.linuxprobe.com/Software/mysql-8.0.18.tar.xz
root@linuxprobe:/lnmp# wget https://www.linuxprobe.com/Software/php-8.1.32.tar.gz
root@linuxprobe:/lnmp# wget https://www.linuxprobe.com/Software/wordpress.zip
root@linuxprobe:/lnmp# ls
mysql-8.0.18.tar.xz pcre-8.45.tar.gz rpcsvc-proto-1.4.4.tar.xz
nginx-1.27.4.tar.gz php-8.1.32.tar.gz wordpress.zip
下面来小试牛刀。rpcsvc-proto 是一款包含 rpcsvc 协议文件的支持软件包名称,rpcsvc协议在后续 Nginx 与MySQL 服务程序的部署过程中都需要调用到。要想通过源码包安装服务程序,就一定要严格遵守上面总结的安装步骤:下载及解压源码包文件、编译源码包代码、生成二进制安装程序、运行二进制的服务程序安装包、清理源码包临时文件。在解压、编译各个软件包源码程序时,都会生成大量的输出信息,下文中会将其省略,请读者以实际操作为准。
root@linuxprobe:/lnmp# tar xvf rpcsvc-proto-1.4.4.tar.xz
root@linuxprobe:/lnmp# cd rpcsvc-proto-1.4.4
root@linuxprobe:/lnmp/rpcsvc-proto-1.4.4# ./configure
root@linuxprobe:/lnmp/rpcsvc-proto-1.4.4# make
root@linuxprobe:/lnmp/rpcsvc-proto-1.4.4# make install
root@linuxprobe:/lnmp/rpcsvc-proto-1.4.4# cd ..
root@linuxprobe:/lnmp#
PCRE 是与 Perl 语言兼容的正则表达式库,当前不需要编译和安装,只要解压后放到/usr/local/src 目录即可,稍后和 nginx 一起调用安装:
root@linuxprobe:/lnmp# tar xzvf pcre-8.45.tar.gz
root@linuxprobe:/lnmp# mv pcre-8.45 /usr/local/src/
由于本章涉及的软件较多,频繁地切换工作目录在所难免。一方面我们会在每次操作后尽可能地返回到/lnmp 目录下待命,另一方面也请读者仔细看清所在的目录路径,以免因为找不到文件而影响心情。
20.2.1 配置Nginx服务
Nginx 是一款非常优秀的轻量级服务程序,广泛用于部署动态网站。最初,Nginx 是为俄罗斯的一家门户网站开发的,但由于其稳定性好、功能丰富、内存占用少、并发处理能力强等优点,迅速获得了用户的信任。目前,国内的门户网站如新浪、网易、腾讯等均已采用了Nginx 服务。
Nginx 的高稳定性源自其采用的分阶段资源分配技术,大幅降低了 CPU 与内存的占用率。因此,使用 Nginx 部署的动态网站环境不仅稳定高效,而且对系统资源的消耗极低。此外, Nginx 支持的模块数量几乎与 Apache 相当,且目前已完全支持常用的模块,如 proxy、rewrite、mod_fcgi、ssl 和 vhosts 等。更重要的是,Nginx 还支持热部署技术,轻松实现 7×24 小时不间断服务,并能够在不停止服务的情况下进行升级。
坦白来讲,虽然 Nginx 程序的代码质量非常高,代码很规范,技术成熟,模块扩展也很容易,但仍然存在不少问题。比如,Nginx 是由俄罗斯人开发的,资料文档还不完善,中文资料的质量更是鱼龙混杂。但是 Nginx 服务程序在近年来发展势头迅猛,相信会在轻量级 Web 服务器市场具有不错的未来。
下面进入主题,准备配置 Nginx 服务。
第 1 步:创建用于管理网站服务的系统账户。这是在 Linux 系统创建之初就植入的基因— 为了让操作系统更加安全,需要由不同的系统用户来管理不同的服务程序。这样即便黑客通过网站服务入侵了服务器,也无法提权到更高权限,或是对系统进行更大的破坏,甚至都无法登录 ssh 服务,因为他拿到的仅仅是一个系统账号。不同以往,这次在新建账户时应使用-M 参数不创建对应的家目录,以及使用-s 参数指定登录后的 Shell 解释器为/sbin/nologin,确保任何人都不能通过这个账号登录主机。
root@linuxprobe:/lnmp# useradd nginx -M -s /sbin/nologin
root@linuxprobe:/lnmp# id nginx
uid=1001(nginx) gid=1001(nginx) groups=1001(nginx)
第 2 步:编译安装 Nginx 网站服务程序。为了能够让网站服务支持更多的功能,首先需要在编译过程中添加额外的参数,其中较为重要的是使用--prefix 参数指定将服务安装到哪个目录,方便后面找到和调用它。其次,考虑到 HTTPS 的使用越来越广泛,所以这里用with-http_ssl_module 参数来开启 Nginx 服务的 SSL 加密模块,以便日后开启 HTTPS 的功能。最后,使用--with-pcre 参数指定 PCRE 源码路径,Nginx 会自动一起进行编译。
root@linuxprobe:/lnmp# tar xzvf nginx-1.27.4.tar.gz
root@linuxprobe:/lnmp# cd nginx-1.27.4/
root@linuxprobe:/lnmp/nginx-1.27.4# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.45
root@linuxprobe:/lnmp/nginx-1.27.4# make
root@linuxprobe:/lnmp/nginx-1.27.4# make install
root@linuxprobe:/lnmp/nginx-1.27.4# cd ..
相对来说,编译脚本文件(configure)比生成二进制文件(make)要快,而安装程序(make install)则是最快的,它相当于以双击的方式运行二进制安装包。在编译、生成、安装的这 3 个阶段中,屏幕上会输出各式各样的信息,主要包含软件包的概要情况、当前系统的软件依赖关系,以及是否有条件进行安装操作。只要进程没有被强制终止,或是没有输出明显的报错信息,则都是正常情况。
第 3 步:安装完毕后进入最终配置阶段。既然在编译环境中使用--prefix 参数指定了安装路径,那么 Nginx 服务程序配置文件一定会乖乖地在/usr/local/nginx 目录中等我们。
我们总共要进行 3 处修改,首先是把第 2 行的注释符(#)删除,然后在后面写上负责运行网站服务程序的账户名称和用户组名称。这里假设由 nginx 用户及 nginx 用户组负责管理网站服务。
root@linuxprobe:/lnmp# vim /usr/local/nginx/conf/nginx.conf
1
2 user nginx nginx;
其次是修改第 45 行的首页文件名称,在里面添加 index.php 的名字。这个文件也是用户在浏览网站时第一眼看到的文件,也叫首页文件。
43 location / {
44 root html;
45 index index.php index.html index.htm;
46 }
最后再删除第 65~71 行前面的注释符(#)来启用虚拟主机功能,然后将第 69 行后面对应的网站根目录修改为/usr/local/nginx/html,其中的 fastcgi_script_name 参数用于指代脚本名称,也就是用户请求的 URL。只有信息填写正确,Nginx 服务才能正确解析用户请求,否则访问的页面会提示“404 Not Found”的错误。
63 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
64 #
65 location ~ \.php$ {
66 root html;
67 fastcgi_pass 127.0.0.1:9000;
68 fastcgi_index index.php;
69 fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
70 include fastcgi_params;
71 }
第4 步:通过编译源码方式安装的服务默认不能被 systemctl 命令所管理,而要使用Nginx 服务本身的管理工具进行操作,相应命令所在的目录是/usr/local/nginx/sbin。由于使用绝对路径的形式输入命令未免会太麻烦,建议将/usr/local/nginx/sbin 路径加入PATH 变量中,让 Bash 解释器在后续执行命令时自动搜索到它。然后在 source 命令后加载配置文件,让参数立即生效。下次就只需要输入 nginx 命令即可启动网站服务了。
root@linuxprobe:/lnmp# vim ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin
export PATH
root@linuxprobe:/lnmp# source ~/.bash_profile
然后把函数库目录加载到系统中,这样 nginx 命令才能执行,服务也就运行起来了。
root@linuxprobe:/lnmp# echo "/usr/local/lib" > /etc/ld.so.conf.d/local-lib.conf
root@linuxprobe:/lnmp# ldconfig
root@linuxprobe:/lnmp# nginx
顺手把 http 流量加入到防火墙的允许列表中:
root@linuxprobe:/lnmp# firewall-cmd --permanent --add-service=http
success
root@linuxprobe:/lnmp# firewall-cmd --reload
success
操作完毕!在浏览器中输入服务器的 IP 地址,即可访问 Nginx 网站服务程序的默认页面, 如图 20-3 所示。相较于 Apache 服务程序的红色默认页面,Nginx 服务程序的默认页面显得更加简洁。
图20-3 Nginx服务程序的默认页面
20.2.2 配置Mysql服务
本书在第 18 章讲解过 MySQL 和 MariaDB 数据库管理系统之间的因缘和特性,也狠狠地夸奖了 MariaDB 数据库,但是 MySQL 数据库当前依然是生产环境中最常使用的关系型数据库管理系统之一,坐拥极大的市场份额,并且已经通过十几年不断的发展向业界证明了自身的稳定性和安全性。另外,虽然第 18 章已经讲解了基本的数据库管理知识,但是为了进一步帮助大家夯实基础,本章依然在这里整合了 MySQL 数据库的内容,使大家在温故的同时可以知新。

在使用软件仓库安装服务程序时,系统会自动根据 RPM 软件包中的指令集完成软件配置等工作。但是,一旦选择使用源码包的方式来安装,这一切就需要自己来完成了。对于 MySQL 数据库来说,我们需要在系统中创建一个名为 mysql 的用户,专门用于负责运行 MySQL 数据库。请记得要把这类账户的 Bash 终端设置成 nologin 解释器,避免黑客通过该用户登录到服务器中,从而提高系统安全性。
接下来准备配置 MySQL 服务。
root@linuxprobe:/lnmp# useradd mysql -M -s /sbin/nologin
第 1 步:解压 MySQL 安装软件包。将解压出的程序目录改名并移动到/usr/local 目录下,对其进行初始化操作后便可使用。需要注意的是,以.tar.xz 结尾的压缩包软件,不应用 z 参数进行解压。
root@linuxprobe:/lnmp# tar xvf mysql-8.0.18.tar.xz
root@linuxprobe:/lnmp# mv mysql-8.0.18-linux-glibc2.12-x86_64 mysql
root@linuxprobe:/lnmp# mv mysql /usr/local
第 2 步:在生产环境中管理 MySQL 数据库时,有两个比较常用的目录。一个是/usr/ local/mysql 目录,用于保存 MySQL 数据库程序文件。另一个是/usr/local/mysql/ data 目录,用于保存数据库的具体内容,每个数据库的内容会被单独存放到一个目录内。对于存放实际数据库文件的 data 目录,用户需要先手动创建出来。
root@linuxprobe:/lnmp# cd /usr/local/mysql
root@linuxprobe:/usr/local/mysql# mkdir data
第 3 步:初始化 MySQL 服务程序,对目录进行授权,保证数据能被 mysql 系统用户读取。在初始化阶段,应使用 mysqld 命令确认管理 MySQL 数据库服务的用户名称、数据保存目录及编码信息。在信息确认无误后开始进行初始化。在初始化的最后阶段,系统会给用户分配一个初始化的临时密码,大家一定要保存好,例如下面示例中分配的密码是yr+IUmh9l,/i。
root@linuxprobe:/usr/local/mysql# chown -R mysql:mysql /usr/local/mysql
root@linuxprobe:/usr/local/mysql# cd bin
root@linuxprobe:/usr/local/mysql/bin# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2025-04-07T02:17:21.539094Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.18) initializing of server in progress as process 42031
2025-04-07T02:17:23.141934Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: yr+IUmh9l,/i
第 4 步:与 Nginx 服务相似,MySQL 数据库的二进制可执行命令也单独存放在自身的程序目录/usr/local/mysql/bin 中。若每次在执行命令之前都要先切换到这个目录,则着实有些麻烦,要能也加入 PATH 变量中可就方便太多了。说干就干!
root@linuxprobe:/usr/local/mysql/bin# cd ~
root@linuxprobe:~# vim ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
export PATH
root@linuxprobe:~# source ~/.bash_profile
在这样设置后,即便返回到源码目录,也可以继续执行 MySQL 数据库的管理命令。不过先别着急!既然是手动安装服务,那么让文件“归位”的重任就只得亲力亲为了—将启动脚本 mysql.server 放入/etc/init.d 目录中,让服务器每次重启后都能自动启动数据库,并给予可执行权限。
MySQL 数据库在 8.0 版本后需要一个重要的函数库文件才能启动—libtinfo.so.5。该文件与红帽 RHEL 10 系统中的 libtinfo.so.6 名称不一致,因此需要手动做一下链接文件。
root@linuxprobe:~# ln -s /usr/lib64/libtinfo.so.6 /usr/lib64/libtinfo.so.5
mysqld 并没有像 nginx 服务安装包那样提供启动文件(老版本有,在 bin 目录中),因此我们手写一个 systemd 服务文件,以后就可以用 systemctl 命令来管理了:
root@linuxprobe:~# vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL 8.0 Server
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld
LimitNOFILE = 5000
[Install]
WantedBy=multi-user.target
root@linuxprobe:~# systemctl daemon-reexec
root@linuxprobe:~# systemctl daemon-reload
最后再把 mysqld 服务目录的 SELinux 安全上下文修改为 bin_t,这样就可以启动了:
root@linuxprobe:~# semanage fcontext -a -t bin_t /usr/local/mysql/bin/mysqld
root@linuxprobe:~# restorecon -v /usr/local/mysql/bin/mysqld
Relabeled /usr/local/mysql/bin/mysqld from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:bin_t:s0
root@linuxprobe:~# systemctl start mysqld
root@linuxprobe:~# systemctl enable mysqld
Created symlink '/etc/systemd/system/multi-user.target.wants/mysqld.service' → '/usr/lib/systemd/system/mysqld.service'.
第 5 步:执行 MySQL 数据库服务启动文件,并进行初始化工作。MySQL 自 8.0 版本起, 安全性增强,不再允许用户使用临时密码管理数据库,也禁止远程控制,用户必须修改初始化密码才能使用。考虑到数据库是系统重要组成部分,为保障安全,建议密码位数不少于 20 位。例如,下面将密码修改为 7U9cnbMNVkcWVQZNtX9q。
root@linuxprobe:~# mysql -u root -p
Enter password: 在此处输入上面生成出的随机密码并回车
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> alter user 'root'@'localhost' identified by '7U9cnbMNVkcWVQZNtX9q';
Query OK, 0 rows affected (0.01 sec)
但这样还是不行,还需要继续切换到 mysql 数据库中,修改 user 表单的密码值。这也是从 MySQL 数据库 8.0 版本之后才有的新安全要求,在 MySQL 5/6 版本中就没有这么麻烦。
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| columns_priv |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
|………………省略部分输出信息………………|
+---------------------------+
33 rows in set (0.00 sec)
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '7U9cnbMNVkcWVQZNtX9q';
Query OK, 0 rows affected (0.01 sec)
由于 20.4 节将会安装部署 WordPress 博客系统,因此现在需要提前把数据库新建出来:
mysql> create database linuxcool;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
20.2.3 配置php服务

PHP(Hypertext Preprocessor,超文本预处理器)是一种通用的开源脚本语言,发明于 1995 年,它吸取了 C 语言、Java 语言及 Perl 语言的很多优点,具有开源、免费、快捷、跨平台、效率高等优良特性,是目前 Web 开发领域最常用的语言之一。
使用源码包的方式编译安装 PHP 语言环境其实并不复杂,难点在于解决 PHP 的程序包和其他软件的依赖关系。
第 1 步:解压 php 安装包软件并编译安装。在编译期间,需要使用--prefix 参数指定安装路径,使用--with-mysqli 等参数开启对数据库的支持模块,为后面的在线安装网站做好准备。
root@linuxprobe:~# cd /lnmp
root@linuxprobe:/lnmp# tar xvf php-8.1.32.tar.gz
root@linuxprobe:/lnmp# cd php-8.1.32
root@linuxprobe:/lnmp/php-8.1.32# ./configure --prefix=/usr/local/php --enable-fpm --with-mysqli --with-curl --with-pdo-mysql --with-pdo-sqlite --enable-mysqlnd --with-openssl --with-zlib
使用下述命令生成二进制文件并进行安装,时间大约为 10~20 分钟,耐心等待即可。
root@linuxprobe:/lnmp/php-8.1.32# make
root@linuxprobe:/lnmp/php-8.1.32# make install
第 2 步:将生成的 php 服务配置文件复制到安装目录中(/usr/local/php/),让其生效。现在主配置文件有了,接下来还需要 php-fpm 的配置文件,好在/usr/local/php/etc/目录中也已经提供,只需要复制模板即可。
root@linuxprobe:/lnmp/php-8.1.32# cp php.ini-development /usr/local/php/lib/php.ini
root@linuxprobe:/lnmp/php-8.1.32# cd /usr/local/php/etc/
root@linuxprobe:/usr/local/php/etc# mv php-fpm.conf.default php-fpm.conf
复制一个模板文件到 php-fpm.d 的目录中,用于后续控制网站的连接性能。
root@linuxprobe:/usr/local/php/etc# mv php-fpm.d/www.conf.default php-fpm.d/www.conf
root@linuxprobe:/usr/local/php/etc# cd ~
第 3 步:同样也是手写一份 systemd 服务文件,并把 php 服务加入到启动项中。
root@linuxprobe:~# vim /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=The PHP 8.1.32 FastCGI Process Manager
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true
Restart=on-failure
[Install]
WantedBy=multi-user.target
root@linuxprobe:~# systemctl daemon-reexec
root@linuxprobe:~# systemctl daemon-reload
第 4 步:由于 php 服务程序的配置参数会对 Web 服务的运行环境造成影响,如果默认开启了一些不必要且高危的功能(如允许用户在网页中执行 Linux 命令),则会降低网站被入侵的难度, 甚至会让入侵人员拿到整台 Web 服务器的管理权限。因此需要编辑 php.ini 配置文件,在第323 行的 disable_functions 参数后面追加上要禁止的功能。下面的禁用功能名单是依据本书配套站点的运行经验定制的,不见得适合每个生产环境,建议大家在此基础上根据自身工作需求酌情删减。
root@linuxprobe:~# vim /usr/local/php/lib/php.ini
320 ; This directive allows you to disable certain functions.
321 ; It receives a comma-delimited list of function names.
322 ; https://php.net/disable-functions
323 disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc _open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
第 5 步:LNMP 架构源码编译工作就此结束。准备享受胜利成果吧。
root@linuxprobe:~# systemctl start php-fpm
root@linuxprobe:~# systemctl enable php-fpm
20.3 搭建Wordpress博客
为了检验 LNMP 动态网站架构环境是否配置妥当,可以在上面部署 WordPress 博客系统, 然后查看效果。如果能够在 LNMP 动态网站环境中成功安装并使用 WordPress 网站系统,也就意味着这套架构是可用的。WordPress 是一种使用 PHP 语言开发的博客系统,可供用户在 支持PHP 和 MySQL 数据库的服务器上架设自己的博客。WordPress 具有丰富的插件和模板, 是当前最受欢迎的网站内容管理系统。截至 2025 年 4 月,全球排名前 1000 万的网站中已有43.2%使用了 WordPress,如果单看内容管理系统类网站,WordPress 的市场占有率则高达62.7%。
下面准备搭建 WordPress 博客。
把nginx 服务程序根目录的内容清空后,将 WordPress 解压后的网站文件复制进去:
root@linuxprobe:~# cd /lnmp
root@linuxprobe:/lnmp# rm -f /usr/local/nginx/html/*
root@linuxprobe:/lnmp# unzip wordpress.zip
root@linuxprobe:/lnmp# mv wordpress/* /usr/local/nginx/html
为了能让网站文件被 nginx 服务程序顺利读取,应设置目录所有权的身份及可读写的权限:
root@linuxprobe:/lnmp# chown -Rf nginx:nginx /usr/local/nginx/html
root@linuxprobe:/lnmp# chmod -Rf 777 /usr/local/nginx/html
随后访问 WordPress 网站的首页面,如图 20-4 所示。该页面提醒了用户稍后需要的安装信息。
图20-4 WordPress网站系统安装首页面
单击图 20-4 中的“现在就开始!”按钮,在随后出现的页面中依次输入刚刚建立的数据库名称、用户名及重置过的密码值。由于 WordPress 会要求用户自行创建好数据库,因此请确保页面中填写的数据库名称与刚才创建的一致,另外数据库地址应写 127.0.0.1 而不是 localhost,如图 20-5 所示。单击“提交”按钮进行确认后,便进入最终的安装阶段, 如图 20-6 所示。
图20-5 填写安装信息
图20-6 确认安装WordPress网站系统
顺利安装完毕后,WordPress 博客系统会要求用户填写站点标题、用户名及密码等信息, 如图 20-7 所示。这些信息均可自行填写,建议密码稍微复杂一些。在检查无误后即可单击“安装 WordPress”按钮进行安装。安装成功后的页面如图 20-8 所示。
图20-7 填网站标题及管理员名称
图20-8 安装完成界面
WordPress 的登录页面将在用户填写完账户及密码且单击“登录”按钮后自动出现, 如图 20-9 所示。
图20-9 填写网站账号和密码
顺利进入 WordPress 的管理后台,如图 20-10 所示。WordPress 作为最热门的网站内容管理系统,都能做出什么样的网站呢?大家一定对此很好奇,感兴趣的同学可以自行研 究一下。
图20-10 WordPress管理后台
看到图 20-10 这个成功搭建后的站点页面,刘遄老师心中真是五味杂陈,从 2015 年创业至今,它见证了我的梦想一步一步成为现实。建议对未来有期许的同学也动手搭建出一个属于自己的站点,这不仅可以让你输出的优质内容能帮助到更多人,没准也许能够帮助你实现梦想呢。
20.4 选购服务器主机
我们日常访问的站点由域名、站点源代码和服务器主机构成。其中,服务器主机用于存放站点的源代码,并将网页内容展示给用户。在本书即将结束之际,再啰嗦几句有关服务器主机的知识以及选购技巧。这些技巧都是在近几年做网站时总结出来的,希望能对大家有所帮助。
虚拟主机:在一台服务器中划分出一定的磁盘空间供用户放置站点信息和存储数据。这类主机仅提供基础的站点访问、数据存储与传输功能。虚拟主机极大地降低了用户的成本,且几乎不需要用户去维护除了站点以外的其他服务,非常适合小型站点。
VPS(Virtual Private Server,虚拟专用服务器):在一台服务器中利用 OpenVZ、Xen 或 KVM 等虚拟化技术模拟出多台“主机”(即 VPS),每台主机都有独立的 IP 地址和操作系统。不同 VPS 之间的磁盘空间、内存、CPU、进程与系统配置完全隔离,用户可自由使用分配到的主机中的所有资源,为此需要具备一定的维护系统的能力。VPS 适合小型网站。
ECS(Elastic Compute Service,弹性计算服务[通常称为云服务器]):ECS 是一种整合了计算、存储和网络功能,能支持弹性伸缩的计算服务。ECS 的使用方式与 VPS 几乎相同,差别是 ECS 建立在一组集群服务器中,每台服务器都保存了虚拟主机的备份镜像,这大大提高了安全性和稳定性。此外,ECS 具有更高的灵活性和扩展性, 用户按实际使用量付费。ECS 适合各类规模的网站。
独立服务器:独立服务器专供某一用户使用,其使用方式分为租用方式与托管方式。租用方式是用户将服务器的硬件配置要求告知 IDC 服务商,按照月、季、年为单位来租用它们的硬件设备。这些硬件设备由 IDC 服务商的机房工作人员负责维护,用户一般需要自行安装相应的软件并部署网站服务,这减轻了用户在硬件设备上的投入,比较适合大中型网站。托管方式则是用户需要自行购置服务器硬件设备,并将其交给IDC 服务商进行管理(需要缴纳管理服务费)。用户对服务器硬件配置有完全的控制权,自主性强,但需要自行维护、修理服务器硬件设备,比较适合大中型网站。
最后,需要提醒读者的是,在选择服务器主机供应商时,一定要注意查看其口碑,在综合分析后再做决定。某些供应商会有限制功能、强制添加广告、隐藏扣费或强制扣费等恶劣行为,请各位读者一定擦亮眼睛,不要上当!
复习题
-
使用源码包安装服务程序的最大优点和缺点是什么?
答:使用源码包安装服务程序的最大优点是,服务程序的可移植性好,而且能更好地提升服务程序的运行效率;缺点是源码包程序的安装、管理、维护和卸载都比较麻烦。
-
使用源码包的方式来安装软件服务的大致步骤是什么?
答:大致分为 5 个步骤,分别为下载及解压源码包文件、编译源码包代码、生成二进制安装程序、运行二进制的服务程序安装包、清理源码包临时文件。
-
LNMP 动态网站部署架构通常包含哪些服务程序?
答:LNMP 动态网站部署架构通常包含 Linux 系统、Nginx 网站服务、MySQL 数据库管理系统,以及 PHP 脚本语言。
-
使用 mysqld 命令及 initialize 参数对 MySQL 数据库服务程序进行初始化,产生的密码能否直接用于搭建网站?
答:不可以,系统会提示权限不足。初始化产生的密码是一个临时的密码,唯一的作用是让用户登录数据库,并设置自己的新密码。
-
相较于 Apache 服务,Nginx 最显著的优势是什么?
答:Nginx 服务比较稳定,原因是采用了分阶段的资源分配技术,降低了 CPU 与内存的占用率,所以使用 Nginx 程序部署的动态网站环境不仅十分稳定、高效,而且消耗的系统资源也很少。
-
安装 Nginx 服务后无法找到 nginx 命令,可能是什么原因?
答:没有将 Nginx 服务的命令目录(/usr/local/nginx/sbin)加入到系统 PATH 变量中。
-
MySQL 服务程序的/usr/local/mysql 和/usr/local/mysql/data 目录有什么区别?
答:/usr/local/mysql 是服务程序文件目录,而/usr/local/mysql/data 是数据库文件目录。
-
如何禁止php 服务程序中不安全的功能?
答:编辑 php 服务程序的配置文件(/usr/local/php/etc/php.ini),把要禁用的功能追加到 disable_functions 参数之后即可。
-
除了 Wordpress 外,请再说出另外几种常见的站点系统。
答:Discuz!、织梦 CMS、Z-Blog、PHPWind、帝国CMS、ThinkPHP。
-
对于处于创业阶段的小站长群体来说,适合购买哪种服务器类型呢?
答:建议选择 ECS,不但费用便宜(每个月费用不超过 100 元人民币),而且性能也十分强劲。