部署LNMP、Nginx+FastCGI、Nginx地址重写语法,地址重写应用案例

news2025/2/24 10:08:36

1 案例1:部署LNMP环境

1.1 问题

安装部署LNMP环境实现动态网站解析

静态网站 在不同环境下访问,网站内容不会变化

动态网站 在不同环境下访问,网站内容有可能发生变化

  • 安装部署Nginx、MariaDB、PHP、PHP-FPM;
  • 启动Nginx、MariaDB、FPM服务;
  • 并测试LNMP是否工作正常。

1.2 方案

目前的网站一般都会有动态和静态数据,默认nginx仅可以处理静态数据,用户访问任何数据都是直接返回对应的文件,如果如果访问的是一个脚本的话,就会导致直接返回一个脚本给用户,而用户没有脚本解释器,也看不懂脚本源代码!网站拓扑如图-1所示。

因此需要整合LNMP(Linux、Nginx、MySQL、PHP)实现动态网站效果。

操作过程中需要安装的软件列表如下:

  • nginx
  • mariadb、mariadb-server、mariadb-devel
  • php、php-fpm、php-mysqlnd

备注:mariadb(数据库客户端软件)、mariadb-server(数据库服务器软件)、mariadb-devel(其他客户端软件的依赖包)、php(解释器)、php-fpm(进程管理器服务)、php-mysqlnd(PHP的数据库扩展包)。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:安装软件

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

为了不受到之前实验的影响,可以先删除nginx,重安装

    [root@proxy nginx]#killall nginx  #停止nginx程序
    [root@proxy nginx]#cd  /root/lnmp_soft/nginx-1.22.1
    [root@proxy nginx-1.22.1]#rm -rf  /usr/local/nginx    #删除nginx原有目录
    [root@proxy nginx-1.22.1]# yum -y install gcc make openssl-devel pcre-devel
    [root@proxy nginx-1.22.1]# ./configure   \
    > --user=nginx   --group=nginx   \
    > --with-http_ssl_module
    [root@proxy nginx-1.22.1]# make && make install
    .. ..

3)安装MariaDB

    [root@proxy ~]# yum -y install   mariadb   mariadb-server   mariadb-devel

4)php和php-fpm

    [root@proxy ~]# yum -y  install  php   php-mysqlnd
    [root@proxy ~]# yum -y  install  php-fpm

步骤二:启动服务

1)启动Nginx服务

如果服务器上已经启动了其他监听80端口的服务(如httpd),则需要先关闭该服务。

    [root@proxy ~]# systemctl stop httpd                   #如果该服务存在则关闭该服务
    [root@proxy ~]# /usr/local/nginx/sbin/nginx             #启动Nginx服务
    [root@proxy ~]# ss -utnlp | grep :80        

 2)启动MySQL服务

    [root@proxy ~]# systemctl start  mariadb           #启动服务器
    [root@proxy ~]# systemctl status mariadb           #查看服务状态
    [root@proxy ~]# systemctl enable mariadb           #设置开机启动

3)启动PHP-FPM服务

    [root@proxy ~]# systemctl start php-fpm           #启动服务
    [root@proxy ~]# systemctl status php-fpm          #查看服务状态
    [root@proxy ~]# systemctl enable php-fpm          #设置开机启动

 4)使用PHP测试页面

    cp  ~/lnmp_soft/php_scripts/test.php  /usr/local/nginx/html   #拷贝动态网站测试页面到nginx中

 使用浏览器访问192.168.99.5/test.php 则无法看到页面内容,而是会当成要下载的文件,因为浏览器无法解析php代码!

2 案例2:构建LNMP平台

2.1 问题

沿用练习一,通过调整Nginx服务端配置,实现以下目标:

  1. 配置Fast-CGI支持PHP网页解析

Fast-CGI是快速公共(通用)网关接口,可以连接如nginx等网站程序到网站的语言解释器(比如php) ,php-fpm进程使用了Fast-CGI解析动态网站页面

  1. 创建PHP测试页面,测试使用PHP连接数据库的效果

2.2 方案

需要延续练习一的实验内容,通过修改Nginx及php-fpm配置文件实现对PHP页面的支持。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一: php-fpm配置文件

1)打开php-fpm配置文件,注意该配置文件中;(分号)是注释

    [root@proxy etc]# vim /etc/php-fpm.d/www.conf
    [www]
    listen = 127.0.0.1:9000                    #php-fpm端口号(使用网络通信)
    ;listen = /run/php-fpm/www.sock            #注释该行
    pm.max_children = 50                #最大进程数量
    pm.start_servers = 5                #最小进程数量
    [root@proxy etc]#systemctl restart php-fpm    #重启服务

步骤二:修改Nginx配置文件并启动服务

    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    ...
     location  ~  \.php$  {        #~是使用正则表达式,匹配以.php结尾
            root           html;
            fastcgi_pass   127.0.0.1:9000;    #将请求转发给本机9000端口
            fastcgi_index  index.php;
           #fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi.conf;       #加载fastcgi配置文件
            }

步骤三:测试LNMP架构能否解析PHP页面

启动或者重加载nginx

    [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
    #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
    #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

再次使用浏览器访问192.168.99.5/test.php 可以看到页面内容!

2)再测试连接数据库的PHP页面

可以参考lnmp_soft/php_scripts/mysql.php

    cp  ~/lnmp_soft/php_scripts/mysql.php  /usr/local/nginx/html   #拷贝动态网站测试页面到nginx中

3)客户端使用浏览器访问服务器PHP首页文档,检验是否成功

http://192.168.99.5/mysql.php

然后修改数据库内容进行测试

    mysql   #进入数据库
    create user dc@localhost identified by '123';   #创建测试账户
    quit;  #退出

再刷新192.168.99.5/mysql.php 可以看到新创建的用户

LNMP常见问题

如果仅访问ip就能看到动态网站的默认页,可以按下列方法配置

    ...
    location / {
                root   html;
                index  index.php  index.html   index.htm;
    #设置默认首页为index.php,当用户在浏览器地址栏中只写域名或IP,不说访问什么页面时,服务器会把默认首页index.php返回给用户
            }
    ...

Nginx的默认访问日志文件为/usr/local/nginx/logs/access.log

Nginx的默认错误日志文件为/usr/local/nginx/logs/error.log

PHP默认错误日志文件为/var/log/php-fpm/www-error.log

如果动态网站访问失败,可用参考错误日志,查找错误信息。

看到以上test.php、mysql.php两个页面说明nginx不但能支持静态网站,也能解析动态网站了,这种情况也可以记作nginx实现了动静分离

3 使用socket方式连接php-fpm

实现此案例需要按照如下步骤进行。

步骤一: php-fpm配置文件

1)打开php-fpm配置文件

    [root@proxy etc]# vim /etc/php-fpm.d/www.conf
    [www]
    ;listen = 127.0.0.1:9000                    #注释或删除该行
    listen = /run/php-fpm/www.sock                #socket方式(使用进程通信)
    listen.acl_users = apache,nginx,nobody        #添加nobody账户
    [root@proxy etc]#systemctl restart php-fpm    #重启服务

 步骤二:修改Nginx配置文件并启动服务

    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    ...
     location  ~  \.php$  {                    #~是使用正则表达式,匹配以.php结尾
            root           html;
           #fastcgi_pass   127.0.0.1:9000;        #注释或删除该行
            fastcgi_pass  unix:/run/php-fpm/www.sock;  #将请求转发给php-fpm进程
            fastcgi_index  index.php;
           #fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi.conf;            #加载fastcgi配置文件
            }
    [root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

4 案例3:地址重写

4.1 问题

  1. 通过调整Nginx服务端配置,实现地址重写功能

4.2 方案

关于Nginx服务器的地址重写,主要用到的配置参数是rewrite

  • rewrite regex replacement flag
  • rewrite 旧地址 新地址 [选项]

4.3 步骤

实现此案例需要按照如下步骤进行。

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

1)修改Nginx服务配置:

    [root@proxy nginx]# cp conf/nginx.conf.default conf/nginx.conf    #还原配置文件
    [root@proxy nginx]# cp:是否覆盖"conf/nginx.conf"? y
    [root@proxy nginx]# vim conf/nginx.conf
    .. ..
    server {
            listen       80;
            server_name  localhost;
            rewrite  /a.html  /b.html;            
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    [root@proxy ~]# echo "nginx-B~~" > /usr/local/nginx/html/b.html

 2)重新加载配置文件

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

3)客户端测试

http://192.168.99.5/a.html

步骤二:测试redirect选项

1)修改Nginx服务配置:

    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    .. ..
    server {
            listen       80;
            server_name  localhost;
            rewrite ^/a.html$  /b.html  redirect;            
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

2)重新加载配置文件

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

3)客户端测试,地址栏同时发生变化

http://192.168.99.5/a.html

步骤三:不同网站间跳转

修改Nginx服务配置实现访问192.168.99.5的请求重定向至www.tmooc.cn

    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    .. ..
    server {
            listen       80;
            server_name  localhost;
        rewrite /  http://www.tmooc.cn/;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

 2)重新加载配置文件

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

