Nginx 入门

最近看了蛮多 Nginx 的书、文档等,适当的总结下一些基础扫盲知识。
刚上班就晓得有 Apache 这个东西,也维护过一段时间,后面就默默的转 DBA 了,从而其实错过了 Nginx ,最近想着扫扫盲,学学、玩玩、看看、补补 。

Nginx、OpenRestry、Kong

  • Nginx 是模块化设计的反向代理软件,C语言开发
  • OpenResty 是以 Nginx 为核心的 Web 开发平台,可以解析执行 Lua 脚本
  • Kong 是 OpenResty 的一个应用,是一个 API 网关,具有API管理和请求代理的功能

上面三点其实就能很明显的发现,讲到底还是 Nginx。

OpenResty

OpenResty 以 Nginx 为核心,集成打包了众多侧重于高性能 Web 开发的外围组件,它既是一个Web Server,也是一个成熟完善的开发套件。OpenResty 基于Nginx 和 Lua/LuaJIT,充分利用了两者的优势,能够无阻塞地处理海量并发连接,任意操纵 HTTP/TCP/UDP 数据流,而且功能代码不需要编译,可以就地修改脚本并运行,简化了开发流程,加快了开发和调试的速度,同时也缩短了开发周期,在如今这个快节奏的时代里弥足珍贵。

简易配置

worker_processes  auto;
worker_cpu_affinity auto;
worker_priority -10;

error_log /data/nginx/logs/error.log;
error_log /data/nginx/logs/error.log notice;
error_log /data/nginx/logs/error.log info;

pid /data/nginx/nginx.pid;

events {
    worker_connections  1024;
}

stream {
    upstream mysqld {
        server xxxxx:3306;
    }
    server {
        listen 23430;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
        proxy_pass mysqld;
    }
}

http {
    lua_shared_dict prometheus_metrics 10M;
    lua_package_path '/etc/openresty/conf.d/lua/?.lua;;';
    init_by_lua_block {
      prometheus = require("prometheus").init("prometheus_metrics")
      metric_requests = prometheus:counter(
        "nginx_http_requests_total", "Number of HTTP requests", {"host", "status"})
      metric_latency = prometheus:histogram(
        "nginx_http_request_duration_seconds", "HTTP request latency", {"host"})
      metric_connections = prometheus:gauge(
        "nginx_http_connections", "Number of HTTP connections", {"state"})
    }
    log_by_lua_block {
      metric_requests:inc(1, {ngx.var.server_name, ngx.var.status})
      metric_latency:observe(tonumber(ngx.var.request_time), {ngx.var.server_name})
    }

    include       mime.types;
    default_type  application/octet-stream;

    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  /data/nginx/logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;

    server {
        listen 23431;
        access_log off;
        # Allow all RFC 1918 address blocks
        # allow 10.0.0.0/8;
        # allow 172.16.0.0/12;
        # allow 192.168.0.0/16;
        # deny all;
        location /nginx_status {
            stub_status;
        }
    }


    server {
        listen 23432;
        access_log off;
        # Allow all RFC 1918 address blocks
        # allow 10.0.0.0/8;
        # allow 172.16.0.0/12;
        # allow 192.168.0.0/16;
        # deny all;
        location /metrics {
            content_by_lua_block {
                metric_connections:set(ngx.var.connections_active, {"active"})
                metric_connections:set(ngx.var.connections_reading, {"reading"})
                metric_connections:set(ngx.var.connections_writing, {"writing"})
                metric_connections:set(ngx.var.connections_waiting, {"waiting"})
                prometheus:collect()
            }
        }
    }


    server {
        listen       23433;
        server_name  Nginx;

        #charset koi8-r;

        access_log  /data/nginx/logs/host.access.log  main;

       location / {
           default_type text/html;
           content_by_lua 'ngx.say("<p>hello, world</p>")';
       }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

       location /baidu {
           rewrite ^/(.*) http://www.baidu.com;
           root html;
           index index.html;
       }

}

日常覆盖场景

  • 与 PHP 配合完成 PHP-CGI 的动态配合,PHP 自带一个 Nginx
  • 7 层转发,公有云 ELB/SLB 就有这样能力,用户流量先打到这层接着转发到后端 Nginx 集群
  • 内部服务api 接入层,如果架构不合理,就会有很多的 localtion rewrite 想想就很酸爽
  • 4 层转发,默认不推荐,因为有更好的 Lvs

Location & Rewrite

  • location 有”定位”的意思, 根据 uri 来进行不同的定位,可以把网站的不同部分,定位到不同的处理方式上。比如,遇到 .php 就转发到 php-cgi 去 ; 还可以配置优先级
  • rewrite 顾名思义就是重定向。使用 nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实现 url 重写以及重定向。

优先级规则

  • 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项 「先判断精准命中,如果命中,立即返回结果并结束解析过程」
  • 前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个location匹配的话,则使用表达式最长的那个 「若未结束,判断前缀普通命中,如果有多个命中,使用表达式“最长”的命中结果,结束解析过程」
  • 正则表达式类型(~ ~*)的优先级次之。一旦匹配成功,则不再查找其他匹配项 「若未结束,继续判断正则表达式的匹配,按正则表达式顺序为准,由上至下一旦匹配成功1个,立即返回结果,并结束解析过程」
  • 常规字符串匹配,如果有多个location匹配的话,则使用表达式最长的那个 「若未结束,继续普通命中,普通命中和前缀普通命中相似,顺序无所谓,按照location表达式的长短来确定命中结果」

301 & 302 跳转

  • 301 永久跳转:被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
  • 302 临时跳转:请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

基于 Lua 可以让 nginx 做更多的事情,ng 本身还是一个插件性的 web server,完全可以基于服务场景来进行二次的插件开发「前提有人会 C++」,本人的理解是普通公司的话 OpenResty 已经可以满足绝大部分场景,而且 Lua 本身也不难,运维基本上都应该适当学习很快就可以上手的一个语言。「sysbench 里面不就是有好多 Lua 」,此文档为个人总结摘录,为了一些技术知识的个人总结为主 「入门扫盲阶段」。

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