搭建LNMP架构服务

LNMP架构概述

什么是LNMP

  • LNMP是一套技术的组合,L=Linux、N=Nginx、M=MySQL/Mariadb、P=PHP/Python

LNMP架构是如何工作的

  • 首先Nginx服务是不能处理动态请求,那么当用户发起动态请求时,Nginx又是如何进行处理的。
  • 当用户发起http请求,请求会被Nginx处理,如果是静态资源请求Nginx则直接返回,如果是动态请求Nginx则通过fastcgi协议转交给后端的PHP程序处理,具体如下图所示
    搭建LNMP架构服务_第1张图片

LNMP架构实现原理

搭建LNMP架构服务_第2张图片

LNMP架构环境准备

安装PHP7.2版本

1. 删除系统默认自带的php5.4版本
rpm -qa |grep php
# php-common-5.4.16-46.1.el7_7.x86_64
# php-5.4.16-46.1.el7_7.x86_64
# php-cli-5.4.16-46.1.el7_7.x86_64
yum -y remove php* &>/dev/null
rpm -qa |grep php

2. 更改yum源
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

3. 安装php7.2版本和各种扩展
yum -y install php72w php72w-cli php72w-common php72w-devel php72w-embedded php72w-fpm php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml

安装Mariadb数据库

  • Mariadb数据库相比Mysql数据库比较小,所以我们这里使用Mariadb代替Mysql数据库。
yum -y install mariadb-server mariadb

搭建LNMP架构

Fastcgi配置语法

在将Nginx与PHP集成过程中,需要先了解Fastcgi代理配置语法

  1. 设置Fastcgi服务器的地址,该地址可以指定域名或者IP地址,以及端口
语法示例
fastcgi_pass localhost:9000;				 fastcgi服务端的端口号默认为9000,也就是说php-fpm管理进程监听的端口号为9000。	
fastcgi_pass unix:/tmp/fastcgi.socket;
  1. 设置fastcgi默认的首页文件,需要结合fastcgi_param一起设置
语法示例
fastcgi_index index.php
fastcgi_param SCRIPT_FILENAME /index.php
  1. 通过fastcgi_param设置变量,并将设置的变量传递到后端的fastcgi服务器
语法示例
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /code$fastcgi_script_name;

搭建LNMP架构服务_第3张图片

配置nginx与php集成

1. 修改配置文件
vim /etc/nginx/conf.d/php.conf 
server {
     
        listen 80;
        server_name php.nana.com;		# 用户发起请求http://php.nana.com:80/,端口号匹配成功,请求路径为/
        root /code;

        location / {
     					# /会被第一个location匹配,返回/code/index.php
                index index.php index.html;
        }

        location ~ \.php$ {
     				# 返回的/code/index.php,会被第二个location匹配
                fastcgi_pass 127.0.0.1:9000;		# /code/index.php会交给本地的9000端口处理
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                # 需要解析的文件都会传给变量名SCRIPT_FILENAME,php服务端会读取该变量,解析变量里面的文件内容,解析完成再传给Nginx。	
                include fastcgi_params;
                # 导入文件fastcgi_params(绝对路径/etc/nginx/fastcgi_params),Nginx安装默认自带的配置文件
                # 该文件里面保存的是fastcgi协议中系统内置的变量名和变量值,没有该文件参数无法传给php服务端,php会出现空白页面
        }
}

2. 启动服务
nginx -t
systemctl restart nginx				启动nginx服务
systemctl start php-fpm				启动php-fpm管理进程
systemctl enable php-fpm			将php-fpm管理进程设为开机自启

- 测试
1. 创建需要返回给浏览器的动态文件
mkdir /code					
vim /code/test.php 						
();
?>

2. 在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析
192.168.15.7		php.nana.com

3. 访问测试
打开浏览器输入http://php.nana.com/test.php,浏览器输出结果为PHP Version 7.2.34。

配置php与mysql集成

1. 启动数据库服务
systemctl restart mariadb			启动mariadb数据库服务
systemctl enable mariadb			将mariadb数据库设为开机自启

