1. 实用命令
命令参数 | 含义 |
---|---|
nginx | 启动 |
nginx -V | 查看当前版本 和 编译信息 |
nginx -t | 检查配置文件语法是否正确 |
nginx -s stop | 直接关闭worker子进程 |
nginx -s quit | 等待worker子进程正确完请求后关闭 |
nginx -s reload | 重读配置文件 |
2.几个实用场景
静态站点 ```shell
配置静态资源,将纯前端静态页面放在系统目录下,交由Nginx解析
server { listen 80; server_name localhost;
location / {
root /opt/nginx/html;
index index.html index.htm;
} }
实际使用中可能会如下所示
server {
listen 12000;
server_name 127.0.0.1;
charset utf-8;
location ~ (^/patrol-station)*.(htm|html|GIF|JPG|JPEG|PNG|BMP|SWF|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|xlsx|mp3|wma|js|css|woff|otf|svg|json|ttf|TTF|woff2|unity3d|unityweb|assetbundle|mp4)$ {
proxy_pass http://172.17.0.1:3300;
}
location ^~ /3D {
alias /usr/local/qif/dsa5200/web/Route2.0;
index index.html;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location ^~ /apiDoc {
alias /usr/local/qif/dsa5200/apiDoc/;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8,gbk;
}
2. **反向代理**
> 1. 反向代理用户客户端访问代理服务器,被按照一定规则从代理服务器中获取响应资源,并返回给客户端代理模式;
>
```shell
# 七层反向代理
server {
listen 8088;
server_name localhost;
location / {
proxy_pass https://www.baidu.com;
}
}
# 四层反向代理 - TCP/UDP 的四层流量。核心模块式stream,编译安装时,配置增加"--with-stream"
stream {
server {
listen 3306;
# 访问本机的3306,就被转发到了远程的3306
proxy_pass 172.17.0.1:3306;
}
}
- 负载均衡 | 指令 | 含义 | | —- | —- | | upstream | 段名,中间定义上游服务url | | server | 定义上游服务器地址 | | zone | 定义共享内存,用于跨worker子进程共享数据 | | keepalive | 对上游服务启动长连接,每个worker子进程与上游服务器空闲长连接数量(keepalive 16,处理完后仅仅保留16个连接) | | keepalive_requests | 一个场链接可以处理的最多请求个数 | | keepalive_timeout | 空闲情况,一个场链接的超时时长,超过后毁掉场链接 | | hash | 负载均衡算法: hash | | ip_hash | 负载均衡算法: 依据IP进行hash计算 | | least_conn | 负载均衡算法: 最少连接数 | | least_time | 负载均衡算法: 最短相应时间 | | random | 负载均衡算法: 随机 |
server可选参数:
指令 | 含义 |
---|---|
weight=number | 权重值,默认为1 |
max_conns=number | 上游服务器的最大并发连接数 |
fail_timeout=time | 服务器不可用的判定时间(10s内不可达3次,这10s后依然还是会转发过去) |
max_fails=number | 服务器不可用的检查次数 |
backup | 备份服务器,仅当其他服务器都不可用时 |
down | 表计服务器长期不可用,离线维护 |
负载均衡算法:
# 1. 轮询(默认)
upstream backend {
# 默认所有服务器权重为 1
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
# 2. weight-权重轮询
upstream backend {
server 192.168.1.1:8080 weight=3;
server 192.168.1.2:8080 weight=2;
# default weight=1
server 192.168.1.3:8080;
}
# 3. hash
## hash $request_uri: 根据这个变量的哈希值来负载
upstream backend {
hash $request_uri;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
# 4. ip_hash
# 每个请求访问ip的hash结果,每个访客固定访问一个后端服务器,是session共享问题的解决方案之一
upstream backend {
ip_hash;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
# 5. 最少连接数
# leaset_conn: 多个worker子进程同时处理请求,无法共享后端服务器的连接窗台;
# zone zone_name 1M, 开辟共享内存
upstream backend {
least_conn;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
Https加密传输 ```shell
需要安装一个https的模块ssl
server { listen 443 ssl; server_name localhost;
证书部分
ssl_certificate /usr/local/nginx/conf/ssl/https.crt; #RSA证书 ssl_certificate_key /usr/local/nginx/conf/ssl/https.key; #RSA密钥
TLS 握手优化
会话缓存的存储大小为1MB
ssl_session_cache shared:SSL:1m;
会话缓存的超时时间为5分钟
ssl_session_timeout 5m; keepalive_timeout 75s; keepalive_requests 100; location / {
root html;
index index.html index.htm;
} }
<br />
5. **文件服务器**
```shell
server {
listen 8004;
server_name localhost;
# 正常显示中文,windows服务器下中文目录无法下钻,目前无解
charset gbk,utf-8;
# 打开autoindex功能,以/结尾的请求
autoindex on;
# 显示文件的大小,
# on:以字节显示
# off:人性化显示,文件过大会显示为mb或gb
autoindex_exact_size off;
# 以哪种格式返回:html | xml | json | jsonp
# 默认值: autoindex_format html
autoindex_format html;
# 显示时间格式
# on: 12-Jul-2019 10:11(当前时区)
# off: 12-Jul-2019 02:11(0时区,GMT)
autoindex_localtime on;
location / {
root /data/files/;
# 如果a.html文件存在,则会返回a.html内容,否则才会返回目录内容
index a.html;
}
}
# 限速
1. limit_conn - 限制客户端并发连接数; 使用共享内存,对所有worker子进程生效
2. limit_req - 限制客户端处理请求的平均速率; 使用共享内存,所有worker子进程生效; leaky_bucket(漏桶)
http {
include mime.types;
default_type application/json;
# limit_conn_zone key zone=name:size
# key:用于定义客户端的唯一标识来限速,如remote_addr
# name:任意名称
# size:共享内存大小空间,m为单位
# binary_remote_addr 使用4个字节空间,高效;remote_addr 使用7-15个字节空间
limit_conn_zone $binary_remote_addr zone=limit_addr:10m;
# limit_req_zone key zone=name:size rate=rate;
# 上下文:http
# rate:表示允许相同标识的客户端的访问频次,12r/m的,即限制每5秒访问一次,每5秒才处理一个请求。
limit_req_zone $binary_remote_addr zone=limit_req:15m rate=12r/m;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
# 触发限速后,返回状态码,默认503
# 上下文:http, server, location
limit_conn_status 503;
# 当触发限速后,错误日志出记录一条日志, 这里用于定义日志等级
# info|notice|warn|error
# 上下文:http, server, location
# 默认值:error
limit_conn_log_level warn;
# limit_conn zone number;
# zone:用limit_conn_zone中定义的zone名称
# number:以zone为标识的客户端被允许的同时最大连接数
limit_conn limit_addr 2;
# 定义响应数据的传输速度,bytes/s
# 本指令属于ngx_http_core_module,不属于ngx_http_limit_conn_module
limit_rate 50;
# limit_req_status code(http的状态码)
# 默认值:503
# 上下文:http, server, location
limit_req_status 504;
# 触发限速后,日志记录的等级
# info|notice|warn|error
# 默认值:error
# 上下文:http, server, location
limit_req_log_level notice;
# limit_req zone=name [burst=number] [nodelay | delay=number];
# burst:桶大小,设置一个大小为x的缓冲区,当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内等待,但是这个等待区里的位置只有5个,超过的请求会直接报503的错误然后返回。
# nodelay:如果设置,会在瞬时提供处理(burst + rate)个请求的能力,请求超过(burst + rate)的时候就会直接返回503,永远不存在请求需要等待的情况。
# 上下文:http, server, location
# limit_req zone=limit_req burst=7 nodelay;
limit_req zone=limit_req;
}
}
}
黑白名单 ```shell
access -限制特定IP或网段访问(allow、 deny)
server { listen 80; server_name localhost; location / {
# allow address | CIDR | UNIX | all
# 默认值
# 上下文:http, server, location, limit_except
allow 192.168.0.1/24;
# deny address | CIDR | UNIX | all
# 默认值
# 上下文:http, server, location, limit_except
deny all;
} }
7. **请求拦截**
```shell
# auth_request - 基于子请求收到的HTTP响应码,做为访问控制
location /private {
# 默认值:off
# 上下文:http, server, location;
# 鉴权成功对会返回后面实际内容,鉴权失败会返回鉴权服务的返回内容
auth_request /auth;
...
}
location /auth {
proxy_pass http://localhost:8080/auth;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
3. 全局配置
# main
#核心参数(其他参数大部分情况下用不到)
# user USERNAME [GROUP]
# 解释:指定运行nginx的worker子进程的属主和属组,其中属组可以不指定
user nginx;
# worker_processes NUMBER | auto
# 解释:指定nginx启动的worker子进程数量
# 【*auto:自动设置为物理CPU核心数】
worker_processes auto;
# pid DIR
# 解释:指定运行nginx的master主进程的pid文件存放路径
pid /opt/nginx/logs/nginx.pid;
# worker_rlimit_nofile NUMBER
# 解释:指定worker子进程可以打开的最大文件句柄数
# 【系统最大打开65535,每个子进程打开数乘子进程数,实际也不会超过65535】
# 这个值需要调大
worker_rlimit_nofile 20480;
# worker_rlimit_core SIZE
# 指定worker子进程异常终止后的core文件,用于记录分析问题
worker_rlimit_core 50M;
working_directory /opt/nginx/tmp;#【必须对子进程用户赋写权限】
# 解释:将每个worker子进程与CPU物理核心绑定
# 【master负责调度,worker负责处理请求】
# 【假设CPU有4个核心,某一时刻worker1获取到了CPU1的工作调度时间片,时间片过后worker1从CPU1上面撤下来,CPU1去处理其他事件,下一时刻可能是CPU2、CPU3的时间片调度到了worker1上面,那么worker1就会在其他CPU上面工作,进程与CPU的调度切换是有损耗的,worker1如果绑定了CPU1,worker1将永远等待CPU1的调度,充分利用CPU缓存】
# 【【主要作用:将每个worker子进程与特定CPU物理核心绑定,优势在于:避免同一个worker子进程在不同的CPU核心上切换,缓存失效,降低性能;其并不能真正避免进程切换(进程切换是CPU工作特性)】】
# -- worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;# 8核心,8个worker
# -- worker_cpu_affinity 01 10 01 10;# 2核心,4个worker
worker_cpu_affinity 0001 0010 0100 1000;# 4核心,4个worker
# 解释:指定worker子进程的nice值,以调整运行nginx的优先级,通常设定为“负值”,以优先调用nginx
# 【Linux默认进程的优先级值是120,值越小越优先;nice设定范围为-20到+19】
# 【对Linux来说,优先级值则是100到139】
worker_priority -20;
# 指定worker子进程优雅退出时的超时时间,不管5秒内是否处理完,都强制退出
worker_shutdown_timeout 5s;
# worker子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降
# 比如某些计时的操作,worker需要去获取内核时间,频繁跟内核打交道会降低性能
timer_resolution 100ms;
# daemon on | off
# 设定nginx的运行方式,前台还是后台,前台用户调试,后台用于生产
daemon on;
# 负载均衡互斥锁文件存放路径
lock_file logs/nginx.lock;
# event
events {
# Nginx使用何种事件驱动模型,一般不指定这个参数
# use epoll;
# worker子进程能够处理的最大并发连接数,多核情况最大其实达不到65535,
worker_connections 65535;
# 是否打开负载均衡互斥锁,默认off(当master接收到请求时,会给每个worker发送消息去唤醒,状态为on时,则会有一个负载均衡锁,master会轮流发给每一个)
accept_mutex on;
# 新连接分配给worker子进程的超时时间,默认500ms,超时后会转给下一个worker处理请求
accept_mutex_delay 100ms;
# worker子进程可以接收的新连接个数(这个参数对性能影响不太大)
multi_accept on;
}
# http段,server
server {
listen 80;
server_name www.test.com;
location /picture {
root /opt/nginx/html/picture;
# 客户端请求 www.test.com/picture/1.jpg;
# 对应磁盘映射路径为:/opt/nginx/html/picture/picture/1.jpg
}
location /picture {
alias /opt/nginx/html/picture/;
# 客户端请求 www.test.com/picture/1.jpg;
# 对应磁盘映射路径为:/opt/nginx/html/picture/1.jpg
# 【末尾一定要加/】
}
}
4. location规则
匹配规则 | 含义 | 示例 | 优先级(1最高) |
---|---|---|---|
= | 精确匹配 | location = /pic/ | 1 |
^~ | 匹配到即停止搜索 | location ^~ /pic/ | 2 |
~ | 正则匹配,区分大小写 | location ~ \.(Jpg|gif)# | 3 |
~* | 正则匹配,不区分大小写 | location ~ \.(Jpg|gif)$ | 4 |
无符号 | location / | 5 | |
@ | 内部跳转 | location @errorpage |
root与alias的区别 | root | alias |
---|---|---|
语法 | root path | alias path |
上下文 | http, server, location, if | location |
区别 | 将定义路径与URI叠加 | 只取定义路径,末尾一定要加/ |
location末尾带与不带/的区别 | ||
---|---|---|
不带/ | location /test | 尝试把test当成目录,如果找不到则找test文件 |
带/ | location /test/ | 将test作为目录,如果不存在则直接返回404 |
# 测试样例
location ~ /test/8005/t/$ {
return 200 'first regular expressions match!';
}
location ~* /test/8005/t/(\w+)$ {
return 200 'longest regular expressions match!';
}
location ^~ /test/8005/t/ {
return 200 'stop regular expressions match!';
}
location /test/8005/t/Test2 {
return 200 'longest prefix string match!';
}
location /test/8005/t {
return 200 'prefix string match!';
}
location = /test/8005/t {
return 200 'exact match!';
}
5.HTTP状态码
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
状态码 | 描述 |
---|---|
100 | 继续。客户端应继续其请求 |
101 | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
200 | 请求成功。一般用于GET与POST请求 |
201 | 已创建。成功请求并创建了新的资源 |
202 | 已接受。已经接受请求,但未处理完成 |
203 | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
204 | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
205 | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
206 | 部分内容。服务器成功处理了部分GET请求 |
300 | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
301 | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
302 | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
303 | 查看其它地址。与301类似。使用GET和POST请求查看 |
304 | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | 使用代理。所请求的资源必须通过代理访问 |
306 | 已经被废弃的HTTP状态码 |
307 | 临时重定向。与302类似。使用GET请求重定向 |
400 | 客户端请求的语法错误,服务器无法理解 |
401 | 请求要求用户的身份认证 |
402 | 保留,将来使用 |
403 | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置”您所请求的资源无法找到”的个性页面 |
405 | 客户端请求中的方法被禁止 |
406 | 服务器无法根据客户端请求的内容特性完成请求 |
407 | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
408 | 服务器等待客户端发送的请求时间过长,超时 |
409 | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
410 | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
411 | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
412 | 客户端请求信息的先决条件错误 |
413 | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
414 | 请求的URI过长(URI通常为网址),服务器无法处理 |
415 | 服务器无法处理请求附带的媒体格式 |
416 | 客户端请求的范围无效 |
417 | 服务器无法满足Expect的请求头信息 |
500 | 服务器内部错误,无法完成请求 |
501 | 服务器不支持请求的功能,无法完成请求 |
502 | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
505 | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
参考文档: