配置文件结构
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; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500502503504 /50x.html; location = /50x.html { root 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
| location =/ { return 400; }
location ^~ /av { root /data/av/; }
location ~ /media { alias /data/static/; }
location ~* .*\.(jpg|gif|png|js|css)$ { root /data/av/; }
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 上的一些不足,比如,
- 某些文件修改是在秒级以下速度进行修改,但If-Modified-Since 能检查到的粒度是s级的。采用弱 Etag,此时它是基于 MTime 来生成,只能精确到s,所以1s秒内生成的 Etag 是一样的。可以避免强 Etag 造成的频繁缓存刷新。弱 Etag 以 W/ 开头。
- 某些文件会周期性变更,但其内容是不变化的,此时我们不希望它被认为被修改了等。
- 某些服务器不能精准获取文件的最后修改时间。
文件存储
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/user1 2 3
| location ^~ /api/ { proxy_pass http://127.0.0.1:3001; }
|
不带斜杠把 path 直接拼接在 url后面;带斜杠
前端 /api/user
后端 /user1 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/user1 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;
gzip_static
以先把文件压缩成 gzip,nginx 直接拿 gzip 过的文件就行了。预处理的好处不光是节省了 cpu 压缩时间,还可以 让 nginx 可以使用 sendfile 系统调用来传输文件,性能得到提高。
为了能直接拿 gzip 过的文件,需要 gzip_static 模块。 新版本的 nginx 已经默认安装了这个模块,如果是老版的 nginx 这个模块需要安装一下。
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分配请求,保持session1 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 ; }
|