Nginx初探

初识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部分)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容