Nginx初探

作者: DivenYang | 来源:发表于2019-02-11 15:53 被阅读67次

    初识Nginx

    Nginx 特点

    1. 高并发,高性能
      • epoll io 模型处理大并发请求
      • 32核64G服务器能支持1000w请求连接,作为静态资源服务器可以处理100wRPS
    2. 可扩展性好
      • 模块化设计良好
      • 有丰富的第三方模块(OpenResty/Tengine……)
    3. 高可靠性
      • 持续不间断运行多年不需要重启
    4. 热部署
      • 可以在不停止服务的情况下完成升级
    5. BSD许可证

    Nginx主要场景

    1. 静态资源服务
      • 通过本地文件系统提供服务
    2. 反向代理服务
      • Nginx的强大性能
      • 缓存
      • 负载均衡
    3. API服务
      • OpenResty

    Nginx的组成部分

    1. 二进制可执行文件:各个模块源码编译出来的一个文件
    2. Nginx配置文件:控制Nginx的行为
    3. 访问日志:记录每一条Http请求
    4. 错误日志:定位问题

    Nginx的选择

    1. 开源版本Ngixn
    2. Nginx-Plus
      1. 优点:整合第三方模块,运营监控,技术支持
      2. 缺点:不开源
    3. Tengine
      1. 优点:经历严苛考验,设计领先于开源Nginx
      2. 缺点:不能跟随Nginx一同升级
    4. OpenResty

    Nginx的目录结构

    1. auto
      1. cc:编译相关的目录
      2. lib
      3. OS:对于操作系统的判断
      4. types
    2. CHANGES文件:版本特性、Bugfix、重构
    3. conf
      1. config示例文件
    4. configure脚本:生成中间文件,编译前的必备动作
    5. contrib:提供两个poll脚本和vim工具
      • vim工具使用(vim语法高亮提示)
        $ cp -r contrib/vim/* ~/.vim/
    6. html
      1. index.html:欢迎界面
      2. 50.html:错误页面
    7. man:Linux 帮助文件
    8. src:Nginx源代码
    9. objs:编译目标文件

    编译Nginx

    1. 配置指令
      $ ./configure ....
    2. 编译生产的中间文件
      • ngx_modules.cc:记录有哪些模块会被编译
    3. 编译:$ make(C语言编译后的所有中间文件放在objs/src目录下)
    4. 编译安装:$ make install

    Nginx配置

    1. 配置语法

      1. 配置文件由指令和指令快构成
      2. 每条指令以;结尾,指令间参数由空格分割
      3. 指令块由{}大括号将多条指令组织在一起
      4. include指令组合多个配置文件以提升维护性
      5. 使用#符合添加注释,提高可读性
      6. 使用$符号使用变量
      7. 部分指令的参数支持正则表达式
    2. 配置参数

      1. 时间单位
        • ms:毫秒
        • d:天
        • s:秒
        • w:周
        • m:分
        • M:月
        • h:小时
        • y:年
      2. 空间单位
        • :bytes
        • k/K:kilobytes
        • m/M:megabytes
        • g/G:gigabytes
    3. http配置指令块

      • http
      • server
      • upstream
      • location

    Nginx命令行

    Nginx基本命令
    1. -s 发送信号
      • stop:立刻停止服务
      • quit:优雅的停止服务
      • reload:重载配置文件
      • reopen重新开始记录日志
    2. -t/T 测试配置文件是否有语法错误
    3. -v/V 打印Nginx版本信息及编译信息
    4. -c 使用指定配置文件
    5. -g 指定配置命令(在命令行覆盖一些指令)
    6. -p 指定运行目录(log/modules...)
    Nginx热部署
    1. 备份旧的二进制文件
      $ cp nginx nginx.old
    2. 拷贝新版本的二进制文件至sbin目录
      $ cp -r /source/path/to/nginx /target/path/to/sbin/ -f
    3. 告诉Master进程进行热部署做一次版本升级(新老的worker|master进程都在运行,老的worker进程已不在监听网络端口,新的请求新的连接只会进入新的Ngixn进程中)
      $ kill -USR2 $ngx_master_pid
    4. 向老的Nginx进程发出信号,优雅的关闭所有的worker进程(老的worker进程全部退出,老的Master进程依然存在,用于通过reload信号拉起worker进程,实现快速回滚)
      $ kill -WINCH $ngx_master_pid
    日志切割
    1. 备份日志文件
      $ mv access.log 2018-xx-xx-access.log
    2. 重新开始记录日志
      $ /path/to/sbin/nginx -s relaod

    Nginx应用

    搭建静态资源服务器
    1. root VS alias:root会将URL的路径带入文件系统,通常使用alias
    2. 静态资源可通过gzip进行压缩
      1. 开启gzip:gzip on
      2. 设置需要压缩的文件的最小大小为一字节:gzip_min_length 1
      3. 设置压缩级别:gzip_comp_level: 2
      4. 设置需要压缩的文件类型(后缀):gzip type text/plain application/x-javascript ...
    3. 显示目录结构:autoindex on
    4. 设置发送响应的速度为1K:set $limit_rate 1k
    5. 配置access日志
      1. log_formate:设置日志格式:log_formate main 'xxx-xxx'
      2. access_log:path/to/file main
      3. access_log在配置文件中的位置觉得记录日志的范围
    搭建反向代理服务器
    1. location配置
    location / {
        proxy_set_header Host $host;    
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 设置对应的共享缓存
        proxy_cache cache_name;
        # 设置缓存的key
        proxy_cache_key $host$uri$is_args$args;
        # 设置不返回的响应
        proxy_cache_valid 200 304 303 1d;
        proxy_pass http://upstream-name;
    }
    
    1. 设置缓存文件路径:proxy_cache_path
    http {
        proxy_cache_path /temp/nginx/cache levels=1:2 keys_zone=cache_name:10m(cache_size) max_size=10g inactive=60m use_temp_path=off
    }
    
    利用GoAccess实现access日志的可视化实时监控
    1. access日志的作用
      1. 定位问题
      2. 用户行为分析
    2. GoAccess的使用
    $ goaccess access.log -o ../html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED
    
    1. GoAccess使用websocket实时更新数据
    网络安全协议SSL
    1. TLS/SSL的发展历程(Secure Socket Layer/Transport Layer Security)
      1. SSL3.0(1995)
      2. TLS1.0(1999)
      3. TLS1.1(2006)
      4. TLS1.2(2008)
      5. TLS1.3(2018)
    2. ISO/OSI模型
    graph TD
    A[表示层] --> B(握手)
    A[表示层] --> C(记录)
    B --> E(交换秘钥)
    E --> F(警告)
    F --> G(对称加密应用数据)
    G --> H(应用层)
    C --> H
    
    1. TLS安全密码套件组成


      image.png
      1. 密钥交换:ECDHE(椭圆曲线加密算法)
      2. 身份验证:RSA
      3. 对称加密算法、强度、分组模式
        • 算法:AEC(对称加密算法)
        • 强度:128
        • 模式:GCM(提升多核CPU情况下加解密性能)
      4. 签名HASH算法
    2. 对称加密与非对称加密

      1. 性能对比:对称加密位运算,性能较好
      2. 对称加密:同一个密钥进行加解密
      3. 非对称加密:公钥加密私钥解密,私钥加密公钥解密,可用于身份认证(SSH)
    3. 证书管理流程


      image.png
    4. 证书的类型

      • 域名验证(Domain validated,DV)证书
      • 组织验证(Organization validated,OV)证书
      • 扩展验证(extended validated,EV)证书
    5. 证书链

        ├── 根证书(操作系统更新,平均一年一次,大比分)
        │   ├── 二级证书
        │   │   └── 主证书
    
    1. TLS通讯过程
      • TLS通讯过程的4个目的
        1. 验证身份
        2. 达成安全套件共识
        3. 传递秘密钥
        4. 加密通讯
      • TLS通讯过程(交换密钥、加密数据)
        1. Client Hello:支持的加密算法
          
        2. Server Hello:支持的加密算法列表,以及倾向于使用的加密算法套件,Nginx选择最喜欢的加密套件发送给客户端
          
        3. Server Certificates:发送公钥证书(证书链)给客户端
          
        4. Server Hello Done:如有类似椭圆曲线算法参数再次发送给客户端
          
        5. ClientKey exchange Message:根据椭圆曲线参数生成私钥并把公钥发送给服务器
          
        6. Key Generation:各种生成的密钥是相同的
          
        7. CipherSpec Exchange
          
        8. Finished
          
      • Nginx综合性能
        1. 小文件传输主要考虑非对称加密算法,优化椭圆曲线算法强度
        2. 大文件传输主要考虑对称加密算法
    2. 使用let's encrypt搭建https服务
      • 在nginx.conf配置server_name(与生成密钥息息相关)
      • 安装let's encrypt自动化脚本:
        $ yum install python2-certbot-nginx
      • 自动配置https:
        $ certbot --nginx --nginx-server-root=${ngx_root}/nginx/conf/ -d ${domain}
      • let's encrypt自动化脚本执行流程
        1. 申请一个证书
        2. 等待验证
        3. 部署证书到nginx.conf文件中
        4. 选择是否将http站点重定向到https站点上

    --nginx-server-root:指定nginx.conf 所在的目录 -d:指定需要申请证书的域名 依赖模块:http_ssl_module 依赖类库:open-ssl 如果遇到 python-urllib3.noarch 安装失败 使用 sudo pip uninstall urllib3 卸载 urllib3 再使用 sudo yum install python-urllib3 安装即可

    OpenResty安装实战

    OpenResty目录结构
    • build:编译时生成的中间目标文件
    • bundle:nginx源代码、nginx模块(C模块、lua模块)
    • configure:OpenResty编译脚本
    • patches
    • util
    OpenResty Lua 配置
    在nginx.conf文件中使用Lua代码
    • 在openresty http-lua 模块中提供了几个lua指令
      • content_by_lua 在http请求内容生成阶段用lua代码来处理
      • ngx.say("xxxx"):生成http响应(body部分)

    相关文章

      网友评论

        本文标题:Nginx初探

        本文链接:https://www.haomeiwen.com/subject/aapqeqtx.html