[toc]

介绍

Nginx 是介于客户端与服务端的

特点: 1. 稳定性极强, 7*24小时不间断运行 2. 丰富的配置示例 3. 占用内存小,并发能力强(50000以上并发)

tomcat 150个并发

安装

windows 安装:

  • 下载,解压到任意目录,进入包含 Nginx.exe 的目录,打开命令窗口,进入到该目录,运行 start nginx

如果启动失败 可以进入 logs 文件夹中的 error.log 文件产看是否有错误原因

启动成功后在任务管理器可以看到 nginx 的进程

  • 浏览器访问 http://127.0.0.1/locahost

其它的一些操作

nginx -s stop 立即停止nginx,不保存相关信息

nginx -s quit 正常退出nginx,并保存相关信息

nginx -s reload 重启: 改变了配置等

第一次安装  service nginx start 启动一下

在安装目录下执行  ./nignx -v

安装

centeOS

默认安装地址 /etc/nginx

  • 安装 yum -y install nginx
  • 卸载 yum remove nginx

开启和停止等 查看 systemctl 命令

Ubuntu

sudo apt install nginx

nginx -t 显示信息 配置文件地址 进入配置文件后查看引入的文件 即可找到对应的默认配置


  • 开了端口后 需要开防火墙

root 与 alias 的区别:

主要在于怎么解释 location 后面的 url

root的处理结果是:root路径+location路径

alias的处理结果是:使用alias路径替换location路径 (注意alias后面视情况是否要用 '/' 结束)

示例: 假设访问地址是 /t/x.html

location /t/ {
    root http://www.xx.xx/   
    # 映射为  http://www.xx.xx/t/x.html

    alias http://www.xx.xx/   
    # 映射为  http://www.xx.xx/x.html
}   

  • 一个 server 块中可以有多个 location

  • 更多默认配置和查看新安装的 Nginx 的 nginx.conf 文件

http 缓存

  • 强制缓存 (浏览器不会向服务器发送任何请求,直接从本地缓存中读取缓存数据并返回 200 (disk cache | memory cache) 状态码)

两种方式: (https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control)

  • Expires:Wed, 22 Oct 2018 08:41:00 GMT 该时间后过期 (Header上设置, 是 HTTP1.0 中的内容),该值是有服务端生成,而客户端的时间和服务端的时间有可能不一致,导致存在一定误差

  • Cache-Control (Header上设置, HTTP/1.1 优先级高于Expire)

# 可缓存性
public      # 表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,允许cdn缓存
private     # 表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:用户的本地浏览器,禁止cdn缓存
no-cache    # 浏览器会缓存资源,但每次都会向服务器确认资源是否发生改变,进行验证 (协商缓存验证)。
no-store    # 不使用任何缓存

# 过期相关
max-age=30          # 30s后过期
s-maxage=<seconds>  # 设置共享缓存。cdn缓存时长 会覆盖max-age和expires,私有缓存会忽略它
max-stale=秒数      # 客户端愿意接收一个已经过期的资源
min-fresh=秒数      # 客户端希望在指定的时间内获取最新的响应

# 重新验证和加载
must-revalidate    # 一旦资源过期(比如已经超过max-age),向服务器获取新资源
proxy-revalidate
  • 其它请求头
Pragma no-cache    # 用来向后兼容只支持 HTTP/1.0 协议的缓存服务器,它的行为与 Cache-Control: no-cache 一致
Last-modified Date # 资源上次修改时间
Etag string        # 资源的标识,一般为md5或者hash值
  • 协商缓存 协商缓存会先向服务器发送一个请求,服务器会根据这个请求的 request header 的一些参数来判断是否命中协商缓存,如果命中,则返回 304 状态码并带上新的 response header 通知浏览器从缓存中读取资源。

  • 使用 HTTP / 2.0

  • 预加载

配置html不缓存示例

location / {
    root   html;
    index  index.html index.htm;

    # ~* 指定正则表达式返回 true 判断匹配不区分大小写
    # 控制 html 不缓存
    if ($request_filename ~* ^.*?.html$) {
        add_header Cache-Control "private, no-store";
    }

    # 处理其它文件
    if ( $request_uri ~* /((.*)\.html?)?$ ) {
        add_header Cache-Control no-cache;
    }
    if ( $request_uri ~* /.*\.(js|css)$ ) {
        add_header Cache-Control max-age=86400;
    }
}

配置 点击劫持

location / {
    root   html;
    index  index.html index.htm;

    add_header X-Frame-Options DENY always;
    # 如果指定了 always 参数 (1.7.5),则无论响应代码如何,都将添加标头字段。
}
#user  nobody;
worker_processes  1;
#pid        logs/nginx.pid;


# 以上为全局块 
# worker_processes 数值越大,Nginx 并发能力越强
# error_log  错误日志存放的位置
# pid  一般不用关注  Nginx 运行的标志

events {
    worker_connections  1024;
}

# events块  
# worker_connections 数值越大,Nginx 并发能力越强(这里的数据值一般是运维人员根据服务器来配置, worker_processes 也是如此)


# 以下为http块
# include 引入一个外部的文件 mime.types 里面放着大量的媒体类型

