LNMP(5)

一、实战

systemctl centos7
ipaddress 192.168.80.2
wordpress-verison wordpress-5.3.2-zh_CN
php-version 7.1
nginx-version yum安装-官方最新
//统一用户www,提前创建
groupadd -g 666 www;
useradd -u 666 -g 666 -M -s /sbin/nologin www;

1、安装

安装nginx

//用官方的yum源
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

//安装
yum -y install nginx

//更改主配置文件的启动用户
[root@nginx conf.d]# vim /etc/nginx/nginx.conf 
user  www;

//编写站点文件
[root@nginx conf.d]# vim default.conf 
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /code;
        index  index.php;
    }
 location ~ .php$ {
                root /code;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass 127.0.0.1:9000;
                include fastcgi_params;
                }
}

//创建站点目录
mkdir /code


//上传wordpress-5.3.2-zh_CN,unzip解压到/code目录
[root@nginx code]# mv wordpress/* ./

//更改权限
[root@nginx code]# chown -R www:www  /code

//启动
systemctl start nginx
systemctl enable nginx

//检查
ss -tnlp | grep 80
ps aux | grep nginx

数据库

//安装启动,设置密码
yum -y install mariadb-server mariadb
systemctl start mariadb
mysql_secure_installation  #初始化并设置密码

//创建wordpress数据库
create database wordpress;

//创建wordpress用户对wordpress数据库的授权
grant ALL on wordpress.* to wordpress@'localhost' identified by 'cba-123'; 

php

腾讯云提供的方法(亲测好用):

rpm -Uvh https://mirrors.cloud.tencent.com/epel/epel-release-latest-7.noarch.rpm 
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

yum -y install php70w php70w-opcache php70w-mbstring php70w-gd php70w-xml php70w-pear php70w-fpm php70w-mysql php70w-pdo

//编写配置谁的,保证nginx进程和php进程的用户一致
vim /etc/php-fpm.d/www.conf
user = www group=www

//启动进程
systemctl start php-fpm

//ps -aux 检查
ss -tnlp | grep 9000

yum-php7.3版本(新测好用):

yum -y install epel-release
yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm 
yum -y install yum-utils   

yum install -y php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-pecl-mcrypt php73-php-pecl-geoip php73-php-recode php73-php-snmp php73-php-soap php73-php-xml
 
systemctl enable php73-php-fpm
systemctl start php73-php-fp

rpm -ql php73-php-fpm-7.3.6-1.el7.remi.x86_64

老男孩教育提供方法(使用之后,wordpress不正常,样式丢失)

//卸载旧的php
yum remove php-mysql php php-fpm php-common

//使用专用的php源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

//开始安装php
yum install -y php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb

//编写配置谁的,保证nginx进程和php进程的用户一致
vim /etc/php-fpm.d/www.conf
user = www  nginx=www group=www

//启动进程
systemctl start php-fpm

//ps -aux 检查
ss -tnlp | grep 9000

wordpress

搭建

在浏览器上通过ip地址即可访问

管理URL:http://192.168.80.2/wp-admin/

报错解决

上传大文件时报413的错误,原因是因为默认文件大小是有限制的,我们只要更改一下限制就可以了。

//修改php-ini的配置文件
vim /etc/php.ini
upload_max_filesize = 50M

//更改网站的配置文件
vim /etc/nginx/conf.d/default.conf 
client_max_body_size 50m;    #在server标签下加这么一行

2、三者建立联系

nginx和php建立联系

[root@web01 conf.d]# cat default.conf 
server {
    listen       80;
    server_name  www.zhanghe.com;
    location / {               
        root   /code;
        index  index.html index.htm;
    }
    location ~ .php$ {     #匹配php结尾的文件,通过cgi接口交给php
                root /code;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  #重点,携带完整的URL
                fastcgi_pass 127.0.0.1:9000;   #交给php
                include fastcgi_params;   #变量所在的文件,与上面fastcgi相配合
                }
}
systemctl restart nginx
mkdir /code
cd /code
	vim index.php
        <?php
        phpinfo();
        ?>

192.168.80.2/index.php访问时会打印一个紫色的表格

php与mariadb建立关系

[root@nginx code]# pwd
/code
[root@nginx code]# cat index.php 
<?php
$servername = "localhost";
$username = "root";
$password = "cba-123";

$conn = mysqli_connect($servername,$username,$password);
if ($conn) {
	echo "mysql successful by root !
";
	}else{
	die("connection failed:" .mysqli_connect_error());
}
?>

访问: http://192.168.80.2/index.php ,结果如果成功了就会提示:“ mysql successful by root ! ”

二、数据分离

我们通过worpdress写的文章内容有图片,也有文字,用户账户信息和文字被存放至mysql数据库里面了,而像图片就没有被存放进mysql里面,而是存放在目录当中,在wordpress的主站点里面的wp-content目录里面。

我们可以这么做,我们可以把整个站点目录迁移到NFS存储上,然后把数据库也迁移到专门的数据库存储上,在WEB服务器通过NFS挂载站点目录,然后修改wordpress的配置文件连接远程的数据库,所以至少需要准备三台主机。

准备环境

