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指定为不同的域名即可。
哇晒