乐趣区

关于nginx:Nginx实用操作

实用手册:https://wizardforcel.gitbooks…

1 nginx 根底操作

1.1 nginx 装置

# yum 疾速装置
yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel


# 编译装置
wget http://nginx.org/download/nginx-1.14.1.tar.gz
tar -zxvf nginx-1.14.1.tar.gz
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module\
--with-http_realip_module\
--with-http_sub_module \
--with-http_ssl_module\
--with-http_realip_module \
--with-http_sub_module \
--with-http_gunzip_module\
--with-http_gzip_static_module\
--with-http_auth_request_module\
--with-http_random_index_module \
--with-http_slice_module \
--with-http_stub_status_module

make && make install

# 查看加载的模块及版本信息
nginx -V

1.2 nginx 常用命令

# 查看 Nginx 的版本号
nginx -V

# 进行
nginx -s stop

# 退出 
nginx -s quit

# 重启加载配置 
nginx -s reload

# 配置文件启动
nginx -c </path/to/config> 
# </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的

# 不运行,而仅仅测试配置文件
nginx -t
# nginx 将查看配置文件的语法的正确性,并尝试关上配置文件中所援用到的文件。

1.3 nginx 管制信号

再次回过头看看 nginx 的原理图,咱们还能够通过信号去操作 nginx,默认状况下nginx 将其主过程的 pid 写入到 /usr/local/nginx/nginx.pid 文件中。

# nginx 进行命令,等所有申请完结后敞开服务。(从容敞开)Kill -QUIT nginx 主过程号

# 从新载入配置。用新的配置开始新的工作过程,从容敞开旧的工作过程
kill -HUP nginx 主过程号

# 疾速敞开
kill -TERM nginx 主过程号
# 或
kill -INT nginx 主过程号

# 从新关上日志文件
kill -USR1 nginx 主过程号

# 平滑降级可执行程序
kill -USR2 nginx 主过程号

# 从容敞开工作过程
kill -WINCH nginx 主过程号

2 nginx 配置阐明

2.1 根底配置阐明


配置语法阐明:

1、配置文件由指令与指令块形成
2、每条指令以; 分号结尾,指令与参数间以空格符号分隔
3、指令块以{}大括号将多条指令组织在一起
4、应用 #符号增加正文,进步可读性
5、include 语句容许组合多个配置文件以晋升可维护性
6、应用 $ 符号应用变量
7、局部指令的参数反对正则表达式

Nginx 的各种指令以及配置繁多,有些配置能够在如下的链接 https://tengine.taobao.org/nginx_docs/cn/docs/ 或者在官网文档上查看

为了对配置性能进行可扩大化,并对相干配置能进行明确的辨别,让配置看见就能很明了。采纳了模块化配置。
nginx 罕用模块

http 模块

http 规范外围模块,http 服务的相应配置

server 模块

接管申请的服务器须要将不同的申请按规定转发到不同的后端服务器上,在 nginx 中咱们能够通过构建虚拟主机 (server) 的概念来将这些不同的服务配置隔离。

server_name

因为 IP 地址的数量无限,因而常常存在多个主机域名对应着同一个 IP 地址的状况,这时在 nginx.conf中就能够依照 server_name(对应用户申请中的主机域名) 并通过 server 块来定义虚拟主机,每个 server 块就是一个虚拟主机,它只解决与之绝对应的主机域名申请。这样,一台服务器上的 Nginx 就能以不同的形式解决拜访不同主机域名的 HTTP 申请了。

语法:

主机名称
语法:server_name name[...];
默认:server_name"";
配置块:server

虚拟主机名能够应用确切的名字,通配符,或者是正则表达式来定义, 在开始解决一 HTTP 申请时,Nginx会取出 header 头中的 Host,与每个server 中的 server_name 进行匹配,以此决定到底由哪一个 server 块来解决这个申请。有可能一个 Host 与多个 server 块中的 server_name 都匹配,这时就会依据匹配优先级来抉择理论解决的 server 块。

