原创系统笔记

linux部署LNMP架构动态网站环境

本文阅读 20 分钟
首页 系统笔记 正文

LNMP 动态网站部署架构是一套由 Linux + Nginx + MySQL + PHP 组成的动态网站系统解决方案,具有免费、高效、扩展性强且资源消耗低等优良特性,目前正在被广泛使用。首先对比使用源码包安装服务程序与使用 RPM 软件包安装服务程序的区别,然后讲解了如何手工编译源码包并安装各个服务程序,以及使用最受欢迎的 WordPress 博客系统验证架构环境。

源码包程序

在 RPM(红帽软件包管理器)技术出现之前,Linux 系统运维人员只能通过源码包的方式来安装各种服务程序,这是一件非常繁琐且极易消耗时间与耐心的事情;而且在安装、升级、卸载程序时还要考虑到与其他程序或函数库的相互依赖关系,这就要求运维人员不仅要掌握更多的 Linux 系统理论知识以及高超的实操技能,还需要有极好的耐心才能安装好一个源码软件包。

一般来讲,在安装软件时,如果能通过软件仓库来安装,就用 dnf 命令搞定它;反之则去寻找合适的 RPM 软件包来安装;如果实在没有资源可用,那就只能使用源码包来安装了。

[root@RS ~]# tar zxvf FileName.tar.gz   //解压源码包
[root@RS ~]# cd FileName               //进入源码包目录
[root@RS ~]# ./configure --prefix=/usr/locaol/program   //编译检查,并指定安装目录
[root@RS ~]# make           //编译生成安装服务程序的二进制
[root@RS ~]# make install   //运行安装包 
/*如果在源码包编译阶段使用了--prefix参数,那么此时服务程序就会被安装到那个目录;
如果没有自行使用参数定义目录的话,一般会被默认安装到/usr/local/bin目录中*/
[root@RS ~]# make clean   //清理临时文件
/*运行二进制的服务程序安装包。由于不需要再检查系统环境,也不需要再编译代码,因此运行二进制的服务程序安装包应该是速度最快的步骤。
如果在源码包编译阶段使用了--prefix参数,那么此时服务程序就会被安装到那个目录;如果没有自行使用参数定义目录的话,一般会被默认安装到/usr/local/bin目录中。*/

其实RPM软件包就是把软件的源码包和一个针对特定系统、架构、环境编写的安装规则打包到一起的指令集。因此,为了让用户都能使用这个软件包来安装程序,通常一个软件程序会发布多种格式的RPM软件包(例如i386、x86_64等架构)来让用户选择。而源码包的软件作者肯定希望自己的软件能够被安装到更多的系统上面,能够被更多的用户所了解、使用,因此便会在编译阶段(configure)来检查用户当前系统的情况,然后制定出一份可行的安装方案,所以会占用很多的系统资源,需要更长的等待时间。

LNMP动态网站架构

LNMP 动态网站部署架构是一套由 Linux + Nginx + MySQL + PHP 组成的动态网站系统解决方案。LNMP 中的字母 L 是 Linux 系统的意思,不仅可以是RHEL 、 CentOS 、 Fedora , 还 可 以 是 Debian 、 Ubuntu 等 系 统 。

在使用源码包安装服务程序之前,首先要让安装主机具备编译程序源码的环境。这需要具备 C 语言、C++语言、Perl 语言的编译器,以及各种常见的编译支持函数库程序。因此请先配置妥当软件仓库,然后把下面列出的这些软件包都统统安装上:

dnf -y install 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等一系列的安装包,因此需要配置虚拟机,将其连接到互联网。

LNMP动态网站部署架构所需的4个软件源码包在Windows系统中下载后通过ssh服务传送到打算部署LNMP动态网站架构的Linux服务器中,也可以直接在Linux服务器中使用wget命令下载这些源码包文件。为了更好地找到它们统一放到/lnmp目录下保存:

[root@webRS ~]# mkdir /lnmp
[root@webRS ~]# cd /lnmp
[root@webRS lnmp]# ls   //需要以下4个服务包
mysql-8.0.18.tar.xz  nginx-1.16.0.tar.gz  php-7.3.5.tar.gz  rpcsvc-proto-1.4.tar.gz

安装rpcsvc-proto

rpcsvc-proto是一款包含rcpsvc协议文件的支持软件包名称,rcpsvc协议在后续Nginx与MySQL服务程序的部署过程中都需要被调用到。要想通过源码包安装服务程序,就一定要严格遵守上面总结的安装步骤:下载及解压源码包文件、编译源码包代码、生成二进制安装程序、运行二进制的服务程序安装包。

