nginx常用配置
Star Sea

配置文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
worker_processes  1# worker进程的数量
events { # 事件区块开始
worker_connections 1024# 每个worker进程支持的最大连接数
} # 事件区块结束
http { # HTTP区块开始
include mime.types; # Nginx支持的媒体类型库文件
default_type application/octet-stream; # 默认的媒体类型
sendfile on# 开启高效传输模式
keepalive_timeout 65# 连接超时
server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80# 提供服务的端口,默认80
server_name localhost; # 提供服务的域名主机名
location / { # 第一个location区块开始
root html; # 站点的根目录,相当于Nginx的安装目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
} # 第一个location区块结果
error_page 500502503504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html; # 指定对应的站点目录为html
}
}

location的匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#优先级1,精确匹配,根路径
location =/ {
return 400;
}

#优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
location ^~ /av {
root /data/av/;
}

#优先级3,区分大小写的正则匹配,匹配/media*****路径
location ~ /media {
alias /data/static/;
}

#优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/av/;
}

#优先7,通用匹配
location / {
return 403;
}

常用全局变量

变量 含义
$args 这个变量等于请求行中的参数,同$query_string
$content length 请求头中的Content-length字段。
$content_type 请求头中的Content-Type字段。
$document_root 当前请求在root指令中指定的值。
$host 请求主机头字段,否则为服务器名称。
$http_user_agent 客户端agent信息
$http_cookie 客户端cookie信息
$limit_rate 这个变量可以限制连接速率。
$request_method 客户端请求的动作,通常为GET或POST。
$remote_addr 客户端的IP地址。
$remote_port 客户端的端口。
$remote_user 已经经过Auth Basic Module验证的用户名。
$request_filename 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme HTTP方法(如http,https)。
$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name 服务器名称。
$server_port 请求到达服务器的端口号。
$request_uri 包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。
$uri 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri 与$uri相同。

缓存配置

配置缓存时间

1
2
3
4
location ~* .(gif|jpg|png|bmp|ico)$ {
#设置缓存时间
expires 1d;
}

使用协商缓存

1
2
3
4
5
location / {
root html;
index index.html index.htm;
add_header Cache-Control no-store;
}

禁止缓存

1
2
3
4
5
location / {
root html;
index index.html index.htm;
add_header Cache-Control no-store;
}

缓存相关标识

Etag