留神:优先级问题,所导致的配置不失效
server_name 与 Host 的匹配优先级如下:1)首先抉择所有字符串齐全匹配的 server_name,如 nginx.2367.com。2)其次抉择通配符在后面的 server_name,如 *.2367.com。3)再次抉择通配符在前面的 server_name,如 nginx.2367.*。4)最初抉择应用正则表达式才匹配的 server_name,如 ~^\.testweb\.com$
如果都不匹配
1、优先选择 listen 配置项后有 default 或 default_server 的
2、找到匹配 listen 端口的第一个 server 块
location(URL 匹配特定地位后的设置)

location局部用于匹配网页地位(比方,根目录“/”,“/images”, 等等),server是对应一个域名进行的配置,而 location 是在一个域名下对更精密的门路进行配置

语法:

语法:location[=|~|~*|^~|@]/uri/{...}
配置块:server
location 会尝试依据用户申请中的 URI 来匹配下面的 /uri 表达式,如果能够匹配,就抉择
location{}块中的配置来解决用户申请。当然,匹配形式是多样的,上面介绍 location 的匹配
规定。

location 表达式类型:

~ 示意执行一个正则匹配,辨别大小写;~* 示意执行一个正则匹配,不辨别大小写;^~ 示意一般字符匹配。应用前缀匹配。如果匹配胜利,则不再匹配其余 location;= 进行一般字符准确匹配。也就是齐全匹配;@ 它定义一个命名的 location,应用在外部定向时,例如 error_page, try_files

优先级:
(location =) > (location 残缺门路) > (location ^~ 门路) > (location ~,~* 正则程序) > (location 局部起始门路)

等号类型(=)的优先级最高。一旦匹配胜利,则不再查找其余匹配项。前缀一般匹配 (^~) 优先级次之。不反对正则表达式。应用前缀匹配,如果有多个 location 匹配的话,则应用表达式最长的那个。正则表达式类型(~ ~*)的优先级次之。一旦匹配胜利,则不再查找其余匹配项。惯例字符串匹配,如果有多个 location 匹配的话,则应用表达式最长的那个。
root(文件门路的定义)和 alias(以别名形式设置资源门路)

以 root 形式设置资源门路
语法:

语法:root path;
配置块:http、server、location、if

以别名形式设置资源门路
语法:

语法:alias path;
配置块:location
alias 也是用来设置文件资源门路的,它与 root 的不同点次要在于如何解读紧跟 location 前面的 uri 参数

留神:location 中应用 root 指令和 alias 指令的意义不同

  • root,相当于 追加 在 root 目录前面。比方拜访的是 xxx/test=>/www/test
  • alias,相当于对 location 中的 uri 进行 替换,比方拜访的是 xxx/test,想要拜访到 /www/test 就必须设置 alias /www/test

2.2 nginx 内置变量阐明

NginxApacheLighttpd等其余 Web 服务器的配置记法不太雷同,Nginx的配置文件应用语法的就是一门微型的编程语言。能够相似写程序个别编写配置文件,可操作性很大。既然是编程语言,个别也就少不了“变量”这种货色。
所有的 Nginx 变量在 Nginx 配置文件中援用时都须带上 $ 前缀在 Nginx 配置中,变量只能寄存一种类型的值,有且也只存在一种类型,那就是字符串类型
应用 set 配置指令对变量 $a 进行了赋值操作
set $hello "hello world" ;
Nginx 变量一旦创立,其变量名的可见范畴就是整个 Nginx 配置,甚至能够逾越不同虚拟主机的 server 配置块
Nginx 变量名的可见范畴尽管是整个配置,但每个申请都有所有变量的独立正本,或者说都有各变量用来寄存值的容器的独立正本,彼此互不烦扰
Nginx 内置变量寄存在 ngx_http_core_module 模块中

3 罕用模块配置或者实际案例

3.1 IP 和目录权限访问控制配置

IP 访问控制模块 用来对特定 IP 的进行访问控制。默认是容许所有 ip 拜访,若局部容许需定义deny all
allow

语法: allow address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except
容许某个 ip 或者一个 ip 段拜访

deny

语法: deny address | CIDR | unix: | all;
默认值: —
区块: http, server, location, limit_except

