超全Nginx反向代理服务器原理+实战篇2

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 超全Nginx反向代理服务器原理+实战篇

5.Nginx经典应用

5.1.Nginx全局异常兜底数据返回

  • 任何接口都有可能出错,4xx,5xx等。
  • 如果业务没有做好统一的错误管理,直接暴漏给用户,无疑是降低用户体验。
  • 所以假如后端某个业务出错,nginx层也需要进行转换,让前端知道响应是200,其实将错误的状态吗定向到200,返回了全局兜底数据。
upstream lbs{
  server 192.168.10.111:8080;
  server 192.168.10.111:8081;
}
location /api/{
  proxy_pass http://lbs;
  proxy_redirect default;
  #存放用户真实的IP
  proxy_set_header Host $host;
  proxy_set_heater X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  #开启错误拦截配置,一定要开启
  proxy_intercept_errors on;
}
error_page 404 500 503 502 503 =200 /default_api/;
location /default_api/{
  default_type application/json;
  return 200 '{"code":"-1","msg":"invoke fail, not found "}';
}

5.2.Nginx封禁恶意IP

  • 网络攻击,TCP洪水攻击、注入攻击、DOS、DDOS等
  • 数据安全,防止对手爬虫而已爬取,封禁IP

(1)封禁IP的方式

  • linux server的层面封IP:iptables
  • nginx层面封禁IP

(2)Nginx作为网关封禁IP

在nginx/conf 下编写blacklist.conf文件
deny 192.168.10.1;
在nginx.conf配置
全局配置:在http{}下配置
单独虚拟主机配置:在server下配置
include blacklist.conf;
  • ./nginx -s reload 重新加载nginx配置
  • 配置shell脚本自动化编写恶意IP封禁



e897168f9f2c4807908d3205292300e5.jpg

5.3Nginx配置浏览器跨域

  • 跨域:浏览器同源策略1995年,同源政策由Netscape公司引入浏览器。目前,所有浏览器都实行这个政策。最初,他的含义是指A网页设置的Cookie,B网页不能打开,除非这两个网页同源。
  • 同源
  • 协议相同 http https
  • 域名相同 www.baidu.com
  • 端口相同 80 81
  • 解决办法
  • JSONP
  • Http响应头配置允许跨域
  • nginx层配置
  • 程序代码中处理通过拦截器配置
  • Nginx开启跨域配置
  • location下配置
location /{
  add_header 'Access-Control-Allow-Origin' $http_origin;
  add_header 'Access-Control-Allow-Credentials' 'true';
  add_header 'Access-Control-Allow-Headers' 'DNT,web-token,apptoken,Authorization,Accept,Origin,KeepAlive,User-Agent,X-Mx-ReqToken,X-DataType,X-Auth-Token,X-Requested-With,IfModified-Since,Cache-Control,ContentType,Range';
  add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
  #如果预见请求则返回成功,不需要转发到后端
  if($request_method == 'OPTIONS'){
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain; charset=utf-8';
    add_header 'Content-Length' 0;
    return 200;
  }
}

5.4.Nginx的location路径匹配规则

正则

^:以什么开始
$:以什么结束
^/api/user$

location路径匹配

  • 语法 location [ = | ~ | ~* | ^~] uri{……}
  • location =/uri
  • = 表示精准匹配,只有完全匹配上才能生效
  • location /uri
  • 不带任何修饰符,表示前缀匹配
  • location ^~/uri/
  • 匹配任何以/uri/开头的任何查询并停止搜索
  • location /
  • 通用匹配,任何未匹配到其他location的请求都会匹配到
  • 正则匹配
  • 区分大小写匹配(~)
  • 不区分大小写匹配(*)
  • 优先级
  • 精准匹配>字符串匹配>正则匹配
  • 案例
server {   
  server_name xdclass.net;   
  location ~^/api/pub$ { 
  ... 
  }  
}
http://xdclass.net/api/v1 #不匹配,没有以pub结尾
http://xdclass.net/API/PUB #不匹配,大写不匹配
http://xdclass.net/api/pub?key1=value1 #匹配
http://xdclass.net/api/pub/ #不匹配/说明接口不是以pub结尾
http://xdclass.net/api/public #不匹配 ,没有pub结尾
  • 测试
