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

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里面内容

  1. 修改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;
    }
相关推荐
05大叔1 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密1 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20151 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑
卷福同学2 小时前
【养虾日记】QClaw操作浏览器自动化发文
运维·人工智能·程序人生·自动化
woho7788993 小时前
不同网段IP的网络打印机,打印、扫描设置
运维·服务器·网络
耗子会飞3 小时前
小白学习固定VM虚拟机的centos服务器的IP
运维·服务器·centos
门豪杰4 小时前
Ubuntu下安装Claude Code
linux·运维·ubuntu·claude·claude code
新新学长搞科研4 小时前
第五届电子、集成电路与通信技术国际学术会议(EICCT 2026)
运维·人工智能·自动化·集成测试·信号处理·集成学习·电气自动化
桌面运维家4 小时前
Windows/Linux双启动:BIOS/UEFI多配置桌面创建指南
linux·运维·windows
無法複制4 小时前
debian安装Postgresql-14.x
运维·postgresql·debian