allow、deny 实例

  • 对 IP 的拜访的管制

    location / {
        deny 192.168.1.1; # 回绝 IP 拜访 
        allow 192.168.1.0/24; # 容许 IP 段拜访
        allow 47.98.147.49; # 容许 IP 拜访
        deny all; # 启用 IP 管制
    }
  • 对目录文件的拜访
    比方能够限度某些目录下的某些文件的拜访,具体能够本人组合。

    # 禁止拜访所有目录下的 sql|log|txt|jar|sh|py 后缀的文件,location ~.*\.(sql|log|txt|jar|war|sh|py|php) {deny all;}

3.2 限流模块

场景:抢购的场景,下载限速下就会有波及使用
限流:次要是当访问量达到一个限度量的时候能够抉择以服务器为次要,而抉择对用户拜访申请的量做限度,对于超出限度的用户申请会采取抛弃或者提早解决等形式解决,来保障更多用户来拜访解决。

比方:某一服务器失常在高峰期上能反对的访问量是 1w,然而忽然某一时刻在访问量上忽然暴增一下子超过 3w,5w 则可能会导致服务器宕机,这个时候咱们就能够通过设置最大的拜访如 1 分钟拜访 8000 次。

也能够避免攻打(对同一个 ip 每秒拜访多少次)如:30min/ 次

原理:令牌桶算法

对应模块:

  • ngx_http_limit_conn_module限度连接数
  • ngx_http_limit_reg_module限度申请频率

3.2.1 ngx_http_limit_req_module 限度申请频率

https://tengine.taobao.org/ng…
根本示例:

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
    # 应用 $binary_remote_addr【这是一个二进制的信息记录 $remote_addr(非二进制的)】(nginx 自身存在的,保留客户端的 ip 地址)变量,能够将每条状态记录的大小缩小到 64 个字节,这样 1M 的内存能够保留大概 1 万 6 千个 64 字节的记录。如果限度域的存储空间耗尽了,对于后续所有申请,服务器都会返回 503 (Service Temporarily Unavailable)谬误。# zone=one:10m 示意设置了名为“one”,大小为 10 兆字节,也能够了解为设置的限流名为 one
    # rate=10r/s 的意思是容许 1 秒钟不超过 10 个申请。速度能够设置为每秒解决申请数和每分钟解决申请数,其值必须是整数。如果申请频录不到每秒 1 次,你能够设置每分钟几次(r/m)。比方每秒半次就是 30r/m。limit_req_log_level notice;
    # 如果你说心愿的日志级别,当拜访因为频录过高回绝或提早解决申请时能够记下相应级别的日志。提早记录的日志级别比回绝的低一个级别;比方,如果设置“limit_req_log_level notice", 提早的日志就是 info 级别。# 语法:limit_req_log_level info | notice | warn | error;
    # 默认值:limit_req_log_level error;
    # 上下文:http、server、location
    # 版本要求 0.8.18+
    
    ...
    server {
        ...
        location /search /{ 
            
            limit_req zone=one burst=5;
            # 应用了上方名字为”one" 的限流。# burst=5 容许超过频率限度的申请数不多于 5 个,假如 1、2、3、4 秒申请为每秒 9 个,那么第 5 秒内申请 15 个是容许的,反之,如果第一秒内申请 15 个,会
将 5 个申请放到第二秒,第二秒内超过 10 的申请间接 503,相似多秒内均匀速率限度。这里多进去的 5 个申请是被放到 10m 的哪个缓存中,期待下一秒的解决。# nodelay 超过的申请不被提早解决,设置后 15 个申请在 1 秒内解决。这里回有 5 个超出,超出的 5 个会间接 503。写法:limit_req zone=one burst=5 nodelay;
        }
    }
}

3.2.2 ngx_http_limit_conn_module 限度申请连接数

https://tengine.taobao.org/ng…
根本示例:

