LNMP部署Nginx+FastCGINginx高级技术

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LNMP部署Nginx+FastCGINginx高级技术相关的知识,希望对你有一定的参考价值。

1 案例1:部署LNMP环境
1.1 问题
安装部署nginx、MariaDB、php环境
?安装部署Nginx、MariaDB、PHP、PHP-FPM;
?启动Nginx、MariaDB、FPM服务;
?并测试LNMP是否工作正常。
1.2 方案
在RHEL7系统中,源码安装Nginx,使用RPM包安装MariaDB、PHP、PHP-FPM软件。
操作过程中需要安装的软件列表如下:
?nginx 【源码】(web服务器,接收用户请求)
?mariadb(客户端软件mysql)、mariadb-server(服务)、mariadb-devel (依赖包)
?php、php-fpm、php-mysql (php解释器,解释基本语法格式,但不支持连接mysql。php-mysql扩展包是用来连接mysql。php-fpm是php服务,可启动php服务。先看后台有什么服务再决定安装什么包。)
?修改配置文件,把它们串连在一起,正常工作
1.3 步骤
LNMP动态网站
Nginx静态网站
静态网站:用户访问的任何页面,服务器直接将文件给用户。服务器不管客户端有没有相应软件,直接给客户端网页(傻瓜式),没有就得下载
动态网站:代码需要在服务上执行,将执行结果给用户。使用相应解释器在服务器本身运行一次,结果传给客户端
nginx+PHP【实现动静分离】
用户发送请求到nginx:80
nginx要分析用户的请求,看是请求静态还是动态,如果是静态,则nginx找root网站根,【成功,404】如果是动态,则转发给9000端口。

PHP:网站(对于java来说性能差一些)
Java:网站,软件,软件(最难)
Python:网站,软件,游戏(对于java来说性能差一些)
步骤一:安装软件
1)使用yum安装基础依赖包
1.[[email protected] ~]# yum -y install gcc openssl-devel pcre-devel l
2... ..
2)源码安装Nginx
1.[[email protected] ~]# useradd –s /sbin/nologin nginx
2.[[email protected] ~]# tar -zxvf nginx-1.8.0.tar.gz
3.[[email protected] ~]# cd nginx-1.8.0
4.[[email protected] nginx-1.8.0]# ./configure \
5.> --prefix=/usr/local/nginx \
6.> --user=nginx --group=nginx \
7.> --with-http_ssl_module
8.[[email protected] ~]# make && make install
9... ..
3)安装MariaDB
Mariadb在新版RHEL7光盘中包含有该软件,配置yum源后可以直接使用yum安装:
1.[[email protected] ~]# yum –y install mariadb mariadb-server mariadb-devel
4)php和php-fpm
1.[[email protected] ~]# yum –y install php php-mysql
2.[[email protected] ~]# tar –xf lnmp_soft-2017-03-28.tar.gz
3.[[email protected] ~]# cd lnmp_soft
4.[[email protected] ~]# yum –y php-fpm-5.4.16-36.el7_1.x86_64.rpm

?安装操作:
? yum -y install mariadb mariadb-server
? yum -y install mariadb-devel
? yum -y install php php-mysql 解释器
? cd lnmp_soft/
? rpm -ivh php-fpm-5.4.16-36.el7_1.x86_64.rpm
php是一个解释器,不是服务,只能靠rpm安装php-fpm来启动。
步骤二:启动服务
1)启动Nginx服务
这里需要注意的是,如果服务器上已经启动了其他监听80端口的服务软件(如httpd),则需要先关闭该服务,否则会出现冲突。
1.[[email protected] ~]# systemctl stop httpd????????????????//如果该服务存在则关闭该服务
2.[[email protected] ~]# systemctl disable httpd????????????????//关闭httpd的开机启动功能
3.[[email protected] ~]# /usr/local/nginx/sbin/nginx ????????????//启动Nginx服务
4.[[email protected] ~]# netstat -utnlp | grep :80
5.tcp????0????0 0.0.0.0:80????????0.0.0.0:*????????LISTEN????????32428/nginx
2)启动MySQL服务
1.[[email protected] ~]# systemctl start mariadb
2.[[email protected] ~]# systemctl status mariadb
3.[[email protected] ~]# systemctl enable mariadb
3)启动PHP-FPM服务
1.[[email protected] ~]# systemctl start php-fpm
2.[[email protected] ~]# systemctl status php-fpm
3.[[email protected] ~]# systemctl enable php-fpm
2 案例2:构建LNMP平台
2.2 方案
使用2台RHEL7虚拟机,其中一台作为LNMP服务器(192.168.4.5)、另外一台作为测试用的Linux客户机(192.168.4.100),如图-1所示。

