Better

Ethan的博客,欢迎访问交流

Nginx深入学习系列-进阶篇

Nginx在代理服务器中扮演着十分重要的位置,目前从事前端工作的我,使用的比较少,但是一直觉得这是一个利器,因此准备深入学习下,本篇是开篇-进阶篇,主要学习动静分析,HTTPS化等。

动静分离

通过中间件将动态请求和静态请求分离

为什么

  • 分离资源,减少不必要的请求消耗,减少请求延时
  • 减少影响范围,静态和动态资源之间彼此不影响

实例:静态资源服务器

Rewrite规则

作用:实现URL重写以及重定向

场景:

  • URL访问跳转,支持开发设计
    • 页面跳转
    • 兼容性支持,老路径的可访问性能
    • 展示效果,精简长路径
  • SEO优化
  • 维护
    • 后台维护(维护性页面)
    • 流量转发
  • 安全

配置语法

Syntax: rewrite regex replacement [flag];
Default: --;
Context: server, location, if

eg: rewrite ^(.*)$ /pages/maintain.html break;
# .表示匹配除换行符以外的任意字符,并不是点哈

Nginx的正则,()用于匹配括号之间的内容,通过$1,$2调用

if($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

flag含义

  • last:停止rewrite检测
  • break:停止rewrite检测
  • redirect:返回302临时重定向,地址栏会显示跳转后的地址
  • permanent:返回301永久重定向,地址栏会显示跳转后的地址

last和break的区别:last会新建一个指定路径请求,而break直接开始在项目中寻找文件

last和redirect区别:redirect会和Location字段使用,服务端会收到来自客户端的两次请求,而last只有一次请求。

redirect和permanent区别:permanent会在客户端建立缓存,第二次访问时,不再请求服务器,浏览器直接请求本地缓存的地址

redirect优先级

  • 执行server块的rewrite指令
  • 执行location匹配
  • 执行选定location的rewrite指令

高级模块

secure_link_module模块

  • 制定并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问
  • 限制链接生效周期

配置语法

Syntax: secure_link expression;
Default: --;
Context: http, server, location

Syntax: secure_link_md5 expression;
Default: --;
Context: http, server, location

eg: /download?md5=hkhfksfieufbj&expires=1345676888787

Geoip_module模块

作用:基于IP地址匹配MaxMind Geoip二进制文件,读取ip地域信息

默认没有编译安装Geoip_module

yum install nginx-module-geoip

# 在nginx.conf加载模块
load_module "modules/ngx_http_geoip_module.so"
load_module "modules/ngx_stream_geoip_module.so"

场景

  • 基于国内国外做HTTP访问控制
  • 基于国内城市做HTTP访问控制

具体步骤

  1. nginx.conf中load指定模块
  2. MaxMind下载数据文件
  3. 加载且配置

HTTPS

HTTP不安全

  • 传输数据被中间人盗用,信息泄露
  • 数据内容劫持,篡改

HTTPS:对传输内容进行加密和身份验证

生成密钥和CA证书 openssl version

  1. 生成KEY密钥
    openssl genrsa -idea -out ethan.key 1024
    
  2. 生成证书签名请求文件csr文件
    openssl req -new -key ethan.key -out ethan.csr
    
  3. 生成证书签名文件CA证书
    openssl x509 -req -days 3650 -in ethan.csr -signkey ethan.key -out ethan.crt
    

nginx -V 查看有没有编译安装 --with-http_ssl_module

HTTPS语法配置

Syntax: ssl on|off;
Default: ssl off;
Context: http, server

Syntax: ssl_certificate file;
Default: --;
Context: http, server

Syntax: ssl_certificate_key file;
Default: --;
Context: http, server

苹果要求的证书

  • 服务所有连接TLS1.2以上版本(openssl 1.0.2)
  • HTTPS证书必须使用SHA256以上加密算法
  • HTTPS证书必须使用RSA 2048位或ECC 256位以上公钥算法
  • 使用前向加密技术

直接通过key生成crt

openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout ethanc.key -out ethan.crt

去掉保护码

openssl rsa -in ./ethan.key -out ./ethan_nopass.key

HTTPS优化

  • 激活keepalive优化
  • 设置ssl session缓存

Lua

Nginx和Lua优势:充分的结合Nginx的并发处理epoll优势和Lua的轻量实现简单功能的高并发场景,比如收集信息

Nginx实现灰度发布

了解灰度发布:按照一定的关系区别,分部分的代码上线,使代码的发布能平滑过渡上线

  • 基于用户信息cookie等信息区别
  • 基于用户IP地址


留言