LNMP动态网站.构建LNMP平台.地址重写

本文介绍了LNMP(Linux、Nginx、MySQL、PHP)的基础知识,包括静态与动态网站的区别,详细讲解了如何部署LNMP环境,配置FastCGI支持PHP,以及如何进行地址重写,包括不同场景的重写规则和实际应用案例。
摘要由CSDN通过智能技术生成

一、LNMP基础知识

什么是LNMP

  • 主流的企业网站平台之一

        ----L:Linux操作系统

        ----N:Nginx网站服务软件

        ----M:MySQL、MariaDB数据库

        ----P:网站开发语音(PHP.Perl.Python)

静态网站和动态网站区别

静态网页:
(1)静态网页不能简单地理解成静止不动的网页,他主要指的是网页中没有程序代码,只有HTML(即:超文本标记语言),一般后缀为.html,.htm,或者.xml等。虽然静态网页的页面一旦做成,内容就不会再改变了。但是,静态网页也包括一些能动的部分,这些主要是一些GIF动画等
(2)静态网页的打开,用户可以直接双击,并且不管任何人任何时间打开的页面的内容都是不变的。

动态网页:
(1)动态网页是指跟静态网页相对的一种网页编程技术。动态网页的网页文件中除了HTML标记以外,还包括一些特定功能的程序代码,这些代码可以使得浏览器和服务器可以交互,所以服务器端根据客户的不同请求动态的生成网页内容。
即:动态网页相对于静态网页来说,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。
(2)动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术(如PHP、ASP、JSP等)生成的网页都可以称为动态网页。

1、部署LNMP环境

问题

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

方案

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

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

 

                                      图-1

LNMP在CentOS系统中,源码安装Nginx,使用RPM包安装MariaDB、PHP、PHP-FPM软件。

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

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

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

步骤一: 安装软件

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

[root@proxy ~]# yum  -y  install gcc openssl-devel pcre-devel

2.源码安装Nginx

[root@proxy ~]#useradd -s /sbin/nologin nginx       #创建用户.shell环境为不可登录
[root@proxy opt]# tar xf nginx-1.12.2.tar.gz ##解包
[root@proxy ~]# cd  nginx-1.12.2
[root@proxy nginx-1.12.2]# ./configure   \
--prefix=/usr/local/nginx   \                #指定安装路径
--user=nginx   \                            #指定用户
--group=nginx  \                            #指定组
--with-http_ssl_module                    #开启SSL加密功能
[root@proxy nginx-1.12.2]# make && make install     ##编译并安装
......

3.安装MariaDB

Mariadb在新版RHEL7光盘中包含有该软件,配置yum源后可以直接使用yum安装:

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

4.php和php-fpm

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

步骤二:启动服务

1.启动Nginx服务(如果已经启动nginx,则可以忽略这一步)

这里需要注意的是,如果服务器上已经启动了其他监听80端口的服务软件(如httpd),则需要先关闭该服务,否则会出现冲突。

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

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.验证服务是否启动成功

[root@proxy ~]# ss  -ntulp  |  grep  :80                       #nginx端口
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=3951,fd=6),("nginx",pid=3950,fd=6))
[root@proxy ~]# ss  -ntulp  |  grep  :3306                    #mariadb端口
tcp    LISTEN     0      50        *:3306                  *:*                   users:(("mysqld",pid=4292,fd=14))
[root@proxy ~]# ss  -ntulp  |  grep  :9000                   #php-fpm端口
tcp    LISTEN     0      128    127.0.0.1:9000                  *:*                   users:(("php-fpm",pid=4361,fd=0),("php-fpm",pid=4360,fd=0),("php-fpm",pid=4359,fd=0),("php-fpm",pid=4358,fd=0),("php-fpm",pid=4357,fd=0),("php-fpm",pid=4355,fd=6))

FastCGI工作原理

FastCGI简介

FastCGI技术目前支持语言有PHP.C/C++.Java.Perl.Python.RUby等

工作流程

  • WebServer启动时载入FastCGI进程管理器
  • FastCGI进程管理器初始化,启动多个解释器进程
  • 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个解释器
  • FastCGI子进程完成处理后返回结果,将标准输出和错误信息从同一连接返回Web Server

FastCGI缺点

  • 因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程小号7至25兆内存,将这个数字乘以50或100就是很大的内存数
  • Nginx+PHP(FastCGI)服务器在3万并发连接下开10个Nginx进程消耗150M内存(1015M),开64个php-cgi进程消耗1280M内存(20M64)

配置FastCGI

[root@proxy ~]# vim /etc/php-fpm.d/www.conf 
[www]
listen = 127.0.0.1:9000                     //php端口号
listen.allowed_clients = 127.0.0.1
pm.max_children = 50                        //最大进程数量
pm.start_servers = 5                        //最小进程数量

