一、补充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/
好文阅读
发表评论