[root@webRS lnmp]# tar zxvf rpcsvc-proto-1.4.tar.gz    //解压源码包文件
[root@webRS lnmp]# cd rpcsvc-proto-1.4                 //进入源码目录
[root@webRS rpcsvc-proto-1.4]# ./configure             //编译源码包代码
[root@webRS rpcsvc-proto-1.4]# make                    //生成二进制安装程序
[root@webRS rpcsvc-proto-1.4]# make install            //运行二进制安装程序安装包

安装Nginx服务

Nginx是一款相当优秀的用于部署动态网站的轻量级服务程序,它最初是为俄罗斯的一家门户站点而开发的,因其稳定性、功能丰富、占用内存少且并发能力强而备受用户的信赖。目前国内诸如新浪、网易、腾讯等门户站点均已使用了此服务。

Nginx服务程序的稳定性源自于采用了分阶段的资源分配技术,降低了CPU与内存的占用率,所以使用Nginx程序部署的动态网站环境不仅十分稳定、高效,而且消耗的系统资源也很少。此外,Nginx具备的模块数量与Apache具备的模块数量几乎相同,而且现在已经完全支持proxy、rewrite、mod_fcgi、ssl、vhosts等常用模块。更重要的是,Nginx还支持热部署技术,可以7×24小时不间断提供服务,还可以在不暂停服务的情况下直接对Nginx服务程序进行升级。

第一步:创建用于管理网站服务的系统账户。这是在Linux系统创建之初就植入的基因片段—为了能够让操作系统更加安全,需要由不同的系统用户来管理不同的服务程序。

[root@webRS ~]# useradd nginx -M -s /sbin/nologin
[root@webRS ~]# id nginx
uid=1001(nginx) gid=1001(nginx) groups=1001(nginx)

第二步:编译安装Nginx网站服务程序。为了能够让网站服务支持更多的功能,需要在编译过程中添加额外的参数,其中较为重要的是使用prefix参数指定服务将被安装到哪个目录,方便后面找到和调用它。其次,考虑到HTTPS协议的使用越来越广泛,所以这里用with-http_ssl_module参数来开启Nginx服务的SSL加密模块,以便日后开启HTTPS协议功能:

[root@webRS lnmp]# tar zxvf nginx-1.16.0.tar.gz 
[root@webRS nginx-1.16.0]# ./configure --prefix=/usr/locol/nginx --with-http_ssl_module
[root@webRS nginx-1.16.0]# make
[root@webRS nginx-1.16.0]# make install

在编译环境中使用prefix参数指定了安装路径,那么Nginx服务程序配置文件就会安装在/usr/local/nginx目录中。