图-1
Nginx结合FastCGI技术即可支持PHP页面架构,因此本案例,需要延续练习一的实验内容,通过修改Nginx及php-fpm配置文件实现对PHP页面的支持。
php-fpm需要修改的常见配置如下:
listen = 127.0.0.1:9000 //PHP端口号
pm.max_children = 32 //最大进程数量
pm.start_servers = 15 //最小进程数量
pm.min_spare_servers = 5 //最少需要几个空闲着的进程
pm.max_spare_servers = 32 //最多允许几个进程处于空闲状态

Nginx ---PHP(动静分离)
Nginx判断用户访问的是静态还是动态
如果是静态,则在root对应的目录中找到页面直接给用户
如果是动态,则nginx将请求转发给9000端口

location / {allow all} 默认值是允许所有
location /a {deny all}
location /b {allow 1.1.1.1}
location /c {deny 1.1.1.1}
http://192.168.4.5/ 没有任何匹配的时候,只能默认匹配根。默认值是允许所有
http://192.168.4.5/a 所有人都打不开
http://192.168.4.5/b 只允许1.1.1.1访问
http://192.168.4.5/c 仅不允许1.1.1.1访问
Location 匹配用户的地址栏(支持正则)

有多少Location相当于有多少if
Server {
Listen 80;
Server_name localhost;
Location / {
Root html;(静态)和上一节的集群调度器相反。
}
Location

修改nginx的配置文件
Location ~ .php$ { (动态交给9000端口)
Root html;
Fastcgi_pass 127.0.0.1:9000; (交给9000端口)
Fastcgi_index index.php;
#Fastcgi_param........name;
Include fastcgi.conf; (读到最后一行加载一下配置文件)
}
1.vim /etc/php-fpm.d/www.conf
2.[www]
3.listen = 127.0.0.1:9000
4.listen.allowed_clients = 127.0.0.1
5.user = apache
6.group = apache
7.pm = dynamic
8.pm.max_children = 50
9.pm.start_servers = 5
10.pm.min_spare_servers = 5
11.pm.max_spare_servers = 35
FastCGI 工作原理:

动态:客户端发送请求给nginx,nginx转发给PHP,PHP多个进程共同操作(并发量大,但是占用内存大),操作结果源路返回给nginx,nginx发送给客户端。
常见错误:
没有页面(权限):关闭selinux:setenforce 0;rwx;acl
error:查error日志:连接被拒绝(upstream后台失败):服务器没有启动
Php报错:语法错误,注意分号
端口80和9000要开启,关闭squid
Location 下载页面:注释没打开
Nginx报错:mariadb 要开启,路径在conf下面(绝对路径),配置文件deny注释掉
Php是多进程的服务,启动多个php,都交给9000端口
多个进程:同时开不同界面,连不同服务器
Php-CGI解释器运行很占内存
网上有数据库模板

2.3 步骤
步骤一:创建并修改php-fpm配置文件
1)查看php-fpm配置文件
1.[[email protected] etc]# vim /etc/php-fpm.d/www.conf
2.[www]
3.listen = 127.0.0.1:9000
4.listen.allowed_clients = 127.0.0.1
5.user = apache
6.group = apache
7.pm = dynamic
8.pm.max_children = 50 最多启50个
9.pm.start_servers = 5 一开始启5个
10.pm.min_spare_servers = 5
11.pm.max_spare_servers = 35
2)确认php-fpm服务已经启动
1.[[email protected] ~]# systemctl restart php-fpm
2.[[email protected] ~]# systemctl status php-fpm
步骤二:修改Nginx配置文件并启动服务
1.[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf (给php部分去掉#)
2.location / {

  1. root html;
  2. index index.php index.html index.htm;
  3. }
  4. location ~ .php$ {
  5. root html;
  6. fastcgi_pass 127.0.0.1:9000;
  7. fastcgi_index index.php;
  8. #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; (老版本使用,去掉)
  9. include fastcgi.conf; 修改这里
  10. }
    13.[[email protected] ~]# /usr/local/nginx/sbin/nginx -s reload
    步骤三:创建PHP页面,测试LNMP架构能否解析PHP页面
    在nginx的网页写好网页内容才能访问到内容:/usr/local/nginx/html/
    1)创建PHP测试页面1:
    1.[[email protected] ~]# vim /usr/local/nginx/html/test1.php
    2.<?php
    3.$i="This is a test Page";
    4.echo $i;
    5.?>
    2)创建PHP测试页面,连接MariaDB数据库:
  11. [[email protected] ~]# vim /usr/local/nginx/html/test2.php
    2.<?php
    3.$links=mysql_connect("localhost","root","密码");????????
    4.//注意:root为mysql账户名称,密码需要修改为实际mysql密码,无密码则留空即可
    5.if($links){
  12. echo "link db ok!!!";
    7.}
    8.else{
  13. echo "link db no!!!";
    10.}
    11.?>
    3)创建PHP测试页面,连接并查询MariaDB数据库:
    1.[[email protected] ~]# vim /usr/local/nginx/html/test3.php
    2.<?php
    3.$mysqli = new mysqli(‘localhost‘,‘root‘,‘‘,‘mysql‘);
    4.if (mysqli_connect_errno()){
    5.????die(‘Unable to connect!‘). mysqli_connect_error();
    6.}
    7.$sql = "select * from user"; 从数据库中提取数据
    8.$result = $mysqli->query($sql);
    9.while($row = $result->fetch_array()){
    10.????printf("Host:%s",$row[0]);
    11.????printf("</br>");
    12.????printf("Name:%s",$row[1]);
    13.????printf("</br>");
    14.}
    15.?>
    4)客户端使用浏览器访问服务器PHP首页文档,检验是否成功:(导出数据库的内容到网页)
    1.[[email protected] ~]# firefox http://192.168.4.5/test1.php
    2.[[email protected] ~]# firefox http://192.168.4.5/test2.php
    3.[[email protected] ~]# firefox http://192.168.4.5/test3.php
    3 案例3:地址重写
    3.1 问题
    nginx支持地址重写(地址栏重新改写)
    www.baidu.com/a----->www.baidu.com/b
    Rewrite 旧地址 新地址 【选项】
    Rewrite /a.html /b.html redirect
    Rewrite 支持正则
    http://192.168.4.5/achtml 成功
    http://192.168.4.5/a.html 成功
    http://192.168.4.5/acchtml 不成功

