一、补充if语句的不同浏览器类型网页测试

 if上下文(通常定义在location或server上下文中)

语法:if (condition) {......} 

应用环境:server,location

condition:

①变量名 (变量值为空时,或者以“0”开始,即为false,其他的均为true)

②以变量为基础的比较表达式

③可以基于正则表达式模式匹配操作

~:区分大小写模式匹配

~*:不区分大小写的模式匹配检查

!~和!~*:对上面两种测试取反

④测试文件是否存在  -f  !-f

⑤测试指定目录是否存在  -d  !-d

⑥测试文件是否存在:-e  !-e

⑦检查文件是否有执行权:-x  !-x

例如:

例1:使用MSIE浏览器

if ($http_user_agent ~* MSIE) {

       rewrite ^(.*)$ /msie/$1 break;

                           }

【注】:在旧版本Linux系统中要写last,不然浏览器跳转不过去。

例2:禁止做post表单提交

       if ($request_method = POST) {

         return 405;

                       }

例3:防止不合法的浏览器或压力测试

        location /return {

            if ($http_user_agent ~* curl|wget|ApacheBench) {

                Retrun /deny.jpg;

                }

        }

例4:编辑配置文件/etc/nginx/nginx.conf ,然后做规则:谁故意ab压力测试本服务器nginx,就将对应ip进行拉黑($remete_addr 是调用的main日志里面的变量),这实验没成功,但可以使用防火墙日志规则

在/usr/share/nginx/html/下,创建对应的return目录,并编辑index.html

用另一台虚拟机进行ab压力测试:

首先进行curl,发现正常,然后进行压力测试

例5:一旦用户使用Chrome访问nginx,就会使用302临时重定向到对应的图片

没设定规则之前是访问这个页面

在日志文件下查看浏览器类型,在规则中进行精准浏览器正则表达式匹配

在/etc/nginx/nginx.conf下设置规则

在/usr/share/nginx/html/,放一张gou.jpg图片

测试结果:

在10.110虚拟机上curl是正常访问的

在用Chrome访问:192.168.10.100/return

二、防盗链

 location ~* \.(gif|jpg|jpeg)$ {

      root "/www/images";

     valid_referers none blocked *.xxhf123.com xxhf123.* ~\.xxhf123\.;

      if ($invalid_referer) {

      rewrite ^/ http://www.xxhf123.com/daolian.png break;

            }

       }

①实验准备

vim /etc/nginx/nginx.conf

在/usr/share/nginx/html下创建images对应的目录,并放一些图片资源

写一个index.html

进行测试:192.168.10.100

②做一个防盗链主机

首先在另一台虚拟机10.110安装一个apache,并启动服务(更改完配置文件,一定检查语法并启动服务)

yum -y install httpd

其次在/var/www/html下,写一个index.html

【注】:一定要清除缓存,不然效果出不来

第三步编辑/etc/httpd/conf/httpd.conf,打开Servername 80端口

第四步做本地名字解析,编辑/etc/hosts

第五步把/etc/hosts 推给主机192.168.10.100下的/etc,并进行ping测试

httpd -t         systemctl start httpd

进行结果测试:192.168.10.110,盗链成功

如果110被同意就是合理的referer,如果不同意,就是盗链的referer,就要把其禁掉

③禁掉不合理的referer(防盗链)

在10.100上更改配置文件/etc/nginx/nginx.conf,白名单里允许盗链,黑名单里的就跳转到其他地方或者禁止访问

在/images里面放一张daolian.png,然后移动位置

进行结果测试:

④当把两台虚拟机都改成一样的域名后,进行访问,访问结果还是访问盗链页面。其原因是referer头部访问的是IP地址,所以我们需要做在Windows里做主机名解析

做名字解析:

Windows:C:\Windows\System32\drivers\etc\hosts

结果测试:

三、网络连接相关配置

1.网络连接相关的配置:(/etc/nginx/nginx.conf)

Keepalive_timeout #;  长连接能允许请求超时时长,默认65s;

Keepalive_requests #;  一个长连接所能够允许请求的最大资源数

Keepalive_disable [msie8 | safari | none] 为指定类型的User Agent禁用长连接;

tcp_nodelay  on|off  是否对长连接使用TCP_NODELAY选项

client_header_timeout #;  读取http请求报文首部的超时时长

client_max_body_size 1M #;  允许客户端上传单个文件的最大值(一般调大)

client_body_timeout #;  读取http请求报文body部分的超时时长

Send_timeout #;  发送响应报文的超时时长

limit_rate 1024k;  nginx浏览或下载限速---server上下文

 limit_rate_after 100m;  前100M不限速

2.限制并发连接数