2. 创建数据库密码
mysqladmin -u root password "123"		
mysql -u root -p123					使用账号密码登陆数据库

3. 准备一个php文件,测试能否正常连接数据库
vim /code/mysql.php
$servername = "localhost";
        $username = "root";
        $password = "123";

        # 创建连接
        $conn=mysqli_connect($servername,$username,$password);

        # 检查连接
        if (!$conn) {
     
                die("Connection failed: " . mysqli_connect_error());
        }
        echo "php连接Mysql数据库成功";
?>

- 测试
我们在浏览器输入http://php.nana.com/mysql.php,浏览器输出结果为"php连接Mysql数据库成功"表示连接成功,
输出结果为"Connection failed: Access denied for user 'oot'@'localhost' (using password: YES)"表示连接失败。

基于LNMP架构部署Wordpress

Wordpress中文版压缩包
链接:https://pan.baidu.com/s/1xej4Bnql5DzLeFw3qyJIiw
提取码:1234

1. 修改配置文件
vim /etc/nginx/conf.d/blog.nana.com.conf
server {
     
        listen 80;
        server_name blog.nana.com;
        root /code/wordpress;
        # 解决nginx上传文件大小限制
        client_max_body_size 100m;			# 默认nginx仅支持上传1m大小的文件(超过1m,会报错413)		
        
        location / {
     
                index index.php index.html;
        }

        location ~ \.php$ {
     
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

2. 根据配置文件中定义的内容,创建站点目录,下载wordpress文件
mkdir /code
cd /code
wget https://wordpress.org/latest.tar.gz			下载wordpress压缩包(英文版)
tar -xf wordpress-5.7.1.tar.gz			

3. 创建用户www
groupadd -g 666 www					将用户www所属的主群的gid改为666
useradd -u666 -g666 www				创建用户www,将用户www的uid和gid都改为666

4. 修改nginx与php-fpm管理进程的运行用户为www,并授权代码属主和属组都为www。
sed -i "/^user /c user www;" /etc/nginx/nginx.conf	
sed -i "/^user /c user = www;" /etc/php-fpm.d/www.conf
sed -i "/^group /c group = www;" /etc/php-fpm.d/www.conf

5. 重启nginx服务和php-fpm管理进程
systemctl restart nginx
systemctl restart php-fpm

6. 修改wordpress文件的属主和属组
chown -R www:www /code/wordpress
ll -d /code/wordpress
# drwxr-xr-x 5 www www 4096 Apr 15 10:08 /code/wordpress

7. 在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析
192.168.15.7		blog.nana.com
  • 我们在浏览器中输入blog.nana.com,会出现如下的页面:
    搭建LNMP架构服务_第4张图片
    搭建LNMP架构服务_第5张图片
创建数据库
mysql -u root -p123					进入数据库
create database wordpress;			创建数据库
# Query OK, 1 row affected (0.00 sec)
show databases;						查看所有的数据库

搭建LNMP架构服务_第6张图片
搭建LNMP架构服务_第7张图片
搭建LNMP架构服务_第8张图片

  • 我们搭建完成之后,输入域名http://blog.nana.com/,会显示如下页面:
    搭建LNMP架构服务_第9张图片

解决nginx和PHP上传文件大小限制

自定义主题压缩包
链接:https://pan.baidu.com/s/1NNJU_DY-Oeiom2uIVKEe3g
提取码:1234

我们搭建好网站后,可以通过网站的图形化界面上传一些数据包,例如我们可以自定义网页页面主题,如下图所示:搭建LNMP架构服务_第10张图片
我们发现上传一个的数据包大小超过1M,会出现413的报错信息,如下图所示:
搭建LNMP架构服务_第11张图片
我们可以修改nginx的配置文件,修改Nginx默认上传文件的大小限制来解决这个问题 (注 : PHP默认支持的上传大小为2M)。

- 解决nginx上传文件大小限制
vim /etc/nginx/conf.d/blog.nana.com.conf
server {
     
		...
        # 解决nginx上传文件大小限制
        client_max_body_size 100m;			# 默认nginx仅支持上传1m大小的文件(超过1m,会报错413)
		...
}

systemctl restart nginx				重启nginx服务
- 解决PHP上传文件大小限制,本地书写文件大小限制
vim /etc/php.ini
post_max_size = 100M  			# 上传文件的大小最大100M(第656行)
upload_max_filesize = 100M 		 # 本地书写文件最大写100M(第799行)

基于LNMP架构部署WeCenter知乎

我们之前安装的PHP7.2版本没有安装Mcrypt模块,我们在用浏览器访问页面的时候,服务器环境检查会显示× WeCenter 的加密需要 Mcrypt 支持。建议使用PHP7.1版本搭建wecenter知乎。

PHP7.1版本压缩包
链接:https://pan.baidu.com/s/1MJSeR2pG_Ur3fPFxoaxcGw
提取码:1234
路漫漫其修远兮,吾将上下而求索

环境准备

- 重新安装PHP7.1版本
1. 删除PHP7.2版本
rpm -qa | grep php
yum -y remove php* &>/dev/null
rpm -qa | grep php

2. 将本地的PHP源码包上传到服务器,解压安装
rz -E php.tar.gz			
tar -xf php.tar.gz
yum localinstall -y *.rpm

3. 授权并重启php-fpm管理进程
sed -i "/^user /c user = www;" /etc/php-fpm.d/www.conf
sed -i "/^group /c group = www;" /etc/php-fpm.d/www.conf
systemctl restart php-fpm

部署WeCenter服务

WeCenter压缩包
链接:https://pan.baidu.com/s/1qV5dhq-sy2we6lwRvM_2HA
提取码:1234

1. 修改配置文件
vim /etc/nginx/conf.d/zh.nana.com.conf
server {
     
        listen 80;
        server_name zh.nana.com;
        root /code/zh;
        client_max_body_size 100m;

        location / {
     
                index index.php index.html;
        }

        location ~ \.php$ {
     
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

2. 根据配置文件中定义的内容,下载WeCenter软件
cd /code/
rz -E WeCenter_3-2-1.zip			
unzip WeCenter_3-2-1.zip		
mv WeCenter_3-2-1 zh

3. 重启nginx服务
systemctl restart nginx

4. 修改zh文件的属主和属组
chown -R www:www /code/zh

5. 在本机添加域名解析
C:\Windows\System32\drivers\etc
在hosts文件添加域名解析
192.168.15.7		zh.nana.com
  • 我们在浏览器中输入zh.nana.com,会出现如下的页面:
    搭建LNMP架构服务_第12张图片
    搭建LNMP架构服务_第13张图片
创建数据库
mysql -u root -p123					进入数据库
create database zh;			创建数据库
# Query OK, 1 row affected (0.00 sec)
show databases;						查看所有的数据库

搭建LNMP架构服务_第14张图片
搭建LNMP架构服务_第15张图片

LNMP架构扩展知识点

fastcgi协议本地文件调用方式传给php服务端

nginx ==》 fastcgi ==》 php-fpm
vim /etc/php-fpm.d/www.conf 				将php-fpm监听的端口改成的本地文件
	listen = /tmp/php.socket			

/etc/nginx/conf.d/nana.com.conf
server{
     
	...
	location ~ \.php$ {
     
		fastcgi_pass address:port;
	#				127.0.0.1:9000;				通过ip和port的形式进行处理
					unix:/tmp/php.socket;		早期通过本地文件路径的形式进行处理(换一种调用方式)
					# 早期通过文件的形式进行处理,不需要走tcp协议,效率更高(这种方式nginx和php必须安装在同一台服务器上)
		}
	...
}

- 现在大部分都是通过ip+port的形式进行处理,这种方式使代码的解耦合性强。

浏览器为什么会出现502报错

  • 如果我们关闭php服务端,浏览器会显示502错误。无论后端的服务器是Java,还是python,或者是其他语言。
    Nginx只要连不上后端资源,都会往前端报错502。

Nginx+php与apache+php的区别是什么

  • nginx是以fastcgi协议调用的php
  • apache是以模块的方式加载的php

你可能感兴趣的:(nginx)