3)客户端测试

http://192.168.99.5

步骤四:修改配置文件(访问192.168.99.5/下面子页面,重定向至www.tmooc.cn/下相同的子页面)

1) 修改Nginx服务配置

    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    .. ..
    server {
            listen       80;
            server_name  localhost;
        rewrite  /(.*)  http://www.tmooc.cn/$1;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

 2)重新加载配置文件

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

3)客户端测试

http://192.168.99.5/test

步骤五:实现不同浏览器跳转到不同页面

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

    [root@proxy nginx]# mkdir  html/firefox
    [root@proxy nginx]# echo  firefox~~  >  html/firefox/abc.html   #火狐专用页面
    [root@proxy nginx]# echo  others~~  >  html/abc.html            #其他浏览器专用页面

火狐访问192.168.99.5/abc.html时可以看到html/firefox/abc.html里面内容

其他浏览器访问192.168.99.5/abc.html时可以看到html/abc.html里面内容

2) 修改Nginx服务配置

    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    .. ..
    server {
            listen       80;
            server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
    if ($http_user_agent ~* firefox) {        #如果用户使用了火狐浏览器
    rewrite (.*)  /firefox/$1;        #就进行地址重写,让用户看到火狐专用页面$http_user_agent是nginx的内置变量,存储了用户的信息,比如用的什么浏览器,~是匹配正则  *是忽略大小写
    }
    }

3)重新加载配置文件

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

 4)客户端测试

    分别用火狐浏览器与其他浏览器访问相同地址http://192.168.99.5/abc.html,可以得到不同结果

5 地址重写的选项

redirect 临时重定向,状态码302,爬虫不更新URI

permanent 永久重定向,状态码301,爬虫更新URI

