一、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服务端配置,实现以下目标:
- 配置Fast-CGI支持PHP网页
- 创建PHP测试页面,测试使用PHP连接数据库的效果
方案
使用2台RHEL7虚拟机,其中一台作为LNMP服务器(192.168.4.5)、另外一台作为测试用的Linux客户机(192.168.4.10),如图-2所示。
图-2
Nginx结合FastCGI技术即可支持PHP页面架构,如图-3所示。
图-3
配置nginx,实现两个如果:
- 如果用户访问的是静态网页,则直接返回
- 如果用户访问的是动态网页,则交给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 旧地址 新地址 [选项]
案例
- 访问http://www.360buy.com会自动跳转至http://www.jd.com。
- 访问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 永久重定向