LNMP 动态网站部署架构是一套由 Linux + Nginx + MySQL + PHP 组成的动态网站系统解决方案,具有免费、高效、扩展性强且资源消耗低等特性,目前正在被广泛使用。本章首先对比使用源码包安装服务程序与使用 RPM 软件包安装服务程序的区别,然后学习如何手工编译源码包并安装各个服务程序,再使用 WordPress 博客系统验证架构环境。
LNMP 中的字母 L 指 Linux 不仅可以是 RHEL 、 CentOS 、 Fedora , 还可以是 Debian 、 Ubuntu 等 系 统 。 刘老师的多个站点如 linuxprobe.com 就是基于 LNMP 部署出来的,一直运行很稳定,访问速度也很快。
20.1 源码包程序
在 RPM(红帽软件包管理器)技术出现之前,Linux 系统运维人员只能通过源码包的方式来安装服务程序,这是一件非常消耗时间与耐心的事情;而且在安装、升级、卸载程序时还要考虑到与其他程序或函数库的相互依赖关系,这就要求运维人员要掌握更多的 Linux 系统理论知识及实操经验。现在依然有些软件程序只有源码包的形式,如果我们只会使用 dnf/yum 命令来安装程序,则面对这些只有源码包的软件程序时,将充满无力感,对日后的运维工作带来不利。
下面来学习如何使用源码包的方式来安装服务程序,其实使用源码包来安装服务程序具有两大优势。
➢ 源码包的可移植性非常好,几乎可以在任何 Linux 系统中安装使用,而 RPM 软件包是针对特定系统和架构编写的指令集,必须严格地符合执行环境才能顺利安装(支持 RPM 包的系统才能安装)。
➢ 使用源码包安装服务程序时会有一个编译过程,因此能够更好地适应安装主机的系统环境,运行效率和优化程度都会强于使用 RPM 软件包安装的服务程序。可以将采用源码包安装服务程序的方式看作是针对系统的“专属定制”。
一般都是软件仓库没有合适的安装包可用,那就选择使用源码包来安装;使用源码包安装服务程序的过程看似复杂,但刘老师帮我们汇总后只需要 5 个步骤即可完成安装。接下来对每一个步骤进行详解。
第一步:下载及解压源码包文件;
为了方便在网络中传输,源码包文件通常会在归档后使用 gzip 或 bzip2 等格式进行压缩,因此具有.tar.gz 或.tar.bz2 的后缀,下载后先把里面的内容解压出来,然后再切换到源码包文件的目录中:
第二步:编译源码包代码;
在正式使用源码包安装服务程序之前,还需要使用编译 脚本针对当前系统进行一系列的评估工作,包括对源码包文件、软件之间及函数库之间的依赖关系、编译器、汇编器及链接器进行检查;还可以根据需要来追加--prefix 参数,来指定源码包程序的安装路径,当编译工作结束后,如果系统环境符合安装要求,会自动在当前目录下生成一个 Makefile 安装文件。
第三步:生成二进制安装程序;
刚刚生成的 Makefile 文件中会保存与系统环境、软件依赖关系和安装规则等相关的内容,接着便可以使用 make 命令来根据 Makefile 文件内容提供的合适规则,编译生成出可供用户安装的二进制可执行文件了。
第四步:运行二进制的程序安装包;
由于不需要再检查系统环境,也不需要再编译代码,因此运行二进制程序安装包成了速度最快的步骤;如果在源码包编译阶段使用了--prefix 参数指定路径,就会被安装到指定目录;没有则默认安装到/usr/local/bin 目录中。
第五步:清理源码包临时文件;
由于在安装服务程序的过程中进行了代码编译的工作,因此在安装后目录中会遗留下很多临时垃圾文件,本着尽量不要浪费磁盘存储空间的原则,可以使用 make clean 命令对临时文件进行彻底的清理。
在 RHCA 认证的 RH401 考试中,会要求考生写一个 RPM 软件包;其实 RPM 软件包就是把软件的源码包和针对特定系统、架构、环境编写的安装规则打包到一起的指令集。因此为了让用户都能适配到这个软件包程序,源码包的制作者会发布多种格式的 RPM 软件包(例如 i386、x86_64 等架构)来支持多种平台。用户在编译阶段(configure)就是在检查适配当前系统,因此会占用过多的系统资源,等待更长的时间。
20.2 LNMP 动态网站部署架构
在使用源码包安装服务程序之前,首先要让服务器本机具备编译程序源码的环境。这需要具备 C 语言、C++语言、Perl 语言的编译器,以及各种常见的编译支持函数库程序。因此先配置好软件仓库,然后把下面列出的这些软件包统统安装上,包太多加上 -y 参数就不用手动确认了。
apr* autoconf automake numactl bison bzip2-devel cpp curl-devel fontconfig-devel freetype-devel gcc gcc-c++ gd-devel gettext-devel kernel-headers keyutils-libs-devel krb5-devel libcom_err-devel libpng-devel libjpeg* libsepol-devel libselinux-devel libstdc++-devel libtool* libxml2-devel libXpm* libxml* libXaw-devel libXmu-devel libtiff* make openssl-devel patch pcre-devel perl php-common php-gd telnet zlib-devel libtirpc-devel gtk* ntpstat na* bison* lrzsz cmake ncurses-devel libzip-devel libxslt-devel gdbm-devel readline-devel gmp-devel
可以适当增大虚拟机的内存上限,让稍后的编译过程更快一些;由于接下来还需要从外部网络中获取 Nginx、MySQL、PHP 及 WordPress 等一系列的安装包,因此需要虚拟机网卡改为桥接模式或NAT模式,使其连接到互联网。
使用 nmtui 或 nm-connection-editor 命令修改为以 DHCP 模式自动获取网络信息,再 ping 命令确认外网连接成功。
刘老师已经帮我们把安装 LNMP 动态网站部署架构所需的 4 个软件源码包和 1 个用于检查效果的博客软件包上传到了站点服务器上。我们可以在 Windows 系统中下载后通过 ssh 服务传送到打算部署 LNMP 动态网站架构的 Linux 服务器中,也可以直接在 Linux 服务器中使用 wget 命令下载这些源码包文件。为了更好地找到它们,我们统一放到 /lnmp 目录下。
wget https://www.linuxprobe.com/Software/rpcsvc-proto-1.4.tar.gz
wget https://www.linuxprobe.com/Software/nginx-1.16.0.tar.gz
wget https://www.linuxprobe.com/Software/mysql-8.0.18.tar.xz
wget https://www.linuxprobe.com/Software/php-7.3.5.tar.gz
wget https://www.linuxprobe.com/Software/wordpress.tar.gz
下载完毕后记得把虚拟机网卡改回仅主机模式,手动配置 IP 地址。
rpcsvc-proto 是一款包含 rcpsvc 协议文件的支持软件包名称,rcpsvc 协议在后续 Nginx 与 MySQL 服务程序的部署过程中都需要调用到。在解压、编译各个软件包源码程序时,都会生成大量的输出信息,下文中会将其省略,请读者以实际操作为准。
cd 进入到解压后的目录,configure 编译源码包。
make 生成二进制安装程序。
make install 运行二进制程序安装包。
至此 rpcsvc-proto 源码包也就安装完成了,可以执行 make clean 清理编译产生的临时文件,再 cd . . 回到 /lnmp 目录准备下一个源码包的安装。
20.2.1 配置 Nginx 服务
Nginx 是一款相当优秀的用于部署动态网站的轻量级服务程序,它最初为俄罗斯的一家门户站点而开发的,因其稳定性、功能丰富、占用内存少且并发能力强而备受用户的信赖。目前国内诸如新浪、网易、腾讯等门户站点均已使用了此服务。
Nginx 服务程序采用了分阶段的资源分配技术,降低了 CPU 与内存的占用率,所以使用 Nginx 程序部署的动态网站环境不仅十分稳定、高效,而且消耗的系统资源也很少。此外与 Apache 具备的模块数量几乎相同,而且现在已经完全支持 proxy、rewrite、mod_fcgi、ssl、vhosts 等常用模块。更重要的是,Nginx 还支持热部署技术,即在不暂停服务的情况下直接对 Nginx 服务程序进行升级。 下面准备配置 Nginx 服务。
第一步:创建用于管理网站服务的系统账户。
Linux 为了让操作系统更加安全,需要由不同的系统用户来管理不同的服务程序。这样即便有黑客通过网站服务侵入了服务器,也无法对系统进行更大的破坏。在新建系统账户时应使用 -M 参数不创建对应的家目录,以及 -s 参数指定登录后的 Shell 解释器为 /sbin/nologin,禁止任何人通过这个账号登录主机。以往使用软件仓库安装服务程序时,系统会自动根据 RPM 软件包中的指令集完成类似配置等工作。但是使用源码包的方式来安装,这一切就需要自己来完成了。
第二步:编译安装 Nginx 网站服务程序。
为了让网站服务支持更多的功能,需要在编译过程中添加额外的参数,使用 prefix 参数指定服务将被安装到哪个目录,方便后面调用它。考虑到 HTTPS 协议的使用越来越广泛,所以这里用 with-http_ssl_module 参数来开启 Nginx 服务的 SSL 加密模块,以便开启 HTTPS 协议功能。
进入解压后的 nginx 目录,configure 编译时加 --prefix 和 with-http_ssl_module 参数。
接下来的 make、make install、make clean 操作同上这里省略截图;在编译、生成、安装三阶段中屏幕上会输出各式各样的信息,主要包含软件包的概要情况、当前系统的软件依赖关系,以及检查硬件平台的支持,只要进程没有报错或被强制终止,则代表正常安装成功。
第三步:安装完毕后进入最终配置阶段。
上面在编译环境中使用 prefix 参数指定了安装路径,在 Nginx 服务程序配置文件 /usr/local/nginx/conf/nginx.conf 中,我们总共要进行 3 处修改,首先是把第 2 行的注释符(#)删除,然后在后面写上负责运行网站服务程序的账户名称和用户组名称。这里设置为 nginx 用户及 nginx 用户组。
再修改第 45 行的文件名称,在其中添加 index.php,这个文件也是让用户浏览网站时第一眼看到的文件,也叫首页文件。
最后删除第 65~71 行前面的注释符(#)来启用虚拟主机功能,然后将第 69 行后面对应的网站根目录修改为 /usr/local/nginx/html,其中的 fastcgi_script_name 参数用于指脚本名称,也就是用户请求的 URL。信息填写正确才能使 Nginx 服务正确解析用户请求,否则访问的页面会提示“404 Not Found”的错误。
第四步:添加 nginx 管理命令到 PATH。
通过编译源码方式安装的服务默认不能被 systemctl 命令所管理,Nginx 服务本身的管理命令所在的目录是/usr/local/nginx/sbin,可使用绝对路径的形式输入命令但太麻烦;可以将/usr/local/nginx/sbin 路径加入到 PATH 变量~/.bash_profile 中,让 Bash 解释器在执行命令时自动搜索到它,然后在 source 命令后加载配置文件使参数立即生效,完成后只需要输入 nginx 命令即可启动网站服务。
配置完成后就可以直接输入 nginx 启动服务程序,并在浏览器中输入本机的 IP 地址或loopback 地址127.0.0.1,即可访问到 Nginx 网站服务程序的默认界面。
20.2.2 配置 MySQL 服务
我们在第 18 章了解过 MySQL 和 MariaDB 数据库管理系统之间的渊源,也夸奖了 MariaDB 数据库,但是 MySQL 数据库依然是生产环境中最常使用的关系型数据库管理系统之一。
源码包 MySQL 程序也需要在系统中创建一个名为 mysql 的用户,专门用于负责运行 MySQL 数据库。也要把这类账户的 Bash 终端设置成 nologin 解释器,但不需要做编译只需要做相应的配置就好。
解压 MySQL 安装包将解压出的程序目录改名并移动到 /usr/local 目录下,对其进行初始化操作后便可使用。需要注意的是,以.tar.xz 结尾的压缩包不用 z 参数进行解压。一般管理 MySQL 数据库有两个比较常用的目录。一个是 /usr/local/mysql 目录,这是用于保存 MySQL 数据库程序文件的路径。另一个是 /usr/local/mysql/data 目录,用于存储数据库的具体内容,每个数据库的内容会单独存放到一个目录内。对于 data 目录我们需要手动创建出来。
对目录进行授权,保证数据能够被 mysql 系统用户读取,然后初始化 MySQL 服务,应使用 mysqld 命令确认用户名称、数据保存目录及编码信息。在信息确认无误后按回车开始进行初始化,在初始化的最后阶段,系统会给用户分配一个初始化的临时密码,例如我们这次分配的密码是 gzLqkedL,06Z。
与 Nginx 服务相似,MySQL 数据库的二进制可执行命令也单独存放在自身的程序目录/usr/local/mysql/bin 中。若每次在执行命令之前都要先切换到这个目录确实麻烦,也加入到 PATH 变量 ~/.bash_profile 可就方便多了!别忘了执行 source 命令加载配置文件使参数立即生效。
既然是手动安装服务,那么让文件“归位”就得亲力亲为了—将启动脚本 mysql.server 放入到/etc/init.d 目录中并编辑,指定程序路径及数据目录,让服务器每次重启后都能自动启动数据库,并给予可执行权限。另外 /usr/lib64/libtinfo.so.5 文件是 MySQL 数据库在 8.0 版本后新添加的重要函数库文件,但默认不存在,需要将 libtinfo.so.6.1 文件复制过来或者作为链接文件才能正常启动。
执行 MySQL 数据库服务启动,并进行相关配置工作;为了安全着想,MySQL 自 8.0 版本起不再允许用户使用临时密码来管理数据库内容,也不能进行远程控制,用户必须修改初始化时生成的临时密码(回看上面为:gzLqkedL,06Z )后才能使用 MySQL 数据库。数据库作为系统重要的组成服务,密码位数建议设置在 20 位及以上,我们将密码修改为“hdsjbvj647HJKF76VUaz”。
但这样还是不行,还需要继续切换到 mysql 数据库中,修改 user 表单的密码值,这也是从 MySQL 数据库 8.0 版本之后才有的新安全要求,记得在 MySQL 5/6 版本中就没有这么麻烦。
顺便创建了一个数据库,后面会安装部署 WordPress 网站系统,到时可以用到。
20.2.3 配置 PHP 服务
PHP(Hypertxt Preprocessor,超文本预处理器)是一种通用的开源脚本语言,发明于 1995 年,它吸取了 C 语言、Java 语言及 Perl 语言的很多优点,具有开源、免费、快捷、跨平台性强、效率高等优良特性,是目前 Web 开发领域最常用的语言之一。 使用源码包的方式编译安装 PHP 语言环境并不复杂,难点在于解决 PHP 的程序包和其他软件的依赖关系。
第一步:解压 php 安装包软件并 configure 编译。
等参数开启对数据库的支持模块,为后面的在线安装网站做好准备。
随后的 make 命令生成二进制文件,并进行make install 安装 make clean清理,时间大约为 10~20 分钟,这里省略截图。
第二步:让PHP相关配置文件归位并生效。
将生成的 php 服务配置文件复制到安装目录中 /usr/local/php/lib 并重命名,还需要 php-fpm 的配置文件,好在/usr/local/php/etc/目录中也已经提供,只需要按模板重命名即可,以及重命名一个模板文件到 php-fpm.d 的目录中,用于后续控制网站的连接性能。
第三步:禁止不必要的 PHP 功能。
把 php 服务加入到启动项中,并赋予所有人可执行权限;由于PHP 默认开启了一些不必要且高危的功能(如允许用户在网页中执行 Linux 命令),因此需要编辑 php.ini 配置文件,在第 310 行的 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
顺利启动 PHP,至此 LNMP 架构源码编译工作就此结束。
20.3 搭建 WordPress 博客
如果能够在 LNMP 动态网站环境中成功安装并使用 WordPress 网站系统,也就意味着这套架构是可用的。WordPress 是一种使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的网站。WordPress 具有丰富的插件和模板系统,是当前最受欢迎的网站内容管理系统。截至 2021 年 5 月,全球排名前 1000 万的网站中已有超过 41%使用了 WordPress。下面准备搭建 WordPress 博客。
把 Nginx 服务程序根目录的内容清空后,将 WordPress 解压后的网站文件复制进去;为了能够让网站文件被 Nginx 服务程序顺利读取,应设置目录所有权的 nginx 身份及可读写的权限。
然后浏览器输入本机 IP 地址访问 WordPress 网站的首页面,该页面提醒了用户稍后需要的安装信息。单击图中的“现在就开始”按钮,
在随后出现的界面中依次输入前面建立的数据库名称、用户名及修改过的密码值。由于 WordPress 会要求用户自行创建好数据库,因此请确保网页中填写的数据库名称与刚才创建的一致,填好后单击“提交”按钮进行确认后,便进入最终的安装阶段。
继续点现在安装后,WordPress 网站系统会要求用户填写站点标题、用户名及密码等信息,这些信息均可自行填写。在检查无误后即可单击“安装 WordPress”按钮进行安装。安装成功后的界面如图。
安装成功后的界面如下图,点登录。
WordPress 的登录界面将在用户填写完账号及密码且单击“登录”按钮后自动出现。
顺利进入 WordPress 的管理后台;WordPress 作为最热门的网站内容管理系统,都能做出什么样的网站呢?我们可以自行研究一下。
20.4 选购服务器主机
我们日常访问的网站是由域名、网站源程序和主机共同组成的。主机则是用于存放网页源代码并把网页内容展示给用户的服务器。下述这些技巧都是刘老师在近几年做网站时总结出来的,希望能对大家有所帮助。
➢ 虚拟主机:在一台服务器中划分一定的磁盘空间供用户放置网站信息、存放数据等;仅提供基础的网站访问、数据存放与传输功能;能够极大地降低用户费用,也几乎不需要用户来维护网站以外的服务;适合小型网站。
➢ VPS(Virtual Private Server,虚拟专用服务器):在一台服务器中利用OpenVZ、Xen或KVM等虚拟化技术模拟出多台“主机”(即VPS),每个主机都有独立的IP地址、操作系统;不同VPS之间的磁盘空间、内存、CPU、进程与系统配置完全隔离,用户可自由使用分配到的主机中的所有资源,为此需要具备一定的维护系统的能力;适合小型网站。
➢ ECS(Elastic Compute Service,弹性计算服务[通常称为云服务器]):是一种整合了计算、存储、网络,能够做到弹性伸缩的计算服务;使用起来与VPS几乎一样,差别是云服务器是建立在一组集群服务器中,每个服务器都会保存一个主机的镜像(备份),从而大大提升了安全性和稳定性;另外还具备灵活性与扩展性;用户只需按使用量付费即可;适合大中小型网站。
➢ 独立服务器:这台服务器仅提供给用户个人使用,其使用方式分为租用方式与托管方式。租用方式是用户将服务器的硬件配置要求告知IDC服务商,按照月、季、年为单位来租用它们的硬件设备。这些硬件设备由IDC服务商的机房负责维护,用户一般需要自行安装相应的软件并部署网站服务,这减轻了用户在硬件设备上的投入,比较适合大中型网站。托管方式则是用户需要自行购置服务器硬件设备,并将其交给IDC服务商进行管理(需要缴纳管理服务费)。用户对服务器硬件配置有完全的控制权,自主性强,但需要自行维护、修理服务器硬件设备;比较适合大中型网站。
最后需要提醒大家的是,在选择服务器主机供应商时请一定要注意查看口碑,并在综合分析后再决定购买。某些供应商会有限制功能、强制添加广告、隐藏扣费或强制扣费等恶劣行为,请大家一定擦亮眼睛,不要上当!