沿用练习一,通过调整Nginx服务端配置,实现以下目标:
1.所有访问a.html的请求,重定向到b.html;
2.所有访问192.168.4.5的请求重定向至www.tmooc.cn;(替换为www.it211.com.cn)
3.所有访问192.168.4.5/下面子页面,重定向至www.tmooc.cn/下相同的页面;
4.实现curl访问不同的页面。
步骤一:修改配置文件(访问a.html重定向到b.html)
1)修改Nginx服务配置:
cd /usr/local/nginx/html/
[[email protected] html]# ls
50x.html a.php index.html mysql.php
[[email protected] html]# vim /usr/local/nginx/conf/nginx.conf
[[email protected] html]# /usr/local/nginx/sbin/nginx -s reload
[[email protected] html]# echo "BBB" > b.html
1.[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
2... ..
3.server {

  1. listen 80;
  2. server_name localhost;
    6.location / {
    7.????root html;
    8.index index.html index.htm;
    9.rewrite /a.html /b.html;?????????(添加这一行)???(可后加一个redirect,添加就会使客户端看到自己的网站改了)
    10.}
    11.}
    2)重新加载配置文件
    1.[[email protected] ~]# /usr/local/nginx/sbin/nginx -s reload
    3)客户端测试
    1.[[email protected] ~]# firefox http://192.168.4.5/a.html
    步骤二:修改配置文件(访问192.168.4.5的请求重定向至www.tmooc.cn)
    1) 修改Nginx服务配置
    1.[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
    2... ..
    3.server {
  3. listen 80;
  4. server_name localhost;
    6.rewrite ^/ http://www.tmooc.cn/; (^/ 正则模糊匹配,访问192.168.4.5的请求重定向至www.tmooc.cn) 放到location外面
    7.location / {
    8.????root html;
    9.index index.html index.htm; 默认主页
    10.}
    11.}
    2)重新加载配置文件
    1.[[email protected] ~]# /usr/local/nginx/sbin/nginx -s reload
    3)客户端测试
    1.[[email protected] ~]# firefox http://192.168.4.5
    步骤三:修改配置文件(访问192.168.4.5/下面子页面,重定向至www.tmooc.cn/下相同的页面) purl 版正则,\变为$
    1) 修改Nginx服务配置
    1.[[email protected] ~]# vim /usr/local/nginx/conf/nginx.conf
  5. 3... ..
    4.server {

  6. listen 80;
  7. server_name localhost;
    12.rewrite ^/(.) http://www.tmooc.cn/$1; (^/支持正则,从http://192.168.4.5/开始,/后的都跳转到http://www.tmooc/cn上)(rewrite ^//(.) http://www.tmooc.cn/$1) $和\一样代表粘贴,()代表复制保留。客户端需要什么就跳转到相应页面。访问192.168.4.5/下面子页面,重定向至www.tmooc.cn/下相同的页面
  8. 8.location / {
    9.????root html;
    10.index index.html index.htm;
    11.}
    12.}
    2)重新加载配置文件
    1.[[email protected] ~]# /usr/local/nginx/sbin/nginx -s reload
    3)客户端测试
    1.[[email protected] ~]# firefox http://192.168.4.5