limit_conn_zone $variable zone=name:size;

server {

       listen       80;

       server_name  www.abc.com;

       location / {

         limit_conn one 1;  #这将指定一个地址只能同时存在一个连接。“one”与上面的对应,也可以自定义命名

         limit_rate 300k;

  }

}

检查语法重启之后,在另一台虚拟机进行测试:

查看本机100的日志:

3.限制请求数

限制同一个IP的同时发起的最大请求数

指令

范例: 基于来源IP对下载速率限制,限制每秒处理1次请求,缓存区请求突发队列为10个

 }

}

http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

Syntax: limit_req_zone key zone=name:size rate=rate [sync];

Default: —

Context: http

Syntax: limit_req zone=name [burst=number] [nodelay | delay=number];

Default: —

Context: http, server, location

Syntax: limit_req_status code;

Default:

limit_req_status 503;

Context: http, server, location

#示例:

http {

   limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

   ...

   server {

       ...

       location /search/ {

           limit_req zone=one burst=5;

           limit_req_status 500; #默认503,可以指定其它状态码

       }

     

#参数说明

limit_req_zone定义在http块中,$binary_remote_addr表示以客户端IP地址的二进制形式为限流依据的key

Zone定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。8000个IP地址的状态信息约1MB,例子区域可以存储80000个IP地址。

Rate定义最大请求速率。示例中速率不能超过每秒10个请求。超过此速率的请求放入burst队列做延迟处理

burst表示队列大小,当此队列满后,会中断请求报错

nodelay表示超过请求速率并且缓存区满后不延迟处理,立即返回503错误

#可以有几个limit_req指令。例如,以下配置将限制来自单个 IP 地址的请求的处理速率,同时限制虚拟服务器的请求处理速率

#示例:

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;

limit_req_zone $server_name zone=perserver:10m rate=10r/s;

server {

   ...

   limit_req zone=perip burst=5 nodelay;

   limit_req zone=perserver burst=10;

}

四、Nginx的LNMP架构

1.nginx架构体系图流程:

首先当后台Nginx启动之后,它就会以一个master进程生成多个work进程(work进程默认生成数取决于CPU核心数)。那么就有多个人基于http或者https协议去访问对应的work进程,而work内部有四大核心模块(ht_upstream:集群模块、ht_proxy:代理模块、ht_fastcgi:fastcgi模块、ht_core:核心模块);无论是集群还是普通代理都是走基于http协议的七层代理,这里我们重点关注fastcgi关联Application server.

ht_upstream(集群模块):实现反向代理,去代理后端的多个web server,实现负载均衡

ht_proxy(代理模块):直接实现反向代理,来代理后端服务器,实现代理和缓存功能;在走纯代理过程中,缓存是非常明显的

ht_fastcgi(fastcgi模块):代理后端动态页面程序,如:java、php

ht_core(核心模块):实现http协议和web功能

memcache:调用后台数据库缓存

proxy cache:代理缓存,修剪缓存在cache manager、

【注】:nginx除了不支持模块,fastcgi、UDS都支持

2.LNMP架构实验:

原则:先做最前端nginx、再做最后端mysql、最后做中间php

首先需要三台虚拟机分别模拟:php、mysql(120)、nginx(100)

nginx源码编译成功前提下

fastcgi.conf:/etc/nginx/fastcgi.conf

php模版文件:/etc/nginx/nginx.conf.defaults

3.模拟nginx和php在同一台虚拟机上,走UDS模式

(1)10.100模拟前端服务器nginx:

①首先把模版配置文件挪到主配置文件中

cd /etc/nginx/

vim nginx.conf.default nginx.conf -o

V选中,ctrl+w右键,p粘贴,wqall 退出

②编辑主配置文件/etc/nginx/nginx.conf

nginx -t //检查语法

(2)10.120模拟数据库mysql:

①安装mysql,并启动

yum -y install mysql mysql-server.x86_64

systemctl restart mysqld

【注】:在实战中,如果mysql版本不一致,需要在/etc/my.cnf.d/进行配置数据字典、socket等

②进入mysql,进行配置

数据库基本用法

show databases;//显示当前数据库

create database test;  //创建数据库

drop database test;//删除数据库

use mysql;  //使用mysql 数据库

show tables;  //查看当前数据库的所有表

select * from user\G   //纵向显示

select user,host,authentication_string from user;//查看user表的这些字段

更改root密码、创建用户、赋予权限、刷新授权

set password for 'root'@'localhost' = '666666';

create user 'test'@'%' identified by '123456';

grant all privileges on *.* to 'test'@'%';

flush privileges;

创建wordpress用户,库,授权:

mysql -u root -p

create database wordpress;

create user 'wordpress'@'%' identified by '123456';

grant all privileges on * .* to 'wordpress'@'%';  //授权给wordpress所有表

flush privileges   //刷新授权

(3)10.100模拟php:

①首先安装php,安装好php后自带一个apache,不需要启动,因为我们目前用nginx。

yum -y install php php-common.x86_64 php-fpm.x86_64 php-opcache.x86_64 php-gd.x86_64 php-mysqlnd.x86_64 php-devel.x86_64

②编辑配置文件/etc/nginx/nginx.conf,更改fastcgi_pass,改成已有的/etc/nginx/conf.d/php-fpm.conf下UDS的路径

③编辑配置文件/etc/php-fpm.d/www.conf,把属主、属组由apache改成nginx

因为目前模拟走UDS,所以不用监听端口,不用更改/etc/php-fpm.d/www.conf

重启:systemctl restart php-fpm

只有80端口,UDS端口默认没有

④编写index.php,进行php与nginx关联,php与mysql关联

cd /usr/share/nginx/html/

vim index.php

   phpinfo();

?>

进行测试:

写一个测试页,测试php和mysql结合:

    $link=new mysqli("192.168.10.120","test",'123456');

    if(mysqli_connect_errno()){

    echo "Not Ok!";

    $link=null;

    exit;

}

    echo "OK";

    $link->close();

phpinfo();

?>

4.模拟nginx、php、mysql拆开,走fastcgi模式

(1)10.100模拟前端服务器nginx:

①首先源码编译好nginx

cd /etc/nginx

cd conf.d/  ---->php-fpm.conf配置文件还在,这个配置文件是走UDS的,目前没用

②编辑配置文件/etc/nginx/nginx.conf

systemctl restart nginx

③进行甩锅给php

首先排除干扰问题

进行测试php和nginx勾连效果:

④进行部署应用

首先安装nfs

yum -y install nfs-utils

在nfs-server部署好之后,在nginx查看一下探测挂载

进行nfs挂载,把nfs-server的目录/usr/share/nginx/html/,挂载到nginx的/usr/share/nginx/html/

mount -t nfs 192.168.10.120:/usr/share/nginx/html/  /usr/share/nginx/html/

进行安装软件shopxo

使用共享存储nfs的理由:在配置的时候,我们不知道哪个是动态资源,哪个是静态资源;动静资源合不到一起,为了让其资源保持一致,所以要用nfs

首先拖进shopxo,然后进行解压

tar xf shopxo.tar.gz

其次把shopxo移动到/usr/share/nginx/html/

mv shopxo /usr/share/nginx/html/

写一个测试页index.php,测试一下效果

    $link=new mysqli("192.168.10.120","shopxo",'123456');

    if(mysqli_connect_errno()){

    echo "Not Ok!";

    $link=null;

    exit;

}

    echo "OK";

    $link->close();

    phpinfo();

?>

进行访问shopxo,并对其做权限处理

访问shopxo:192.168.10.100/shopxo

点击进入后台,然后进行登录

(2)10.120模拟数据库mysql和nfs-server:

数据库配置与上面配置一样,进入部署应用环节,在数据库上安装nfs

yum -y install nfs-utils (因为不是c/s架构,所以nginx,php,mysql都需要装)

vim /etc/exports

 systemctl start nfs-server.service

ss -tnl

创建目录

mkdir /usr/share/nginx/html/ -pv 

查看共享存储的shopxo

给数据库进行创建shopxo账号

创建wordpress用户,库,授权:

mysql -u root -p

create database shopxo;

create user 'shopxo'@'%' identified by '123456';

grant all privileges on * .* to 'shopxo'@'%';  //授权给shopxo所有表

flush privileges   //刷新授权

(3)10.110模拟php:

①首先安装php

yum -y install php php-common.x86_64 php-fpm.x86_64 php-opcache.x86_64 php-gd.x86_64 php-mysqlnd.x86_64 php-devel.x86_64

②编辑配置文件/etc/php-fpm.d/www.conf

apache不需要动,只需要改php-fpm,不注释掉,会报503

启动php-fpm服务:systemctl start php-fpm

③创建对应index.php根路径,并编辑index.php

mkdir -pv /usr/share/nginx/html

vim index.php

   phpinfo();

?>

④部署应用

首先安装nfs

yum -y install nfs-utils

在nfs-server部署好之后,在nginx查看一下探测挂载

showmount -e 192.168.10.120

进行nfs挂载,把nfs-server的目录/usr/share/nginx/html/,挂载到nginx的/usr/share/nginx/html/

mount -t nfs 192.168.10.120:/usr/share/nginx/html/  /usr/share/nginx/html/

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: