Better

Ethan的博客,欢迎访问交流

Nginx深入学习系列-模块篇

nginx在代理服务器中扮演着十分重要的位置,目前从事前端工作的我,使用的比较少,但是一直觉得这是一个利器,因此准备深入学习下,本篇是开篇-模块篇,主要介绍常用模块的配置和作用。

模块分类

nginx模块可以简单氛围如下两类

  • nginx官方模块
  • 第三方模块

默认安装模块

nginx在安装时默认安装的可用模块,具体可以通过nignx -V查看

stub_status

--with-http_stub_status_module: Nginx的客户端状态

http_stub_status_module配置语法

Syntax: stub_status;
default: -
Context: server,location

修改配置后,记得重载配置文件,在虚拟机环境下使用ip a查看ip,即可访问,eg:192.168.1.107

配置好stub_status后,通过访问具体location,可以得到如下信息

Active connections: 2 # nginx当前活跃链接数
server accepts handled requests
 2 2 3 # 握手次数 处理连接数 总的连接数,正常前两者相同,表示没有丢失
Reading: 0 Writing: 1 Waiting: 1

random_index_module

--with-http_random_index_module:目录中选择一个随机主页,使用场景较少

random_index_module配置语法

Syntax: random_index on|off;
default: random_index off;
Context: location

ps -aux|grep nginx 查看nginx运行情况

sub_module

--with-http_sub_module:HTTP内容替换

具体配置语法有多种:

# 语法一
Syntax: sub_filter string replacement;
default: -;
Context: http,server,location

# 语法二 主要用于缓存中
Syntax: sub_filter_last_modified on|off;
default: sub_filter_last_modified off;
Context: http,server,location

# 语法三
Syntax: sub_filter_once on|off;
default: sub_filter_once off;
Context: http,server,location

请求限制

连接频率限制:-limit_conn_module

请求频率限制:-limit_req_module

连接限制配置语法

# 开辟空间,定义zone
Syntax: limit_conn_zone key zone=name:size;
default: -;
Context: http;

# 依赖上述定义的zone
Syntax: limit_conn zone number;
default: -;
Context: http,server,location

请求限制配置语法

# 开辟空间,定义zone,rate表示速率
Syntax: limit_req_zone key zone=name:size rate=rate;
default: -;
Context: http;

# 依赖上述定义的zone,burst表示延迟响应的数目
Syntax: limit_req zone=name [burst=number] [nodelay];
default: -;
Context: http,server,location

压力测试工具ab(apache),基本使用 ab -n 50 -c 20 url。-n表示请求数,-c表示并发请求数

访问控制

常见的访问控制策略

  • 基于IP的访问控制 - http_access_module
  • 基于用户的信任登录 - http_auth_basic_module

http_access_module配置语法

Syntax: allow address | CIDR | unix: | all;
default: -;
Context: http,server,location,limit_except

Syntax: deny address | CIDR | unix: | all;
default: -;
Context: http,server,location,limit_except

http_access_module局限性:基于remote_addr,是客户端的ip,但是有时候会有很多中间代理服务器,此时并不能知道客户端的真实ip。

扩展:通过http_x_forwarded_for,会记录访问的所有ip地址。备注:协议要求如此,但可以不采取

http_x_forwarded_for = client ip, proxy1 ip, proxy2 ip,...

解决http_access_module局限性

  • 采用别的HTTP头信息访问控制,如:http_x_forwarded_for
  • 结合geo模块
  • 通过http自定义变量传递

http_auth_basic_module配置语法

Syntax: auth_basic string | off;
default: auth_basic off;
Context: http,server,location,limit_except

Syntax: auth_basic_user_file file;
default: -;
Context: http,server,location,limit_except

密码文件管理:可以通过htpasswd工具生成,eg:htpasswd -c path2file name,回车输入密码即可添加一个用户

http_auth_basic_module局限性

  • 用户信息依赖文件方式
  • 操作管理低效,效率低效,无法实现多系统打通

解决方式

  • nginx和lua实现高效认证
  • nginx和LDAP打通,利用nginx-auth-ldap模块

多套业务服务

一个nginx启用多个虚拟主机分别对多个业务服务提供服务。

虚拟主机配置定义:在同一个nginx上运行多套单独服务,这些服务是相互独立的。优势:即可以节约资源,又可以提高维护性。

虚拟主机配置方式:

  • 基于主机多ip方式
  • 基于端口的配置方式
  • 基于多host名称方式(多域名方式)

基于主机多ip的方式

  • 方式一:多网卡多ip的方式(对设备要求较高)
  • 方式二:单网卡多ip的方式

linux命令:ip a 查看网卡和IP的对应关系

通过ip a add ip/掩码(eg:192.168.1.110/24) 设备(eg:dev eth0)添加ip。

添加完后,通过修改listen的端口为特定ip的端口即可。

基于端口的配置方式

为了方式多端口冲突,需要查看当前端口的使用情况,不同的centos版本命令所有差别。

ss -luntp || netstat -luntp

其实配置十分简单:启多个server,listen监听多个不同端口。

基于多host名称方式

实现原理:依赖HTTP协议,根据HTTP协议请求头Host头信息,进行分发处理

就不演示DEMO啦,主要是修改server下字段server_name指定为不同的域名即可。



留言

瑶哈哈
2018-11-06 12:56

哇晒