location =/img/test.png{
  return 1;
}
location /img/test.png{
  return 2;
}
location ^~/img/{
  return 3;
}
location =/{
  return 4;
}
location /{
  return 5;
}

5.5.Nginx的rewrite重定向规则

  • 重写-重定向
  • rewrite地址重定向,实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转。
  • 语法:rewrite regex replacement[flag]
rewrite ^/(.*) https://xdclass.net/$1 permanent
#这是一个正则表达式,匹配完整的域名和后面的路径地址
#replacement部分事https://xdclass.net/$1,$1是取自regex部分()里的内容
  • 常用正则表达式:
字符 描述
^ 表示以什么开头
$ 表示以什么结尾
* 表示前面的字符0次或者多次
+ 表示匹配前面一次或者多次
匹配前面0次或者1次
. 表示单个字符
(pattern) 匹配括号的内pattern
  • rewrite最后一项flag参数
标记符号 说明
last 本条规则匹配完成后继续向下匹配新的location URI规则
break 本条规则匹配完成后终止,不在匹配任何规则
redirect 返回302临时重定向
permanent 返回301永久重定向
  • 应用场景
  • 非法访问跳转,防盗链
  • 网站更换新域名
  • http跳转https
  • 不同地址访问同一个虚拟主机的资源
location /{
  #重定向以/划分把/前的所有替换成https://xdclass.net,$1为(.*)表示参数,permanent表示永久重定向
  rewrite ^/(.*) https://xdclass.net/$1 permanent;
}

5.6.Nginx配置Websocket反向代理

配置

server {
  listen 80;
  server_name xdclass.net;
  location /{
    proxy_pass http://lbs;
    proxy_read_timeout 300s; #websocket空闲保持时长
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;               proxy_http_version 1.1;
    #
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
  }
}
  • 核心是下面的配置其他和普通反向代理没区别,表示请求服务器升级协议为WebSocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;


  • 服务器处理完请求,响应如下报文 #状态码为101
HTTP /1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade

5.7.Nginx静态资源压缩

压缩配置

  • 对文本、js和css文件等进行压缩,一般是压缩后的大小是原始大小的25%
  • gzip
  • 语法: gzip on|off
  • 默认值: gzip off
    作用域: http, server, location, if (x) location
    开启或者关闭gzip模块
  • gzip_buffers
  • 语法: gzip_buffers number size
  • 默认值: gzip_buffers 4 4k/8k

作用域: http, server, location

设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。

  • 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
  • gzip_comp_level
  • 语法: gzip_comp_level 1…9
  • 默认值: gzip_comp_level 1

作用域: http, server, location

gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。

gzip_min_length

  • 语法: gzip_min_length length
    默认值: gzip_min_length 0
    作用域: http, server, location
  • 设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
    默认值是0,不管页面多大都压缩。
    建议设置成大于1k的字节数,小于1k可能会越压越大。 即: gzip_min_length 1024
  • gzip_http_version
  • 语法: gzip_http_version 1.0|1.1

默认值: gzip_http_version 1.1

作用域: http, server, location

识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。 注:21世纪都来了,现在除了类似于百度的蜘蛛之类的东西不支持自解压,

  • 99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。
  • gzip_types
  • 语法: gzip_types mime-type [mime-type …]
  • 默认值: gzip_types text/html

作用域: http, server, location

匹配MIME类型进行压缩,(无论是否指定)”text/html”类型总是会被压缩的。

注意:如果作为http server来使用,主配置文件中要包含文件类型配置文件

#开启gzip,减少我们发送的数据量
gzip on;
#设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 4 16k;
#gzip压缩比,可在1-9中设置,1压缩比例最小,速度最快,9压缩比例最大,速度最慢,消耗cpu
gzip comp level 4;
#压缩类型
gzip_types application/javascript text/plain text/css application/json application/xml text/javascript;
#给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费支持也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
gzip_vary on;
#禁用IE6一下的gzip压缩,IE某些版本对gzip的压缩支持很不好
gzip_disable "MSIE [1-6].";
  • 压缩前后区别(上传js文件进行验证)
