nginx:小知识

一、服务器名称

  1. server_name 匹配(性能)顺序:

    • 精确匹配;
    • 以星号开头的最长通配符名称,如:*.example.org
    • 以星号结尾的最长通配符名称,如:mail.*
    • 正则表达式(正则表达式匹配的位置会优先于普通前缀匹配的位置。 ~* \.(gif|jpg|jpeg)$ 优先于 /documents/
  • 第一个匹配的正则表达式(按照配置文件中出现的顺序)。

最好在可能的情况下使用精确名称。如果服务器最常请求的名称是 example.orgwww.example.org,则明确定义它们会更有效。

# 建议
server {
    listen       80;
    server_name  example.org  www.example.org  *.example.org;
    ...
}

# 不建议
server {
    listen       80;
    # 特殊的通配符形式 ".example.org" 存储在通配符名称哈希表中,而不是精确名称哈希表中
    server_name  .example.org;
    ...
}
  1. 名称使用通配符:

    通配符只能出现在域名的开头或结尾,并且只能出现在点的边界上。如:*.example.orgmail.*

  2. 名称使用正则表达式:

    • 必须以波浪号字符开头,同时不要忘了加 ^ $ 如:

    • server_name  ~^www\d+\.example\.net$;
      
    • 包含字符“{”和“}”的正则表达式应该加引号:

    • server_name  "~^(?<name>\w\d{1,3}+)\.example\.net$";
      

      之后使用命名的正则表达式捕获作为变量使用:

      server {
          server_name   ~^(www\.)?(?<domain>.+)$;
      
          location / {
              root   /sites/$domain;
          }
      }
      

二、负载均衡

  1. 支持以下三种方式:
    • round-robin(轮询):为默认配置。将请求以轮询的方式分发给应用服务器;
    • least-connected(最小连接数):下一个请求分配给当前连接数最少的服务器;
    • ip-hash(IP 哈希):使用哈希函数确定应选择哪个服务器以处理下一个请求(基于客户端的 IP 地址)。
  • round-robin 轮询
http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
                # 要为 HTTPS 而不是 HTTP 配置负载均衡,只需将协议设置为 "https"
            proxy_pass http://myapp1;
        }
    }
}
  • 最小连接数负载均衡

使用最小连接数负载均衡时,nginx 将尽量避免向繁忙的应用服务器发送过多请求,而是将新请求分发到较不繁忙的服务器。

upstream myapp1 {
    least_conn;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}
  • IP哈希

确保来自同一客户端的请求总是被定向到相同的服务器,除非此服务器不可用。

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}
  • 加权负载均衡

通过使用服务器权重,还可以进一步影响 nginx 负载均衡算法。在最新的nginx版本上,也可以对最小连接数和 ip-hash 负载均衡使用权重。

upstream myapp1 {
    server srv1.example.com weight=3;
    server srv2.example.com;
    server srv3.example.com;
}
  1. 健康检查

如果从特定服务器收到的响应出现错误,nginx 将将此服务器标记为失败,并将在一段时间内尽量避免选择此服务器用于后续的入站请求。

max_fails 指令,是设置一个服务器在与 nginx 通信的过程中,连续出现了指定次数的失败尝试,nginx 将把该服务器标记为失败。默认情况下,max_fails 设置为 1。当设置为 0 时,禁用对该服务器的健康检查。fail_timeout 参数定义了服务器被标记为失败的时间长短。在服务器失败后的 fail_timeout 时间间隔之后,nginx 将开始通过实时客户端请求对服务器进行平稳的探测。如果探测成功,服务器将被标记为存活。

三、配置https

配置HTTPS服务器,必须:

  • 监听套接字上启用ssl参数;

  • 指定服务器证书和私钥文件的位置。

server {
    listen              443 ssl; #请用SSL
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ...
}

服务器证书是一个公共实体,会发送给连接到服务器的每个客户端。私钥是一个安全实体,应该存储在一个受限制访问的文件中,但必须能够被nginx的主进程读取。

ssl_protocols:指定支持的SSL/TLS协议的版本。默认情况下,Nginx启用了TLSv1、TLSv1.1、TLSv1.2 和 TLSv1.3。通常不需要显式指定。

ssl_ciphers: 这个指令用于指定可用于SSL/TLS握手的密码套件。在默认情况下,Nginx使用了 HIGH:!aNULL:!MD5 这个值,表示高级加密套件,而且不允许使用匿名密钥交换和不安全的MD5算法。这也是一个比较强大和相对安全的默认设置。

  1. HTTPS服务器优化

SSL操作会消耗额外的CPU资源。在多处理器系统上,应该运行多个工作进程,数量不少于可用CPU核心数。最消耗CPU资源的操作是SSL握手。

减少每个客户端的握手操作次数:

    1. 启用keepalive连接,通过一个连接发送多个请求;
    1. 重用SSL会话参数,以避免在并行和后续连接中进行SSL握手。

    会话存储在SSL会话缓存中,该缓存在工作进程之间共享,并由ssl_session_cache指令进行配置。1兆字节的缓存大约包含4000个会话。默认缓存超时为5分钟,可以通过使用ssl_session_timeout指令进行增加。

    worker_processes auto;
    
    http {
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;
    
        server {
            listen              443 ssl;
            server_name         www.example.com;
            keepalive_timeout   70;
    
            ssl_certificate     www.example.com.crt;
            ssl_certificate_key www.example.com.key;
            ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
            ssl_ciphers         HIGH:!aNULL:!MD5;
            ...
        }
    }
    
  1. 单一的服务器来处理HTTP和HTTPS请求
server {
    listen              80;
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ...
}
  1. 基于名称的HTTPS服务器

如下所示:假如 www.example.comwww.example.org 都指向 120.79.250.121

在单个IP地址上配置两个或更多监听HTTPS的服务器,浏览器将接收默认服务器的证书,即www.example.com,而不考虑请求的服务器名称。这是由SSL协议行为引起的。SSL连接在浏览器发送HTTP请求之前建立,nginx不知道请求的服务器名称。

server {
    listen          443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
    ...
}

server {
    listen          443 ssl;
    server_name     www.example.org;
    ssl_certificate www.example.org.crt;
    ...
}

四、内置变量

http://example.com/page?param1=value1&param2=value2 为例:

  • $scheme: 获取请求的协议,对应 http
  • $host: 获取客户端请求中的主机头信息;对应 example.com
  • $uri: 获取不带参数的原始 URI;对应 /page
  • $args: 获取请求中的查询参数部分;对应 param1=value1&param2=value2
  • $request_uri:获取客户端请求的原始URI,包括参数。对应 /page?param1=value1&param2=value2

五、重定向到主机

    1. 推荐使用 return 而非 rewrite
server {
    listen       80;
    server_name  example.org;
    return       301 http://www.example.org$request_uri;
}

server {
    listen       80;
    server_name  www.example.org;
    ...
}

如果真的想使用 rewrite,则是下面的形式:

rewrite      ^ http://www.example.org$request_uri?;
    1. 的逻辑:
server {
    listen       80;
    server_name  example.com www.example.com;
    ...
}

server {
    listen       80 default_server;
    server_name  _;
    return       301 http://example.com$request_uri;
}

第二个 server 块定义了 listen 80 default_server;,这表示它是默认的服务器块,将匹配所有未被其他服务器块匹配的请求。server_name _; 表示对任何主机名(没有匹配的情况下),都将其重定向到 http://example.com 并保留原始请求的URI。

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

推荐阅读更多精彩内容