Better

Ethan的博客,欢迎访问交流

Nginx深入学习系列-高阶篇

Nginx在代理服务器中扮演着十分重要的位置,目前从事前端工作的我,使用的比较少,但是一直觉得这是一个利器,因此准备深入学习下,本篇是开篇-高阶篇,主要总结下常见问题,性能优化和安全等。

常见问题

主要问题

  • 相同server_name多个虚拟主机优先级访问
  • location匹配优先级
  • try_files使用
  • Nginx的alias和root区别
  • 用什么方法传递用户真实IP

多虚拟机主机优先级

具体如下

server {
    listen 80;
    server_name testserver1 ethan.com
}
server {
    listen 80;
    server_name testserver2 ethan.com
}

这种情况Nginx启动会有warning,但是并不会报错,而且可以启动成功

Nginx加载配置文件,优先加载最开始读到的文件

多location匹配

location匹配分类

  • = 进行普通字符精确匹配,完全匹配
  • ^~ 表示普通字符串,使用前缀匹配
  • ~~ 表示执行一个正则匹配(波浪符区分大小写,波浪符+不区分大小写)

前两者优先级最高,一旦匹配,不在继续寻找。正则匹配在匹配后,后继续寻找是否有更完善的

try_files

按顺序检查文件是否存在,如果存在返回文件内容,如果不存在

location / {
    try_files $uri $uri/ /index.php
}

alias & root

root指定程序目录

location /request_path/image {
    root /local_path/image
}

如果我们访问,test.com/request_path/image/cat.png,重点来了,实际访问的是:/local_path/image/request_path/image/cat.png

root指定程序目录

location /request_path/image {
    alias /local_path/image
}

如果我们访问,test.com/request_path/image/cat.png,重点来了,实际访问的是:/local_path/image/cat.png

真实IP

与第一级代理协商一个头信息,加上真实IP

set x_real_ip=$remote_addr

错误码

413 Request Entity Too Large:用户上传文件限制:client_max_body_size

502 bad gateway:后端服务无响应

504 Gateway Time-out:后端服务执行超时,nginx默认60s

性能优化

主要如下点:

  • 性能优化考虑点
    • 当前系统结构瓶颈,观察指标(top),压力测试
    • 了解业务模式(接口业务类型,系统层次化结构)
    • 性能和安全
  • 压测工具ab
    • 安装 yum install httpd-tools
    • 使用
      ab -n 2000 -c 2 http://127.0.0.1
      # -n 总得请求数
      # -c 并发数
      # -k 是否开启长连接
      
  • 系统与Nginx性能优化
    • 网络(流量,丢包情况)
    • 系统(磁盘损坏与速率,系统负载,内存使用率)
    • 服务(连接优化,内核优化,HTTP服务优化)
    • 程序
    • 数据库、底层服务

性能优化具体点 - 句柄设置

  • 文件句柄,一切皆文件,文件句柄就是一个索引
  • 设置方式(系统全局性修改、用户局部性修改、进程局部性修改)

系统全局性修改/etc/security/limits.conf

root soft nofile 665535
root hard nofile 665535
* soft nofile 665535
* hard nofile 665535

针对nginx进程,在nginx.conf下配置

worker_rlimit_nofile 35535; # 小站点建议1w+,大站点根据符合判断

性能优化具体点 - CPU亲和配置

  • 使nginx不同work的进程绑定到不同的CPU上,减少进程间切换的性能损耗
  • 查看多少个物理CPU
    cat /proc/cpuinfo|grep "physical id"|sort|uniq|wc -l
    
  • 查看CPU核心
    cat /proc/cpuinfo|grep "cpu cores"|uniq
    
  • 使用TOP查看CPU使用情况
  • 配置nginx.conf

    user nginx; # 配置成普通用户,为了安全考虑
    work_processes 16; # 官方建议和CPU核心数保持一致
    work_cpu_affinity: 000000000000001 # ... 配置具体CPU
    # work_cpu_affinity: auto;
    events {
      use epoll; # nginx优势之处
      work_connections 10240; # 限制每一个work的最大连接数
    }
    http {
      # charset
      charset utf-8;
    
      # access_log 根据实际情况选择打日志,毕竟日志涉及到IO
    
      # Core module
      sendfile on;
      #tcp_nopush on;
      #tcp_nodeny on;
    
      #Gzip module
      gzip on;
      gzip_disable "MSIE [1-6]\."; # 兼容
      gzip_http_version 1.1;
    }
    

安全

常见的恶意行为:爬虫行为,恶意抓取,资源盗用

应用层攻击手段

  • 后台密码撞库
  • 文件上传漏洞
  • SQL注入
  • CC攻击

Nginx防攻击策略

  • 基础防盗链功能
  • secure_link_module
  • access_module:IP访控
  • 预警机制(Nginx + Lua)
  • waf防火墙

Nginx服务体系角色

  • 静态资源服务
    • 类型分类
    • 浏览器缓存
    • 防盗链
    • 流量限制
    • 防资源盗用
    • 压缩
  • 代理服务
    • 协议类型
    • 正向代理
    • 反向代理
    • 负载均衡与策略
    • 代理缓存
    • 头信息处理
    • 分片请求
  • 动静分离

新特性

具体内容

  • 平滑升级
  • HTTP2.0协议
  • GRPC应用网关

平滑升级

什么是平滑升级:服务版本升级时,对于用户体验无感知,不会造成服务中断

前提条件

  • 新老版本Nginx安装目录结构一致
  • 老版本备份
  • 重启进程采用reload方式

平滑升级的步骤

  1. 了解现有版本nginx的安装
  2. 按照原有编译参数重新编译版本
    • 安装基础包 gcc pcre-devel openssl-dev
    • wget url 下载更新包
    • 复制nginx -V的结果进行输出编译
  3. reload服务

如果通过yum安装nginx,可以通过rpm查看相关信息

  • rpm -qa nginx 当前nginx的版本
  • rpm -ql nginxx 安装rmp包在操作系统的内容和目录

升级完成后,nginx默认备份的老的版本,可以通过nginx.old -V查看

HTTP2.0协议

HTTP1.1 - 持久链接

HTTP2.0 - 多路复用

GRPC(远程调用)nginx 1.13.10支持

  • Google主导开发的rpc框架
  • 提供从客户端和服务端的整体解决方案
  • 基础HTTP2.0协议


留言