http {
   limit_conn_zone $binary_remote_addr zone=addr:10m; 
   # 区域名称为 addr,大小为 10m,键值是客户端 IP。# 用于限度每个已定义键的连接数, 特地是来自单个 IP 地址的连接数。并不是所有的连贯都被计算在内。只有当服务器解决了一个申请,并且整个申请头曾经被读取时,才会计算连贯。# 语法: limit_conn_zone $binary_remote_addr zone=addr:10m;
   # 默认值: none
   # 上下文:http
   # 如果限度域的存储空间耗尽了,对于后续所有申请,服务器都会返回 503 (Service Temporarily Unavailable)谬误。...
   server {
        ...
        location /download/{ 
            
            limit_conn addr 1;
            # 限度每个 IP 只能发动 1 个连贯。(addr 要跟 limit_conn_zone 的变量对应)}
    }
}

下载限速设置

http {
    # ....
    limit_conn_zone $binary_remote_addr zone=addr:10m;
    # ....
    server {
        location / {
            # root html;
            autoindex on;
            # 是限度每个 IP 只能发动 1 个连贯(addr 要跟 limit_conn_zone 的变量对应)limit_conn addr 1;
            limit_rate 10k; #限速为 10KB/ 秒
            root /redis_2004;
            # index index.html index.htm;
        }
    }
}

测试下载文件

3.2.3 IP 黑白名单

连贯限度跟申请限度,会对所有的 ip 进行限度,咱们不心愿本人的测试的 ip, 或者搜索引擎蜘蛛受到限制。

依据下面的速率限度的问题:

limit_req_zone $binary_remote_addr zone=testz:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;

目前的状况是针对于所有的申请均会有做限度,而在业务中可能会存在这对于某一些 ip 是不做限度的需要;在 nginx 的配置中并不能间接对于变量编辑相应的逻辑计算因而咱们不得不须要换一个形式。

3.2.3.1 ngx_http_geo_module

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_geo_module.html
ngx_http_geo_module模块创立变量,并依据客户端 IP 地址对变量赋值.

语法: geo [$address] $variable {...}
默认值: —
上下文: http

其实这个操作就有点相似于枚举变量,会依据咱们传递的参数而后匹配并返回相应的参数。
根底体验:

http {
    // ..
    geo $whiteIpList {
        default 1;
        192.168.169.139 0;# 如果拜访 IP=192.168.169.139, 下方 $whiteIpList 就返回 0
        192.168.169.160 0;
        include ip/whiteIp.conf;# 能够设置 ip 列表
    }
    server {
        // ..
        location /geo {
            return 200 '$whiteIpList';
            # 拜访 http://xxxx/geo =》浏览器页面输入 1 或 0
        }
    }
}
3.2.3.2 ngx_http_map_module

ngx_http_map_module能够依据咱们传递的参数。

语法: map string $variable {...}
默认值: —
上下文: http

应用方面和 geo 的形式相似. 须要值得注意的是

limit_req_zone $binary_remote_addr zone=testz:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;

如果 binary_remote_addr 为空则限度失败。
操作测试:

map $whiteIpList $limit_ip {
    0 "";
    1 $remote_addr;
}

最初配合 geo 实现白名单的操作

http {
    // ..
    limit_req_zone $limit_ip zone=testz:10m rate=1r/s;
    limit_conn_zone $limit_ip zone=addr:10m;
    
    // ..
    geo $whiteIpList {
        default 1;
        192.168.169.139 0;# 如果拜访 IP=192.168.169.139, 下方 $whiteIpList 就返回 0
        include ip/whiteIp.conf;# 能够设置 ip 列表
    }
    
    map $whiteIpList $limit_ip {
        0 "";
        1 $binary_remote_addr;
    }
    
    server {
        // ..
        location / {
            root html;
            limit_conn addr 1;
            limit_rate 10k; #限速为 100KB/ 秒
            index index.html index.htm;
            
            # 这里 192.168.169.139 和 whiteIp.conf 中的都能够是白名单;如果是这些 IP,geo 返回的都是 0,0 在 map 中对应的值为 "",所以上方的 limit_req_zone 和 limit_conn_zone 中设置的 $limit_ip 对应的值就是"", 限度等性能无用,就实现了白名单性能了。}
    }
}

3.3 rewrite 模块(ngx_http_rewrite_module)

rewrite的次要性能是实现 URL 地址的重定向。Nginxrewrite 性能须要 PCRE 软件的反对,即通过 perl 兼容正则表达式语句进行规定匹配的。默认参数编译 nginx 就会反对 rewrite 的模块,然而也必须要 PCRE 的反对。

应用场景:

1、能够调整用户浏览的 URL,看起来更标准,合乎开发及产品人员的需要。2、为了让搜索引擎搜录网站内容及用户体验更好,企业会将动静 URL 地址伪装成动态地址提供服务。3、网址换新域名后,让旧的拜访跳转到新的域名上。例如,拜访京东的 360buy.com 会跳转到 jd.com
4、依据非凡变量、目录、客户端的信息进行 URL 调整等。

3.3.1 if 指令

# 语法:if(condition){…}
# 上下文:server,location
# 该指令用于查看一个条件是否合乎,如果条件合乎,则执行大括号内的语句。if 指令不反对嵌套,不反对多个条件 && 和 || 解决。# 其中,condition 中能够蕴含的判断标识如下
# ~ 为辨别大小写匹配
# ~* 为不辨别大小写匹配
# - f 和!- f 用来判断是否存在文件
# - d 和!- d 用来判断是否存在目录
# - e 和!- e 用来判断是否存在文件或目录
# - x 和!- x 用来判断文件是否可执行
if ($http_user_agent~*(mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {rewrite ^(.*) http://peter.23673.com$1 permanent;
}

3.3.2 return 指令

# 语法:return code 
# return code URL;
# return URL;
# 上下文:server,location,if
# 该指令用于完结规定的执行并返回状态吗给客户端。# 状态码包含:# 204(No Content)、# 400(Bad Request)、402(PaymentRequired)、403(Forbidden)、404(Not Found)、405(Method Not Allowed)、406(Not Acceptable)、408(Request Timeout)、410(Gone)、411(Length Required)、413(Request Entity Too Large)、416(Requested Range Not Satisfiable)、# 500(Internal Server Error)、501(Not Implemented)、502(Bad Gateway)、503(Service Unavailable)和 504(Gateway Timeout)。# 例如,示例,如果拜访的 URL 以.sh .bash 结尾,返回状态码 403
location ~ .*\.(sh|bash)?$ {return 403;}

3.3.3 Rewrite 语法

# 语法:rewrite regex replacement [flag];
# 默认值:—
# 上下文:server, location, if
# rewrite 是实现 URL 重写的要害指令,依据 regex(正则表达式)局部内容,重定向到 replacement,结尾是 flag 标记。#     正则:perl 兼容正则表达式语句进行规定匹配
#     代替内容:将正则匹配的内容替换成 replacement
#     flag 标记:rewrite 反对的 flag 标记[last...]

3.3.4 last、break、redirect、permane 标记阐明


last 
# 本条规定匹配实现后,持续向下匹配新的 location URI 规定。# 完结以后的申请解决,用替换后的 URI 从新匹配 location;#   可了解为重写(rewrite)后,发动了一个新申请,进入 server 模块,匹配 locaton;# 如果从新匹配循环的次数超过 10 次,nginx 会返回 500 谬误;break 
# 本条规定匹配实现即终止,不再匹配前面的任何规定
#   完结以后的申请解决,应用以后资源,不在执行 location 里余下的语句

redirect
# 返回 302 长期重定向,浏览器地址会显示跳转后的 URL 地址。permane
    返回 301 永恒重定向, 地址栏显示重定向后的 url,爬虫更新 url

4 图形化压测工具:jmeter 在 nginx 中应用

4.1 下载安装

这个工具是须要 jdk 1.8 以上。
自行百度下载。
下载后双击 apache-jmeter-5.3binjmeter.bat 即可运行

4.2 实现相似 ab 这种性能

测试计划 ->right click ->add -> 线程(用户)-> 线程组
线程组 ->right click ->add -> 取样器 ->http 申请
http 申请 ->right click ->add-> 监听器 -> 查看后果树

http 申请 ->HTTP 申请栏目中填写门路 (http://xxxx)
线程组 -> 线程属性下 -> 线程数填写 (示意几个客户端发动申请)和 Ramp-Up 填写(0 示意并发)
查看后果树 -> 点击上方”三角形“启动

退出移动版