4. 感受 nginx 指令二

75 阅读3分钟

静态和动态资源

  • 静态资源: 一般客户端发送请求到 web 服务器, web 服务器 从内存取到相应的文件,返回给客户端,客户端解析并渲染显示出来
  • 动态资源: 客户端请求的动态资源,先将请求交于 web 容器, web 容器连接数据库,数据库处理数据之后,将内容交给 web 服务器, web 服务器返回给客户端解析渲染处理

nginx 做代理

  1. cd /usr/local/etc/nginx
  2. vi nginx.conf
http {

    server {
        listen 8081;
        server_name localhost;

        location / {
            root html;
            index index.html index.htm;
            # 使用外面的 req_zone 来限定当前的请求
            limit_req zone=req_zone;
            limit_conn conn_zone 1;
        }

        # 如果访问的是以 api 开头的,则代理到 http://localhost:8000; 
        # 即如果访问了 http://localhost:8081/api/xxx 
        # 则回被代理到 http://localhost:8000 并将其返回的内容 返回给 api/xxx 
        location ~ ^/api {
            proxy_pass http://localhost:8000;
        }

    }
  
}
  1. sudo brew services start/restart nginx [开启或重启nginx]
  2. 新建一个服务, 比如 app.js
const http = require("http");

http
  .createServer((req, res) => {
    res.writeHead(200, { "Content-Type": "application/json" });

    res.end(
      JSON.stringify({
        data: "Hello World",
      })
    );
  })
  .listen(8000, () => {
    console.log("node server running at: http://localhost:8000");
  });
  1. node app.js 开启8000服务
  2. 访问 http://localhost:8081/api/user 将会得到 {data: "Hello World"} 字符化的内容,说明代理成功

tcp_nopush (适合下载)

在 sendfile 开启的情况下,合并多个数据包,提供网络包的传输效率

Syntax: tcp_nopush on/off;
Default: tcp_nopush off;
Context: http, server, location;

tcp_nodelay (适合实时性高的情况)

在 keepalive 连接下,提高网络包的传输实时性, 只要有数据包,就进行数据传输(不会进行多个数据包进行传输)

Syntax: tcp_nodelay on/off;
Default: tcp_nopush off;
Context: http, server, location;

gizp

压缩文件可以节约宽带和提高网络传输效率

Syntax: gzip on/off;
Default: gzip off;
Context: http, server, location;

gizp_comp_level

压缩比率高,文件被压缩的体积越小

Syntax: gzip_comp_level level; # level 是 number 类型
Default: gzip_comp_level 1;
Context: http, server, location;

gzip_static

先去找磁盘上同名的 .gz 文件,如果找到直接 返回给 请求者,节约 CPU 的压缩时间和性能损耗

简单demo

#user  nobody;
worker_processes 1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
  worker_connections 1024;
}


http {
  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 logs/access.log main;

  sendfile on;
  #tcp_nopush     on;

  #keepalive_timeout  0;
  keepalive_timeout 65;

  limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
  limit_conn_zone $binary_remote_addr zone=conn_zone:10m;

  #gzip  on;

  server {
    listen 8081;
    server_name localhost;

    # ~ 表示精准匹配,如果是jpg,png,gif 类型的图片则不需要压缩,因为他们已经是高压缩过的,再压缩意义不大
    location ~ .*.(jpg|png|gif) {
      gzip off;
      root html;
    }


    location ~ .*.(html|js|css) {
      gzip on;
      gzip_min_length 1k;
      gzip_http_version 1.1; # 满足 http 版本的约束
      gzip_comp_level 9;
      gzip_types text/css application/javascript;
      root html; # 静态服务根目录
    }

    location ~ ^/download {
      gzip_static on; # 如果后端有压缩的文件则直接返回 压缩的文件,避免服务器再去将文件压缩后发给客户端
      tcp_nopush on; # 延迟推送
      root html;
    }

    location / {
      root html;
      index index.html index.htm;
      # 使用外面的 req_zone 来限定当前的请求
      limit_req zone=req_zone;
      limit_conn conn_zone 1;
    }

    location ~ ^/admin.html {
      deny 192.168.1.7;
      allow all;
    }
    
    # 如果访问的是以 api 开头的,则代理到 http://localhost:8000; 服务
    location ~ ^/api {
      proxy_pass http://localhost:8000;
    }
    #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;
    }

  }

  include servers/*;
}