第三步:配置文件共要进行3处修改

  1. 首先是把第2行的注释符(#)删除,然后在后面写上负责运行网站服务程序的账户名称和用户组名称。这里假设由nginx用户及nginx用户组负责管理网站服务。
  2. 其次是修改第45行的首页文件名称,在里面添加index.php的名字。这个文件也是让用户浏览网站时第一眼看到的文件,也叫首页文件。
  3. 最后再删除第65~71行前面的注释符(#)来启用虚拟主机功能,然后将第69行后面对应的网站根目录修改为/usr/local/nginx/html,其中的fastcgi_script_name参数用于指代脚本名称,也就是用户请求的URL。只有信息填写正确了,才能使Nginx服务正确解析用户请求,否则访问的页面会提示“404 Not Found”的错误。
[root@webRS lnmp]# vim /usr/local/nginx/conf/nginx.conf
    //......省略以下更改.............nginx用户和用户组
     2    user  nginx nginx;
    //......省略.............以下添加 index.php
    43            location / {
    44                root   html;
    45                index  index.php index.html index.htm;
    46            }
    //......省略.............以下去除#号注释,并更改了第69行
    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@webRS lnmp]# vi ~/.bash_profile 
    //......省略
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin
    //......省略
[root@webRS lnmp]# source ~/.bash_profile    //重新加载配置文件
[root@webRS lnmp]# nginx                     //直接启动nginx
firewall-cmd --permanent --zone=public --add-service=mysql
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

操作完毕!重启服务程序,并设置防火墙放行允许访问。最后在浏览器中输入本机的IP地址,即可访问到Nginx网站服务程序的默认界面,相较于Apache服务程序的红色默认页面,Nginx服务程序的默认页面显得更加简洁。

配置Mysql服务

MySQL数据库当前依然是生产环境中最常使用的关系型数据库管理系统之一,坐拥极大的市场份额,并且已经通过十几年不断的发展向业界证明了自身的稳定性和安全性。

第一步:在使用软件仓库安装服务程序时,系统会自动根据RPM软件包中的指令集完成软件配置等工作。但是一旦选择使用源码包的方式来安装,这一切就需要自己来完成了。对于MySQL数据库来说,需要在系统中创建一个名为mysql的用户,专门用于负责运行MySQL数据库。

useradd mysql -M -s /sbin/nologin

第二步:解压MySQL安装软件包。将解压出的程序目录改名并移动到/usr/local目录下,对其进行初始化操作后便可使用。需要注意的是,以.tar.xz结尾的压缩包软件,不应用 z 参数进行解压。

[root@webRS lnmp]# tar xvf mysql-8.0.18.tar.xz    //解压mysql源码包
[root@webRS lnmp]# mv mysql-8.0.18-linux-glibc2.12-x86_64 mysql   //剪切为mysql目录
[root@webRS lnmp]# mv mysql /usr/local                            //移动mysql至/usr/local目录
[root@webRS lnmp]# cd /usr/local/mysql                            //进入mysql目录
[root@webRS mysql]# mkdir data                                        

/usr/local/mysql目录,这是用于保存MySQL数据库程序文件的路径。

/usr/local/mysql/data目录,它用于存储数据库的具体内容,每个数据库的内容会被单独存放到一个目录内。对于存放实际数据库文件的data目录,用户需要先手动创建出来。

第三步:初始化MySQL服务程序,对目录进行授权,保证数据能够被mysql系统用户读取。在初始化阶段,应使用 mysqld 命令确认管理MySQL数据库服务的用户名称、数据保存目录及编码信息。在信息确认无误后开始进行初始化。在初始化的最后阶段,系统会给用户分配一个初始化的临时密码,大家一定要保存好,例如下面示例中分配的密码是 hj!Wuk*DM4gf

[root@webRS mysql]# chown -R mysql:mysql /usr/local/mysql
[root@webRS mysql]# cd bin/
[root@webRS bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2023-01-09T08:48:34.077950Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.18) initializing of server in progress as process 6946
2023-01-09T08:48:36.318860Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: hj!Wuk*DM4gf

第四步:与Nginx服务相似,MySQL数据库的二进制可执行命令也单独存放在自身的程序录/usr/local/mysql/bin中。也加入到PATH变量中就方便多了!

[root@webRS bin]# vi ~/.bash_profile 
......省略
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin:/usr/local/mysql/bin
......省略
[root@webRS bin]#  source ~/.bash_profile   //重新加载文件

在这样设置后,即便返回到源码目录,也可以继续执行MySQL数据库的管理命令。不过先别着急!既然是手动安装服务,那么让文件“归位”的重任就只得亲力亲为了—将启动脚本mysql.server放入到/etc/init.d目录中,让服务器每次重启后都能自动启动数据库,并给予可执行权限。

libtinfo.so.5文件是MySQL数据库在8.0版本后新添加的重要的函数库文件,但默认不存在,需要将libtinfo.so.6.1文件复制过来或者作为链接文件才能正常启动:

[root@webRS bin]# cd /usr/local/mysql                                //进入mysql程序目录
[root@webRS mysql]# cp -a support-files/mysql.server /etc/init.d    //带属性复制启动文件
[root@webRS mysql]# chmod a+x /etc/init.d/mysql.server                //赋予执行权限
[root@webRS mysql]# ln -s /usr/lib64/libtinfo.so.6.1 /usr/lib64/libtinfo.so.5    //创建软链接

第五步:执行MySQL数据库服务启动文件,并进行初始化工作。为安全着想,MySQL自8.0版本起不再允许用户使用临时密码来管理数据库内容,也不能进行远程控制,用户必须修改初始化密码后才能使用MySQL数据库。数据库作为系统重要的组成服务,密码位数不建议少于20位。例如,下面将密码修改为“1q2w3e4r5t6y7u8i9o0p”。

[root@webRS mysql]# /etc/init.d/mysql.server start   //启动数据库服务
Starting MySQL.Logging to '/usr/local/mysql/data/webRS.err'.
 SUCCESS! 
[root@webRS mysql]# mysql -u root -p    //登录数据库管理系统
Enter password:   //输入初始化时系统分配的密码
//---------------------------------以下为重新设置密码-----------------------------
mysql> alter user 'root'@'localhost' identified by '1q2w3e4r5t6y7u8i9o0p';
Query OK, 0 rows affected (0.00 sec)

第六步:还需要继续切换到mysql数据库中,修改user表单的密码值。这也是从MySQL数据库8.0版本之后才有的新安全要求,在MySQL 5/6版本中就没有这么麻烦。

mysql> use mysql
mysql> show tables;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1q2w3e4r5t6y7u8i9o0p';
//-----------------由于后面会安装部署动态网站系统,因此现在需要提前把数据库新建出来:
mysql> create database zxbke;   //创建一个名为 zxbke 数据库,后期部署博客使用
    Query OK, 1 row affected (0.01 sec)
mysql> exit                     //退出

配置php服务

PHP(Hypertxt Preprocessor,超文本预处理器)是一种通用的开源脚本语言,发明于1995年,它吸取了C语言、Java语言及Perl语言的很多优点,具有开源、免费、快捷、跨平台性强、效率高等优良特性,是目前Web开发领域最常用的语言之一。

使用源码包的方式编译安装PHP语言环境其实并不复杂,难点在于解决PHP的程序包和其他软件的依赖关系。

第一步:解压php安装包软件并编译安装。在编译期间,需要使用prefix参数指定安装路径,使用--with-mysqli等参数开启对数据库的支持模块,为后面的在线安装网站做好准备。

[root@webRS lnmp]# tar xvf php-7.3.5.tar.gz   //解压源码包
[root@webRS php-7.3.5]# ./configure --prefix=/usr/local/php --enable-fpm --with-mysqli --with-curl --with-pdo_mysql --with-pdo_sqlite --enable-mysqlnd --enable-mbstring --with-gd
[root@webRS php-7.3.5]# make   //生成二进制文件包,时间大约为10~20分钟
[root@webRS php-7.3.5]# make install   //安装二进制文件包

第二步:将生成的php服务配置文件复制到安装目录中(/usr/local/php/),让其生效。现在主配置文件有了,接下来还需要php-fpm的配置文件,好在/usr/local/php/etc/目录中也已经提供,只需要复制模板即可。

[root@webRS php-7.3.5]# cp php.ini-development /usr/local/php/lib/php.ini
[root@webRS php-7.3.5]# cd /usr/local/php/etc/
[root@webRS etc]# mv php-fpm.conf.default php-fpm.conf  
[root@webRS etc]# mv php-fpm.d/www.conf.default php-fpm.d/www.conf    //复制一个模板文件到php-fpm.d的目录中,用于后续控制网站的连接性能:

第三步:把php服务加入到启动项中,使其重启后依然生效:

[root@webRS etc]# cd /lnmp/php-7.3.5
[root@webRS php-7.3.5]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@webRS php-7.3.5]# chmod 755 /etc/init.d/php-fpm 