二、构建LNMP平台

问题

通过调整Nginx服务端配置,实现以下目标:

  1. 配置Fast-CGI支持PHP网页
  2. 创建PHP测试页面,测试使用PHP连接数据库的效果

方案

使用2台RHEL7虚拟机,其中一台作为LNMP服务器(192.168.4.5)、另外一台作为测试用的Linux客户机(192.168.4.10),如图-2所示。

                            图-2

Nginx结合FastCGI技术即可支持PHP页面架构,如图-3所示。

 

                                                  图-3

配置nginx,实现两个如果:

  1. 如果用户访问的是静态网页,则直接返回
  2. 如果用户访问的是动态网页,则交给php

location匹配用户的地址栏(从域名后面开始匹配),支持正则,在同一个网站中可以有多个location,"location /"的优先级最低

步骤一:php-fpm配置文件
查看php-fpm配置文件

[root@proxy etc]# vim /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000            //PHP端口号
pm.max_children = 32                //最大进程数量
pm.start_servers = 15                //最小进程数量

步骤二:修改nginx配置文件并启动

root@proxy conf]# vim  /usr/local/nginx/conf/nginx.conf
 35     server {
 36         listen       80;
 37         server_name  localhost;
 43         location / {
 44             root   html;
 45             index  index.html index.htm;
 #设置默认首页为index.php,当用户在浏览器地址栏中只写域名或IP,不说访问什么页面时,服务器会把默认首页index.php返回给用户
 46         }                                                         #静态网页
 65         location ~ \.php$ {
 66             root           html;
 67             fastcgi_pass   127.0.0.1:9000;         #将请求转发给本机9000端口,PHP解释器
 68             fastcgi_index  index.php;                            #dd掉原本的68行
 69             include        fastcgi.conf;                         #加载其他的配置文件
 70         }                                                         #动态网页
 [root@proxy conf]# /usr/local/nginx/sbin/nginx -s reload         
 #请先确保nginx是启动状态,否则运行该命令会报错,报错信息如下:
#[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)

步骤三:创建PHP页面,测试LNMP架构能否解析PHP页面
1.创建PHP测试页面1,可以参考lnmp_soft/php_scripts/test.php:

[root@proxy ~]# vim /usr/local/nginx/html/test.php
<?php
$i="This is a test Page";
echo $i;
?>

2.客户端访问php页面

[root@localhost]$ firefox  192.168.4.5/test.php

访问得到以下页面:

3.连接并查询mariadb数据库
可以参考lnmp_soft/php_scripts/mysql.php:

[root@proxy ~]# cd lnmp_soft/php_scripts/                #切换到模板目录
[root@proxy php_scripts]# ls
Discuz_X3.4_SC_UTF8.zip  mem.php  mysql.php  php-memcached-demo.tar.gz  test.php  web_demo.tar.gz
[root@proxy php_scripts]# cp  mysql.php   /usr/local/nginx/html/      #拷贝到网页根目录下
[root@proxy ~]# vim /usr/local/nginx/html/mysql.php
<?php
$mysqli = new mysqli('localhost','root','密码','mysql');
//注意:root为mysql数据库的账户名称,密码需要修改为实际mysql密码,无密码则留空即可
//localhost是数据库的域名或IP,mysql是数据库的名称
if (mysqli_connect_errno()){
    die('Unable to connect!'). mysqli_connect_error();
}
$sql = "select * from user";
$result = $mysqli->query($sql);
while($row = $result->fetch_array()){
    printf("Host:%s",$row[0]);
    printf("</br>");
    printf("Name:%s",$row[1]);
    printf("</br>");
}
?>
[root@proxy php_scripts]# mysql  -e  "grant all on  *.* to tom@1.1.1.1 identified by '123'"
[root@proxy php_scripts]# /usr/local/nginx/sbin/nginx -s reload

4.客户端访问php页面

[root@localhost ~]$ firefox  192.168.4.5/mysql.php

 

LNMP常见问题

  • Nginx的默认访问日志文件为/usr/local/nginx/logs/access.log
  • Nginx的默认错误日志文件为/usr/local/nginx/logs/error.log
  • 如果动态网站访问失败,可用参考错误日志,查找错误信息。
  • 如果关闭php服务,此时访问动态网页是会报错的

php常见问题

  • php文件要以分号为结尾,如果脚本内容没有分号刷新页面无法报错
  • PHP默认错误日志文件为/var/log/php-fpm/www-error.log

此时访问到的页面如下

LNMP总结

1.nginx,php-fpm,mariadb服务
2.nginx.conf配置
3.test.php脚本语法
LNMP
user(客户端)---->nginx---->PHP---->mysql(mariadb)

三、地址重写

什么是地址重写

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

地址重写的好处

  • 缩短URL隐藏实际路径提高安全性
  • 易于用户记忆和键入
  • 易于被搜索引擎收录

rewrite语法

rewrite基本语句

  • rewrite regex replacement flag
  • (regex表示支持正则)
  • if (条件) {…}

正则表达式

正则表达式匹配模式如下:

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

rewrite选项

rewrite语句

  • rewrite regex replancement flag
  • flag:停止执行其他重写规则,根据URL继续搜索其他location,地址栏不变
  • break: 停止执行其他的重写规则,完成本次需求
  • redirect: 302临时重定向,地址栏改变,爬虫不更新URL
  • permanent: 301永久重定向,地址栏改变,爬虫更新URL

地址重写案例

问题:
通过调整Nginx服务端配置,实现以下目标:
所有访问a.html的请求,重定向到b.html;
所有访问192.168.4.5的请求重定向至www.360.cn;
所有访问192.168.4.5/下面子页面,重定向至www.360.cn/下相同的页面;
实现firefox与curl访问相同页面文件,返回不同的内容。

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

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

案例

  1. 访问http://www.360buy.com会自动跳转至http://www.jd.com。
  2. 访问http://www.baidu.com会自动跳转至https://www.baidu.com。

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

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

2.重新加载配置文件

[root@proxy nginx]# echo  hahahahhah  >  /usr/local/nginx/html/b.html
[root@proxy nginx]# /usr/local/nginx/sbin/nginx  -s  reload 
##此时访问a.html实际访问到的是b.html

3.客户端访问测试

[root@localhost ~]$ firefox  192.168.4.5/a.html

访问页面如下

步骤二:访问a.html重定向到b.html(跳转地址栏)
1.修改Nginx服务配置:

[root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  localhost;
     rewrite /a.html  /b.html redirect;        //添加redirect,可以写多个rewrite
 location / {
            root   html;
            index  index.html index.htm;
        }

2.重起服务

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

3.客户端访问

[root@localhost ~]$ firefox  192.168.4.5/a.html

此时客户端访问到的页面是b.html,观察地址栏变化

步骤三:修改配置文件(访问192.168.4.5的请求重定向至www.cn)
1.修改Nginx服务配置

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

2.重起服务

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

3.客户端访问

[root@localhost ~]$ firefox  192.168.4.5
#此时访问192.168.4.5则自动跳转到www.360.cn

客户端访问到的页面如下

步骤四:修改配置文件(访问192.168.4.5/下面子页面,重定向至www.360.cn/下相同的页面)
1.修改Nginx服务配置

[

root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
        listen       80;
        server_name  localhost;
rewrite ^/(.*)$  http://www.tmooc.cn/$1;      #在nginx中$1和正则中\1意义一样,表示前面的(.*)
location / {
    root   html;
index  index.html index.htm;
}
}

2.重起服务

[root@proxy nginx]# vim /usr/local/nginx/conf/nginx.conf

3.客户端访问

[root@localhost ~]$ firefox  192.168.4.5/download/   
[root@localhost ~]$ firefox  192.168.4.5/xxxxx 

此时客户端访问到的页面如下:

步骤五:修改配置文件(实现curl和火狐访问相同链接返回的页面不同)
用不同的浏览器访问相同的页面出现不同的结果

  • crul http://192.168.4.5/test.html
  • firewall http://192.168.4.5/test.html

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

[root@proxy ~]# echo ""wo shi Normal  wangye" > /usr/local/nginx/html/test.html
[root@proxy ~]# mkdir  -p  /usr/local/nginx/html/firefox/
[root@proxy ~]# echo "wo shi  firefox   wangye" > /usr/local/nginx/html/firefox/test.html

2.修改nginx配置文件

server {
        listen       80;
        server_name  localhost;                       #一定要把刚刚的rewrite取消掉
        if  ($http_user_agent   ~*    firefox)  {
        rewrite   ^/(.*)  /firefox/$1;  
}                                              
#  $http_user_agent为nginx自带的变量,变量的值表示用户的信息.浏览器版本号等,用客户信息和Firefox进行比较,如果客户信息内包含Firefox,则跳转到相应的Firefox文件搭建出的nginx页面
        location / {
            root   html;
            index  index.html index.htm;
        }

3.重起服务

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

4.客户端访问页面

[student@room9pc01 ~]$ curl  192.168.4.5/test.html
wo shi Normal  wangye 
[student@room9pc01 ~]$ firefox  192.168.4.5/test.html
此时,用firefox访问到的页面与curl访问到的不同

firefox访问192.168.4.5访问到的页面如下:


地址重写格式【总结】

  • rewrite 旧地址 新地址 [选项];
  • last 不再读其他rewrite
  • break 不再读其他语句,结束请求
  • redirect 临时重定向
  • permanent 永久重定向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值