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等)生成的网页都可以称为动态网页。
部署LNMP环境
问题
- 安装部署Nginx、MariaDB、PHP环境
- 安装部署Nginx、MariaDB、PHP、PHP-FPM;
- 启动Nginx、MariaDB、FPM服务;
- 并测试LNMP是否工作正常。
方案
目前的网站一般都会有动态和静态数据,默认nginx仅可以处理静态数据,用户访问任何数据都是直接返回对应的文件,如果如果访问的是一个脚本的话,就会导致直接返回一个脚本给用户,而用户没有脚本解释器,也看不懂脚本源代码!网站拓扑如图-1所示。
因此需要整合LNMP(Linux、Nginx、MySQL、PHP)实现动态网站效果。
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.安装nginx依赖包,源码安装Nginx
[root@proxy ~]# yum -y install gcc openssl-devel pcre-devel
[root@proxy ~]# useradd -s /sbin/nologin nginx
[root@proxy ~]# tar -xvf nginx-1.12.2.tar.gz
[root@proxy ~]# cd nginx-1.12.2
[root@proxy nginx-1.12.2]# ./configure \
> --user=nginx --group=nginx \
> --with-http_ssl_module
[root@proxy ~]# make && make install
2.安装MariaDB
Mariadb在新版RHEL7光盘中包含有该软件,配置yum源后可以直接使用yum安装
[root@proxy ~]# yum -y install mariadb mariadb-server mariadb-devel
3.安装php和php-fpm
[root@proxy ~]# yum -y install php php-mysql
[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 ~]# 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所示。
Nginx结合FastCGI技术即可支持PHP页面架构,如图-3所示。
配置nginx,实现两个如果:
1.如果用户访问的是静态网页,则直接返回
2.如果用户访问的是动态网页,则交给php
location匹配用户的地址栏(从域名后面开始匹配),支持正则,在同一个网站中可以有多个location,"location /"的优先级最低
什么是动静分离?
是指动态网站是一种处理方式静态网站是一种处理方式,两种处理方式不一样叫动静分离.
动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提升整个服务访问性能和可维护性。
步骤一:php-fpm配置文件
1.查看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 永久重定向
来源:CSDN
作者:tian1345
链接:https://blog.csdn.net/tian1345/article/details/103933346