第四步:由于php服务程序的配置参数会对Web服务的运行环境造成影响,如果默认开启了一些不必要且高危的功能(如允许用户在网页中执行Linux命令),则会降低网站被入侵的难度,甚至会让入侵人员拿到整台Web服务器的管理权限。因此需要编辑php.ini配置文件,在第310行的disable_functions参数后面追加上要禁止的功能。下面的禁用功能名单是建议示例,不见得适合每个生产环境,建议在此基础上根据自身工作需求酌情删减:

[root@webRS php-7.3.5]# vim /usr/local/php/lib/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

第五步:LNMP架构源码编译工作就此结束。启动php ,查看成果。

[root@webRS php-7.3.5]# /etc/init.d/php-fpm start
Starting php-fpm  done

搭建个人博客

为了检验LNMP动态网站架构环境是否配置妥当,可以在上面部署WordPress博客系统,然后查看效果。如果能够在LNMP动态网站环境中成功安装并使用WordPress网站系统,也就意味着这套架构是可用的。WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设自己的网站。

[root@webRS lnmp]# rm -rf /usr/local/nginx/html/*
[root@webRS lnmp]# tar zxvf wordpress.tar.gz 
[root@webRS lnmp]# mv wordpress/* /usr/local/nginx/html/
[root@webRS lnmp]# chown -Rf nginx:nginx /usr/local/nginx/html 
[root@webRS lnmp]# chmod -Rf 777 /usr/local/nginx/html

加入主机重启以后,需要启动以下服务,或者加载以下防火墙;

启动服务

nginx
/etc/init.d/mysql.server start    
/etc/init.d/php-fpm start

防火墙设置

firewall-cmd --permanent --zone=public --add-service=mysql
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

如果需要设置伪静态,需要更改/usr/local/nginx/conf/nginx.conf

server {
listen 80;
server_name blog.siddim.com;
root /data/htdocs/www/;
index index.html index.htm index.php;
#加以下内容
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}
#更改此行内容,第二location开头
location ~ .*\.php(\/.*)*$ {
}
原创文章,作者:張旭,如若转载,请注明出处:http://www.zxbke.cn/85.html/

发表评论