系统学习Nginx之架构篇

常见问题:

相同server_name多个虚拟主机优先级访问

优先使用最先读取到的配置。

location匹配优先级

= 进行普通字符精确匹配 #找到后不会再往下匹配
^~ 表示普通字符匹配,使用前缀匹配 #下同,匹配到后,还会继续寻找,是否有匹配度更高的
~、~* 表示执行一个正则匹配() # ~*不区分大小写,~区分

try_file的使用:

按顺序检查文件是否存在,如存在返回文件内容,不存在根据路径对应规则

alias和root的区别:

用什么样的方式传递用户的真实IP:

假设用户经过多重代理访问
虽然X-Forwarded-For可以定位,当有可能会被篡改,所以最应该和常用的方式是和第一层代理取得联系,加上用户的IP信息,set x_real_ip=$remote_addr

Nginx常见错误码:

413 Request Entity Too Large #用户请求的文件太大
对用户上传分级限制 修改client_max_body_size

502 bad gatewag
后端服务无响应

504 GateWay Time-out
后端服务执行超时

Nginx性能优化:

考虑点:
1、当前系统结构瓶颈:观测指标、压力测试
2、了解业务模式:接口业务类型、系统层次化结构
3、性能与安全

压测工具ab:

实例:

ab -n 2000 -c 2 http://127.0.0.1/
 -n 总的请求数
 -c 并发数
 -k 是否开启长连接

系统与Nginx性能优化点:网络、系统、服务、程序、数据库、底层服务

文件句柄:

linux\uinx中一切皆文件,文件句柄就是一个索引,linux默认不会让你无限制地打开文件,默认为1024个

设置方式:
系统全局性修改、用户局部性修改、进程局部性修改(vim /etc/security/limits/conf)

CPU亲和配置:

方式一:
worker_processes 4;#nginx进程数,一般和物理CPU核心数相同,这里举例为4;
worker_cpu_affinity 0001 0010 0100 1000;#5的话则为00001…依次类推

方式二:
worker_processes 2;
worker_cpu_affinity:1010 0101;
比较少用

方式三:
worker_cpu_affinity auto;(1.9版本后出现)

使用ps -en pid,args,psr |grep ngxin命令查看nginx进程分别使用的哪个CPU

nginx通用配置优化:

error_log 日志级别 warn;
pid Nginx 管理启动寻找的pid文件
worker_rlimit_nofile ;一般小站点设置为10000以上,

events{
    use epoll; #linux2.6内核后使用epoll
    worker_connections 10240; #限制每个work进程的最大连接数
 }

http域优化:

charset utf-8; #设置文件编码

access_log 如果要跑关闭的话,建议关闭到sever级 

sendfile on;
 #tcp_nopush on; #根据实际情况打开
 #tcp_nodent on; #根据实际情况打开
keepalive_timeout 65;

gzip on;
gzip_disable "MSIE [1~6]\";# IE1~6的版本不压缩
gzip_http_version 1.1;

Nginx架构安全篇:

由于学习的Nginx,所以不从代码程序或者其他层面探讨防范方式。

常见的恶意行为:

爬虫行为和恶意抓取、资源盗用

基础防盗链功能-目的不让恶意用户能轻易地爬取网站对外数据

secure_link_module-对数据安全性提高加密验证和时效性,适合如核心重要数据
access_module-对后台、部分用户服务的数据提供IP防控

也可使用refer做一般性地防范。

常见的应用层攻击手段:

后台密码撞库:通过猜测密码字典不断对后台系统登陆性尝试,获取后台登陆密码
方法一:后台登陆密码复杂度
方法二:access_module 对后台提供IP防控
方法三:预警机制

文件上传漏洞:

利用这些可以上传的接口将恶意代码植入到服务器中,再通过url去访问执行代码
防范方式举例:

location ^~ /upload{
    root /opt/app/images;
    if($request_filename ~* (.*)\.php){
        return 403;
    }

SQL注入:

利用未过滤/未审核用户输入的攻击方法,让应用运行本不应该运行的SQL代码;
使用lua防范

Nginx防攻击政策:

场景:Nginx+LUA的安全waf防火墙:
详见github地址:https://github.com/loveshell/ngx_lua_waf
CC攻击防范:使用AB等工具多次请求。

基于Nginx中间件架构原则:

了解需求

定义Nginx在服务体系中的角色(静态资源服务,代理服务,动静分离)
静态资源服务:类型分类(视频、图片等目录分类),浏览器缓存(是否需要,缓存周期)、防盗链、流量限制(如APP升级时,一下字资源占用满),防资源盗用(安全连接,相应的验证,时效性),压缩(压缩模式,类型,比率等)

代理服务:

协议类型(HTTP,STMP,WEBSOCKET等),正向代理,反向代理,负载均衡,代理缓存,头信息处理、LNMP,分片请求,poxypass等

设计评估考虑点

作为代理服务的时候,要考虑硬件(CPU、内存、硬盘)
系统(用户权限,日志目录存放)
关联服务 LVS,keepalive,syslog,Fastcgi

配置注意事项

合理配置(http,server域),了解原理(HTTP协议原理,状态原理,操作系统原理等),关注日志