常用的Nginx配置总结

Nginx是轻量级的Web服务器,也是一个高性能的HTTP和反向代理服务器。

1.nginx在应用程序中的作用
  • 反向代理:将来自客户端的请求转发到后端的真实服务器,然后将响应返回给客户端。以隐藏服务器的真实IP地址,提高安全性。
  • 负载均衡:将来自客户端的请求分发到多个后端服务器,提高系统的并发处理能力
  • gzip压缩:压缩数据,提高网络传输效率
  • 静态资源服务器:提供对静态文件(如HTML、图片)的访问服务。并可配置缓存,以减少对后端服务器的请求次数
  • SSL/TLS加密:对传输的数据进行加密,即HTTPS
2.默认配置文件分析

nginx.conf 默认配置文件

//配置工作进程数,如果大于1,则以多进程的方式运行
worker_processes  1;
//配置影响Nginx服务器或与用户的网络连接
events {
    //单个工作进程可以同时打开的最大连接数
    //最大客户端连接数由worker_processes和worker_connections决定
    worker_connections  1024;
}


//可以嵌套多个server
http 
{
    //包含其他文件到nginx.conf配置文件中,mime.types文件包含了各种文件类型
    include       mime.types;
    //设置默认的文件类型,'application/octet-stream'是一种通用的二进制文件类型
    default_type  application/octet-stream;
    //启用内核级别的文件传输优化
    sendfile        on;
    //长连接时间,超过时间Nginx会关闭该连接,包括HTTP和WebSocket
    keepalive_timeout  65;
    //配置虚拟主机的相关参数
    server
    { 
        //监听的端口
        listen       80;
        //监听的域名
        server_name  localhost;
        //配置请求的路由,以及各种页面的处理情况
        location / {
            root   html;
            index  index.html index.htm;
        }
        //配置错误页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
     }
}

根据nginx.conf 默认配置文件可分为6个模块:

  • 全局模块:配置影响nginx全局的指令,比如运行nginx的用户名,nginx进程pid存放路径,日志存放路径,配置文件引入,worker进程数等。
  • events模块:配置影响nginx服务器或与用户的网络连接。比如每个进程的最大连接数,选取哪种事件驱动模型(select/poll epoll或者是其他等等nginx支持的)来处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  • http模块:可以嵌套多个server,配置代理,缓存,日志格式定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  • server模块:配置虚拟主机的相关参数比如域名端口等等,一个http中可以有多个server。
  • location模块:配置url路由规则。
  • upstream模块:配置上游服务器的地址以及负载均衡策略和重试策略等等。
3. location 路由匹配规则

location [ = | ~ | ~* | ^~ ] uri { ... }

  • 通用匹配:使用一个 / 表示,可以匹配所有请求。相当于 switch 中的 default。

location / {
    root   dist;
    index  index.html index.htm;
  }
  • 无修饰符的前缀匹配:匹配前缀是配置的的url

location /prefix_match {
   
    alias  dist;  //前缀匹配使用alias来寻找资源
    index  index.html index.htm;
}

匹配结果


curl http://www.locatest.com/prefixmatch     ✅ 301
curl http://www.locatest.com/prefixmatch?    ✅ 301
curl http://www.locatest.com/PREFIXMATCH     ❌ 404
curl http://www.locatest.com/prefixmatch/    ✅ 200
curl http://www.locatest.com/prefixmatchmmm  ❌ 404
curl http://www.locatest.com/prefixmatch/mmm ❌ 404
curl http://www.locatest.com/aaa/prefixmatch/❌ 404
//域名/prefixmatch,域名/prefixmatch? 和域名/prefixmatch/ 这三个url能够匹配上无修饰符的前缀匹配。
  • ^~ 有修饰符的前缀匹配

location ^~ /exactprefixmatch{    
[ configuration ] 
}

匹配结果


curl http://www.locatest.com/exactprefixmatch     ✅ 200
curl http://www.locatest.com/exactprefixmatch/    ✅ 200
curl http://www.locatest.com/exactprefixmatch?    ✅ 200
curl http://www.locatest.com/exactprefixmatchmmm  ✅ 200
curl http://www.locatest.com/exactprefixmatch/mmm ✅ 200
curl http://www.locatest.com/aaa/exactprefixmatch ❌ 404
curl http://www.locatest.com/EXACTPREFIXMATCH     ❌ 404
//域名/exactprefixmatchmmm 和域名/exactprefixmatch/mmm 是可以匹配上的,而不带修饰符的前缀匹配这两个类型的url是匹配不上的直接返回了404 
  • = 精确匹配

location = /test {
    return 200 "hello";
  }
  
  # /test ok
  # /test/ not ok
  # /test2 not ok
  # /test/2 not ok
  • ~ 区分大小写的正则匹配