location /static/ {
  alias /usr/local/software/static;
}
  • web层主要涉及浏览器和服务器的网络交互,而网络交互显然是耗费时间的
  • 要尽量减少交互次数
  • 降低每次请求或响应数据量
  • 开启压缩
  • 在服务端是时间换空间的策略,服务端需要牺牲时间进行压缩以减小响应数据大小
  • 压缩后面的内容可以获得更快的网络传输速度,时间时得到了优化,双向的

48947ab433d84b99aef6046eda6dffdb.jpg


69efaff5e4cf4df5b39216aee68c32b9.jpg

5.8.Nginx业务接口性能优化

(1)高并发Nginx服务器缓存

  • 常见的缓存分类
  • 数据库缓存
  • 应用程序缓存
  • Nginx网关缓存
  • 前端缓存
  • Nginx作为缓存让后端结果的缓存离用户更进一些,性能提高,减少服务请求网络带宽。


1e0618764b1848128dd49c5f89a8aed2.jpg

(2)常用配置

  • /root/cache
  • 本地路径,用来设置Nginx缓存资源的存放地址
  • levels=1:2
  • 默认所有缓存文件都放在上面指定的根路径中,

可能影响缓存的性能,推荐指定为2级目录来存储缓存文件,1和2表示用1位和2位16进制来命名目录名称。第一级目录用1位16进制名,如a,第二级目录用2位的16进制命名,如3a。所以此例中一级目录有16个,二级目录有16*16=256个,总目录数为16*256=4096个

当levels=1:1:1时,表示三级目录,每级目录16个,16*16*16

  • keys_zone
  • 在共享内存中定义一块存储区域来存放缓存中的key和metadata
  • max_size
  • 最大缓存空间,如果不指定会使用掉所有的磁盘孔吉纳,当disk达到上限后,会删除最少使用的cache
  • inactive
  • 某个缓存在inactive指定的时间不被访问,将会从缓存中删除
  • proxy_cache_valid
  • 配置nginx cache中缓存文件的缓存时间,proxy_cache_valid 200 304 2m 对于状态为200和304的缓存文件的缓存时间为2分钟
  • use_temp_path
  • 临时缓存,建议为off,则nginx会将缓存的文件写入指定的cache文件中。
  • proxy_cache
  • 启用proxy_cache,并指定keys_zone,如果proxy_cache off表示关闭缓存
  • add_header Nging-Cache “$upstream_cache_status”
  • 用于前端判断是否缓存,miss、hit、expired(缓存过期)、updating(更新,使用旧的应答)
http{
  proxy_cache_path /root/cache/ levels=1:2 keys_zone=lx_cache:10m max_size=1g inactive=60m use_temp_path=off;
  server {
    proxy_pass http://lbs;
    proxy_redirect default;
    proxy_cache lx_cache;
    proxy_cache_valid 200 304 10m;
    proxy_cache_valid 404 1m
    proxy_cache_key $host$uri$is_args$args;
    add_header Nginx-Cache "$upstream_cache_status";
  }
}
  • 配置重启:./nginx -s reload
  • 验证:

585904ca27d54622a0a68019ecdb75f3.jpg注意:

  • nginx缓存过期影响的优先级进行排序为:inactive > 源服务器端Expires/max-age > proxy_cache_valid
  • 如果出现Permission denied修改nginx.conf,将第一行修改为use root
  • 默认情况下GET请求及HEAD请求会被缓存,而POST请求不会被缓存,可以过滤部分路径不用缓存
  • 缓存清空
  • 直接rm删除
  • ngx_cache_purge
  • 缓存命中率统计
  • 前端打点日志上报
  • nginx日志模板增加信息:$upstream_cache_status

7.Nginx配置HTTPS协议