web服务器 192.168.80.2
NFS服务器 192.168.80.3
MYSQL 192.168.80.4

第一步:我们先在要NFS服务器上搭建好NFS服务,然后将WEB服务器中的站点目录里面的内容全部迁移到NFS共享的目录当中,然后共享此目录。

第二步:在web服务器中将wordpress数据库导出,然后在mysql服务器导入,设置好权限。

第三步:在web服务器上挂载NFS共享的站点目录,并修改站点目录内worpdress的配置文件中的数据库指向,重启nginx服务,查看效果。

过程过于简单,所以演示过程就略过了……

三、理论

静态和动态

  • 静态资源:客户端从服务器获得的资源的表现形式与原文件相同。

  • 动态资源:通常是程序文件,需要在服务器执行之后,将执行的结果返回给客户端。

怎样理解这个静态呢?HTTPD程序接入到客户端的请求之后就是把客户端要请求的内容返回给客户端,其它的事情都没有做,只是做了I/0,内容没有发生改变,这就是静态资源。

web应用与php

httpd收到用户的请求之后,通过httpd的过滤功能(通常是后缀扩展名)可以区分出客户端请求的是静态资源还是动态资源,如果客户端请求的是静态资源的话(比如是html结尾的文件),httpd自己就可以发起系统调用完成响应;如果httpd识别出客户端请求的资源是一个以php或者.sh结尾的文件呢?httpd本身是无能无力的,它总不能把这个php结尾的源码文件发送给客户端吧,但是httpd程序有自己又不能执行php的文件,所以httpd需要与php解释器进行联动让php解释器把客户请求的程序执行一次,然后把结果返回给httpd进程,然后httpd进程再封装返回给客户端。那么httpdphp解释器是两个程序,那么怎样联动呢?

httpdphp解释器是两个不同的程序,就像两个说不同语言的人,相互谁也不理解谁,它们两个要想联动的话,就必须有统一的“交流语言”,这种情况在计算机的领域是非常常见的,都是使用协议来解决的,httpdphp之间都运行cgi协议,所谓的cgi协议就是“通用网关接口”,httpd可以通过加载一个模块来支持此协议,而php也是基于此协议来开发的,所以它们之间是可以相互交流的。

httpdphp在交流时的过程是这样的:

  1. httpd把客户端发过来动态资源请求通过cgi协议封装成请求包发送给php解释器

  2. php解释器收到之后会通过系统调用,然后IO,运行并处理引用户的动态资源,并通过数据流把结果发送给httpd程序,在这里需要注意,httpd加载静态资源的时候虽然加载的也是一个文件,但是实际就是一段数据流而已,当httpd收到来自php的响应报文时,收到的实际上也中是一段数据流,文件只是我们凭空想像出来的。

  3. httpd程序然后进行封装之后响应给客户端

总结

httpd像是客户端向php(服务器)发送请求,php做为服务器进行回应,httpd活生生像一个客户端!

换个角度再看,httpd就像是一个代理,对于动态资源的请求仅做一个转发作用,httpd活生生像一个代理!

php与mysql

php与数据库系统进行联动

php与数据库也是八竿子打不着的两个程序,它们怎样才一起联动呢?在这里并没有使用协议来解决这个问题,而是使用库调用来解决这个问题的。假设以php与mysql进行联动来说明吧!

php程序本身的确无法与mysql进行联动,php还需要加载一个驱动模板,这个驱动模块可能叫做php-mysql,如果数据库是甲骨文数据库,那么php要调用 php-甲骨文模块进行调用才与与甲骨文进行联动,因为php只有通过这个模块向相应的数据库系统发送的数据相应的数据库才能看懂,所以在安装php的时候,不要忘记安装这样一个驱动模块。

[root@www init.d]# yum list all | grep php-mysql
php-mysql.x86_64   #这个就是php与mysql交互的驱动模块

它们之间的关系也类似于客户端与服务器的关系,php向mysql请求,而mysql对php进行回应。

  1. 当客户端通过http协议向apache发来请求

    如果是静态资源,直接发起系统调用

    如果是动态资源,通过php模块/cgi/fastcgi任意一种方式发请求包交给php

  2. 当php收到之后apache的请求之后:

    如果所请求的资源都存储在硬盘上,那么php直接发起系统调用,将文件调用到内存并执行,执行完成之后把结果通过数据流交给apache,然后apache再回复客户端。

    如果所请求的资源有程序硬盘上,还有一部分数据在数据库当中,如下。

  3. 当php发的请求数据到达mysql

    mysql会通过各级索引找到数据,通过响应包回复给php,php通过在磁盘当中调用一部分程序,加上从mqsql回复的这部分数据,结合起来之后就可以运行,运行完成之后把结果交给apache

nginx通过fastcgi接口与php交互,将用户的动态请求交给php处理。

php-fpm进程就用来接收nginx发送过来的动态请求,fpm进程不会处理,真正处理的进程是wrapper进程,有些php请求wrapper可以直接进行处理,处理后再通过php-fpm返回给nginx,但是还有一些需要调用数据库的,php-ini就负责与数据库沟通。

原文地址:https://www.cnblogs.com/yizhangheka/p/12076716.html