Etag 是一种作为web资源关联的标记,由响应头传送给客户端,下次请求会通过请求头 If-None-Match 带上,若服务器资源未发生变化,则返回 304 状态码。它主要是为了解决 Last-Modified 上的一些不足,比如,

  1. 某些文件修改是在秒级以下速度进行修改,但If-Modified-Since 能检查到的粒度是s级的。采用弱 Etag,此时它是基于 MTime 来生成,只能精确到s,所以1s秒内生成的 Etag 是一样的。可以避免强 Etag 造成的频繁缓存刷新。弱 Etag 以 W/ 开头。
  2. 某些文件会周期性变更,但其内容是不变化的,此时我们不希望它被认为被修改了等。
  3. 某些服务器不能精准获取文件的最后修改时间。

    文件存储

    from memory cache
    不请求网络资源,资源存储在内存中,一般存储的有字体、图片、脚本。
    from disk cache
    不请求网络资源,资源存储在磁盘中,一般存储非脚本资源,如css。

    try_files

    Vue项目中设置history模式需要设置try_files。
    try_file 后面必须有一个file, 一个 url 或 code,file 可以有多个。
    简单来说,try_file 按顺序检查 file,如果是文件夹,请在 file后加 / ,如果 file 都不存在,根据最后一个参数做跳转。
    @ 在location 中的用法。 @ 相当于命名了一个变量。
    1
    2
    3
    4
    5
    6
    7
    8
    location / {
    try_files /system/maintenance.html
    $uri $uri/index.html $uri.html
    @mongrel;
    }
    location @mongrel {
    proxy_pass http://mongrel;
    }
    单页应用中设置如下:
    1
    2
    3
    location / {
    try_files $uri $uri/ /index.html
    }

    pass_proxy 代理

    不带斜杠

    前端 /api/user
    后端 /api/user
    1
    2
    3
    location ^~ /api/ {
    proxy_pass http://127.0.0.1:3001;
    }
    不带斜杠把 path 直接拼接在 url后面;

    带斜杠

    前端 /api/user
    后端 /user
    1
    2
    3
    location ^~ /api/ {
    proxy_pass http://127.0.0.1:3001/;
    }
    带斜杠会先去掉匹配到的 path, 再拼接。

    正则匹配的时候不能带斜杠

    ~ 区分大小写正则匹配 ,~* 不区分大小写正则匹配 。location 用正则匹配的时候,proxy_pass 后面不能以 / 结尾,因为 nginx 不能处理这种情况。一下这种情况不可行
    1
    2
    3
    location ~ /api/ {
    proxy_pass http://127.0.0.1:3001/;
    }

    斜杠后面加路径

    前端 /api/user
    后端 /web/api/user
    1
    2
    3
    location ^~ /api/ {
    proxy_pass http://127.0.0.1:3001/web$request_uri;
    }

    代理之前rewrite

    1
    2
    3
    4
    location /search/ {
    rewrite /search/([^/]+) /s?wd=$1 break;
    proxy_pass http://127.0.0.1:3001;
    }

    gzip

    1
    2
    3
    4
    server{
    gzip on;
    gzip_min_length 0;
    }
    gzip 指令默认是 off,设置为 on 打开 gzip。如果只设置 gzip on gzip 可有不会生效,gzip 默认只对大于20字节的内容做处理。我们在测试的时候页面内容都很少,很容易少于 20 字节 gzip_min_length设为 0 代表所有大小都压缩。

    指定需要 gzip 的文件

    gzip 默认只压缩 text/html 类型的文件,如下添加css文件
    1
    gzip_types text/html,text/css;

    压缩级别

    gzip 有9个压缩级别,越高,压缩效果越好,但是对 cpu 的消耗越多。默认压缩级别为 1 。我们可以设置一个合适的级别,比如 2;
    1
    gzip_comp_level 2;

    gzip_static

    以先把文件压缩成 gzip,nginx 直接拿 gzip 过的文件就行了。预处理的好处不光是节省了 cpu 压缩时间,还可以 让 nginx 可以使用 sendfile 系统调用来传输文件,性能得到提高。
    为了能直接拿 gzip 过的文件,需要 gzip_static 模块。 新版本的 nginx 已经默认安装了这个模块,如果是老版的 nginx 这个模块需要安装一下。
    1
    gzip_static always; 
    gzip_static 可以有三个值。
  • off 默认值。 不启用 gzip_static。gzip功能还是可以用的。
  • on 启用。 当客户端支持 gzip的时候,发送压缩文件,不支持的时候发送原文件。
  • always 总是。 不管客户端是否支持,都优先发送压缩文件。如果没有压缩文件,再发送原文件。

    负载均衡

    通过upstream置顶,轮询依次访问服务器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    upstream servers {
    server 192.168.1.1;
    server 192.168.1.2;
    }

    server {
    listen 80;
    server_name _;
    location / {
    proxy_pass http://servers;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
    设置权重
    1
    2
    3
    4
    upstream servers {
    server 192.168.1.1 weight=1;
    server 192.168.1.2 weight=2;
    }
    根据IP分配请求,保持session
    1
    2
    3
    4
    5
    upstream servers {
    ip_hash;
    server 192.168.1.1 ;
    server 192.168.1.2 ;
    }
    根据url分配请求,这样可以实现静态资源来自同一服务器,做缓存处理
    1
    2
    3
    4
    5
    upstream servers {
    hash $request_uri;
    server 192.168.1.1 ;
    server 192.168.1.2 ;
    }
    最小连接数设置。遍历后端集群,比较每个后端的conns/weight(连接数除权重),选取该值最小的后端。 如果有多个后端的 conns/weight 值同为最小,那么对它们采用加权轮询算法。
    1
    2
    3
    4
    5
    upstream servers {
    least_conn;
    server 192.168.1.1 weight=2;
    server 192.168.1.2 weight=1 ;
    }