济南网站建设 unzz/免费的网页网站
文章目录
- Nginx介绍
- Nginx的安装
- Nginx文件
- Nginx反向代理
- 负载均衡
- nginx动静分离
- URLRewrite
- 防盗链
- nginx高可用配置
- 安全性
- Nginx限流
- Nginx缓存集成
- Lua脚本
- OpenRestry
Nginx介绍
Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强,Nginx专为性能优化而开发,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。
正向代理:通过代理服务器访问目标服务器,我们知道目标服务器的链接,但无法直接访问目标服务器,必须通过代理的方式访问。
反向代理:一个请求访问目标服务器时,请求先到达代理服务器,由代理服务器转发给目标服务器,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
反向代理:
正向代理:
Nginx的优缺点:
优点:
1.占用内存小,可实现高并发连接,处理响应快
2.可实现http服务器、虚拟主机、反向代理、负载均衡
3.Nginx配置简单
4.可以不暴露正式的服务器IP地址
缺点:
1.动态处理差:Nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用
2.Nginx作为反向代理抗住压力
Nginx性能为啥这么高
1.异步非阻塞处理机制
2.epoll模型
3.提供队列,排队解决
Nginx应用场景
1.http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
2.虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
3.反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集
群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲
置的情况。
4.nginx 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
Nginx进程模型:
Nginx的进程分为两种:master进程和worker进程
work进程数量由work_processes决定的
master进程负责接收外界的信号和指令,worker来负责工作,master会监控worker
Nginx模块化体系
Nginx工作原理:
1.接收客户端请求:当客户端发起HTTP请求时,Nginx会监听指定的端口并接收请求
2.解析配置文件:Nginx在启动时会加载并解析配置文件,其中包含服务器设置、反向代理规则、缓存配置等
3.处理请求:当收到客户端请求后,Nginx会根据配置文件中的规则进行处理,可根据请求的URL分配给不同的后端
服务,Nginx可对请求进行一系列的处理操作,包括:访问控制、URL重写、gzip压缩、SSL/TLS加密等
Nginx处理一个HTTP请求的全过程
1.Read Request Headers:解析请求头
2.Identify Configuration Block:识别由哪一个location进行处理,匹配URL
3.Apply Rate Limits:判断是否限速。
4.Perform Authentication:连接控制,验证请求。例如可能根据Referer头部做一些防盗链的设置,或者验证用户的权
限
5.Generate Content:生成返回给用户的响应。为了生成这个响应,做反向代理的时候可能会和上游服务进行通信,
然后这个过程还可能会有些子请求或者重定向,那么还会走一下这个过程。
6.Response Filters:过滤返回给用户的响应。比如压缩响应,或者对图片进行处理
7.记录日志
Nginx的安装
1.获取nginx安装包:
wget https://nginx.org/download/nginx-1.21.6.tar.gz
2.解压安装包
tar zxvf nginx-1.21.6.tar.gz
3.配置
./configure
4.编译安装
#编译
make
#安装
make install
5.启动、关闭nginx服务
###启动服务
#需要先进入sbin目录下
cd /usr/local/nginx/sbin
#启动nginx服务
./nginx###关闭服务
#需要先进入sbin目录下
cd /usr/local/nginx/sbin
#关闭nginx服务
./nginx -s stop #快速停止
./nginx -s quit #优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload #重新加载配置
将nginx安装成系统服务
创建服务脚本
vi /usr/lib/systemd/system/nginx.service
服务脚本内容
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecstartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReoad=/usr/local/nginx/sbin/nginx -s reload
Execstop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true[Insta11]
WantedBy=multi-user.target
重新加载系统服务
systemctl daemon-reload
Nginx文件
主要的文件有三个:conf、html、logs
├── client_body_temp
├── conf
│ ├── fastcgi.conf (是fastcgi的配置文件)
│ ├── fastcgi.conf.default
│ ├── fastcgi_params (是fastcgi的参数文件)
│ ├── fastcgi_params.default
│ ├── mime.types (记录的是HTTP协议中的Content-Type的值和文件后缀名的对应关系)
│ ├── mime.types.default
│ ├── nginx.conf (是Nginx的核心配置文件,这个文件非常重要,也是学习的重点)
│ ├── nginx.conf.default
│ ├── scgi_params (是scgi的参数文件)
│ ├── scgi_params.default
│ ├── uwsgi_params (是uwsgi的参数文件)
│ ├── uwsgi_params.default
│ ├── koi-utf (与编码转换映射相关的配置文
件,下面两个也是)
│ ├── koi-win
│ └── win-utf
├── fastcgi_temp
├── html (存放nginx自带的两个静态的html页面)
│ ├── 50x.html (访问失败后的失败页面)
│ └── index.html (访问成功的默认首页)
├── logs
│ ├── access.log (访问日志)
│ ├── error.log (错误日志)
│ └── nginx.pid (记录nginx的pid好)
├── proxy_temp
├── sbin (存放执行程序文件nginx)
│ └── nginx (用于控制Nginx的启动和停止)
├── scgi_temp
└── uwsgi_temp
nginx.conf
#user nobody;
worker_processes 1; #工作的进程个数#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events { #事件驱动模块worker_connections 1024; #一个work可以创建多少个连接
}http {include mime.types; #引入一个子配置文件,mime.types记录返回的数据是什么类型的文件数据default_type application/octet-stream; #默认文件数据类型#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on; #数据零拷贝#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65; #保持连接超时的时间#gzip on;server { #虚拟主机 vhostlisten 80; #监听的端口号server_name localhost; #主机名,也可以配置域名#charset koi8-r;#access_log logs/host.access.log main;location / { #URI,域名之后的路径root html; #从哪个目录下找这个主机index index.html index.htm; #默认页}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html; # 错误重定向URIlocation = /50x.html {root html; }# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}
ServerName匹配规则:
1.我们可以在同一个ServerName中匹配多个域名,写上面的会优先被匹配
2.完整匹配
3.通配符匹配
4.通配符结束匹配
5.正则匹配,正则开始符~,结束符$,例子:~^[0-9]+\.mmban\.com$
Nginx常用变量:
$host: 请求的主机头
$remote_addr: 客户端IP地址
$remote_port: 客户端端口号
$remote_user: 已经经过Auth Basic Module验证的用户名
$http_referer: 请求引用地址
$http_user_agent: 客户端代理信息(UA)
$http_x_forwarded_for: 相当于网络访问路径
$body_bytes_sent: 页面传送的字节数
$time_local: 服务器时间
$request: 客户端请求
$request_uri: 请求的URI,带参数, 不包含主机名
$request_filename: 请求的文件路径
$request_method: 请求的方法,如GET、POST
$args: 客户端请求中的参数
$query_string: 等同于$args, 客户端请求的参数
$nginx_version: 当前nginx版本
$status: 服务器响应状态码
$server_addr: 服务器地址
$server_port: 请求到达的服务器端口号
$server_protocol: 请求的协议版本
$content_type: HTTP请求信息里的Content-Type字段
$content_length: HTTP请求信息里的Content-Length字段
$uri: 请求中的当前URI(不带请求参数,参数位于$args)
$document_root: 当前请求在root指令中指定的值
$document_uri: 与$uri相同
Nginx反向代理
修改conf文件:
worker_processes 1; #工作的进程个数events { #事件驱动模块worker_connections 1024; #一个work可以创建多少个连接
}http {include mime.types; #引入一个子配置文件,mime.types记录返回的数据是什么类型的文件数据default_type application/octet-stream; #默认文件数据类型sendfile on; #数据零拷贝keepalive_timeout 65; #保持连接超时的时间server { #虚拟主机 vhostlisten 80; #监听的端口号server_name localhost; #主机名,也可以配置域名location / { #URI,域名之后的路径proxy_pass http://www.zhangyongjian.top;#代理到这个地址上}error_page 500 502 503 504 /50x.html; # 错误重定向URIlocation = /50x.html {root html; }}}
proxy_pass 如果配置的是http://zhangyongjian.top,会发生网页的重定向,地址栏会变成www.zhangyongjian.top。proxy_pass不支持https
proxy_pass的不同处理方式:
proxy_pass http://localhost:8080和proxy_pass http://localhost:8080/(多了末尾的/)是不同的的处理方式,而proxy_pass http://localhost:8080/和proxy_pass http://localhost:8080/abc是相同的处理方式。
对于不带URI方式,nginx将会保留location中路径部分
对于带URI方式,nginx将使用诸如alias的替换方式对URL进行替换,并且这种替换只是字面上的替换
location /api2/ {proxy_pass http://localhost:8080/;}
#当访问 http://localhost/api2/xxx 时,http://localhost/api2/(注意最后的/)
#被替换成了http://localhost:8080/,然后再加上剩下的xxx,于是变成http://localhost:8080/xxx。
server{listen 80;server_name localhost;location /api1/{proxy_pass http://localhost:8080;}#http://localhost/api1/xxx->http://localhost:8080/api1/xxxlocation /api2{proxy_pass http://localhost:8080;}#http://localhost/api2/xxx->http://localhost:8080/api2/xxxlocation /api3/{proxy_pass http://localhost:8080/;}#http://localhost/api3/xxx->http://localhost:8080/xxxlocation /api4{proxy_pass http://localhost:8080/}#http://localhost/api4/xxx->http://localhost:8080//xxx
location /api5/ {proxy_pass http://localhost:8080/haha;}# http://localhost/api5/xxx -> http://localhost:8080/hahaxxx,#请注意这里的haha和xxx之间没有斜杠,分析一下原因。location /api6/ {proxy_pass http://localhost:8080/haha/;}# http://localhost/api6/xxx -> http://localhost:8080/haha/xxxlocation /api7 {proxy_pass http://localhost:8080/haha;}# http://localhost/api7/xxx -> http://localhost:8080/haha/xxxlocation /api8 {proxy_pass http://localhost:8080/haha/;}# http://localhost/api8/xxx -> http://localhost:8080/haha//xxx,请注意这里的双斜杠。
负载均衡
在一台主机上该nginx.conf
worker_processes 1; #工作的进程个数events { #事件驱动模块worker_connections 1024; #一个work可以创建多少个连接
}http {include mime.types; #引入一个子配置文件,mime.types记录返回的数据是什么类型的文件数据default_type application/octet-stream; #默认文件数据类型sendfile on; #数据零拷贝keepalive_timeout 65; #保持连接超时的时间upstream httpds{ #定义一个服务器组server 192.168.44.102:80 weight=8 down; #weight 访问权重,down是下线,不负载到这台机器server 192.168.44.103:80 weight=2 backup; #weight 访问权重 backup 没有主机可以用时再负载到这台主机}server { #虚拟主机 vhostlisten 80; #监听的端口号server_name localhost; #主机名,也可以配置域名location / { #URI,域名之后的路径proxy_pass http://httpd;#负载均衡到这个服务器组中}error_page 500 502 503 504 /50x.html; # 错误重定向URIlocation = /50x.html {root html; }}}
轮询的方式来进行负责均衡无法保持会话,也就是说登陆之后访问另外一个服务器就获取不到登陆信息
ip_hash:根据来源的ip地址hash计算重定向到一台服务器(不太会用)
upstream myserver{ip_hash;server 127.0.0.1:8081;server 127.0.0.1:8082;
}
least_conn:根据用户访问的url定向访问请求(不太会用)
fair:根据后端服务器响应时间转发请求,响应时间短的优先分配
upstream myserver{server 127.0.0.1:8081;server 127.0.0.1:8082;fair;
}
所谓四层负载均衡指的是OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡
实现四层负载均衡的方式:
硬件:F5、BIG-IP、Radware等
软件:LV2、Nginx、Hayproxy等
所谓七层负载均衡指的是在应用层,主要是基于虚拟的URL或主机的负载均衡
实现七层负载均衡的方式:
软件:Nginx、Hayproxy等
四层和七层负载均衡的区别
1.四层负载均衡数据包是在底层就进行了分发,而七层负载均衡数据包则在最顶端进行分发,所以四层负载均衡的效
率比七层负载均衡的要高
2.四层负载均衡不识别域名,而七层负载均衡识别域名。
Nginx七层负载均衡的指令
upstream指令:该指令是用来定义一组服务器,它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1
server指令:该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者Unix socket
nginx动静分离
动静分离就是把后端服务需要使用到的静态资源前置放到nginx代理中
location /css {
root css;
index index.html index.htm;
}
location /js{
root js;
index index.html index.htm;
}
location /img{
root img;
index index.html index.htm;
}
正则方式:
location ~*/(js|img|css){
alias html;
#alias和root的区别
#root的处理结果是:root路径+location路径
#alias的处理结果是:使用alias路径替换location路径
autoindex on; #列出访问目录
}
URLRewrite
location /j{rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break; #把*.html地址转变为/index。jsp?pageNum=*#flag标记说明:#last 本条规则匹配完成后,继续向下匹配新的location URI规则#break 本条规则匹配完成即终止,不再匹配后面的任何规则#redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址#permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址proxy_pass: http://192.168.44.104:8080;
}
防盗链
valid_referers 192.168.44.101; #检测referers
if($invalid_referer){ #检测完是无效的引用return 403;
}
location ~*/(js|img|css){
root html;
index index.html index.htm;
}
nginx高可用配置
keepalived:检测对方nginx是否存活
安装keepalived
yum install -y keepalived
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs { #全局配置router id lb111 #标识主机
}vrrp_instance atguigu { #实例名称state MASTER #当前这台主机是MASTERinterface ens33 #网卡名称virtual_router_id 51 #标识keepalived组priority 100 #竞选master时的优先级,谁的优先级高,谁是masteradvert_int 1 #间隔检测的时间authentication { #nginx组配对认证的相关配置auth type PASSauth pass 1111}virtual ipaddress ( #虚拟的ip地址,可以填多个192.168.200.16192.168.200.17192.168.200.18}
}
keepalived启动
cd /usr/local/sbin/
./keepalived
VRRP (Virtual Route Redundancy Protocol) 协议,翻译过来为虚拟路由冗余协议。VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,MASTER实现针对虚拟路由器IP的各种网络功能。其他设备不拥有该虚拟IP,状态为BACKUP,除了接收MASTER的VRRP状态通告信息以外,不执行对外的网络功能。当主机失效时BACKUP将接管原先MASTER的网络功能。
这个协议是干什么的?
1.选择协议:虚拟一个IP选择节点成为MASTER
2.路由容错协议:Master和Backup路由会有心跳检测,Master会定时告知Backup自己的状态,如果指定时间内,
Backup没有接收到这个通知内容,Backup就会替代Master成为新的Master。
keepalived之vrrp_script
keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务,比如Nginx,如果Nginx出现异常了,仅仅keepalived保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换,这个时候,我们可以通过编写脚本对业务进程进行检测监控。
实现步骤:
1.在keepalived配置文件中添加对应的配置项
vrrp_script 脚本名称
{script "脚本位置"interval 3 #执行时间间隔weight -20 #动态调整vrrp_instance的优先级
}
2.编写脚本
ck_nginx.sh
3.为脚本文件设置权限
sudo chmod
安全性
https的安全性保障
https升级过程:
1.向CA申请证书
2.将证书上传到服务器
3.证书安装
server{listen 443 ssl;server_name aa.abc.com;ssl_certificate /data/cert/server.crt;ssl_certificate_key /data/cert/server.key;
}
4.重启nginx
Nginx限流
Nginx限流就是限制用户请求速度,防止服务器受不了,限流有3种
1.正常限制访问频率(正常变量)
2.突发限制访问频率(突发流量)
3.限制并发连接数
Nginx的限流是基于两个模块:
1.漏桶算法:实现的请求限流模块ngx_http_limit_req_module控制速率
2.连接数限流模块:ngx_http_limit_conn_module控制并发数
1.正常限制访问频率:限制一个用户发送的请求,我Nginx多久接收一个请求。Nginx中使用nginx_limit_req_module模块来限制访问频率,限流的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率
#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;#$binary_remote_addr是一种key,表示基于remote_addr(客户端IP)来做限流,binary_的目的是压缩
#内存占用量。
#zone:定义共享内存区来存储访问信息,contentRateLimit:10m表示一个大小为10M,名字为
#contentRateLimit的内存区域。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息
#rate:用于设置最大访问速率,rate=10r/s表示每秒最多处理10个请求。Nginx实际上以毫秒为粒度来跟踪
#请求信息,因此10r/s实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求。
#所以如果10次请求同时到达,那么只有一个请求能够得到执行,其它的,都会被拒绝
#这不太友好,大部分业务场景下我们希望10个请求都能得到执行
#因此,可以配置burst
#绑定限流维度
server{location /seckill.html{limit_req zone=one;proxy_pass http://lj_seckill;}
}
1r/s代表1秒一个请求,1r/m一分钟接收一个请求,如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。
2.突发限制访问频率(突发流量):
限制一个用户发送的请求,我Nginx多久接收一个。
上面的配置一定程度可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量,这时候应该如何进一步处理呢?
Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数。我们可以将之前的例子添加burst参数以及nodelay参数:
#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;
#绑定限流维度
server{location/seckill.html{limit_req zone=zone burst=5 nodelay;proxy_pass http://lj_seckill;}
}
burst=5 nodelay代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求
- 限制并发连接数
Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。
http {limit_conn_zone $binary_remote_addr zone=myip:10m;limit_conn_zone $server_name zone=myServerName:10m;
}
server {location / {limit_conn myip 10;limit_conn myServerName 100;rewrite / http://www.lijie.net permanent;}
}
上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。
Nginx缓存集成
Nginx是从0.7.48版开始提供缓存功能。Nginx是基于Proxy Store来实现的,其原理是把URL及相关组合当做Key,在使用MD5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目录中。它可以支持任意URL连接,同时也支持404/301/302这样的非200状态码。Nginx即可以支持对指定URL或者状态码设置过期时间,也可以使用purge命令来手动清除指定URL的缓存。
Nginx缓存设置的相关指令:
Nginx的web缓存服务主要是使用ngx_http_proxy_module模块相关指令集来完成,接下来我们把常用的指令来进行介绍下。
proxy_cache_path:该指定用于设置缓存文件的存放路径。
levels:指定该缓存空间对应的目录层数,最多可以设置3层,每层取值为1|2
keys_zone:用来为这个缓存区设置名称和指定大小
inactive:指定缓存的数据多次时间未被访问就将被删除
max_size:设置最大缓存空间,如果缓存空间存满,默认会覆盖缓存时间最长的资源
http{proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;
}
proxy_cache:该指令用来开启或关闭代理缓存,如果是开启则自定义使用哪个缓存区来进行缓存
zone_name:指定使用缓存区的名称
proxy_cache_key:该指令用来设置web缓存的key值,Nginx会根据key值MD5哈希存缓存
proxy_cache_valid:使用该指令用来对不同状态码的URL设置不同的缓存时间
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
#为200和302的响应URL设置10分钟缓存,为404的响应URL设置1分钟缓存
proxy_cache_valid any lm;
#对所有响应状态码的URL都设置1分钟缓存
proxy_cache_min_uses:该命令用来设置资源被访问多少次后被缓存
proxy_cache_min_uses:该指令用来设置资源被访问多少次后被缓存
proxy_cache_methods:该指令用户设置缓存哪些HTTP方法
默认缓存HTTP的GET和HEAD方法,不缓存POST方法
http{proxy_cache_path /usr/local/proxy_cache levels=2:1 keys_zone=itcast:200m inactive=1d max_size=20g;location /{proxy_cache $scheme$proxy_hosts$request_uri;proxy_cache_key itheima;proxy_cache_valid 200 5d;proxy_cahche_valid any 1m;proxy_cache_min_uses 5;proxy_pass 127.0.0.1:8080/js/;}
}
proxy_no_cache:该指令是用来定义不将数据进行缓存的条件
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_cache_bypass:该指令用来设置不从缓存中获取数据的条件
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_comment;
上述两指令都有一个指定的条件,这个条件可以是多个,并且多个条件中至少有一个不为空且不等于"0”,则条件满足成立。上面给的配置实例是从官方网站获取的,里面使用到了三个变量,分别是 c o o k i e n o c a c h e 、 cookie_nocache、 cookienocache、arg_nocache、$arg_comment
$cookie_nocache
指的是当前请求的cookie中键的名称为nocache对应的值
$arg_nocache和$arg_comment
指的是当前请求的参数中属性名为nocache和comment对应的属性值
http{log_format main $schemes$proxy_hosts$request_uri;log_format params $cookie_nocache|$arg_nocache|$arg_comment;upstream backend {server 192.168.200.146:8080;}server {listen 8081;server_name localhost; location / {access_log logs/access_params.log params; #打印的日志文件和日志格式root html;index index.html;}
}
Lua脚本
lua的安装
1.下载源码压缩包
wget https://www.lua.org/ftp/lua-5.4.1.tart.gz
2.安装lua
cd lua-5.4.1
make linux test
make install
Lua的语法:
Lua有两种交互方式:交互式和脚本式
Lua交互式编程模式可以通过命令lua -i或lua来启用
第一个lua脚本
#!/usr/local/bin/lua
print("hello world!!!")
注释符
– 单行注释
–[[
多行注释
–]]
lua关键字:
lua的8个数据类型
类型字段 | 类型名称 |
---|---|
nil | 空,无效值 |
boolean | 布尔值,true/false |
number | 数值 |
string | 字符串 |
function | 函数 |
table | 表 |
thread | 线程 |
userdata | 用户数据 |
可以通过type函数获取变量类型
字符串的定义中,用[[]]代替··
{}代表表,也可以创建数组
--定义数组
arr={"TOM","JERRY","ROSE"}
--数组下标从1开始
arr={}
arr["X"]=10
arr["Y"]=20
--arr["X"]和arr.X都能获取到
function:函数定义
function functionName(params)endfunction add(a,b)
print(a,b)
endfunction add(...)
local a,b,c=...
print(a,b,c)
end
Lua控制结构
if条件判断
function testif(a)if a>0 thenprint("正数")return "正数"elseif a==0 thenprint("0")return "0"elseprint("负数")return "负数"end
end
while循环
function testwhile()while true doprint("hello world!")end
end
repeat循环
function testRepeat()local i=10repeatprint(i)i=i-1until i<1
end
for循环:数值型for循环和泛型for循环
--数值型for循环
function testfor()for i = 0,100,10 do --从0开始,到100,步长为10,默认步长是1print(i)end
end--泛型for循环
function testfor2(x)for i,v in ipairs(x) doprint(i,v)end
end
OpenRestry
前面我们提到过,openResty是由淘宝工程师开发的,所以其官方网站(http://openresty.org/)我们读起来是非常的方便。OpenResty是一个基于Nginx与 Lua的高性能 Web平台,其内部集成了大量精良的Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。所以本身OpenResty内部就已经集成了Nginx和Lua,所以我们使用起来会更加方便。
OpenRestry的安装:
(1)下载openResty: https://openresty.org/download/openresty-1.15.8.2.tar.gz
(2)使用wget下载: wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
(3)解压缩: tar -zxf openresty-1.15.8.2.tar.gz
(4)进入openResty目录: cd openresty-1.15.8.2
(5)执行命令:./configure
(6)执行命令:make && make install
(7)进入openResty的目录,找到nginx:cd /usr/local/openresty/nginx/
(8)在conf目录下的nginx.conf添加如下内容
location /lua{
default_type 'text/html'
content_by_lua 'ngx.say("<h1>HELLO,OpenRestry</h1>")'
}
(9)在openresty的sbin目录下启动nginx
(10)通过浏览器访问测试
location /getByGender{default_type 'text/html';set_by_lua $param "--获取URL上的参数对应的值 name genderlocal uri_args=ngx.req.get_uri_args()local name=uri_args['name']local gender=uri_args['gender']--条件判断 if gender 1 先生 0 女士if gender=='1' thenreturn name..'先生'else if gender=='0' thenreturn name..'女士'elsereturn nameend";return 200 $param;}
相关文章:

golang入门笔记——nginx
文章目录 Nginx介绍Nginx的安装Nginx文件Nginx反向代理负载均衡nginx动静分离URLRewrite防盗链nginx高可用配置安全性Nginx限流Nginx缓存集成Lua脚本OpenRestry Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强&#x…...

最新报告!TikTok 市场小家电大商机,GMV破亿的爆款如何复制?
近期,新锐小家电品牌Gaabor空气炸锅在东南亚卖爆了,单款商品GMV短时间内突破两亿,在印尼、泰国、马来西亚、菲律宾、越南均开设本土TikTok 小店,增长势头还在持续。 但Gaabor并不是个例。 整个东南亚家电市场规模增长迅速&#…...

功能定义-紧急制动系统
功能简介 紧急制动系统的触发过程如上图所示: 安全距离报警:当两车距离较近时,会给予驾驶员相应提示 预报警:当两车存在碰撞风险但风险较低【Danger Level1】时,会给予驾驶员提示【提示相比之前更为明显】 制动预填充&…...

Map与Set的区别
map与set是一种进行搜索的数据结构。 一 Map map存储的是key-value的键值对。 1 map中的常见方法 方法作用put(key,value)向map中存放key-value键值对get(key)根据key值得到value值getOrDefault(key,value)获取值为key的value,若不存在,则将key值对应…...

基于uwb和IMU融合的三维空间定位算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................................................kkk 0; for E…...

Visual Studio 2019下使用C++与Python进行混合编程——环境配置与C++调用Python API接口
前言 在vs2019下使用C与Python进行混合编程,在根源上讲,Python 本身就是一个C库,那么这里使用其中最简单的一种方法是把Python的C API来嵌入C项目中,来实现混合编程。当前的环境是,win10,IDE是vs2019,python版本是3.9,…...

STM32F4X RTC
STM32F4X RTC 什么是RTCSTM32F4X RTCSTM32F4X RTC框图STM32F4X RTC计数频率STM32F4X RTC日历STM32F4X RTC闹钟 STM32F4X RTC例程 什么是RTC RTC全程叫Real-Time Clock实时时钟,是MCU中一个用来计时的模块。RTC的一个主要作用是用来显示实时时间,就像日常…...

[git] 如何克隆仓库,进行项目撰写,并绑定自己的远程仓库
摘要:删除.git文件,才可重新绑定远程仓库。 具体步骤: 文件夹右键,进入”Git Bash Here“执行命令 1. 执行 ”git clone 仓库地址“,克隆仓库 2. 在生成的仓库中,删除 .git 文件 3. git init 初始化仓库…...

【C++】模拟实现二叉搜索树的增删查改功能
个人主页:🍝在肯德基吃麻辣烫 我的gitee:C仓库 个人专栏:C专栏 文章目录 一、二叉搜索树的Insert操作(非递归)分析过程代码求解 二、二叉搜索树的Erase操作(非递归)分析过程代码求解…...

Yolov8-pose关键点检测:模型轻量化创新 | ScConv结合c2f | CVPR2023
💡💡💡本文解决什么问题:ScConv(空间和通道重建卷积),一个即插即用的架构单元,可以可以直接用来替代各种卷积神经网络中的标准卷积。 ScConv | GFLOPs从9.6降低至9,参数量从6482kb降低至6479kb Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_637742…...

【洛谷 P1060】[NOIP2006 普及组] 开心的金明 题解(动态规划+01背包)
[NOIP2006 普及组] 开心的金明 题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说…...

什么是CI/CD:持续集成与持续交付?(InsCode AI 创作助手)
在现代软件开发领域,CICD(Continuous Integration and Continuous Delivery)是一种关键性的开发实践,它有助于提高软件交付的质量和效率。本文将深入探讨CICD的定义、原理和重要性,以及如何在项目中实施CICD流程。 什…...

redis 高可用
Redis 高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供…...

什么样的词条可以创建维基百科?
维基百科在国内用得比较少,有一些特殊原因,维基百科的控制权海外,目前维基百科和谷歌是一样的,在国内是无法正常访问的。但做海外推广的朋友都是知道维基百科的,小马识途营销顾问认为它在世界互联网领域的地位…...

poll epoll初学习
正是select这些缺点,才有了poll 1.I/O多路转接之poll 2.I/O多路转接之epoll 其中的struct epoll_event:...

BMS电池管理系统——电芯需求数据(三)
BMS电池管理系统 文章目录 BMS电池管理系统前言一、有什么基础数据二、基础数据分析1.充放电的截至电压2.SOC-OCV关系表3.充放电电流限制表4.充放电容量特性5.自放电率 总结 前言 在新能源产业中电芯的开发也占有很大部分,下面我们就来看一下电芯的需求数据有哪些 …...

【uniapp】关于小程序输入框聚焦、失焦(输入法占位)的问题
聊天小程序,界面带有输入框,当输入框中聚焦后,底部自动谈起输入法。此时输入框也要随之出现在输入法上方。默认情况下,输入框此时会被输入法覆盖掉。 以下是亲自实践,解决这个问题的方法: 一、小程序大概…...

MySQL的故事——创建高性能的索引
创建高性能的索引 文章目录 创建高性能的索引一、索引基础二、索引的优点三、高性能的索引策略 一、索引基础 要理解MySQL中索引是如何工作的,最简单的方法就是去看看一本书的“索引 ”部分:如果在一本书中找到某个特定主题,一般会先看书的“…...

渗透测试漏洞原理之---【组件安全】
文章目录 1、组件安全概述1.1、常见组件1.1.1、操作系统1.1.2、Web容器1.1.3、中间件1.1.4、数据库1.1.5、开发框架1.1.6、OA系统1.1.7、其他组件 1.2、漏洞复现1.2.1 漏洞复现模板1.2.3、漏洞名称参考1.2.4、漏洞库 2、Apache2.1、Apache HTTPD2.2、Apache Shiro2.3、Apache T…...

uni-app集成mui-player
uni-app集成mui-player,仅说明集成方法,mui-player 相关配置请查看其官网 准备 在uniapp项目根目录新建hybrid目录在hybrid目录下新建html目录在html目录中新建css、js、img等目录,用于存放相关文件 集成 静态webview 在pages目录下新建v…...

力扣(LeetCode)算法_C++—— 两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 示例 2: 输入:nums1 …...

异步编程 - 12 异步、基于事件驱动的网络编程框架 Netty
文章目录 Netty概述Netty中的一些概念Netty的线程模型Netty Server端Netty Netty 端 TCP半包与粘包问题基于Netty与CompletableFuture实现RPC异步调用 Netty概述 Netty是一个异步、基于事件驱动的网络应用程序框架,其对Java NIO进行了封装,大大简化了TC…...

STM32 Nucleo-144开发板开箱bring-up
文章目录 1. 开篇2. 开发环境搭建2.1 下载官方例程2.2 ST-Link安装 3. STM32F446ZE demo工程3.1 STM32F446ZE简介3.2 跑个demo试一试 1. 开篇 最近做项目,用到STM32F446ZET6这款MCU,为了赶进度,前期软件需要提前开发,于是在某宝买…...

计算机毕业设计 基于SSM的问卷调查管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

基于SpringBoot的无忌在线考试系统(源码+讲解+调试运行)做毕设课设均可
技术栈 前后端分离 前端使用: Vue Element Plus 后端使用: SpringBoot Mysql8.0 Mybatis-Plus 功能 分为 管理员端 和 老师端 和 学生端 管理员端 登陆页 科目管理 查看所有科目 ,增加 ,修改 ,删除科目 , 模糊搜索课程 考试管理 查看所有考试 ,增加 ,修改 ,删除考试 题库…...

无涯教程-JavaScript - EOMONTH函数
描述 EOMONTH函数返回该月最后一天的序列号,该序列号是start_date之前或之后的月份数。 语法 EOMONTH (start_date, months)争论 Argument描述Required/OptionalStart_date 代表开始日期的日期。 应该使用DATE函数或其他公式或函数的输出输入日期。 如果将日期作为文本输入…...

【LeetCode-面试经典150题-day21】
目录 120.三角形最小路径和 64.最小路径和 63.不同路径Ⅱ 5.最长回文子串 120.三角形最小路径和 题意: 给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标…...

算法刷题记录-双指针/滑动窗口(LeetCode)
809. Expressive Words 思路 根据题目描述,我们可以知道,如果要将某个单词定义为可扩张(stretchy),需要满足如下两个条件: 所以,我们在实现的时候,可以通过两个指针p1和p2&#x…...

Python基础tuple元组定义与函数
元组的特点 有序:元组中的元素是按照顺序排列的。不可更改:一旦创建,元组中的元素不可被修改、增加或删除。元素类型多样化:元组可以包含任何数据类型的元素。 定义一个非空元组 name_tuple (a, b, c, d)定义一个空元组 name…...

【linux命令讲解大全】088.深入理解 shell 脚本中的 trap 命令
文章目录 trap概要主要用途选项参数返回值关于信号例子 从零学 python trap 捕捉信号和其他事件并执行命令。 概要 trap [-lp] [[arg] signal_spec ...]主要用途 用于指定在接收到信号后将要采取的动作。 脚本程序被中断时执行清理工作。 选项 -l:打印信号名称…...