当前位置:   article > 正文

Linux云计算 |【第二阶段】OPERATION-DAY2

Linux云计算 |【第二阶段】OPERATION-DAY2

主要内容:

部署LNMP架构(linux、Nginx、MariaDB、PHP)、Nginx+FastCGI动静分离、Nginx地址重写

环境准备:还原配置文件

  1. [root@proxy ~]# cd /usr/local/nginx/
  2. [root@proxy nginx]# sbin/nginx
  3. [root@proxy nginx]# cp conf/nginx.conf.default conf/nginx.conf
  4. cp:是否覆盖"conf/nginx.conf"? y
  5. [root@proxy nginx]# sbin/nginx -s reload
  6. [root@proxy nginx]# sbin/nginx -V
  7. configure arguments: --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module

环境准备:如果Nginx异常,需要按照以下方式重新创建

  1. [root@proxy nginx]# /usr/local/nginx/sbin/nginx -s stop
  2. [root@proxy nginx]# cd ~/lnmp_soft/nginx-1.17.6/
  3. [root@proxy nginx-1.17.6]# killall nginx
  4. [root@proxy nginx-1.17.6]# rm -rf /usr/local/nginx/
  5. [root@proxy nginx-1.17.6]# make install
  6. [root@proxy nginx-1.17.6]# cd /usr/local/nginx/
  7. [root@proxy nginx]# ls
  8. conf  html  logs  sbin
  9. [root@proxy nginx]# sbin/nginx -V
  10. configure arguments: --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module

一、LNMP概述

前言:目前的网站一般都会有动态和静态数据,默认nginx 仅可以处理静态数据,用户访问任何数据都是直接返回对应的文件,如果访问的是一个脚本的话,就会导致直接返回一个脚本给用户,而用户没有脚本解释器,因此需要整合LNMP(Linux、Nginx、MySQL、PHP)实现动态网站效果。

LNMP 是一种常见的 Web 服务器架构,代表 Linux、Nginx、MySQL(或 MariaDB)和 PHP(或 Perl、Python)。这种架构广泛用于搭建高性能的动态网站和 Web 应用程序。

  • L:Linux 基础操作系统(Ubuntu、CentOS、Debian
  • N:一般指Nginx Web服务器(实现HTTP 和反向代理
  • M:一般指MySQL或MariaDB数据库管理系统(用于存储和管理网站和应用的数据
  • P:用于 Web服务器端 开发脚本语言(PHP、Perl、Python

LNMP 架构的优势:

  • 高性能:Nginx 的高并发处理能力和低资源消耗,结合 PHP-FPM(FastCGI Process Manager)的高效处理,提供卓越的性能。
  • 可扩展性:通过 Nginx 的反向代理和负载均衡功能,可以轻松扩展系统以处理更多请求。
  • 安全性:Nginx 提供多种安全功能,如 SSL/TLS 支持、访问控制和限速,保护网站和应用免受攻击。
  • 灵活性:支持多种编程语言和数据库系统,可以根据需求选择合适的组件。

总结:LNMP 架构通过结合 Linux 操作系统的稳定性、Nginx 的高性能、MySQL 的数据管理能力和 PHP 的动态内容生成,提供了一个强大且灵活的 Web 服务器解决方案。无论是小型网站还是大型应用,LNMP 都能满足高性能和可扩展性的需求。

安装思路:LNMP在CentOS系统中,源码安装Nginx,使用RPM包安装MariaDB、PHP、PHP-FPM软件。操作过程中需要安装的软件列表如下:

  • ① nginx(WEB服务器)
  • ② mariadb(数据库客户端软件)、mariadb-server(数据库服务器软件)、mariadb-devel(其他客户端软件的依赖包)
  • ③ php(解释器)、php-fpm(进程管理器服务)、php-mysql(PHP的数据库扩展包)

Nginx+FastCGI实现动静分离,通过localhost{}判断用户访问的是静态还是动态数据

案例:构建LNMP平台

步骤1:LNMP各软件包和依赖包安装并启动服务

1)安装使用yum安装基础依赖包

  1. [root@proxy ~]# yum -y install gcc make    //安装编译工具
  2. [root@proxy ~]# yum -y install pcre-devel   //依赖包,使nginx支持正则
  3. [root@proxy ~]# yum -y install openssl-devel   //依赖包,支持基于ssl技术的网站

2)安装Nginx

  1. [root@proxy lnmp_soft]# tar -xf nginx-1.17.6.tar.gz    //释放nginx的源码包
  2. [root@proxy lnmp_soft]# cd nginx-1.17.6/    //切换到源码包目录
  3. [root@proxy nginx-1.17.6]# ./configure --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module
  4. [root@proxy nginx-1.17.6]# make    //编译
  5. [root@proxy nginx-1.17.6]# make install    //安装
  6. [root@proxy ~]# useradd -s /sbin/nologin nginx    //添加Nginx用户

3)安装MariaDB

  1. [root@proxy ~]# yum -y install mariadb-server    //安装数据库服务端
  2. [root@proxy ~]# yum -y install mariadb     //安装数据库客户端
  3. [root@proxy ~]# yum -y install mariadb-devel   //安装数据库依赖包(支持lnmp)

4)安装PHP、安装PHP扩展

  1. [root@proxy ~]# yum -y install php   //安装PHP环境(相当于解释器)
  2. [root@proxy ~]# yum -y install php-mysql   //安装PHP与数据库关联的软件包
  3. [root@proxy ~]# yum -y install php-fpm  //安装可使Nginx具备动态网站解析能力的软件包

步骤2:启动Nginx、MySQL、PHP服务

1)启动Nginx服务

  1. [root@proxy ~]# /usr/local/nginx/sbin/nginx
  2. [root@proxy ~]# netstat -nuptl | grep :80
  3. tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7321/nginx: master  

2)启动MySQL服务

  1. [root@proxy ~]# systemctl start mariadb.service
  2. [root@proxy ~]# netstat -nuptl | grep :3306      //mariadb端口号3306
  3. tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      7218/mysqld   
  4. [root@proxy ~]# systemctl status mariadb

3)启动PHP服务

  1. [root@proxy ~]# systemctl start php-fpm.service
  2. [root@proxy ~]# netstat -nuptl | grep :9000     //php-fpm端口号9000
  3. tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      7276/php-fpm: maste
  4. [root@proxy ~]# systemctl status php-fpm

步骤3:修改nginx配置文件并启动服务(通过localhost实现动静页面分离)

  1. [root@proxy nginx]# vim conf/nginx.conf   //先通过65,71s/#//取消注释(除69)
  2.  43         location / {
  3.  44             root   html;
  4.  45             index  index.php index.html index.htm;
  5.  46         }
  6. //设置默认首页为index.php,当用户在浏览器地址栏中只写域名或IP,不说访问什么页面时,服务器会把默认首页index.php返回给用户
  7.  65         location ~ \.php$ {    //~是使用正则表达式,匹配包含以.php结尾
  8.  66         root     html;    //网站页面位置,不用改,保持默认
  9.  67         fastcgi_pass   127.0.0.1:9000;   //当用户访问了.php结尾的文件,就让nginx将请求转发给本机9000端口,php-fpm服务(端口号9000)
  10.  68         fastcgi_index  index.php;    //动态网站的默认页面,无需修改
  11.  69   #     fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
  12.  70         include        fastcgi.conf;   //将fastcgi_params修改为:fastcgi.conf配置文件(注意【;】结尾),加载Fast-CGI参数配置文件
  13.  71         }
  14. [root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload     //重置文件

步骤4:创建PHP页面,测试LNMP架构能否解析PHP页面

  1. [root@proxy ~]# cd ~/lnmp_soft/     //可参考lnmp_soft/php_scripts/test.php
  2. [root@proxy lnmp_soft]# cd php_scripts/
  3. [root@proxy php_scripts]# pwd
  4. /root/lnmp_soft/php_scripts
  5. [root@proxy php_scripts]# cp test.php /usr/local/nginx/html/

查看测试页面 test.php 内容:

  1. <html>
  2. <body>
  3. This is HTML message
  4. </br>
  5. <?php
  6. $c = 12;
  7. $d = 2;
  8. if($c > $d){echo "c is bigger";}
  9. else{ echo "d is bigger";}
  10. ?>
  11. </body>
  12. </html>

测试:Firefox浏览器访问192.168.2.5/test.php(# systemctl stop firewalld

常见报错:Nginx未将test.php做解析,直接返回给用户

  • 分析:/conf/nginx.conf配置文件中的PHP配置错误(指定端口9000)

常见报错:php-fpm服务未开启、或者SELinux错误

[root@proxy nginx]# systemctl restart php-fpm


步骤5:创建PHP测试页面,连接并查询MariaDB数据库

  1. [root@proxy ~]# cd ~/lnmp_soft/php_scripts/ //可参考lnmp_soft/php_scripts/mysql.php
  2. [root@proxy php_scripts]# ls
  3. mem.php                  test.php
  4. mysql.php                web_demo.tar.gz
  5. ...
  6. [root@proxy php_scripts]# cp mysql.php /usr/local/nginx/html/

查看测试页面 mysql.php 内容:

  1. <?php
  2. $mysqli = new mysqli('localhost','root','','mysql');
  3. //注意:root为mysql数据库的账户名称,密码需要修改为实际mysql密码,无密码则留空即可;
  4. //localhost是数据库的域名或IP,mysql是数据库的名称;
  5. if (mysqli_connect_errno()){
  6. die('Unable to connect!'). mysqli_connect_error();
  7. }
  8. $sql = "select * from user";
  9. $result = $mysqli->query($sql);
  10. while($row = $result->fetch_array()){
  11. printf("Host:%s",$row[0]);
  12. printf("</br>");
  13. printf("Name:%s",$row[1]);
  14. printf("</br>");
  15. }
  16. ?>

测试1:Firefox浏览器访问192.168.2.5/mysql.php

测试2:Firefox浏览器访问并刷新192.168.2.5/mysql.php,可看到新增的用户记录

  1. [root@proxy html]# mysql
  2. MariaDB [(none)]> create user ANJ@localhost identified by '123';   //创建用户
  3. MariaDB [(none)]> quit

补充:LNMP常见问题,如果动态网站访问失败,可用参考错误日志,查找错误信息

  • Nginx的默认访问日志文件为:/usr/local/nginx/logs/access.log
  • Nginx的默认错误日志文件为:/usr/local/nginx/logs/error.log
  • PHP默认错误日志文件为:/var/log/php-fpm/www-error.log

二、FastCGI原理(快速公共网关接口)

工作流程:

  • ① Web Server启动时载入FastCGI进程管理器(通过PHP-FPM负责调度FastCGI);
  • ② FastCGI进程管理器初始化,启动多个解释器进程;
  • ③ 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个解释器;
  • ④ FastCGI子进程完成处理后返回结果,将标准输出和错误信息从同一连接返回Web Server;

FastCGI技术目前支持语言:PHP、C/C++、JAVA、Perl、Python、Ruby等

缺点:内存消耗大,因为是多进程,所以进程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数;

补充:Nginx+PHP(FastCGI)服务器在3万并发连接下

  • ①开10个Nginx进程消耗150M内存(10*15M)
  • ②开64个PHP-CGI进程消耗1280M内存(20M*64)

查看php-fpm.d配置文件(不需要修改该文件)

  1. [root@proxy ~]# cat /etc/php-fpm.d/www.conf
  2.   2 [www]
  3.  12 listen = 127.0.0.1:9000     //php-fpm监听端口号
  4.  24 listen.allowed_clients = 127.0.0.1
  5.  39 user = apache
  6.  41 group = apache
  7.  60 pm = dynamic
  8.  70 pm.max_children = 50   //最大调度FastCGI解释器进程数量(上限)
  9.  75 pm.start_servers = 5     //默认开始调度5个FastCGI解释器进程数量
  10. ...
  11. [root@proxy ~]# pstree | grep php    //通过进程树可查看5个FastCGI进程数量
  12.         |-php-fpm---5*[php-fpm]

三、地址重写(rewrite)

URL 地址重写(URL rewriting)是一种技术,用于在服务器端修改或转换 URL 的外观,使其对用户更加友好、易于理解和记忆,同时也可以用于实现 SEO 优化、隐藏技术细节、实现重定向等功能。在 LNMP 架构中,Nginx 提供了强大的 URL 重写功能,通过配置 rewrite 指令来实现。

作用:获得一个来访的URL请求,然后改写成服务器可以处理的另一个URL的过程

  1. 用户体验:更简洁、易读的 URL 有助于用户理解和记忆。
  2. SEO 优化:搜索引擎更喜欢语义化的 URL,有助于提高网站的搜索排名。
  3. 隐藏技术细节:可以隐藏服务器端的技术实现细节,提高安全性。
  4. 重定向:可以将旧的 URL 重定向到新的 URL,避免链接失效。

1、Nginx 中的 URL 重写

Nginx 使用 rewrite 模块 来实现 URL 重写。rewrite 指令的基本语法如下:

rewrite regex replacement [flag];
  • regex:用于匹配 URL 的正则表达式。
  • replacement:重写后的 URL。
  • flag:可选标志,用于控制重写行为。
常见标志(flag)

last停止处理当前的 rewrite 指令,并开始一个新的请求。

break停止处理当前的 rewrite 指令,但继续处理其他指令。

redirect返回 302 临时重定向(HTTP 状态码 302)。

permanent返回 301 永久重定向(HTTP 状态码 301)。

正则表达式匹配模式

  • 区分大小写匹配:~
  • 不区分大小写匹配:~*
  • 区分大小写不匹配:!~
  • 不区分大小写不匹配:!~*

示例 1:将动态 URL 重写为静态 URL

假设有一个动态生成的 URL:

http://example.com/index.php?page=about

我们希望将其重写为更友好的静态 URL:

http://example.com/about

可以在 Nginx 配置文件中添加如下 rewrite 指令:

  1. server {
  2. listen 80;
  3. server_name example.com;
  4. location / {
  5. rewrite ^/about$ /index.php?page=about break;
  6. # 其他配置...
  7. }
  8. }
示例 2:实现 301 永久重定向

假设有一个旧的 URL:

http://example.com/old-page

我们希望将其永久重定向到新的 URL:

http://example.com/new-page

可以在 Nginx 配置文件中添加如下 rewrite 指令:

  1. server {
  2. listen 80;
  3. server_name example.com;
  4. location /old-page {
  5. rewrite ^/old-page$ /new-page permanent;
  6. }
  7. }
示例 3:隐藏技术细节

假设有一个动态生成的 URL:

http://example.com/index.php?id=123

我们希望将其隐藏技术细节,重写为:

http://example.com/item/123

可以在 Nginx 配置文件中添加如下 rewrite 指令:

  1. server {
  2. listen 80;
  3. server_name example.com;
  4. location /item {
  5. rewrite ^/item/(.*)$ /index.php?id=\$1 break;
  6. # 其他配置...
  7. }
  8. }

例如1:基本的地址重写

修改配置文件(访问a.html重定向到b.html)

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  2. ...
  3.  42         rewrite /a.html /b.html;    //旧地址a.html,新地址b.html
  4. [root@proxy ~]# echo "AA" > /usr/local/nginx/html/a.html
  5. [root@proxy ~]# echo "BB" > /usr/local/nginx/html/b.html
  6. [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload   //重新加载配置文件

测试:Firefox浏览器访问192.168.2.5/a.html,以a.html域名显示b.html内容

例如2:添加正则表达式,实现规范的输入网页URL访问请求,输入错误,则404报错

思考:只要包含”/a.html”即可访问(不严谨),使用正则表达式实现书写规范

访问页面:http://192.168.2.5/a.htmlzzhhh

访问页面:http://192.168.2.5/abc/a.html

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  2.  42         rewrite ^/a.html$ /b.html;       //前后添加正则【^URL$】
  3. [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

测试:Firefox浏览器访问192.168.2.5/abc/a.html(必须严格匹配a.html)

例如3:通过rewrite选项redirect实现地址重定向(redirect 跳转地址栏)

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  2.  42         rewrite ^/a.html$ /b.html redirect;    //redirect实现地址重定向
  3. [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

测试:Firefox浏览器访问192.168.2.5/a.html,重定向到b.html,而不是以a.html域名显示b.html内容(可观察浏览器地址栏的变化)

例如4:旧地址位置可以写任何参数,只要浏览器访问请求(地址栏)匹配即可

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  2.  42         rewrite ^/haha$ /b.html redirect;
  3. [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

注意:虽地址栏可填任何参数,但要带“/”,该“/”非根目录,表示为/usr/local/nginx/html

测试:Firefox浏览器访问192.168.2.5/haha,重定向到b.html

例如5:访问192.168.2.5的请求重定向至www.tmooc.cn

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  2.  42         rewrite / http://www.tmooc.cn;
  3. [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

测试:Firefox浏览器访问192.168.2.5/或者192.168.2.5,域名跳转到新网址

补充:因直接访问http://192.168.2.5即访问192.168.2.5/index.html默认页面,所以旧地址位置以包含“/”,所以可以此方式也能跳转到新网址;

例如6:访问192.168.2.5/下面子页面,重定向至www.tmooc.cn/下相同的页面

应用场景:访问并收藏了一个旧地址,再次访问时已发生新网页跳转,新网页跳转后依然加载的是旧地址页面即可。

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  2.  42         rewrite /(.*) http://www.tmooc.com/$1;
  3. [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

测试:Firefox浏览器访问192.168.2.5/a.html,域名跳转到新网址/旧地址页面

  • 正则表达式:【()】功能:保留、组合成一个整体
  • rewrite /(.*) http://www.tmooc.com/$1;
  • 解释:【$1】引用前【()】保留参数

例如7:实现火狐浏览器访问与其它浏览器访问相同链接返回的页面不同

① 创建网页目录以及对应的页面文件:

  1. [root@proxy ~]# echo "I am other WEB" > /usr/local/nginx/html/test.html
  2. [root@proxy ~]# mkdir -p /usr/local/nginx/html/firefox/
  3. [root@proxy ~]# echo "Firefox-WEB" > /usr/local/nginx/html/firefox/test.html

② 修改Nginx服务配置

  1. [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
  2. .. ..
  3. server {
  4.         listen       80;
  5.         server_name  localhost;
  6. location / {
  7.     root   html;
  8. index  index.html index.htm;
  9. }
  10.  
  11. if ($http_user_agent ~* firefox) {            //识别客户端firefox浏览器
  12. rewrite ^(.*)$  /firefox/$1;
  13. }
  14. }

解释1:~符号代表正则匹配,*符号代表不区分大小写(Nginx独有符号);(.*)代表复制用户查看的页面,$1代表粘贴;

解释2:Nginx的内置变量http_user_agent存放用户信息,例如客户端使用什么浏览器。当用户来访信息中包含firefox(忽略大小写),则判断条件成立,并执行地址重写;

③ 重新加载配置文件

[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

测试:

  1. [root@proxy ~]# curl http://192.168.2.5/test.html
  2. I am other WEB

Firefox浏览器访问http://192.168.2.5/test.html,如图所示:

Google浏览器访问http://192.168.2.5/test.html,如图所示:

例如8:再次修改nginx配置文件,在2个地址重写rewrite情况下,增加last选项

last:停止执行其它重写规则,地址栏不改变;(仅作用在同一个location{}中)
停止处理当前的 rewrite 指令,并开始一个新的请求。

  1. [root@proxy ~]# cd /usr/local/nginx/html/
  2. [root@proxy html]# echo "AAA" > a.html
  3. [root@proxy html]# echo "BBB" > b.html
  4. [root@proxy html]# echo "CCC" > c.html

① 实验前:

  1. [root@proxy html]# vim /usr/local/nginx/conf/nginx.conf
  2.  42         rewrite /a.html /b.html;
  3.  43         rewrite /b.html /c.html;
  4. ...
  5. [root@proxy html]# /usr/local/nginx/sbin/nginx -s reload

测试:Firefox浏览器访问 http://192.168.2.5/a.html,如图所示:

解释:未增加Last选项,地址栏不变,2个地址重写的跳转:a.html —> b.html —> c.html

② 测试后:增加Last选项

  1. [root@proxy html]# vim /usr/local/nginx/conf/nginx.conf
  2.  42         rewrite /a.html /b.html last;     //增加Last选项
  3.  43         rewrite /b.html /c.html;
  4. ...
  5. [root@proxy html]# /usr/local/nginx/sbin/nginx -s reload

测试:Firefox浏览器访问http://192.168.2.5/a.html,如图所示:

解释:增加Last选项,地址栏不变,2个地址重写的跳转:a.html —> b.htmll

例如9:再次修改nginx配置文件,在2个地址重写rewrite情况下,增加break选项

break:停止执行其它重写规则,完成本次请求就不再读其它语句(可作用在不同location{}中的rewrite)

停止处理当前的 rewrite 指令,但继续处理其他指令。

① 实验前:

  1. [root@proxy html]# vim /usr/local/nginx/conf/nginx.conf
  2.  44         location / {
  3.  45         rewrite /a.html /b.html last;     //已增加Last选项,按理应停止
  4.  46             root   html;
  5.  47             index  index.html index.htm;
  6.  48         }
  7.  49         location /b.html{      //增加了新的location{}及rewrite地址重写
  8.  50         rewrite /b.html /c.html;
  9.  51         }
  10. [root@proxy html]# /usr/local/nginx/sbin/nginx -s reload

测试:Firefox浏览器访问http://192.168.2.5/a.html,如图所示:

解释:虽增加Last选项,但由于第一个rewrite的last选项在单独的一个location{},第二个rewrite在另一个loaction{},last选项仅作用在同一个location{}中的rewrite,所以2个地址重写的跳转:a.html —> b.html —> c.html;

② 实验后:增加break选项

  1. [root@proxy html]# vim /usr/local/nginx/conf/nginx.conf
  2.  44         location / {
  3.  45         rewrite /a.html /b.html break;    //增加break选项
  4.  46             root   html;
  5.  47             index  index.html index.htm;
  6.  48         }
  7.  49         location /b.html{
  8.  50         rewrite /b.html /c.html;
  9.  51         }
  10. [root@proxy html]# /usr/local/nginx/sbin/nginx -s reload

测试:Firefox浏览器访问http://192.168.2.5/a.html,如图所示:

解释:增加break选项,地址栏不变,2个地址重写不同location{}的跳转:a.html —> b.htmll


补充:permanent选项与redirect选项功能差不多

  • Redirect选项 临时重定向 网站状态码 302
  • Premanent选项 永久重定向 网络状态码 301

针对搜索引擎例如百度、360等,Python爬虫不识别302

  1. [root@proxy html]# vim /usr/local/nginx/conf/nginx.conf
  2.  44         rewrite /a.html /b.html permanent;
  3. [root@proxy html]# /usr/local/nginx/sbin/nginx -s reload

  

补充:index  index.html index.htm; 记录

  • index 指定默认页面,当访问http://192.168.2.5,可忽略页面,因index已指定的默认页面index.html;
  • index.html 默认索引页面
  • index.htm 备用页面(当index.html页面没有,则使用备用)

思维导图:

 

小结:

本篇章节为【第二阶段】OPERATION-DAY2 的学习笔记,这篇笔记可以初步了解到 部署LNMP架构(linux、Nginx、MariaDB、PHP)、Nginx+FastCGI动静分离、Nginx地址重写。


Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号