Nginx架构

Nginx常见问题

  1. 多个server配置了相同的server_name优先级访问:
    优先使用最先读取到的配置
  2. location匹配优先级:
    由高到低分别是:
  • =进行普通字符精确匹配,即完全匹配
  • ^~表示普通字符匹配,使用前缀匹配,表示以什么开头
  • ~开头表示区分大小写的正则匹配
  • ~* 开头表示不区分大小写的正则匹配
  • /通用匹配,任何请求都会匹配到
  1. try_files的使用
    用于按顺序检查文件是否存在
location / {
        # 首先查找$rui路径是否存在,不存在则查找$uri/路径,如果也不存在则跳转到/index.php目录
        try_files $uri $uri/ /index.php
}
  1. alias和root的区别
# 当访问路径为http://www.test.com/request_path/image/cat.png

# 实际访问路径为/local_path/image/request_path/image/cat.png
location /request_path/image/ {
        root /local_path/image/;
}

# 实际访问路径为/local_path/image/cat.png
location /request_path/image/ {
        alias /local_path/image/;
}
  1. 获取用户真实ip地址
    对第一层代理设置头信息存储ip,这样后端服务就可以通过$x_real_ip获得真实ip

    set x_real_ip = $remote_addr

  2. 常见错误码

  • 413 Request Entity Too Large
    解决方法: 用户上传文件限制 client_max_body_size
  • 502 bad geteway:后端服务无响应
  • 504 Geteway Time-out:后端服务执行超时

性能优化

接口压力测试工具:ab

  1. 需要先安装http-tools
  2. 使用:

    ab -n 2000 -c 2 http://127.0..0.1/

  • n 总的请求数
  • c 并发数
  • k 是否开启长连接

设置Nginx文件句柄

# 指定一个nginx进程可以打开的最多文件描述符数目
worker_rlimit_nofile num;

CPU亲和

将nginx设置与当前机器物理cpu个数相等,同时配置核心数
总核心数=cpu个数*每个核心数

# 启动多少个worker进程,建议与cpu总核心数一致,默认1
worker_processes num;
# cpu亲缘 ,将工作进程绑定到CPU组。
worker_cpu_affinity cpumask...;

# 设置工作进程可以打开的最大并发连接数
# 配置在events,默认512
# 这个数字包括所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接。另一个考虑因素是实际的并发连接数不能超过最大打开文件数的当前限制,可以通过 worker_rlimit_nofile更改。
worker_connections number;

worker_cpu_affinity配置方法

  1. 使用位掩码表示:绑定到cpu0,cpu1,cpu2,cpu3

    worker_cpu_affinity 0001 0010 0100 1000;

  2. 将工作进程绑定到CPU组,将第一个工作进程绑定到CPU0 / CPU2,将第二个工作进程绑定到CPU1 / CPU3。

    worker_processes 2;
    worker_cpu_affinity 0101 1010;

  3. 使用auto允许将工作进程自动绑定到可用的CPU:

    worker_processes auto;
    worker_cpu_affinity auto;

Nginx安全

常见恶意行为

爬虫行为和恶意抓取,资源盗用
解决方式

  • 使用基础防盗链功能,不让恶意用户能轻易的爬去网站对外数据
  • secure_link_module:对数据安全性提高加密验证和实效性,适合如核心重要数据
  • access_module:对后台、部分用户服务的数据提供IP防控

常见攻击手段

  1. 后台密码撞库:通过猜测密码字典不断对后台系统登录性尝试,获取后台登录密码
    解决方式
  • 后台登录密码复杂度
  • access_module:对后台提供IP防控
  • 预警机制
  1. 文件上传漏洞:利用这些可以上传文件的接口将恶意代码植入到服务器中,再通过url去访问以执行代码
    例如:在Nginx早期版本:

    http://www.server_name.com/upload/1.jpg/1.php

nginx会将其作为php代码执行
解决方式:检查文件上传格式是否合规

location ^~ /upload{
        root /opt/app/images;
        if($request_filename ~* (.*)\.php){
                return 403;
        }
}
  1. SQL注入:利用未过滤,未审核用户输入的攻击方法,让应用运行本不应该运行的SQL代码
    解决方式
    Nginx+LUA防火墙:拦截Cookie类型攻击,异常post请求,cc攻击(对某一个接口高频率访问),拦截URL,arg(get请求提交的参数)