location ~ ^/test$ {
    [ configuration ] 
  }
  
  # /test ok
  # /Test not ok
  # /test/ not ok
  # /test2 not ok
  • ~ 区分大小写的正则匹配

location ~* ^/test$ {     
[ configuration ] 
}


# /test ok
# /Test ok
# /test/ not ok
# /test2 not ok
  • 匹配优先级
    • 精确匹配 =
    • 前缀匹配 ^~
    • 正则匹配 ~ 或~*
    • 通用匹配
  • root 与 alias 的区别
    • root 是直接拼接 root + location
        location /i/ {
           root /data/w3;
        }
       // 当请求 /i/top.gif ,/data/w3/i/top.gif 会被返回。
      
    • ralias 是用 alias 替换 location
        location /i/ {
          alias /data/w3/images/;
        }
      
       // 当请求 /i/top.gif ,/data/w3/images/top.gif 会被返回
      
  • server 和 location 中的 root
    server 和 location 中都可以使用 root,采取就近原则,如果 location 中能匹配到,就是用 location 中的 root 配置,忽略 server 中的 root,当 location 中匹配不到的时候,则使用 server 中的 root 配置
4.解决跨域

server {
    listen       8088;
    server_name  192.168.31.115;


    location / {
        proxy_pass http://192.168.31.115:8080/; //反向代理
    }


    location /laohuangli {
        proxy_pass http://v.juhe.cn/laohuangli;
    }
}
// 将页面地址代理到8088端口,将接口地址也代理到8088端口
5.gzip压缩

http{
    gzip on; # 是否开启gzip
    gzip_min_length  1k;# 开始压缩的最小长度(再小就不要压缩了,意义不在)
    gzip_buffers     4 16k; # 缓冲(压缩在内存中缓冲几块? 每块多大?)
    gzip_http_version 1.1;# 开始压缩的http协议版本(可以不设置,目前几乎全是1.1协议)
    gzip_comp_level 2;# 推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
    gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml;# 对哪些类型的文件用压缩 如txt,xml,html ,css
    gzip_vary on; # 是否传输gzip压缩标志
    gzip_proxied   expired no-cache no-store private auth; #Nginx做为反向代理的时候启用 例如如果header中包含”Expires”头信息,启用压缩
   gzip_disable   "MSIE [1-6]\."; #正则匹配UA,配置禁用gzip条件。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
   gzip_static on; #开启后会寻找以.gz结尾的文件,直接返回,不会占用cpu进行压缩,如果找不到则不进行压缩
}

//默认是动态压缩,即对每个请求是先压缩后输出。可配置gzip_static on;直接读取生成好的gz文件(前端打包时生成gz文件)
6.将HTTP请求转到HTTPS
  • 在服务器上监听80端口,使用重定向
server
    {
        listen 80;
        server_name 47.101.161.174;
        return 301 https://$host$request_uri; //永久性重定向
     }
7.使用HTTP2
  • 在监听443端口后加http2即可开启
listen 443 ssl http2;
8.负载均衡
  • 将请求分配给空闲服务器处理(电话号码同一个,但是不同客服接听)
upstream firstdemo {
    server 192.168.31.123:8081;
    server 192.168.31.123:8082;
}

server {
    listen 8080;
    server_name localhost;
    location / {
        proxy_pass http://firstdemo;
    }
}

负载均衡:upstream name {},两个server分别对应着不同的服务器
proxy_pass http://firstdemo,代理到firstdemo里两个服务器上
灰度系统:可判断cookie版本,走不同服务器

9.防盗链
location ~ .*\.(jpg|png|gif)$ { # 匹配防盗链资源的文件类型
    # 通过 valid_referers 定义合法的地址白名单 $invalid_referer 不合法的返回403  
    valid_referers none blocked 127.0.0.1;
    if ($invalid_referer) {
        return 403;
    }
}
10.请求限制

对于大流量恶意的访问,会造成带宽的浪费,给服务器增加压力。往往对于同一 IP 的连接数以及并发数进行限制。

  • 关于请求限制主要有两种类型:
    limit_conn_module 连接频率限制
    limit_req_module 请求频率限制

# $binary_remote_addr 远程IP地址 zone 区域名称 10m内存区域大小
limit_conn_zone $binary_remote_addr zone=coon_zone:10m;
server {
    # conn_zone 设置对应的共享内存区域 1是限制的数量
 limit_conn conn_zone 1;
}

# $binary_remote_addr 远程IP地址 zone 区域名称 10m内存区域大小 rate 为请求频率 1s 一次
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
server {
    location / {
        # 设置对应的共享内存区域 burst最大请求数阈值 nodelay不希望超过的请求被延迟
        limit_req zone=req_zone burst=5 nodelay;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容