步骤4:不同浏览器访问相同页面,结果不同。(实现curl和火狐访问相同连接返回的页面不同)
/usr/local/nginx/html/[一套正常页面]
/usr/local/nginx/html/uc/[一套窄屏页面]
server{
listen 80;
server_name localhost;
root html;
if (如果你是uc){
rewrite /(.*) /uc/$1;
}
准备两套页面:
ie http://192.168.4.1/a AAA
uc http://192.168.4.1/a BBB

curl:没有图形的命令行版火狐
1) 修改Nginx服务配置
Location 前加if ($http_user_agent ~ curl){ (正则匹配看agent 有没有curl这个关键词)
rewrite ^/(.
) /curl/$1;
}
1... ..
2.server {

  1. listen 80;
  2. server_name localhost;
    5.location / {
    6.????root html;
    7.index index.html index.htm;
    8.}
    9.if ($http_user_agent ~ curl) {????????????????????//识别客户端curl浏览器(不区分大小写)
    10.rewrite ^(.*)$ /curl/$1 break;
    11.}
    12.}
    2)创建网页目录以及对应的页面文件:
    1.[[email protected] ~]# echo "I am Normal page" > /usr/local/nginx/html/test.html
  3. 3.[[email protected] ~]# mkdir -p /usr/local/nginx/html/curl/
    4.[[email protected] ~]# echo "I am is curl page" > /usr/local/nginx/html/curl/test.html
    2)重新加载配置文件
    1.[[email protected] ~]# /usr/local/nginx/sbin/nginx -s reload
    Location 前加if ($http_user_agent ~ curl){ (正则匹配看agent 有没有curl这个关键词)
    rewrite ^/(.
    ) /curl/$1;
    }
    Grep “curl”
    4)客户端测试 。相同地址下不同浏览器对应不同内容,结果不一样
    1.[[email protected] ~]# firefox http://192.168.4.5/test.html
    2.[[email protected] ~]# curl http://192.168.4.5/test.html
    3.firefox http://192.168.4.5/curl/test.html
    4.[[email protected] ~]# curl http://192.168.4.5/test.jsp

使用ie访问是宽屏页面
使用Uc访问是窄屏页面
/usr/local/nginx/html/ 正常页面test.html
/usr/local/nginx/html/uc 内容一样test.html
charset utf-8 可以在网页输出中文
user_agent 识别客户端的浏览器
UC--设置--浏览器设置--UA标识(电脑,手机)即user_agent,可手机伪装成电脑,宽屏
Curl -A(可以伪装成任何人) “AA” http://fdgfgsf

rewrite 旧地址 新地址 选项
last 不再读其他rewrite,只执行一个rewrite
break 不读其他语句,访问结束。不再执行其他冲突语句
redirect【地址变】临时重定向(蜘蛛会看,对此敏感。百度,360,google)
permanent【地址变】永久重定向(潜在提示以后直接访问跳转的页面即可)(蜘蛛会看,对此敏感)
蜘蛛(网络爬虫)喜欢路径短的文件。可以rewrite 短路径 长路经(跳转)
蜘蛛喜欢更新的原创内容

总结:
LNMP
nginx
mariadb mariadb-server mariadb-devel
php php-mysql php-fpm
nginx 80
systemctl start mariadb 3306
systemctl start php-fpm 9000
vim nginx.conf
location / { root html;}
location .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
}写代码[连接数据库] PHP--(数据库)
地址重写[a-b;4.5--tmooc;4.5/a--tmooc/a识别浏览器]$http_user_agent

进入vi/vim编辑器,按CTRL+V进入可视化模式(VISUAL BLOCK)
vi/vim如何添加或删除多行注释
移动光标上移或者下移,选中多行的开头,如下图所示
vi/vim如何添加或删除多行注释
选择完毕后,按大写的的I键,此时下方会提示进入“insert”模式,输入你要插入的注释符,例如#,
vi/vim如何添加或删除多行注释
最后按ESC键,你就会发现多行代码已经被注释了
vi/vim如何添加或删除多行注释
删除多行注释的方法,同样 Ctrl+v 进入列选择模式,移到光标把注释符选中,按下d,注释就被删除了。
ps aux | grep nginx 查看nginx进程
有几个CPU核心就有几个进程数

以上是关于LNMP部署Nginx+FastCGINginx高级技术的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Nginx服务器的安装,升级配置LNMP平台搭建nginx+fastcginginx高级技术-地址重写及优化

LNMP平台部署及应用

Nginx网站服务+LNMP架构及应用部署

Nginx网站服务+LNMP架构及应用部署

部署LNMP Nginx+FastCGI Nginx高级技术

Nginx服务与LNMP架构部署