1 配置文件结构

image.png
Nginx 的典型配置示例:

  1. # main段配置信息
  2. user nginx; # 运行用户,默认即是nginx,可以不进行设置
  3. worker_processes auto; # Nginx 进程数,一般设置为和 CPU 核数一样
  4. error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录
  5. pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置
  6. # events段配置信息
  7. events {
  8. use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
  9. worker_connections 1024; # 每个进程允许最大并发数
  10. }
  11. # http段配置信息
  12. # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
  13. http {
  14. # 设置日志模式
  15. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  16. '$status $body_bytes_sent "$http_referer" '
  17. '"$http_user_agent" "$http_x_forwarded_for"';
  18. access_log /var/log/nginx/access.log main; # Nginx访问日志存放位置
  19. sendfile on; # 开启高效传输模式
  20. tcp_nopush on; # 减少网络报文段的数量
  21. tcp_nodelay on;
  22. keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
  23. types_hash_max_size 2048;
  24. include /etc/nginx/mime.types; # 文件扩展名与类型映射表
  25. default_type application/octet-stream; # 默认文件类型
  26. include /etc/nginx/conf.d/*.conf; # 加载子配置项
  27. # server段配置信息
  28. server {
  29. listen 80; # 配置监听的端口
  30. server_name localhost; # 配置的域名
  31. # location段配置信息
  32. location / {
  33. root /usr/share/nginx/html; # 网站根目录
  34. index index.html index.htm; # 默认首页文件
  35. deny 172.168.22.11; # 禁止访问的ip地址,可以为all
  36. allow 172.168.33.44; # 允许访问的ip地址,可以为all
  37. }
  38. error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
  39. error_page 400 404 error.html; # 同上
  40. }
  41. }
  • 全局配置,对全局生效;
  • events 配置影响 Nginx 服务器与用户的网络连接;
  • http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
  • server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
  • location 用于配置匹配的 uri ;
  • upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分;

    2 main 配置段

    1、user

    指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
    user USERNAME [GROUP]
    user nginx lion; # 用户是nginx;组是lion

    2、 pid

    指定运行 Nginx master 主进程的 pid 文件存放路径。
    pid /opt/nginx/logs/nginx.pid # master主进程的的pid存放在nginx.pid的文件

    3、 worker_rlimit_nofile_number

    指定 worker 子进程可以打开的最大文件句柄数。
    worker_rlimit_nofile 20480; # 可以理解成每个worker子进程的最大连接数量。

    4、 worker_rlimit_core

    指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
    worker_rlimit_core 50M; # 存放大小限制
    working_directory /opt/nginx/tmp; # 存放目录

    5、worker_processes_number

    指定 Nginx 启动的 worker 子进程数量。
    worker_processes 4; # 指定具体子进程数量
    worker_processes auto; # 与当前cpu物理核心数一致

    6、worker_cpu_affinity

    将每个 worker 子进程与我们的 cpu 物理核心绑定;将每个 worker 子进程与特定 CPU 物理核心绑定,优势在于,避免同一个 worker 子进程在不同的 CPU 核心上切换,缓存失效,降低性能。但其并不能真正的避免进程切换。
    worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个worker子进程

    7、worker_priority

    指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。Linux 默认进程的优先级值是120,值越小越优先;nice 定范围为 -20 到 +19 。
    [备注] 应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
    worker_priority -10; # 120-10=110,110就是最终的优先级

    8、worker_shutdown_timeout

    指定 worker 子进程优雅退出时的超时时间。
    worker_shutdown_timeout 5s;

    9、timer_resolution

    worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
    timer_resolution 100ms;

    10、daemon

    指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
    daemon off; # 默认是on,后台运行模式

    3 events 配置段

    1、use

    Nginx 使用何种事件驱动模型,method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
    use method; # 不推荐配置它,让nginx自己选择

    2、worker_connections

    worker 子进程能够处理的最大并发连接数。
    worker_connections 1024 # 每个子进程的最大连接数为1024

    3、accept_mutex

    是否打开负载均衡互斥锁。
    accept_mutex on # 默认是off关闭的,这里推荐打开

    4 server和location配置端

    1、server_name

    指定虚拟主机域名,示例:
    server_name www.nginx.com;
    域名匹配的四种写法:
    精确匹配:server_name www.nginx.com ;
    左侧通配:server_name .nginx.com ;
    右侧统配:server_name www.nginx.
    ;
    正则匹配:server_name ~^www.nginx.*$ ;
    匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配

    1. # 左匹配
    2. server {
    3. listen 80;
    4. server_name *.nginx-test.com;
    5. root /usr/share/nginx/html/nginx-test/left-match/;
    6. location / {
    7. index index.html;
    8. }
    9. }
    10. # 正则匹配
    11. server {
    12. listen 80;
    13. server_name ~^.*\.nginx-test\..*$;
    14. root /usr/share/nginx/html/nginx-test/reg-match/;
    15. location / {
    16. index index.html;
    17. }
    18. }
    19. # 右匹配
    20. server {
    21. listen 80;
    22. server_name www.nginx-test.*;
    23. root /usr/share/nginx/html/nginx-test/right-match/;
    24. location / {
    25. index index.html;
    26. }
    27. }
    28. # 完全匹配
    29. server {
    30. listen 80;
    31. server_name www.nginx-test.com;
    32. root /usr/share/nginx/html/nginx-test/all-match/;
    33. location / {
    34. index index.html;
    35. }
    36. }
    37. 访问分析
    38. 当访问 www.nginx-test.com 时,都可以被匹配上,因此选择优先级最高的“完全匹配”;
    39. 当访问 mail.nginx-test.com 时,会进行“左匹配”;
    40. 当访问 www.nginx-test.org 时,会进行“右匹配”;
    41. 当访问 fe.nginx-test.club 时,会进行“正则匹配”;

    2、root

    指定静态资源目录位置,它可以写在 http 、 server 、 location 等配置中。
    root path

    1. 例如:
    2. location /image {
    3. root /web/nginx/html;
    4. }

    3、alias

    它也是指定静态资源目录位置,它只能写在 location 中,当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png;[注意] 使用 alias 末尾一定要添加 / ,并且它只能位于 location 中。

    1. location /image {
    2. alias /opt/nginx/static/image/;
    3. }

    4、location优先级匹配
    配置路径

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

    匹配规则:
    = 精确匹配;
    ^~ 匹配到即停止搜索;
    ~ 正则匹配,区分大小写;
    ~ 正则匹配,不区分大小写;
    通配
    /
    匹配优先级:= > ^~ > ~ > ~
    > 不带任何字符。
    实例:

    1. server {
    2. listen 80;
    3. server_name www.nginx-test.com;
    4. # 只有当访问 www.nginx-test.com/match_all/ 时才会匹配到/usr/share/nginx/html/match_all/index.html
    5. location = /match_all/ {
    6. root /usr/share/nginx/html
    7. index index.html
    8. }
    9. # 当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源
    10. location ~ \.(jpeg|jpg|png|svg)$ {
    11. root /usr/share/nginx/images;
    12. }
    13. # 当访问 www.nginx-test.com/bbs/ 时会匹配上 /usr/share/nginx/html/bbs/index.html
    14. location ^~ /bbs/ {
    15. root /usr/share/nginx/html;
    16. index index.html index.htm;
    17. }
    18. }

    location 中的反斜线 ```nginx location /test { … }

location /test/ { … } 不带 / 当访问 www.nginx-test.com/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ;如果没有 test 目录, nginx 则会找是否有 test 文件。 带 / 当访问 www.nginx-test.com/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ,如果没有它也不会去找是否存在 test 文件。

  1. <a name="reyKE"></a>
  2. ## 4、return
  3. 停止处理请求,直接返回响应码或重定向到其他 URL ;执行 return 指令后, location 中后续指令将不会被执行。<br /> return code [text];<br /> return code URL;<br /> return URL;<br />例如:
  4. ```nginx
  5. location / {
  6. return 404; # 直接返回状态码
  7. }
  8. location / {
  9. return 404 "pages not found"; # 返回状态码 + 一段文本
  10. }
  11. location / {
  12. return 302 /bbs ; # 返回状态码 + 重定向地址
  13. }
  14. location / {
  15. return https://www.baidu.com ; # 返回重定向地址
  16. }

5、rewrite

根据指定正则表达式匹配规则,重写 URL ,上下文:server、location、if;
语法:
rewrite 正则表达式 要替换的内容 [flag];
示例:rewirte /images/(..jpg)$ /pic/$1; # $1是前面括号(..jpg)的反向引用
flag 可选值的含义:

  • last 重写后的 URL 发起新请求,再次进入 server 段,重试 location 的中的匹配;
  • break 直接使用重写后的 URL ,不再匹配其它 location 中语句;
  • redirect 返回302临时重定向;
  • permanent 返回301永久重定向;

    server {
    listen 80;
    server_name fe.lion.club; 
    root html;
    location /search {
     rewrite ^/(.*) https://www.baidu.com redirect;
    }
    
    location /images {
     rewrite /images/(.*) /pics/$1;
    }
    
    location /pics {
     rewrite /pics/(.*) /photos/$1;
    }
    
    location /photos {
    
    }
    }
    按照这个配置我们来分析:
    ● 当访问fe.lion.club/search时,会自动帮我们重定向到https://www.baidu.com。
    ● 当访问fe.lion.club/images/1.jpg时,第一步重写URL为fe.lion.club/pics/1.jpg,找到pics的location,继续重写URL为 fe.lion.club/photos/1.jpg,找到/photos的location后,去html/photos目录下寻找1.jpg 静态资源。
    

    6、if 指令

    语法:if (condition) {…} 上下文:server、location
    示例:

    if($http_user_agent ~ Chrome){
    rewrite /(.*)/browser/$1 break;
    }
    

    condition 判断条件:

  • $variable 仅为变量时,值为空或以0开头字符串都会被当做 false 处理;

  • = 或 != 相等或不等;
  • ~ 正则匹配;
  • ! ~ 非正则匹配;
  • ~* 正则匹配,不区分大小写;
  • -f 或 ! -f 检测文件存在或不存在;
  • -d 或 ! -d 检测目录存在或不存在;
  • -e 或 ! -e 检测文件、目录、符号链接等存在或不存在;
  • -x 或 ! -x 检测文件可以执行或不可执行;

实例:

server {
  listen 8080;
  server_name localhost;
  root html;  
  location / {
   if ( $uri = "/images/" ){
     rewrite (.*) /pics/ break;
    }
  }
}
当访问 localhost:8080/images/ 时,会进入 if 判断里面执行 rewrite 命令。

7、autoindex

用户请求以 / 结尾时,列出目录结构,可以用于快速搭建静态资源下载网站。
autoindex.conf 配置信息:

server {
  listen 80;
  server_name fe.lion-test.club;

  location /download/ {
    root /opt/source;

    autoindex on;                         # 打开 autoindex,,可选参数有 on | off
    autoindex_exact_size on;  # 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出⽂件的确切⼤⼩
    autoindex_format html;         # 以html的方式进行格式化,可选参数有 html | json | xml
    autoindex_localtime off;     # 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间
  }
}
当访问 fe.lion.com/download/ 时,会把服务器 /opt/source/download/ 路径下的文件展示出来

5 变量

Nginx 提供给使用者的变量非常多,但是终究是一个完整的请求过程所产生数据, Nginx 将这些数据以变量的形式提供给使用者。下面列举些项目中常用的变量,常在自定义日志格式时会使用这些内置变量
640.webp

6 反向代理与负载均衡

Nginx配置详解 - 图3
Nginx 实现负载均衡的策略:
轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。
最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。
最快响应时间策略:优先分配给响应时间最短的服务器。
客户端 ip 绑定策略:来自同一个 ip 的请求永远只分配一台服务器,有效解决了动态网页存在的 session 共享问题。

6.1 upstream

用于定义上游服务器(指的就是后台提供的应用服务器)的相关信息。

语法:upstream name {
 ...
}
上下文:http
示例:
upstream back_end_server{
  server 192.168.100.33:8081
}

在 upstream 内可使用的指令:

  • server 定义上游服务器地址;
  • zone 定义共享内存,用于跨 worker 子进程;
  • keepalive 对上游服务启用长连接;
  • keepalive_requests 一个长连接最多请求 HTTP 的个数;
  • keepalive_timeout 空闲情形下,一个长连接的超时时长;
  • hash 哈希负载均衡算法;
  • ip_hash 依据 IP 进行哈希计算的负载均衡算法;
  • least_conn 最少连接数负载均衡算法;
  • least_time 最短响应时间负载均衡算法;
  • random 随机负载均衡算法;

    6.1.1 server

    语法:server address [parameters],上下文:upstream;
    

    parameters 可选值:

  • weight=number 权重值,默认为1;

  • max_conns=number 上游服务器的最大并发连接数;
  • fail_timeout=time 服务器不可用的判定时间;
  • max_fails=numer 服务器不可用的检查次数;
  • backup 备份服务器,仅当其他服务器都不可用时才会启用;
  • down 标记服务器长期不可用,离线维护;

    6.1.2 keepalive

    限制每个 worker 子进程与上游服务器空闲长连接的最大数量。
    keepalive connections,上下文:upstream;
    示例:keepalive 16;
    

    6.1.3 keepalive_requests

    单个长连接可以处理的最多 HTTP 请求个数,上下文:upstream
    语法:keepalive_requests number;
    默认值:keepalive_requests 100;
    

    6.1.4 keepalive_timeout

    空闲长连接的最长保持时间,上下文:upstream;
    语法:keepalive_timeout time;
    默认值:keepalive_timeout 60s;
    

    配置实例

    upstream back_end {
    server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
    keepalive 32;
    keepalive_requests 50;
    keepalive_timeout 30s;
    }
    

    6.2 proxy_pass

    用于配置代理服务器,上下文:location、if、limit_except
    语法:proxy_pass URL;
    示例:
    proxy_pass http://127.0.0.1:8081
    proxy_pass http://127.0.0.1:8081/proxy
    
    URL 参数原则
    1、URL 必须以 http 或 https 开头;
    2、URL 中可以携带变量;
    3、URL 中是否带 URI ,会直接影响发往上游请求的 URL ;
    接下来让我们来看看两种常见的 URL 用法:
    1、proxy_pass http://192.168.100.33:8081
    2、proxy_pass http://192.168.100.33:8081/
    这两种用法的区别就是带 / 和不带 / ,在配置代理时它们的区别可大了:
    1、不带 / 意味着 Nginx 不会修改用户 URL ,而是直接透传给上游的应用服务器;
    2、带 / 意味着 Nginx 会修改用户 URL ,修改方法是将 location 后的 URL 从用户 URL 中删除;
    不带 / 的用法: ```nginx location /bbs/{ proxy_pass http://127.0.0.1:8080; } 分析:
  1. 用户请求 URL :/bbs/abc/test.html
  2. 请求到达 Nginx 的 URL :/bbs/abc/test.html 3 .请求到达上游应用服务器的 URL :/bbs/abc/test.html 带 / 的用法:nginx location /bbs/{ proxy_pass http://127.0.0.1:8080/; } 分析:
  3. 用户请求 URL :/bbs/abc/test.html
  4. 请求到达 Nginx 的 URL :/bbs/abc/test.html
  5. 请求到达上游应用服务器的 URL :/abc/test.html 并没有拼接上 /bbs ,这点和 root 与 alias 之间的区别是保持一致的。

    <a name="J2wCJ"></a>
    ## 6.3 配置反向代理
    上游服务器配置
    ```nginx
    # /etc/nginx/conf.d/proxy.conf
    server{
    listen 8080;
    server_name localhost;
    
    location /proxy/ {
     root /usr/share/nginx/html/proxy;
     index index.html;
    }
    }
    

    代理服务器配置:

    # /etc/nginx/conf.d/proxy.conf
    upstream back_end {
    server 121.42.11.34:8080  weight=2 max_conns=1000 fail_timeout=10s max_fails=3;
    keepalive 32;
    keepalive_requests 80;
    keepalive_timeout 20s;
    }
    server {
    listen 80;
    server_name proxy.lion.club;
    location /proxy {
    proxy_pass http://back_end/proxy;
    }
    }
    

    6.4 配置负载均衡

    配置负载均衡主要是要使用 upstream 指令。
    上游服务器,做如下配置 ```nginx server{ listen 8020; location / { return 200 ‘return 8020 \n’; } }

server{ listen 8030; location / { return 200 ‘return 8030 \n’; } }

server{ listen 8040; location / { return 200 ‘return 8040 \n’; } }

代理服务器,做如下配置
```nginx
upstream demo_server {
  server 121.42.11.34:8020;
  server 121.42.11.34:8030;
  server 121.42.11.34:8040;
}

server {
  listen 80;
  server_name balance.lion.club;

  location /balance/ {
   proxy_pass http://demo_server;
  }
}

6.4.1 负载算法

1、hash

通过制定关键字作为 hash key ,基于 hash 算法映射到特定的上游服务器中。关键字可以包含有变量、字符串,hash $request_uri 表示使用 request_uri 变量作为 hash 的 key 值,只要访问的 URI 保持不变,就会一直分发给同一台服务器。

upstream demo_server {
  hash $request_uri;
  server 121.42.11.34:8020;
    .......
}

2、ip_hash

根据客户端的请求 ip 进行判断,只要 ip 地址不变就永远分配到同一台主机。它可以有效解决后台服务器 session 保持的问题。
ip_hash;

3、最少连接数算法

各个 worker 子进程通过读取共享内存的数据,来获取后端服务器的信息。来挑选一台当前已建立连接数最少的服务器进行分配请求。
least_conn;

7 配置缓存

缓存可以非常有效的提升性能,因此不论是客户端(浏览器),还是代理服务器( Nginx ),乃至上游服务器都多少会涉及到缓存。可见缓存在每个环节都是非常重要的。下面让我们来学习 Nginx 中如何设置缓存策略。

7.1 proxy_cache

存储一些之前被访问过、而且可能将要被再次访问的资源,使用户可以直接从代理服务器获得,从而减少上游服务器的压力,加快整个访问速度,上下文:http、server、location
语法:proxy_cache zone | off ; # zone 是共享内存的名称
默认值:proxy_cache off;

7.2 proxy_cache_path

设置缓存文件的存放路径,上下文:http
语法:proxy_cache_path path [level=levels] …可选参数省略,下面会详细列举
默认值:proxy_cache_path off
参数含义:

  • path 缓存文件的存放路径;
  • level path 的目录层级;
  • keys_zone 设置共享内存;
  • inactive 在指定时间内没有被访问,缓存会被清理,默认10分钟;

    7.3 proxy_cache_key

    设置缓存文件的 key,上下文:http、server、location
    语法:proxy_cache_key
    默认值:proxy_cache_key $scheme$proxy_host$request_uri;

    7.4 proxy_cache_valid

    配置什么状态码可以被缓存,以及缓存时长,上下文:http、server、location
    语法:proxy_cache_valid [code…] time;
    配置示例:proxy_cache_valid 200 304 2m;; # 说明对于状态为200和304的缓存文件的缓存时间是2分钟

    7.5 proxy_no_cache

    定义相应保存到缓存的条件,如果字符串参数的至少一个值不为空且不等于”0”,则将不保存该响应到缓存,上下文:http、server、location
    语法:proxy_no_cache string;
    示例:proxy_no_cache $http_pragma $http_authorization;

    7.6 proxy_cache_bypass

    定义条件,在该条件下将不会从缓存中获取响应,上下文:http、server、location
    语法:proxy_cache_bypass string;
    示例:proxy_cache_bypass $http_pragma $http_authorization;

    7.7 upstream_cache_status 变量

    它存储了缓存是否命中的信息,会设置在响应头信息中,在调试中非常有用。
    MISS: 未命中缓存
    HIT:命中缓存
    EXPIRED: 缓存过期
    STALE: 命中了陈旧缓存
    REVALIDDATED: Nginx验证陈旧缓存依然有效
    UPDATING: 内容陈旧,但正在更新
    BYPASS: X响应从原始服务器获取

    7.8 配置实例

    上游服务器配置 ```nginx server { listen 1010; root /usr/share/nginx/html/1010; location / { index index.html; } }

server { listen 1020; root /usr/share/nginx/html/1020; location / { index index.html; } }

代理服务器配置
```nginx
proxy_cache_path /etc/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=2g inactive=60m use_temp_path=off;

upstream cache_server{
  server 121.42.11.34:1010;
  server 121.42.11.34:1020;
}

server {
  listen 80;
  server_name cache.lion.club;
  location / {
    proxy_cache cache_zone;                 # 设置缓存内存,上面配置中已经定义好的
    proxy_cache_valid 200 5m;             # 缓存状态为200的请求,缓存时长为5分钟
    proxy_cache_key $request_uri;     # 缓存文件的key为请求的URI
    add_header Nginx-Cache-Status $upstream_cache_status # 把缓存状态设置为头部信息,响应给客户端
    proxy_pass http://cache_server; # 代理转发
  }
}

我们可以在 /etc/nginx/cache_temp 路径下找到相应的缓存文件。
对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来看看如何配置不缓存的内容。

server {
  listen 80;
  server_name cache.lion.club;
  # URI 中后缀为 .txt 或 .text 的设置变量值为 "no cache"
  if ($request_uri ~ \.(txt|text)$) {
   set $cache_name "no cache"
  }

  location / {
    proxy_no_cache $cache_name;         # 判断该变量是否有值,如果有值则不进行缓存,如果没有值则进行缓存
    proxy_cache cache_zone;                 # 设置缓存内存
    proxy_cache_valid 200 5m;             # 缓存状态为200的请求,缓存时长为5分钟
    proxy_cache_key $request_uri;     # 缓存文件的key为请求的URI
    add_header Nginx-Cache-Status $upstream_cache_status # 把缓存状态设置为头部信息,响应给客户端
    proxy_pass http://cache_server; # 代理转发
  }
}

8 配置开启 gzip 压缩

GZIP 是规定的三种标准 HTTP 压缩格式之一。目前绝大多数的网站都在使用 GZIP 传输 HTML 、CSS 、 JavaScript 等资源文件。对于文本文件, GZiP 的效果非常明显,开启后传输所需流量大约会降至 1/4~1/3 。
并不是每个浏览器都支持 gzip 的,如何知道客户端是否支持 gzip 呢,请求头中的 Accept-Encoding 来标识对压缩的支持。
Nginx配置详解 - 图4
启用 gzip 同时需要客户端和服务端的支持,如果客户端支持 gzip 的解析,那么只要服务端能够返回 gzip 的文件就可以启用 gzip 了,我们可以通过 Nginx 的配置来让服务端支持 gzip 。下面的 respone 中 content-encoding:gzip ,指服务端开启了 gzip 的压缩方式。
Nginx配置详解 - 图5
# 默认off,是否开启gzip,以下两个参数开启就可以支持Gzip压缩了
gzip on;
# 要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# 默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容;
gzip_static on;
# 默认 off,nginx做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩;
gzip_proxied any;
# 用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩;
gzip_vary on;
# gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6;
gzip_comp_level 6;
# 获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得;
gzip_buffers 16 8k;
# 允许压缩的页面最小字节数,页面字节数从header头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大;
gzip_min_length 1k;
# 默认 1.1,启用 gzip 所需的 HTTP 最低版本;
gzip_http_version 1.1;

Nginx 模块化管理机制

Nginx 的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。Nginx 的模块是互相独立的,低耦合高内聚。

Nginx配置详解 - 图6