1

Nginx-架构篇

一、Nginx常见问题

1. 相同server_name多个虚拟主机优先级访问
# 三个配置文件:

# testserver1:
server_name testserver1 www.rona1do.top;
root /opt/app/code1;

# testserver2:
server_name testserver2 www.rona1do.top;
root /opt/app/code2;

# testserver3:
server_name testserver3 www.rona1do.top;
root /opt/app/code3;
配置上述相同server_name的三个虚拟主机,会先访问testserver1,访问的优先级是按照服务器的读取顺序,即文件名的排序。
2. location匹配优先级
  • =:进行普通字符精确匹配,也就是完全匹配
  • ^~:表示普通字符匹配,使用前缀匹配
  • ~ ~ :表示执行一个正则匹配(加不区分大小写)
上述优先级自上而下优先级降低,前两个匹配是精确匹配,匹配到以后就不再往下找,正则匹配匹配到相应的字符串也会继续往下寻找是否有更精确的匹配。
3. Nginx的try_files的使用
按顺序检查文件是否存在
# 先检查对应的url地址下的文件存不存在,如果不存在找/index.php,类似于重定向
location / {
    try_file $uri /index.php;
}
4. Nginx的alias和root区别
  • root
location /request_path/image/ {
    root /local_path/image/;
}
# 请求:http://www.rona1do.top/request_path/image/cat.png
# 查询: /local_path/image/request_path_image/cat.png
  • alias
location /request_path/image/ {
    alias /local_path/image/;
}
# 请求:http://www.rona1do.top/request_path/image/cat.png
# 查询: /local_path/image/cat.png
5. 用什么样的方法传递用户的真实IP地址
  • 在有代理的情况下,remote_addr获取的是代理的ip,不是用户的ip
  • x-forwarded-for容易被篡改
通用解决办法: 可以跟第一级代理协商,设置头信息x_real_ip记录用户的ip
set x_real_ip=$remote_addr
6. Nginx中常见错误码
  • 413:request entity too large

    • 用户上传文件限制:client_max_body_size
  • 502:bad gateway

    • 后端服务无响应
  • 504:gateway time-out

    • 后端服务超时

二、Nginx性能优化

1. 性能优化考虑点
  • 当前系统结构瓶颈

    • 观察指标(top查看状态、日志等)、压力测试
  • 了解业务模式

    • 接口业务类型,系统层次化结构
  • 性能与安全

    • 配置防火墙太过于注重安全,会降低性能
2. ab接口压力测试工具
  1. 安装

    • yum install httpd-tools
  2. 使用

    • ab -n 2000 -c 2 http://127.0.0.1/
    • -n:总的请求数
    • -c:并发数
    • -k:是否开启长连接
3. 系统与Nginx性能优化
  1. 文件句柄

    • LinuxUnix一起皆文件,文件句柄就是一个索引
  2. 设置方式

    - 系统全局性修改、用户局部性修改、进程局部性修改
    
系统全局性修改 和 用户局部性修改:
配置文件:/etc/security/limits.conf
# root:root用户
root soft nofile 65535
# hard 强制限制、soft 超过会发送提醒(邮件等),不限制
root hard nofile 65535
# *:所有用户
*     soft nofile 65535
*     hard nofile 65535
进程局部性修改
配置文件:/etc/nginx/nginx.conf
# 针对nginx进程进行设置
worker_rlimit_nofile 35535;
4. CPU的亲和
CPU亲和:将进程/线程与cpu绑定,最直观的好处就是提高了cpu cache的命中率,从而减少内存访问损耗,提高程序的速度。
  • 物理CPU数量:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
  • CPU核心:cat /proc/cpuinfo | grep "cpu cores" | uniq
  • 核心和进程使用率:先按top,再按1
# /etc/nginx/nginx.conf

# nginx建议数量跟cpu核心数保持一致
worker_processes 2;
# 配置cpu亲和
worker_cpu_affinity 0000000000000001 0000000000000010
# 与上一行等价,自动对应(Nginx1.9版本以上)
worker_cpu_affinity auto

