Nginx 是一款轻量级的 Web 服务器、反向代理服务器,它内存占用少、启动速度快、并发能力强,在互联网项目中有广泛应用。
Nginx 是什么?
Nginx 的不同版本:
开源版:
商业版:Nginx Plus
yum安装
yum -y install nginx
常用指令
nginx # 启动
nginx -v # 查看版本号
nginx -V # 查看已安装模块
nginx -t # 测试(常在修改配置文件后使用)
nginx -h # 显示帮助文档
ps -ef | grep nginx # 查看启动进程
nginx -s stop # 强制停止
nginx -s quit # 安全停止
nginx -s reload # 重新加载配置(主进程不变,工作进程平滑重启)
配置文件架构
. 全局配置
|-- event
|-- http
|-- server
|-- location
常用 include 全局配置引入其他配置文件:
include /usr/share/nginx/modules/*.conf;
语法规范:所有语句均以分号;
结尾。
工作特点
存在主线程与工作进程之分,master进程指挥 worker 进程工作,worker进程数常与服务器核心数一致,可设为 auto 。
> ps -ef|grep nginx
root 1627 1 0 03:10 ? 00:00:00 nginx: master process nginx
nginx 1628 1627 0 03:10 ? 00:00:00 nginx: worker process
nginx 1629 1627 0 03:10 ? 00:00:00 nginx: worker process
# 全局配置
worker_processes auto;
服务器权限控制
user nginx;
ps -ef |grep nginx
root 954 1 nginx: master process /usr/sbin/nginx
nginx 89135 954 nginx: worker process
Host请求头诠释:
Host 是 HTTP/1.1 协议中唯一必须携带的请求头,如果缺失就会返回 400 状态码( curl 等操作中默认携带)。
作用:指明请求服务器的域名/IP地址和端口号。
组成:域名+端口号,如 test.com:1998 。
在 HTTP/2 以及 HTTP/3 中,以伪头:authority
代替。
常见服务器扩容方式:
三种扩容方式并没优劣之分,实际使用中依据情况而进行选择、优化。
动静分离思想:
其他注意点
root
为默认的网站目录位置。架构图:nginx + Tomcat 是一套流行的前后端分离架构。
keepalived 说明:
keepalived 首先要求使用者申请一个公网 IP 地址,然后将域名绑定到该公网 IP( IP 实际上与机器的 mac 地址相绑定)。该公网 IP 在 keepalived 的加持下可以在多台机上的 mac 上“漂移”,从而实现高可用!
一些简单的配置
监听指定 ip 端口
listen 127.0.0.1:8000;
listen 127.0.0.1; # 监听指定 ip 所有端口
listen 8000; # 监听指定端口(常用)
listen *:8000; # 通配符,同上
server {
# 监听多个端口
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen 80;
listen 81;
server_name example.com ;
}
简介
*
(但只能用在开头结尾,不能用于中间)~
开头标识)匹配优先级(高到低)
范例
server_name www.baidu.com;
server_name *.baidu.com;
server_name www.baidu.*;
server_name ~^www\.\w+\.com$; # 正则表达式: www 开头,com 结尾
server {
listen 80;
server_name www.thinkstu.com;
}
支持多种匹配模式。
匹配优先级:
=
^~
/abc
~
、~*
(区分、不区分大小写)/
(注意:当同级匹配冲突时,首先依据长度优先、其次依据匹配次序优先)
匹配优先级规则:
/
范例
location / {}
location /abc {}
location =/abc {}
location ~ /abc {}
location ^~ /abc {}
匿名location:
@
符完成错误信息展示# 404状态码转为200,表示错误已处理并返回 @error 内容
error_page 404 =200 @error;
location @error{
return 503 "{'msg':'error'}"; # 状态码冲突时,此处失效、error_page优先
# rewrite ^(/.*)$ http://$host/ permanent;
}
=[response]
更改响应码。
编写格式:等号前有空格、后无空格。
**小tips:**精确匹配初始域名,加快解析速度
location = / {
}
简介:开启高效的文件传输模式,默认关闭(强烈建议开启!)。
sendfile on;
为什么能加快文件传输效率?
必须开启 sendfile 才能使用 nodelay 与 nopush
tcp_nodelay:(默认开启)接收到请求后立即向服务器转发,速度快、资源利用率差。
tcp_nopush:接收到请求后缓冲再向服务器转发,速度慢、资源利用率高。
nopush 与 nodelay 共同使用:
Linux V2.5.9 允许,它能够极大提升效率。
在正常情况下使用 nopush 传输数据。
当碰上最后一次传输数据时,使用 nodelay 直接传送(避免缓冲区不满导致空转)。
> uname -a
Linux VM-12-16-centos 3.10.0-1160.76.1.el7.x86_64
作用:添加 http 请求头。
表示形式:键值对,可选用 always 表示无论浏览器是否支持、总是配置。
add_header key value [always];
add_header cache-control max-age=600;
简介:nginx 中设置,使用变量时携带美元 $
符号。
location /test {
set $abc '123';
return 200 $abc;
}
简介:与编程 if 语句大致类似
语法规则:
判断条件:
-f 和 !-f 用来判断是否存在文件
-d 和 !-d 用来判断是否存在目录
-e 和 !-e 用来判断是否存在文件或目录
-x 和 !-x 用来判断文件是否可执行
location /test {
default_type text/plain;
set $abc '';
if ($abc){ return 403; }
return 200;
}
对图片文件判断 并 设置过期时间(可用于反向代理配置中,优化逻辑)
if ($uri ~ ^.*\.(png|jpg|jpeg|gif)$){
expires 3600;
}
简单范例:
-f
if ($args){}
if (-f $request_filename){}
if ($http_user_agent ~ Safari) # 正则
if ($http_user_agent !~ Safari) # 取反
if ($http_user_agent ~* Safari) # 不区分大小写
简介:
简单使用
location /test {
return https://thinkstu.com/;
# return 302 https://thinkstu.com/;
# return 301 https://thinkstu.com/;
}
尚需大量实践
# 时间为 0 表示关闭 keepalive
keepalicve_timeout 0s;
keepalicve_timeout 65s;
# 单个连接中可处理的请求数量
# 表示不与某些浏览器建立长连接
# 最长连接时间(超过强制关闭)
keepalive_request 1000;
keepalive_disable msie6;
keepalive_time 1h;
send_timeout
默认为 60s ,表示超过 60s 则关闭本次链接,所以它的值不能比 keepalive小。send_timeout: 120s;
keepalive 100;
keepalive_timeout 65s;
keepalive_request 1000;
proxy_http_version 1.1;
proxy_set_header Connnection " ";
宝塔面板默认配置
简介
*
,部分文件格式已压缩,二次压缩不仅费时费力、而且可能会适得其反)常用配置
gzip on; # 开启(默认关闭)
gzip_min_length 1k; # 最小压缩限值,建议 1KB
gzip_comp_level 2; # 压缩等级1-9,动态设置考虑性能比
gzip_min_length 1kb; # 最小压缩启动值
gzip_buffers 4 16k; # 默认,无需配置
gzip_http_version 1.1; # 默认 1.1,无需配置
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml text/html; # 压缩类型
gzip_vary on; # header标识:告知浏览器使用 gzip 压缩
gzip_disable "MSIE [1-6]\."; # 排除旧版本浏览器,支持正则表达式
gzip_proxied expired no-cache no-store private auth; # 反向代理时设置
gzip_static插件:
.gz
,请求时返回压缩文件。.
: 匹配除换行符以外的任意字符?
: 重复0次或1次+
: 重复1次或更多次*
: 重复0次或更多次\d
:匹配数字^
: 匹配字符串的开始$
: 匹配字符串的介绍{n}
: 重复n次{n,}
: 重复n次或更多次[c]
: 匹配单个字符c[a-z]
: 匹配a-z小写字母的任意一个()
:小括号之间匹配的内容,在后面依次序使用$1
、$2
等表示。~
:严格正则,区分大小写~*
:宽松正则,不区分大小写^~
:前缀正则,如果匹配到则直接返回。!~
:严格正则取反。!~*
:宽松正则取反。简介:重写 url 使请求重定向,浏览器发送2次请求。
规则:
# 对 https://a.com/1/11010.json?b=10 而言仅 /1/11010.json 可重写。
正则延伸:
^/
:匹配全部^(/.*)$
:匹配全部,后用$1
承接。重写标志位:标识重写方式
常用变量:rewrite 使用 nginx 全局参数。
变量 | 说明 |
---|---|
$request_uri | 变量中存储了当前请求的URI,并且携带请求参数。 |
$args | url请求参数 |
$uri | 获取 uri |
$document_uri | 功能和 $uri 一样 |
$host | 服务器 server_name 值 |
$http_user_agent | 浏览器代理信息 |
$document_root | 请求对应的root目录,未设置则指向nginx自带html目录 |
$content_length | Content-Length |
$content_type | Content-Type |
$http_cookie | cookie |
$limit_rate | 存储服务器对网络连接速率的限制,默认0不限制。 |
$remote_addr | 客户端 IP 地址 |
$remote_port | 客户端与服务端建立连接的端口号(指客户端的) |
$remote_user | 存储客户端的用户名,需要有认证模块才能获取 |
$scheme | 访问协议,如http |
$server_addr | 服务端的地址 |
$server_name | 客户端请求到达的服务器的名称 |
$server_port | 客户端请求到达服务器的端口号 |
$server_protocol | 存储客户端请求协议的版本,如"HTTP/1.1" |
$request_body_file | 存储发给后端服务器的本地文件资源的名称 |
$request_method | 存储客户端的请求方式,比如"GET","POST"等 |
$request_filename | 存储当前请求的资源文件的路径名 |
rewrite_log 日志:该指令用来指明是否开启 URL 重写日志输出功能,开启后将以 notice 级别向 error.log 日志中输出信息(配置相应 error 日志文件中的输出级别为 notice ,这将会输出大量日志记录),不建议使用该功能。
location /test {
rewrite ^(/.*)$ https://$host$1 permanent;
rewrite_log on; #开启
error_log /var/log/nginx/error.log notice;
}
强制HTTPS
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent; # 永久重定向
}
目录对换
/123456/xxxx -> /xxxx?id=123456
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;
指定浏览器对换指定路径
location / {
if ( $http_user_agent ~* MSIE ){ #ie浏览器使用此url资源
rewrite ^(.*)$ /msie/$1 break;
}
if ( $http_user_agent ~* chrome ){ #谷歌浏览器使用此url资源
rewrite ^(.*)$ /chrome/$1 break;
}
}
将a.com/b
跳转至b.a.com
rewrite ^/b$ http://b.a.com permanent;
rewrite ^/b/(.*)$ http://b.a.com/$1 permanent;
a.com
跳转到www.a.com
if ($host = 'a.com' ) {
rewrite ^/(.*)$ http://www.a.com/$1 permanent;
}
指定页面返回404
# /a/数字.htmlb
rewrite ^/a/([0-9]+)\.html$ /404.html last;
简介:
理解参考文献:
CSRF理解:
Access-Control-Allow-Origin http://unmeta.cn;
,通过。利用请求头允许跨域:
即跨域会自动发送 Origin 请求头,服务器设置 Allow-Origin 链接与请求方式。
add_header Access-Control-Allow-Origin http://unmeta.cn;
add_header Access-Control-Allow-Methods GET,POST;
valid_referers 与 $invalid_referer 结合使用
简介:
三种情景发送【referer】:
<img src="foo.jpg">
<script src="foo.js"></script>
<link href="foo.css" rel="stylesheet">
不发送 referer 的两种原生方法:
rel:a、area 和 form 三个标签可以使用rel="noreferrer"
属性,一旦使用,该元素就不会发送Referer字段,但是 rel 局限只能单个设置。
<a href="..." rel="noreferrer" target="_blank">点击按钮</a>
Referrer Policy:更为强大的 w3c 标准,可应用 3 种场景、 8 种模式,常用2种模式(origin、no-referrer,发送与不发送)。
Referrer-policy: no-referrer
<meta name="referrer" content="origin">
<img src="..." referrerpolicy="origin">
nginx 图片防盗链【配置】
location ~ .*\.(css|js|png|jpg|jpeg)$ {
root /usr/share/nginx/html/images;
# 只允许空 referer 与 thinkstu.com 进行跳转访问
valid_referers none thinkstu.com;
# 若为 true,即 “无效的referer” 成立,返回 403 Forbidden 标识
if ($invalid_referer){
return 403;
}
}
if ($invalid_referer){
rewrite ^/ /2.jpg break;
}
适配移动端/桌面端设备
借助开源脚本:国外 detect mobile browsers
源码详解:
# 设置变量:mobile_rewrite = 非移动端
set $mobile_rewrite do_not_perform;
# 如果是移动端的话:mobile_rewrite = 移动端
if ($http_user_agent ~* "是移动端") {
set $mobile_rewrite perform;
}
# 判断是否为移动端,进行相应操作
if ($mobile_rewrite = perform) {
rewrite ^(/.*)$ http://mobile.网址.com/$1 redirect break;
# 或者更改 root 目录
# root /html/mobile;
}
获取 IP 地址主要分为两种情况:
为什么后端服务器不能像以往一样直接获取用户 IP 地址?
因为后端服务器接收到的“网际层面IP地址”永远只能是 nginx 服务器的 IP 地址。
nginx设置IP转发头:
proxy_set_header x_forwarded_for $remote_addr;
如何防止前端伪造 IP 请求头?
只要我们在配置中设置了 x_forwarded_for ,就会自动覆盖掉用户写的 x_forwarded_for ,以此来达到目的。
# 覆盖用户私自声明的 x_forwarded_for
proxy_set_header x_forwarded_for $remote_addr;
如何避免多级 nginx 链重写 x_forwarded_for 请求头?
server 与 location 中均可配置。
server {
# ...
charset utf-8;
}
简介:将服务器上的某目录开放访问,点击下载。
4个配置:
autoindex on;
autoindex_exact_size off;
autoindex_format html;
autoindex_localtime on;
简易下载站
# 地址最后带有斜杆,表示访问目录
location =/test/ {
autoindex on;
autoindex_exact_size off;
autoindex_format html;
autoindex_localtime on;
}
# 正则匹配,声明强制下载
location ~* ^/test/.*$ {
add_header Content-Disposition "attachment;";
}
返回 403 Forbidden 状态码
即可以使用 deny 实现,也可以使用 allow 实现
简介:
blocksip.conf
来实现。简单配置(allow相同)
deny all;
deny 127.0.0.1;
deny 123.1.1.0/24; # 123.1.1.1 ~ 123.1.1.254
叠加 limit_except语法进行配置:
limit_except GET {
allow 192.168.1.0/32;
deny all;
}
范例:
location ~/\.ht {
deny all; # 善用 deny all;
}
location ~ ^/(cron|templates)/ {
deny all;
}
通过更改 root 根目录实现:重定向资源访问路径
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
Apache压测工具: httpd-tools
yum install httpd-tools
ab -n 1000 -c 30 https://baidu.com/
/
结尾,否则报错。简介:小型化认证工具,明文传输、易受攻击。
使用流程:
httpd-tools生成验证文件:
yum 安装 httpd-tools ,使用 htpasswd 指令生成账号密码。
nginx 配置认证,可以位于 server、location 等。
选择 nginx 用户可以访问的目录,生成账号密码文件
yum install httpd-tools
# 创建一个新文件记录用户(回车输入密码)
htpasswd -c /usr/local/nginx/conf/htpasswd username
# 追加一个用户
htpasswd -b /usr/local/nginx/conf/htpasswd username password
# 删除一个用户
htpasswd -D /usr/local/nginx/conf/htpasswd username
# 验证一个用户的账号密码
htpasswd -v /usr/local/nginx/conf/htpasswd username
nginx配置:
auth_basic "请输入账号密码";
auth_basic_user_file /usr/share/nginx/users/login_01;
利用 return 语句
简介:nginx 可以代替实际的服务器,快速返回某些字符串(JSON格式等)。
实现:server、location中均可使用。
location / {
default_type text/JSON;
charset utf-8;
return 200 "{'msg':'ok'}";
}
error_page
针对错误页面的处理,我们拥有2种策略:
error_page 404 =302 http://a.com;
error_page 404 =200 /index.html; # 这里虽然标识为200,但是依旧会返回302进行重定向
error_page 404 =200 '{'code':'200','msg':'error'}';
简介:
架构:
/www/server/nginx/conf/nginx.conf
/www/server/panel/vhost/nginx/
宝塔 nginx 历史配置文件目录
/www/backup/file_history/www/server/panel/vhost/nginx/java_emptyForward-0.conf
nginx 服务器在返回的响应头中包含版本信息,而某些版本可能存在漏洞,为防止其他人利用版本漏洞进行攻击,我们可以选择不返回版本信息。
server_tokens off;
简介:
Content-Type: text/html; charset=utf-8
优先级(从上至下):
Content-Disposition
或Content-Type
mime.types
default_type
简单实现:
location / {
default_type application/octet-stream;
}
location / {
add_header Content-Disposition "attachment;";
# add_header Content-Type 'text/plain; charset=utf-8';;
}
由于一些环境因素,后续我可能还会回到这
简介:
流程
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --without-http_rewrite_module
make
cp new__ old__
断点续传
简介:nginx 支持 Range 请求头,可实现断点续传,默认开启。
Range请求头格式(单位默认字节):
Range: bytes=0-10
文件下载业务关闭 Range 的方法:
octet-stream
add_header Content-type application/octet-stream;
反向代理时关闭 Range
# 覆盖用户 range 请求头,范围超过原文件字节大小即可。
# accept-ranges其实没用,放在这里只是为了提示用户。
add_header Accept-Ranges none;
proxy_set_header range 'bytes=0-10000000000';
转发请求头至Tomcat:正常情况下无需配置,但发现 range 未生效时可配置。
proxy_set_header Range $http_range;
1、web缓存作用于浏览器
2、代理缓存作用于代理服务器
深入理解浏览器缓存:传送门
简介:
2种缓存类型
浏览器缓存响应图
强缓存优于弱缓存!存在强缓存则弱缓存不会进行!
注意:
此外,这里提一个概念,webkit 资源分为主资源和派生资源。主资源是地址栏输入的 URL 请求返回的资源,派生资源是主资源中所引用的 JS、CSS、图片等资源。
在 Chrome 中,主资源通常会首先发起一个网络请求试探是否过期,派生资源则会先在本地判断资源是否过期。强缓存生效时的区别在于新标签打开为from disk cache
,而当前页刷新派生资源是from memory cache
。
Cache-Control请求头参数
指令 | 说明 |
---|---|
must-revalidate | 可缓存但必须再向服务器进行确认 |
no-cache | 缓存前必须确认其有效性 |
no-store | 不缓存任何请求 |
no-transform | 代理不可更改媒体类型 |
public | 浏览器、代理服务器均可缓存 |
private | 浏览器可以缓存、代理服务器不可缓存(默认取值) |
proxy-revalidate | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age=[秒] | 缓存有效期 |
s-maxage=[秒] | 公共缓存服务器响应的最大 Age 值 |
expires 与 Cache-Control: max-age=1000 区别:
Expires 缺点: 返回的到期时间是服务器端的时间。存在问题:如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP 1.1版开始,使用Cache-Control: max-age=秒替代(相对时间)。
实例:缓存 js/css/image 文件
location ~.*\.(css|js|png|jpg|jpeg)$ {
expires 86400s;
}
注意:
分布式系统里多台机器间文件的last-modified必须保持一致,以免负载均衡到不同机器导致比对失败,**分布式系统尽量关闭掉Etag(每台机器生成的Etag都会不一样)。**但是 if-modified只能精确到秒级(如果每秒进行了多次修改则存在隐患),而 Etag 能每次都能判断。
http {
etag off;
}
只有返回的资源带有Last-Modified
标识,而浏览器再次请求该资源时才会自动带上If-Modified-Since
请求头。另外If-Modified-Since
只能作用于 GET、HEAD 请求。
什么情况下服务器会发送last-modified ?
禁用 last-modified的两种方法:
add_header Last_modified "";
if_modified_since off;
注意,应避免给
XHR
类请求设置代理缓存
示意图:
原理阐释:
缓存目录思想:
创建 1 个缓存总目录,然后利用参数值令 nginx 自行创建子缓存目录。
先打开proxy_buffering
# 默认已开启,但这里要防止被其他配置关闭(否则不生效也不报错)
proxy_buffering on;
总体配置思想
proxy_cache_path /usr/local/nginx_cache levels=2:1 keys_zone=mycache:10m inactive=1d max_size=1g;
proxy_cache mycache;
额外配置
$scheme$proxy_host$request_uri
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m; # 为 404 页面缓存 1 分钟
proxy_cache_valid any 1m;
proxy_cache_methods GET|POST|PUT|DELETE;
清除缓存:
rm -rf
删除:但存在不便,适合一下子情况所有缓存的情况。不缓存与不使用缓存
proxy_no_cache $cookie_nocache $arg_nocache $arg_leaf;
proxy_cache_bypass $cookie_nocache $arg_nocache $arg_leaf;
浏览器查看是否击中缓存
1、初级爬虫过滤
2、高级爬虫过滤
初级爬虫过滤
简介:
简单实现:禁止某些爬虫与空 agent 访问。
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
if ($http_user_agent ~* "python|java|curl|wget|postman|apipost|httpclient|Apifox|^$"){
return 503;
}
}
curl模拟各种爬虫
curl -A '' test.com
curl -I -A 'okhttp' test.com # -I 只返回状态码与响应头,不返回 body
禁止搜索引擎爬虫:当我们不想被搜索引擎爬虫干扰时使用,下面参数只列出了部分搜索引擎爬虫。
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {
return 503;
}
高级爬虫过滤
简介:
nginx默认不限流。
限制请求速率:limit_req_zone
限制并发数:limit_conn_zone
限制网速:limit_rate
原理:(传送门)
限制请求速率 ngx_http_limit_req_module
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
location / {
limit_req zone=mylimit burst=10 nodelay;
}
}
**注意:**limit_req_zone 只是设置限流参数,如果要生效的话,必须和 limit_req 配合使用。
$binary_remote_addr:使用二进制 IP 存储辨别客户端(压缩内存占用量)。
zone:myLimit:10m 表示一个大小为10M,名字为 myLimit 的内存区域,1M 能存储16000个 IP 地址的访问信息。
rate:rate=1r/s 表示每秒最多处理 1 个请求。实际上 nginx 以毫秒为粒度追踪请求,所以是每 1000 毫秒 1 个请求。
burst:在超过设定的访问速率后缓存的请求数(单独设置还是要等待、依次进行)。
nodelay:表示不延迟。设置 no_delay 后,第一个到达的请求和队列中的请求会立即进行处理,不会出现等待的请求。通常与 burst 搭配使用提高突发请求响应。
限制并发数 ngx_http_limit_conn_module
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
limit_req_status 510; # 失败时默认返回503,可自定义400-599
server {
location / {
limit_conn perserver 50;
limit_conn perip 5;
}
}
限制网速 ngx_http_core_module
limit_rate_after 20m;
limit_rate 100k;
设置访问白名单:白名单不限流。
limit_req_zone $limit_key zone=mylimit:10m rate=10r/s;
geo $limit {
default 1;
10.0.0.0/8 0;
192.168.0.0/24 0;
172.20.0.35 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
简介
实现过程:
dd
指令制作压缩前大小为 10GB 的文件,置入 /html
目录。dd if=/dev/zero bs=1M count=10240 | gzip > 10G
location / {
# 如果是非法请求
if ($http_user_agent ~* "python|apipost|postman|Apifox|^$"){
rewrite ^(/.*)$ /10G last;
}
}
location =/10G {
gzip off;
add_header Content-Type 'text/plain';
add_header Cache-Control no-store;
add_header Content-Encoding gzip;
}
代理用户,本质为请求转发
实现:
server{
listen 80;
location / {
proxy_pass http://$host$request_uri;
}
}
upstream + proxy_pass
简介:
负载均衡的作用:
3种常见负载均衡策略
【简单配置】
# 定义 upstream ,命名为 backend
upstream backend{
server 127.0.0.1:8081 weight=1;
server 127.0.0.1:8082 weight=2;
server 127.0.0.1:8083 weight=10;
}
location / {
proxy_pass http://backend;
default_type text/plain;
}
server{
listen 8081;
# listen 8082;
# listen 8083;
server_name localhost;
default_type text/plain;
}
【进阶配置】
反向代理叙述:所有带有 proxy 开头的指令全部都是反向代理配置。
在作反向代理时,location
路径末尾加或不加斜线/d
的区别:
location /test/ {
proxy_pass http://127.0.0.1/;
# proxy_pass http://127.0.0.1;
}
假设想请求 abc.html,真实访问路径如下:
加:http://127.0.0.1/abc.html
不加:http://127.0.0.1/test/abc.html
总结:如果我不加的话,他就会替我加!(包括location路径中的一切)
负载均衡状态
用于标注服务器状况
状态 | 概述 |
---|---|
down | 当前的 server 暂不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 失败之后 server 暂停接受请求的时间 |
max_conns | 限制的最大接收连接数(默认 0 ,即不受限制) |
backup:原可用的所有服务都不可用时才会生效。
max_fails + fail_timeout:两者通常结合使用。
范例:当该服务器在 10s 内出现 3 次失败后,暂时该服务器在下一个时间段 10s 内的使用( fail_timeout 描述的是时间段)。
server 127.0.0.1:8081 max_fails=3 fail_timeout=10s;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
负载均衡策略
算法名称 | 说明 |
---|---|
轮询 | 默认 |
weigth | 权重,默认 1 |
ip_hash | 依据ip分配 |
url_hash | 依据URL分配 |
cookie_hash | 依据 Cookie 内的某些字段分配,如 session |
least_conn | 最少连接优先选择 |
fair | 依据响应时间(第三方模块) |
upstream backend{
ip_hash;
least_conn;
hash $request_uri;
# 基于 Java 中的 Java Session Id
hash $cookie_JSESSIONID
server 127.0.0.1:8081 weigth=1;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
对特定资源实现负载均衡
upstream imagebackend{
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
upstream videobackend{
server 127.0.0.1:8083;
server 127.0.0.1:8084;
}
server{
listen 80;
server_name localhost;
# image
locatio /image/ {
proxy_pass http://imagebackend;
}
# video
locatio /video/ {
proxy_pass http://videobackend;
}
}
对不同域名实现负载均衡
upstream aaa{
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
upstream bbb{
server 127.0.0.1:8083;
server 127.0.0.1:8084;
}
server{
listen 80;
server_name one.com;
locatio / {
proxy_pass http://aaa;
}
}
server{
listen 80;
server_name two.com;
locatio / {
proxy_pass http://bbb;
}
}
lua 是一门简洁、轻量、可扩展的脚本语言,其采用 C 语言编写。
简介:Lua的设计目的是为了嵌入到其他应用程序,从而为其他应用程序提供灵活的扩展和定制功能。
安装:绝大部分 Linux 系统已默认安装 Lua 。
yum install -y lua
2种执行模式:
交互式
lua
脚本式
# 编辑、执行
vim lua_01
lua lua_01
vim lua_01
#! /usr/bin/lua
print("Hello Lua")
chmod 777 lua_01
./lua_01
语法细则:分号;
加不加都行
注释
--注释内容
--[[
注释内容
--]]
---[[
注释失效
--]]
变量定义:
nil
表示未赋值(nil /nɪl/:零、空)。> a=10
> print(a)
10
> local b=20
> print(b)
nil
> local c=30; print(c)
30
关键字
部分运算规则:
10^2 --> 100
10==10 --> true
10~=10 --> false
and
or
not --> 逻辑非
.. --> 字符串连接,例:"aa".."bb",输出 aabb
# --> 返回字符串长度,例:#"hello",输出 5
8种数据类型
nil # 空、无效值
boolean
number # 数值,包含 integer 整数、float 双精度(这与其他语言不同)
string
function # 函数
table # 表
thread # 线程
userdata # 用户数据
type()
来检测数据类型> print(type(123))
number
注意:
只要将变量名赋值为 nil,那么垃圾回收就会释放该变量所占用的内存。
在boolean中,lua 只会将 false 与 nil 视为假,其余均为真!
不管是 integer 或者 float ,type()
返回的均为 number。
字符串声明:
[[ sample ]]
> a="123"
> b="456"
> c=[[
>> 7
>> 8
>> 9
>> ]]
table数据类型:lua 中最主要和最为强大的数据结构,可以以一种简单的方式表达数组、集合、记录等内容。**注意:**数组下标从 1 开始。
> a={}
> b={"A","B","C"}
> print(b[1])
A
> arr["A"]=10
> arr["B"]=20
> arr[1] -- 当为以上的方式书写时,不能用序号获取
nil
> arr["A"]
10
> arr = {"A",X=10,"B",Y=20}
> arr[1]
A
> arr[2] -- 注意此时的序号关系
B
> arr.X -- 注意这种书写方式
10
函数
function 函数名(参数)
-- 具体内容
end
> function add(n,m)
>> print(n+m)
>> end
> add(1,2)
3
> function add(...)
>> a,b,c=...
>> return a,b,c
>> end
> q,w,e=add(1,2,3)
> print(q,w,e)
1 2 3
if语句:end作终结符
if then
elseif then
else
-- precedure
end
> function testif(age)
>> if age <= 18 then
>> return "未成年"
>> elseif age <= 45 then
>> return "中年人"
>> else
>> return "老年人"
>> end
>> end
> print(testif(20))
中年人
while与repeat:end、until 作终结符,不支持 a++ 类语法。
> function testwhile()
>> i=10
>> while i<20 do
>> print(i)
>> i=i+1
>> end
>> end
> function testrepeat()
>> i=10
>> repeat
>> print(i)
>> i=i-1
>> until i<1
>> end
openResty = nginx + lua
简介: nginx 直接操作缓存,避免将请求转发至真正后端(少了一层)。
centos安装
sudo yum-config-manager --add-repo https://openresty.org/yum/cn/centos/OpenResty.repo
sudo yum install openresty
组件图