last 不再读其他语句,但还会继续匹配其他location语句

    echo  "nginx-c~~"  >   html/c.html        #准备素材c页面
    rewrite  /a.html  /b.html  last;        #没有其他location语句时,打开b页面
    rewrite  /b.html  /c.html ;

 break 不再读其他语句,结束请求

            location / {                #此处为默认的location
    rewrite /a.html /b.html break;        #break可以阻止后面的语句            
                root   html;
                index  index.html index.htm;
            }
    location /b.html {                #这里是新添加的location
    rewrite /b.html /c.html;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java—AWT

AWT 课程:1、GUI编程简介_哔哩哔哩_bilibili 一.介绍 包含了很多类和接口!GUI!元素:窗口、按钮、文本框java.awt 二.窗口 1.构造 2.方法 // 实例化frame类Frame frame new Frame("这个一个框");// 设置可见性frame.…

游戏设计模式

单列模式 概念 单例模式是一种创建型设计模式,可以保证一个类只有一个实例,并提供一个访问该实例的全局节点。 优点 可以派生:在单例类的实例构造函数中可以设置以允许子类派生。受控访问:因为单例类封装他的唯一实例&#xf…

Cyberdog2 docker环境软件源无法被验证问题

搭建docker系统后更新软件源sudo apt-get update出现异常 经过查询GPT,使用如下方式成功解决 从keyserver.ubuntu.com获取缺失的公钥,并添加到apt-key中。具体命令如下: gpg --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C6…

C++的关键字,命名空间,缺省参数,函数重载以及原理

文章目录 前言一、C关键字(C98)二、命名空间命名空间介绍命名空间的使用 三、C输入【cin】& 输出【cout】四、缺省参数缺省参数概念缺省参数分类缺省参数的使用小结一下 五、函数重载函数重载介绍函数重载类型 六、C支持函数重载的原理--名字修饰(name Mangling)【重点】 前…

【开源】基于JAVA语言的智慧社区业务综合平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 业务类型模块2.2 基础业务模块2.3 预约业务模块2.4 反馈管理模块2.5 社区新闻模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 业务类型表3.2.2 基础业务表3.2.3 预约业务表3.2.4 反馈表3.2.5 社区新闻表 四、系统展…

[BUUCTF]-PWN:hitcon2014_stkof解析

又是一道堆题,先看保护 关键信息,64位,没开pie。再看ida 大致就是alloc创建堆块,free释放堆块,fill填充堆块内容,以及一个看起来没啥用的函数,当然我也没利用这个函数去解题 这里有两种解法 解…

Python tkinter (6) Listbox

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…

Java版大厂算法题1——数字颠倒

问题描述 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出&#xff0c;程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0。如果输入为100&#xff0c;则输出为001。 数据范围&#xff1a;0<n<(2^30)-1 * 输入描述&#xff1a;输入…

2023启示录|虚拟人这一年

图片&#xff5c;《银翼杀手 2049》剧照 作者丨程心 编辑丨罗辑 2023 年&#xff0c;大模型 “救活” 了很多行业&#xff0c;其中最为反转的&#xff0c;就是把虚拟数字人&#xff08;以下简称虚拟人&#xff09;从活死人墓里拉了出来。 还没开年&#xff0c;在 2022 年火…

保姆级教学:Java项目从0到1部署到云服务器

目录 1、明确内容 2、apt 2.1、apt 语法 2.2、常用命令 2.3、更新apt 3、安装JDK17 4、安装MySQL 4.1、安装 4.2、检查版本及安装位置 4.3、初始化MySQL配置⭐ 4.4、检查状态 4.5、配置远程访问⭐ 4.6、登录MySQL 4.7、测试数据库 4.8、设置权限与密码⭐ 5、安…

基于Python flask MySQL 猫眼电影可视化系统设计与实现

1 绪论 1.1 设计背景及目的 猫眼电影作为国内知名的电影信息网站&#xff0c;拥有海量的电影信息、票房数据和用户评价数据。这些数据对于电影市场的研究和分析具有重要意义。然而&#xff0c;由于数据的复杂性和数据来源的多样性&#xff0c;如何有效地采集、存储和展示这些数…

0127-2-Vue深入学习5—Vue-Router路由模式

1、Vue-Router三种路由模式&#xff1a; hash&#xff1a;#️⃣使用URL hash 值来做路由&#xff0c;支持所有路由器&#xff1b;history:&#x1f4d6;依赖HTML5 History API和服务器配置&#xff1b;abstract:⛓支持所有JS运行环境&#xff0c;Node.js服务端&#xff1b; 1.1…

基于springboot+vue+mysql+mybatis的博客系统源码+数据库

pb-cms 介绍 博客系统&#xff0c;架构&#xff1a;springbootvuemysqlmybatis 软件架构 软件架构说明 系统截图 技术选型 技术版本说明Spring Boot2.1.6MVC核心框架Spring Security oauth22.1.5认证和授权框架MyBatis3.5.0ORM框架MyBatisPlus3.1.0基于mybatis&#xff0…

HCIA-HarmonyOS设备开发认证-3.内核基础

目录 前言目标一、进程与线程待续。。。 前言 对于任何一个操作系统而言&#xff0c;内核的运行机制与原理是最为关键的部分。本章内容从多角度了解HarmonyOS的内核运行机制&#xff0c;涵盖进程与线程的概念&#xff0c;内存管理机制&#xff0c;网络特性&#xff0c;文件系统…

高级CPU(提高CPU运行速度)

晶体管 早期是加快晶体管切换速度,来提升CPU速度 增加电路 给CPU专门的除法电路其他电路来做复杂操作 缓存&#xff08;cache&#xff09; 给CPU加缓存&#xff08;cache&#xff09;,提高数据存取速度,更快送给CPU&#xff0c;因为处理器里空间不大所以缓存一般只有KB或M…

BGP:03 BGP路由

这是实验拓扑&#xff0c;IBGP 利用环回口建立邻居&#xff0c;IGP 协议为 OSPF&#xff0c; EBGP 通过物理接口建立邻居 基本配置&#xff1a; R1: sys sysname R1 int loop 0 ip add 1.1.1.1 24 int g0/0/0 ip add 192.168.12.1 24 qR2: sys sysname R2 int loop 0 ip ad…

基于SSM的网络办公系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的网络办公系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

c语言基础6

1.逗号表达式 逗号表达式&#xff0c;就是用逗号隔开的多个表达式。 逗号表达式&#xff0c;从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果。 我们来看下面的一个代码&#xff1a; int main() {int a 1;int b 2;int ret (a > b, a b 2, b, b a 1);p…

shell脚本基础之函数与数组详解

目录 一、shell函数 1、shell函数的概念 2、shell函数的用法 2.1 定义函数 2.2 调用函数 2.3 函数作用范围 2.3.1 调用函数的范围 2.3.2 全局作用域和局部作用域 3、 函数返回值 3.1 系统默认的返回值 3.2 return语句 4、函数传参 5、查看函数列表 6、删除函数 …

RC4Drop加密:提升数据保护的新选择

摘要&#xff1a;RC4Drop是一种基于RC4算法的加密技术&#xff0c;通过将明文数据分成多个部分并进行加密&#xff0c;实现了对数据的高效保护。本文将对RC4Drop加密技术的优缺点进行详细分析&#xff0c;并给出一个Java完整demo示例。 RC4Drop加密解密 | 一个覆盖广泛主题工具…