查看Nginx的cpu绑定情况:
ps -eo pid,args,psr | grep [n]ginx

5. Nginx通用配置优化
# nginx服务使用nginx用户(最好不要使用root用户)
user nginx;
# cpu亲和(最好跟核心数保持一致)
worker_processes 2;
worker_cpu_affinity auto;

# error的日志级别设置为warn
error_log  /var/log/nginx/error.log warn; 
pid        /var/run/nginx.pid;

# 文件句柄对于进程间的限制(建议1w以上)
worker_rlimit_nofile 35535;

# 事件驱动器
events {
    use epoll;
    # 限制每一个worker_processes进程可以处理多少个连接
    worker_connections  10240;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    
    #字符集(服务端响应发送的报文字符集)
    charset utf-8;
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    access_log  /var/log/nginx/access.log  main;
    
    # 静态资源的处理
    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    # gzip压缩(对于IE6或以下版本对于gzip压缩支持不是很好)
    gzip  on;
    # IE6或以下不进行压缩(兼容)
    gzip_disable "MSIE [1-6]\.";
    gzip_http_version 1.1;
    
    include /etc/nginx/conf.d/*.conf;
}

三、Nginx安全

1. 常见的恶意行为
  • 爬虫行为和恶意抓取、资源盗用

    • 基础防盗链功能,不让恶意用户能轻易的爬取网站对外数据
    • secure_link_module,对数据安全性提高加密验证和实效性,适合如核心重要数据
    • acces_module,对后台、部分用户服务的数据提供IP防控
2. 常见的攻击手段
  • 后台密码撞库,通过猜测密码字典不断对后台系统尝试性登录,获取后台登录密码

    • 后台登录密码复杂度
    • access_module,对后台提供IP防控
    • 预警机制(一个IP在一段时间内重复不断请求等)
3. 文件上传漏洞
利用一些可以上传的接口将恶意代码植入到服务器中,再通过url去访问以执行代码
# 文件上传漏洞解决办法
location ^~ /upload {
    root /opt/app/images;
    if ($request_file ~* (.*)\.php){
        return 403;
    }
}
4. SQL注入
利用未过滤/未审核用户输入的攻击方法,让应用运行本不应该运行的SQL代码
  • Nginx+LUA配置WAF防火墙防止SQL注入

图片描述

使用waf步骤:

  1. git clone https://github.com/loveshell/ngx_lua_waf.git
  2. cd ngx_lua_waf
  3. mv ngx_lua_waf /etc/nginx/waf
  4. vim /etc/nginx/waf/conf.lua,修改RulePath为对应路径(/etc/nginx/waf/wafconf)
  5. vim /etc/nginx/waf/wafconf/post,加入一行,\sor\s+,放sql注入的正则
  6. 集成waf:
# /etc/nginx/nginx.conf
lua_package_path "/etc/nginx/waf/?.lua";
lua_shared_dict limit 10m;
init_by_lua_file /etc/nginx/waf/init.lua;
access_by_lua_file /etc/nginx/waf/waf.lua
  1. reload Nginx
5. 复杂的访问攻击中CC攻击
  • waf/conf.lua配置文件中打开防cc攻击配置项

    • CCDeny="on"
    • CCrate="100/60" #每60秒100次请求

四、Nginx总结

  1. 定义Nginx在服务体系中的角色

    • 静态资源服务
    • 图片描述
    • 代理服务
    • 图片描述
    • 动静分离
  2. 设计评估

    • 硬件

      • CPU、内存、硬盘
    • 系统

      • 用户权限、日志目录存放
    • 关联服务

      • LVS、keepalive、syslog、Fastcgi
  3. 配置注意事项

    • 合理配置
    • 了解原理(HTTP、操作系统...)
    • 关注日志

罗纳尔多Coder
300 声望33 粉丝

everyday hardwork ? 1.1^365 : 0.9^365