http {
    include       mime.types;
    # 这里是默认使用的媒体类型
    default_type  application/octet-stream;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip on;
    # 动态压缩: 对每个请求先压缩再输出
    # 静态压缩: 使用现成的名为 .gz 的压缩文件
 
    # gzip_static on; 
    # 返回头中会出现 Content-Encoding: gzip
    # 读取预先压缩的gz文件

    # gzip_vary on; 
    # 如果代理服务器不使用 Vary,纯粹只是根据 请求URL和请求方法 来判断是否缓存命中,那不支持解压功能的 客户端 就可能会错误拿到代理服务器中的被压缩过的 # 数据;所以多加一层判断
    # 返回响应头增加 Vary: Accept-Encoding ;客户端请求头 一般会携带支持的类型 Accept-Encoding:gzip, deflate, br
    
    # gzip_proxied any;
    # 禁止IE使用gzip 以免假死
    gzip_disable "MSIE [1-6].";
    # 不压缩小于256字节的文件
    gzip_min_length 256; 
    # gzip_proxied any;
    # gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
    gzip_comp_level 2;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # 表示压缩的文件类型
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    # server块
    # 这里的server块也可以通过 include 方式加载,可将server块独立开来,因为后期主要修改几乎为server块
    # 引入的文件内容格式 
    # server {
    # }
    server {
        # Nginx 监听的端口号
        listen       80;
        # 监听 ipv6的地址
        # listen [::]:80
        # Nginx接收请求的的域名
        server_name  localhost;

        # location块
        location / {
            # 重定向到指定地址
            # proxy_pass http://localhost:2500/page/one;
            
            # 将接收到的请求,根据 html  这个地址去查找静态资源
            # 默认 /usr/share/nginx/html  或者  /var/www/html(当前是默认的这个)  具体的看配置文件,一般是 include 进来
            root   html;
            # 默认去上面的路径中查找 index.html 或者 index.htm
            index  index.html index.htm;
        }
    }
}

关于 location 的路径映射

优先级:

(location = ) > (location /xxx/xx/x) > (location ^~) > (location ~, ~*) > (location /起始路劲) > (location /)

  1. = 匹配
location = / {
    # 精准匹配 主机域名后面不能带任何的字符串
}
  1. 通用匹配
location /xxx {
    # 匹配所有以 /xxx 开头的路径
}
  1. 正则匹配
location ~/xxx {
    # 匹配所有以 /xxx 开头的路径
}
  1. 匹配开头路径
location ^~/xxx {
    # 匹配所有以 /xxx 开头的路径
}
  1. 匹配结尾
location ~* \.(gif|jpg)$ {
    # 匹配所有以 .gif 或 .jpg 结尾的路径
}

反向代理

正向代理:

  1. 代理服务器是由客户端设立的
  2. 客户端了解代理服务器和目标服务器是谁
  3. 帮助实现突破访问权限、提高访问速度、对目标服务器隐藏客户端的ip

反向代理:

  1. 反向代理服务器放在服务端
  2. 客户端不知道访问的是哪一台服务器
  3. 达到负载均衡,并且可以隐藏服务器的真正ip

负载均衡

根据相应的算法决定请求是发给哪个服务器

处理策略:

  1. 轮询 轮流给每一个服务器派发 客户端的请求,平均分配
upstream myServer {
    # server ip:port;
    server localhost:2500;
    server localhost:1112;
}
server {
    location / {
        proxy_pass http://myServer;
    }
}
  1. 权重 根据具体的服务器的处理能力,派发客户端的请求

只需加上 weight

upstream myServer {
    server localhost:2500 weight=10;
    server localhost:1112 weight=2;
}
  1. ip_hash 对请求ip 进行相关的处理,然后请求指定的服务器,如果ip 不变,请求的服务器将一直不变
upstream myServer {
    ip_hash;
    # 下面是否加权重与 ip_hash无关
    server localhost:2500 weight=10;
    server localhost:1112 weight=2;
}

动静分离

动态资源 静态资源 分离

动态资源交给服务器,静态资源自己处理

Nginx 并发能力公式: worker_processes * worker_connections / (4 | 2) = 最终并发能力

动态资源除以4(因为多了请求服务器数据和接收服务器数据),静态资源除以2

  1. 动态资源代理
location / {
    proxy_pass  url;
}
  1. 静态资源代理
location / {
    root 静态资源路径;
    index  默认访问路径下的什么资源;
    autoindex on; # 表示展示静态资源全部内容 以列表的形式
}

# 存在目录 /static/static 和 /static/image 
# 以下配置生效
location /static {
    root static;
    index index.html;
}

location /image {
    root static;
    autoindex on;
}

集群

搭建集群后,使用Nginx做反向代理服务器

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user root;
worker_processes 2;
error_log /root/software/nginx/nginx-1.18.0/logs/error.log;
pid /root/software/nginx/nginx-1.18.0/run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

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

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /root/software/nginx/nginx-1.18.0/conf/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /root/software/nginx/nginx-1.18.0/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            index  index.html index.htm;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}
Last Updated:
Contributors: Warren, Warren