源码安装LNMP
# CentOS7安装各种依赖包
[root@zuolaoshi ~]# yum -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 --skip-broken
# Ubuntu安装各种依赖
[root@zuolaoshi ~]# apt update
[root@zuolaoshi ~]# apt upgrade -y
[root@zuolaoshi ~]# apt install -y libpng-dev build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev libaio1 libaio-dev libtinfo5 libncurses-dev libncurses5 libncurses5-dev libncursesw5 libncursesw5-dev autoconf libtool bison re2c pkg-config libxml2-dev libsqlite3-dev libcurl4-openssl-dev libbz2-dev libonig-dev libzip-dev libgmp-dev libreadline-dev libffi-dev
# 局域网下载源码包
[root@zuolaoshi ~]# wget http://192.168.3.200/Software/lnmp.tar.xz
# 解压缩
[root@zuolaoshi ~]# tar -xvf lnmp.tar.xz
lnmp/
lnmp/nginx-1.16.0.tar.gz
lnmp/Discuz_X3.5_SC_UTF8_20231221.zip
lnmp/php-7.3.5.tar.gz
lnmp/wordpress.tar.gz
lnmp/rpcsvc-proto-1.4.tar.gz
lnmp/mysql-8.0.18.tar.xz
# 查看
[root@zuolaoshi ~]# ls
anaconda-ks.cfg lnmp lnmp.tar.xz
[root@zuolaoshi ~]# cd lnmp
[root@zuolaoshi lnmp]# ls
Discuz_X3.5_SC_UTF8_20231221.zip nginx-1.16.0.tar.gz rpcsvc-proto-1.4.tar.gz
mysql-8.0.18.tar.xz php-7.3.5.tar.gz wordpress.tar.gz
rpcsvc-proto
rpcsvc-proto是一款包含rcpsvc协议文件的支持软件包名称,rcpsvc协议在后续Nginx与MySQL服务程序的部署过程中都需要被调用到。要想通过源码包安装服务程序,就一定要严格遵守上面总结的安装步骤:下载及解压源码包文件、编译源码包代码、生成二进制安装程序、运行二进制的服务程序安装包。在解压、编译各个软件包源码程序时,都会生成大量的输出信息,下文中会将其省略,请读者以实际操作为准。
[root@zuolaoshi lnmp]# tar xzvf rpcsvc-proto-1.4.tar.gz
[root@zuolaoshi lnmp]# cd rpcsvc-proto-1.4/
[root@zuolaoshi rpcsvc-proto-1.4]# ./configure
[root@zuolaoshi rpcsvc-proto-1.4]# make
[root@zuolaoshi rpcsvc-proto-1.4]# make install
[root@zuolaoshi rpcsvc-proto-1.4]# cd ..
[root@zuolaoshi lnmp]#
由于本章涉及的软件较多,频繁地切换工作目录在所难免。一方面我们会在每次操作后尽可能地返回到/lnmp目录下待命,另一方面也请读者仔细看清所在的目录路径,以免因为找不到文件而影响心情。
配置Nginx服务
Nginx是一款相当优秀的用于部署动态网站的轻量级服务程序,它最初是为俄罗斯的一家门户站点而开发的,因其稳定性、功能丰富、占用内存少且并发能力强而备受用户的信赖。目前国内诸如新浪、网易、腾讯等门户站点均已使用了此服务。
Nginx服务程序的稳定性源自于采用了分阶段的资源分配技术,降低了CPU与内存的占用率,所以使用Nginx程序部署的动态网站环境不仅十分稳定、高效,而且消耗的系统资源也很少。此外,Nginx具备的模块数量与Apache具备的模块数量几乎相同,而且现在已经完全支持proxy、rewrite、mod_fcgi、ssl、vhosts等常用模块。更重要的是,Nginx还支持热部署技术,可以7×24小时不间断提供服务,还可以在不暂停服务的情况下直接对Nginx服务程序进行升级。
坦白来讲,虽然Nginx程序的代码质量非常高,代码很规范,技术成熟,模块扩展也很容易,但依然存在不少问题。比如,Nginx是由俄罗斯人开发的,资料文档还不完善,中文资料的质量更是鱼龙混杂。但是Nginx服务程序在近年来增长势头迅猛,相信会在轻量级Web服务器市场具有不错的未来。
下面进入主题,准备配置Nginx服务。
第1步:创建用于管理网站服务的系统账户。这是在Linux系统创建之初就植入的基因片段—为了能够让操作系统更加安全,需要由不同的系统用户来管理不同的服务程序。这样即便有黑客通过网站服务侵入了服务器,也无法提权到更高权限,或是对系统进行更大的破坏,甚至都无法登录ssh服务,因为他拿到的仅仅是一个系统账号。不同以往,这次在新建账户时应使用-M参数不创建对应的家目录,以及使用-s参数指定登录后的Shell解释器为/sbin/nologin,确保任何人都不能通过这个账号登录主机。
[root@zuolaoshi lnmp]# useradd nginx -M -s /sbin/nologin
[root@zuolaoshi lnmp]# id nginx
uid=1001(nginx) gid=1001(nginx) groups=1001(nginx)
第2步:编译安装Nginx网站服务程序。为了能够让网站服务支持更多的功能,需要在编译过程中添加额外的参数,其中较为重要的是使用prefix参数指定服务将被安装到哪个目录,方便后面找到和调用它。其次,考虑到HTTPS协议的使用越来越广泛,所以这里用with-http_ssl_module参数来开启Nginx服务的SSL加密模块,以便日后开启HTTPS协议功能:
[root@zuolaoshi lnmp]# tar zxvf nginx-1.16.0.tar.gz
[root@zuolaoshi lnmp]# cd nginx-1.16.0/
[root@zuolaoshi nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
[root@zuolaoshi nginx-1.16.0]# make
[root@zuolaoshi nginx-1.16.0]# make install
[root@zuolaoshi nginx-1.16.0]# cd ..
相对来说,编译脚本文件(configure)比生成二进制文件(make)要快,而安装程序(make install)则是最快的,它相当于以双击的方式运行二进制安装包。在编译、生成、安装三阶段中,屏幕上会输出各式各样的信息,主要包含软件包的概要情况、当前系统的软件依赖关系,以及是否有条件进行安装操作。但只要进程没有被强制终止,或是没有输出明显报错信息,则都是正常情况。
第3步:安装完毕后进入最终配置阶段。既然在编译环境中使用prefix参数指定了安装路径,那么Nginx服务程序配置文件一定会乖乖地在/usr/local/nginx目录中等我们。
我们总共要进行3处修改,首先是把第2行的注释符(#)删除,然后在后面写上负责运行网站服务程序的账户名称和用户组名称。这里假设由nginx用户及nginx用户组负责管理网站服务。
[root@zuolaoshi lnmp]# vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
其次是修改第45行的首页文件名称,在里面添加index.php的名字。这个文件也是让用户浏览网站时第一眼看到的文件,也叫首页文件。
location / {
root html;
index index.php index.html index.htm;
}
最后再删除第65~71行前面的注释符(#)来启用虚拟主机功能,然后将第69行后面对应的网站根目录修改为/usr/local/nginx/html,其中的fastcgi_script_name参数用于指代脚本名称,也就是用户请求的URL。只有信息填写正确了,才能使Nginx服务正确解析用户请求,否则访问的页面会提示“404 Not Found”的错误。
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
第4步:通过编译源码方式安装的服务默认不能被systemctl命令所管理,而要使用Nginx服务本身的管理工具进行操作,相应命令所在的目录是/usr/local/nginx/sbin。由于使用绝对路径的形式输入命令未免会太麻烦,建议将/usr/local/nginx/sbin路径加入到PATH变量中,让Bash解释器在后续执行命令时自动搜索到它。然后在source命令后加载配置文件,让参数立即生效。下次就只需要输入nginx命令即可启动网站服务了。
[root@zuolaoshi 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@zuolaoshi lnmp]# source ~/.bash_profile
[root@zuolaoshi lnmp]# nginx
操作完毕!重启服务程序,并在浏览器中输入本机的IP地址,即可访问到Nginx网站服务程序的默认界面,如图20-3所示。相较于Apache服务程序的红色默认页面,Nginx服务程序的默认页面显得更加简洁。
配置Mysql服务
接下来准备配置MySQL服务。
[root@zuolaoshi lnmp]# useradd mysql -M -s /sbin/nologin
第1步:解压MySQL安装软件包。将解压出的程序目录改名并移动到/usr/local目录下,对其进行初始化操作后便可使用。需要注意的是,以.tar.xz结尾的压缩包软件,不应用z参数进行解压。
[root@zuolaoshi lnmp]# tar xvf mysql-8.0.18.tar.xz
[root@zuolaoshi lnmp]# mv mysql-8.0.18-linux-glibc2.12-x86_64 mysql
[root@zuolaoshi lnmp]# mv mysql /usr/local
第2步:在生产环境中管理MySQL数据库时,有两个比较常用的目录。一个是/usr/local/mysql目录,这是用于保存MySQL数据库程序文件的路径。还有一个是/usr/local/mysql/data目录,它用于存储数据库的具体内容,每个数据库的内容会被单独存放到一个目录内。对于存放实际数据库文件的data目录,用户需要先手动创建出来:
[root@zuolaoshi lnmp]# cd /usr/local/mysql
[root@zuolaoshi mysql]# mkdir data
第3步:初始化MySQL服务程序,对目录进行授权,保证数据能够被mysql系统用户读取。在初始化阶段,应使用mysqld命令确认管理MySQL数据库服务的用户名称、数据保存目录及编码信息。在信息确认无误后开始进行初始化。在初始化的最后阶段,系统会给用户分配一个初始化的临时密码,大家一定要保存好,例如下面示例中分配的密码是qfroRs,Ei4Ls。
[root@zuolaoshi mysql]# chown -R mysql:mysql /usr/local/mysql
[root@zuolaoshi mysql]# cd bin
[root@zuolaoshi bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2021-05-06T07:07:06.243270Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.18) initializing of server in progress as process 7606
2021-05-06T07:07:08.116268Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: qfroRs,Ei4Ls
第4步:与Nginx服务相似,MySQL数据库的二进制可执行命令也单独存放在自身的程序目录/usr/local/mysql/bin中。若每次在执行命令之前都要先切换到这个目录,则着实有些麻烦,要能也加入到PATH变量中可就方便太多了。说干就干!
[root@zuolaoshi bin]# 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@zuolaoshi bin]# source ~/.bash_profile
在这样设置后,即便返回到源码目录,也可以继续执行MySQL数据库的管理命令。不过先别着急!既然是手动安装服务,那么让文件“归位”的重任就只得亲力亲为了—将启动脚本mysql.server放入到/etc/init.d目录中,让服务器每次重启后都能自动启动数据库,并给予可执行权限。
libtinfo.so.5文件是MySQL数据库在8.0版本后新添加的重要的函数库文件,但默认不存在,需要将libtinfo.so.6.1文件复制过来或者作为链接文件才能正常启动:
[root@zuolaoshi bin]# cd /usr/local/mysql
[root@zuolaoshi mysql]# cp -a support-files/mysql.server /etc/init.d/mysqld
[root@zuolaoshi mysql]# chmod a+x /etc/init.d/mysqld
修改MySQL配置文件 /etc/my.cnf
[mysqld]
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log-error = /usr/local/mysql/data/error.log
pid-file = /usr/local/mysql/data/mysql.pid
socket = /tmp/mysql.sock
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-storage-engine=InnoDB
default-authentication-plugin=mysql_native_password
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
第5步:执行MySQL数据库服务启动文件,并进行初始化工作。为了安全着想,MySQL自8.0版本起不再允许用户使用临时密码来管理数据库内容,也不能进行远程控制,用户必须修改初始化密码后才能使用MySQL数据库。数据库作为系统重要的组成服务,密码位数不建议少于20位。例如,下面将密码修改为“PObejCBeDzTRCncXwgBy”。
[root@zuolaoshi mysql]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/usr/local/mysql/data/error.log'.
. SUCCESS!
[root@zuolaoshi mysql]# 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 'PObejCBeDzTRCncXwgBy';
Query OK, 0 rows affected (0.01 sec)
mysql>
但这样还是不行,还需要继续切换到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 'PObejCBeDzTRCncXwgBy';
Query OK, 0 rows affected (0.01 sec)
之后将会安装部署WordPress网站系统,因此现在需要提前把数据库新建出来:
mysql> create database linuxcool;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
配置php服务
PHP(Hypertxt Preprocessor,超文本预处理器)是一种通用的开源脚本语言,发明于1995年,它吸取了C语言、Java语言及Perl语言的很多优点,具有开源、免费、快捷、跨平台性强、效率高等优良特性,是目前Web开发领域最常用的语言之一。
使用源码包的方式编译安装PHP语言环境其实并不复杂,难点在于解决PHP的程序包和其他软件的依赖关系。
第1步:解压php安装包软件并编译安装。在编译期间,需要使用prefix参数指定安装路径,使用--with-mysqli等参数开启对数据库的支持模块,为后面的在线安装网站做好准备。
[root@zuolaoshi mysql]# cd ~/lnmp
[root@zuolaoshi lnmp]# tar xvf php-7.3.5.tar.gz
[root@zuolaoshi lnmp]# cd php-7.3.5/
[root@zuolaoshi 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
使用下述命令生成二进制文件并进行安装,时间大约为10~20分钟,耐心等待即可:
[root@zuolaoshi php-7.3.5]# make
[root@zuolaoshi php-7.3.5]# make install
第2步:将生成的php服务配置文件复制到安装目录中(/usr/local/php/),让其生效。现在主配置文件有了,接下来还需要php-fpm的配置文件,好在/usr/local/php/etc/目录中也已经提供,只需要复制模板即可:
[root@zuolaoshi php-7.3.5]# cp php.ini-development /usr/local/php/lib/php.ini
[root@zuolaoshi php-7.3.5]# cd /usr/local/php/etc/
[root@zuolaoshi etc]# mv php-fpm.conf.default php-fpm.conf
复制一个模板文件到php-fpm.d的目录中,用于后续控制网站的连接性能:
[root@zuolaoshi etc]# mv php-fpm.d/www.conf.default php-fpm.d/www.conf
第3步:把php服务加入到启动项中,使其重启后依然生效:
[root@zuolaoshi etc]# cd ~/lnmp/php-7.3.5
[root@zuolaoshi php-7.3.5]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@zuolaoshi php-7.3.5]# chmod 755 /etc/init.d/php-fpm
第4步:由于php服务程序的配置参数会对Web服务的运行环境造成影响,如果默认开启了一些不必要且高危的功能(如允许用户在网页中执行Linux命令),则会降低网站被入侵的难度,甚至会让入侵人员拿到整台Web服务器的管理权限。因此需要编辑php.ini配置文件,在第310行的disable_functions参数后面追加上要禁止的功能。下面的禁用功能名单是老师依据配套站点的运行经验而定制的,不见得适合每个生产环境,建议大家在此基础上根据自身工作需求酌情删减:
[root@zuolaoshi php-7.3.5]# vim /usr/local/php/lib/php.ini
307 ; This directive allows you to disable certain functions for security reasons.
308 ; It receives a comma-delimited list of function names.
309 ; http://php.net/disable-functions
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
第5步:LNMP架构源码编译工作就此结束。准备享受胜利成果吧。
[root@zuolaoshi php-7.3.5]# /etc/init.d/php-fpm start
Starting php-fpm done
搭建Wordpress博客
为了检验LNMP动态网站架构环境是否配置妥当,可以在上面部署WordPress博客系统,然后查看效果。如果能够在LNMP动态网站环境中成功安装并使用WordPress网站系统,也就意味着这套架构是可用的。WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设自己的网站。WordPress具有丰富的插件和模板系统,是当前最受欢迎的网站内容管理系统。截至2021年5月,全球排名前1000万的网站中已有超过41%使用了WordPress。
下面准备搭建WordPress博客。
把Nginx服务程序根目录的内容清空后,将WordPress解压后的网站文件复制进去:
[root@zuolaoshi php-7.3.5]# cd ..
[root@zuolaoshi lnmp]# rm -f /usr/local/nginx/html/*
[root@zuolaoshi lnmp]# tar xzvf wordpress.tar.gz
[root@zuolaoshi lnmp]# mv wordpress/* /usr/local/nginx/html/
为了能够让网站文件被Nginx服务程序顺利读取,应设置目录所有权的身份及可读写的权限:
[root@zuolaoshi lnmp]# chown -Rf nginx:nginx /usr/local/nginx/html
[root@zuolaoshi lnmp]# chmod -Rf 777 /usr/local/nginx/html
随后输入本机IP地址访问WordPress网站的首页面,如图所示。该页面提醒了用户稍后需要的安装信息。
单击图中的“现在就开始”按钮,在随后出现的界面中依次输入刚刚建立的数据库名称、用户名及重置过的密码值。由于WordPress会要求用户自行创建好数据库,因此请确保网页中填写的数据库名称与刚才创建的一致,如下图所示。单击“提交”按钮进行确认后,便进入最终的安装阶段,如图所示。
填写安装信息
确认安装WordPress网站系统
顺利安装完毕后,WordPress网站系统会要求用户填写站点标题、用户名及密码等信息,如图所示。这些信息均可自行填写,建议密码稍微复杂一些。在检查无误后即可单击“安装WordPress”按钮进行安装。安装成功后的界面如下图所示。
填网站标题及管理员名称
安装完成界面
WordPress的登录界面将在用户填写完账号及密码且单击“登录”按钮后自动出现,如图20-9所示。
填写网站账号和密码
顺利进入WordPress的管理后台,WordPress作为最热门的网站内容管理系统,都能做出什么样的网站呢?大家一定对此很好奇,感兴趣的同学可以自行研究一下。