7.1.新一代传输协议https

  • HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议,是身披SSL外壳的HTTP
  • HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包
  • HTTPS协议由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。要比HTTP协议安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性。

7.2.HTTPS传输流程


1d3ac19a1b45457697c4ef9f152f39a8.jpg

  • 客户端发送https请求到服务端
  • 服务端会将crt public(配置公钥)发送到客户端
  • 客户端根据公钥验证是否正确,不正确则提醒警告,正确则根据公钥生成一个随机的密钥保存在客户端
  • 将客户端生成的随机密钥发送到服务端
  • 服务端解密随机的密钥,得到key
  • 最后客户端通过key来交换数据
  • 密钥交换使用非对称加密,内容传输使用对称加密的方式

7.3.阿里云HTTPS证书申请


351915564f2d45a5a6934342ed4ac6b0.jpg

地址:https://common-buy.aliyun.com/?commodityCode=cas

7.4.Nginx配置HTTPS证书

  • 删除原先的nginx,新增ssl模块
./configure prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make
make install
#查询是否安装成功
/usr/local/nginx/sbin/nginx -V
  • 配置https证书
https{
    server {
        listen 443 ssl;
    server_name 16web.net;
    ssl_certificate /usr/local/software/biz/key/4383407_16web.net.pem;
    ssl_certficate_key /usr/local/software/biz/key/4383407_16web.net.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;
    }
    }
}
  • 阿里云开发网络安全组
  • 443端口


相关文章
|
1月前
|
分布式计算 监控 Hadoop
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
Hadoop-29 ZooKeeper集群 Watcher机制 工作原理 与 ZK基本命令 测试集群效果 3台公网云服务器
37 1
|
1月前
|
中间件 应用服务中间件 nginx
Nginx+uWSGI+Django原理
Nginx+uWSGI+Django原理
|
1月前
|
存储 网络协议 Unix
docker的底层原理一:客户端-服务器架构
本文详细解释了Docker的客户端-服务器架构,包括常驻后台的Docker守护进程、通过命令行接口发送请求的Docker客户端、以及它们之间通过Unix socket或网络接口进行的通信。
18 0
|
1月前
|
Java 应用服务中间件 API
nginx线程池原理
nginx线程池原理
26 0
|
3月前
|
Ubuntu 应用服务中间件 Linux
在Linux中,如何配置Web服务器(如Apache或Nginx)?
在Linux中,如何配置Web服务器(如Apache或Nginx)?
|
3月前
|
负载均衡 应用服务中间件 Linux
"揭晓nginx的神秘力量:如何实现反向代理与负载均衡,拯救服务器于水火?"
【8月更文挑战第20天】在Linux环境下,nginx作为高性能HTTP服务器与反向代理工具,在网站优化及服务器负载均衡中扮演重要角色。本文通过电商平台案例,解析nginx如何解决服务器压力大、访问慢的问题。首先介绍反向代理原理,即客户端请求经由代理服务器转发至内部服务器,隐藏真实服务器地址;并给出配置示例。接着讲解负载均衡原理,通过将请求分发到多个服务器来分散负载,同样附有配置实例。实践表明,采用nginx后,不仅服务器压力得到缓解,还提升了访问速度与系统稳定性。
77 3
|
3月前
|
应用服务中间件 Linux 网络安全
在Linux中,如何配置Apache或Nginx Web服务器?
在Linux中,如何配置Apache或Nginx Web服务器?
|
16天前
|
应用服务中间件 BI nginx
Nginx的location配置详解
【10月更文挑战第16天】Nginx的location配置详解
|
23天前
|
缓存 负载均衡 安全
Nginx常用基本配置总结:从入门到实战的全方位指南
Nginx常用基本配置总结:从入门到实战的全方位指南
214 0
|
28天前
|
应用服务中间件 Linux nginx
Jetson 环境安装(四):jetson nano配置ffmpeg和nginx(亲测)之编译错误汇总
这篇文章是关于在Jetson Nano上配置FFmpeg和Nginx时遇到的编译错误及其解决方案的汇总。
75 4
下一篇
无影云桌面