这里使用LNMP来完成网站的搭建。LNMP是Linux、Nginx、MySQL、PHP的首字母的组合,一个最常见的应用就是实现动态页面的处理。其基本原理如下
首先,浏览器发送http request请求到服务器80端口(Nginx),服务器响应并处理web请求,将php脚本通过接口传输协议(网关协议)PHP-FCGI(fast-cgi)传输给(9000端口)PHP-FPM(进程管理程序),然后PHP-FPM调用PHP解析器进程,PHP解析器解析php脚本信息。PHP解析器进程可以启动多个,进行并发执行。然后将解析脚本中的内容并访问数据库,然后将执行结果返回到PHP-FPM,PHP-FPM再通过fast-cgi的形式将脚本信息传送给Nginx,服务器再通过Http response的形式传送给浏览器。浏览器再进行解析与渲染然后进行呈现。
Nginx相对与Apache运行速度更快、效率更高、软件小巧,Nginx是一个高性能的HTTP和反向代理服务器,淘宝所使用的Tengine是淘宝在Nginx做了二次开发。
一般来来说在官方说明文档中会说明需要哪些依赖包。如果在官方文档中没有说明,可以先尝试直接安装,然后根据报错信息安装依赖包,一般以devel结尾的为依赖包。这里需要按照的依赖包如下
yum -y install gcc pcre-devel openssl-devel
只在源码安装的时候需要创建用户。如果直接使用yum进行安装就不需要创建用户,通过yum安装会自动生成一个普通用户,运行该程序会以该普通用户的身份运行
安全策略是针对用户和组,当电脑中的某个程序启动后,该程序会在电脑中读写文件,当用户启动程序后,该程序会继承该用户的权限,当启用程序的用户是root时,该程序可以在任意位置读写文件。
为了防止入侵者破解服务器的该程序后,掌握了服务器的超级管理员的权限,需要创建一个无法登录的普通用户,通过root用户启动程序后,程序运行后会切换到普通用户
useradd -s /sbin/nologin nginx
首先先在官网下载自己需要的nginx版本
wget https://nginx.org/download/nginx-1.9.9.tar.gz
然后接下nginx的压缩包
tar -zxvf nginx-1.9.9.tar.gz
然后进入解压后的目录中
cd nginx-1.9.9
完成下面的配置操作
./configure \
--prefix=/usr/local/nginx \ #指定安装路径
--user=nginx \ #指定用户
--group=nginx \ #指定组
--with-http_ssl_module #开启ssl加密功能
最后完成编译安装
make && make install
可以执行下面的命令查看nginx的版本,并验证nginx成功安装
/usr/local/nginx/sbin/nginx -v
如果页面显示nginx版本表示成功安装。
可以执行下面的命令启动nginx
/usr/local/nginx/sbin/nginx
需要注意的是在启动nginx的时候要确保80端口没有服务,因为nginx默认会占用80端口,如果nginx启动的时候80端口已经被占用,会导致启动失败,首先需要关于占用了80端口的服务。
当nginx启动后,可以看到80端口被nignx监听
netstat -antulp | grep nginx
可以使用下面的命令停止nginx服务
/usr/local/nginx/sbin/nginx -s stop
当修改了nginx的配置文件后,可以不用重启nginx服务,而通过命令让nginx重新加载配置文件,就可以读入新修改的配置信息
/usr/local/nginx/sbin/nginx -s reload
如果觉得nginx的操作命令过于长,而不方便输入的话,可以使用软连接的方式,缩短nginx的命令
ln -s /usr/local/nginx/sbin/nginx /sbin/
将/usr/local/nginx/sbin/nginx链接到sbin目录下,这样就可以直接使用nginx而不需要使用/usr/local/nginx/sbin/nginx来操作nginx。
nginx配置文件的路径为
/usr/local/nginx/conf/nginx.conf
常用内容的说明如下
#usr nobody; #以什么身份启动程序
worker_processes 1; #启动几个nginx
#error_log logs/error.log; #错误日志的路径
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #存放nginx的进程id
events {
worker_connections 1024; #允许的最大连接数
}
server {
listen 80; #监听80端口
server_name localhost; #网站的域名
location / {
root html; #网页的位置,可以使用相对路径也可以使用绝对路径
index index.html index.htm; #默认首页
}
}
这里使用MariaDB代替MySQL,MariDB是MySQL的一个分支,主要由开源社区维护,完全兼容MySQL,包括API和命令行。先MySQL已经属于Oracle旗下,可能存在闭源的风险。MariaDB是一个很好的MySQL替代品。
首先通过yum完成软件的安装
yum -y install mariadb mariadb-server mariadb-devel
yum -y install php php-mysql php-fpm
#php为php的解释器
#php-mysql为php提供链接数据库的功能
#php-fpm为进程管理器服务
安装完成后启动相关服务
systemctl start mariadb
systemctl start php-fpm
成功启动服务后,可以看到我们需要的三个服务都已经成功监听了对应的端口
我们可以了解一下php-fpm的配置文件,首先配置文件的路径是
/etc/php-fpm.d/www.conf
配置文件的内容如下
[www]
listen = 127.0.0.1:9000 #监听端口
listen.allowed_clients = 127.0.0.1
usr = apache
group = apache
pm = dynamic
pm.max_children = 50 #最大的子进程数量
pm.start_servers = 5 #初始的子进程数量
pm.min_spare_servers = 5 #最小的空闲进程数量
pm.max_spare_servers = 35 #最多的空闲进程数量
完成了相关服务器的下载,我们要接着配置nginx,也就是让nginx接收到php页面后会往9000端口进行转发。
在nginx的配置文件中一个server配置块可以代表一台虚拟主机,比如
通过域名www.a.com访问到的站点为
server {
listen 80;
server_name www.a.com;
location / {
root html;
index index.html index.htm;
}
}
其中网站的根目录为/usr/local/nginx/html。通过域名www.b.com访问到的站点为
server {
listen 80;
server_name www.b.com;
location / {
root www;
index index.html index.htm;
}
}
其中网站的根目录为/usr/local/nginx/www。也就是说用户通过两个域名会访问到不同的网站,但是者两个不同的网站是位于同一主机中的不同目录下,而在用户看来是完全不同的两台主机。
注意到在server块中有一个location字段的配置内容,该字段是用来匹配域名后面的路径,当我们直接使用域名访问网站的时候,实际上我们访问的URL为
http://www.a.com/
最后的/表示访问网站的根目录,如果我们要访问站点test目录下的test.php文件,可以将URL修改为
http://www.a.com/test/test.php
在权限允许的情况下就可以成功访问到test目录下的test.php文件。这个location字段就是用来匹配域名后面的/test/test.php。在上面的例子中,location匹配的是网站的根目录/,这里我们想让nginx发现请求的内容为php文件的时候往9000端口的php-fpm转发,可以将配置文件修改为
location /.php$
{
root html
fastcgi_pass 127.0.0.1:9000;
fastcgi_ince index.php;
include fastcgi.conf;
}
location可以支持正则匹配,这里表示匹配以.php结尾的文件。如果配置了虚拟主机,在需要转发的虚拟主机的server块中配置,如果没有配置虚拟主机,在第一个配置即可。一般来说在nginx的配置文件中已经存在了该内容,但是处于注释状态,我们只需要取消注释即可。修改完配置文件后,需要重新加载配置文件让其生效
/usr/local/nginx/sbin/nginx -s reload
随后我们在网站的根目录下放一个php文件验证是否配置成功,如果没有修改网站的根目录,默认的根目录为
/usr/local/nginx/html
我们在该目录下放置如下的test.php文件
$a='hello,world';
echo $a;
?>
说明站点能够解析我们的php文件。需要注意如果出现无法访问的情况,可以先尝试关闭linux的防火墙和selinux
systemctl stop firewalld
setenforce 0
然后再尝试访问。
完成了网站的php解析配置,接下来要配置数据库的访问,之前我们已经完成了MariaDB的安装。接下来我们运行命令
mysql_secure_installation
进行相关配置。运行该命令后,首先会让你输入当前的密码,因为我们是刚刚安装并没有密码,所以直接回车使用默认的none
然后会让你输入密码,可以输入你想要设置的密码
接着默认是否删除匿名用户、是否禁止root远程登录、是否删除test数据库、是否重新加载权限表。都直接回车使用默认配置即可。完成了上面的配置后,我们可以使用用户名和密码登录数据库
完成了上面的配置后,我们需要在MariaDB中创建一个数据库,并存放一些信息用于接下来的测试
create database test;
use test;
create table user(name varchar(20),passwd varchar(255));
insert into user value('Tom',md5('123456'));
insert into user value('admin',md5('admin'));
随后我们完成下面的登录逻辑的编写
login.html
<html>
<head>
<meta charset="UTF-8">
<title>logintitle>
head>
<body>
<form action="login.php" method="POST" target="_self">
username:<input type="text" name="username"/><br />
password:<input type="password" name="password"/><br />
<input type="submit" value="login"><hr />
form>
body>
html>
login.php
#1.从前端获取数据
$username=$_REQUEST["username"];
$password=$_REQUEST["password"];
#2.连接数据库
$conn=mysqli_connect('localhost','root','123456','test');
if(!$conn) die("");
#3.构造查询语句
$md5_password=md5($password);
$sql="select * from user where name='$username' and password='$md5_password' limit 0,1";
#4.进行查询,并获得结果
$result=mysqli_query($conn,$sql);
$row=mysqli_fetch_array($result);
#5.进行结果验证
if($row["name"]==$username && $row["password"]==$md5_password)
{
echo "Welcome ".$username."
";
}else{
echo "";
}
?>
如果站点能够正确的验证用户名与密码的匹配情况,说明站点可以成功的于数据库进行交互,也就是说数据库配置成功。
自此我们便完成了LNMP环境的搭建,在最后一步的用户登录页面,因为于数据库交互的是php文件,所以站点可以成功的解析php。又因为站点可以成功的识别用户名和密码的匹配,说明php可以正常的雨数据库进行交互,也就是说完整的用户登录验证过程会跑通整个的LNMP流程。如果用户登录的逻辑可以正常执行,说明整个LNMP环境搭建成功。
完成了LNMP的搭建后。可以选择一个自己喜欢的CMS,来完成网站的建立。CMS有很多种,常见的有dedeCMS、Wordpress等等。可以根据自己的需要选择自己喜欢的CMS。通常只需要将CMS的源码放在网站的根目录。然后通过浏览器访问CMS的安装文件,剩下的交给CMS完成即可。