Nginx基础篇
前言什么是Nginx?Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务Nginx的优点?1.IO多路复用epoll2.轻量级(功能模块少,代码模块化)3.CPU亲和4.sendfile什么是IO多路复用?一、IO多路复用就是通过一种机制,监听多个描述符(当一个IO流要进行文件处理的时候,要获取一组文件的描述符),一旦某个描述符就绪,就通知应用程序进行相应的操作,...
前言
什么是Nginx?
Nginx是一个开源且高性能、可靠的HTTP中间件、代理服务
Nginx的优点?
1.IO多路复用epoll
2.轻量级(功能模块少,代码模块化)
3.CPU亲和
4.sendfile
什么是IO多路复用?
一、IO多路复用就是通过一种机制,监听多个描述符(当一个IO流要进行文件处理的时候,要获取一组文件的描述符),一旦某个描述符就绪,就通知应用程序进行相应的操作,但select,poll,epoll这三个都是同步IO,也就是说它们都需要在事件就绪之后自己进行读写操作,即这个读写过程是阻塞的。
二、多个描述符的IO操作都能在一个线程内并发交替地顺序执行,这就叫IO多路复用,这里的“复用”指的是复用同一个线程。
三、多路复用模型select,poll,epoll
1.总结下select的几大缺点:
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了,默认是1024
2.epoll
(1)每当FD(文件描述符)就绪时,采用系统的回调函数将fd放入,效率更高
(2)最大连接无限制
什么是CPU亲和?
是一种把CPU核心和Nginx工作进程(work process)绑定的方式,把每个work procrss固定在一个CPU上,减少CPU的cache miss,获得更好的性能。
sendfile
一般文件的传输要经过内核空间和用户空间,但一些静态资源其实不需要经过用户空间的逻辑处理,sendfile可以直接把这些静态资源通过内核空间进行传输。
一、快速安装
1.环境搭建
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim
iptables -F(先使用iptables -L命令查看是否关闭)
iptables -t nat -F(先使用iptables -t nat -L命令查看是否关闭)
setenforce 0(先使用getenforce命令查看是否关闭)
2.进入nginx.org,按照官网方法进行下载,使用yum
二、配置语法
1.安装目录讲解
路径 | 类型 | 作用 |
---|---|---|
/etc/logrotate.d/nginx | 配置文件 | Nginx日志轮转,用于logrotate服务的日志切割 |
/etc/nginx /etc/nginx/nginx.conf /etc/nginx/nginx.d /etc/nginx/conf.d/default.conf | 目录、配置文件 | Nginx主配置文件 |
/etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf | 配置文件 | 编码转换映射转化文件 |
/etc/nginx/mime.types | 配置文件 | 设置http协议的Content-Type与扩展名对应关系 |
/usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /etc/sysconfig/nginx /etc/sysconfig/nginx-debug | 配置文件 | 用于配置出系统守护进程管理器管理方式 |
/usr/lib64/nginx/modules /etc/nginx/modules | 目录 | Nginx模块目录 |
/usr/sbin/nginx /usr/sbin/nginx-debug | 命令 | Nginx服务的启动管理的终端命令 |
/usr/share/doc/nginx-1.16.1 /usr/share/doc/nginx-1.16.1/COPYRIGHT /usr/share/man/man8/nginx.8.gz | 文件、目录 | Nginx的手册和帮助文件 |
/var/cache/nginx | 目录 | Nginx的缓存目录 |
/var/log/nginx | 目录 | Nginx的日志目录 |
2.Nginx默认配置语法
名称 | 作用 |
---|---|
user | 设置nginx服务的系统使用用户 |
worker_process | 工作进程数 |
error_log | nginx的错误日志 |
pid | nginx服务启动时候pid |
名称 | 子名称 | 作用 |
---|---|---|
events | worker_connections ---------- use | 每个进程允许最大连接数 ---------- 工作进程数 |
三、默认模块
1. http_stub_status_module
显示与连接有关的信息
在nginx.conf(或default.conf)文件的server中配置如下:
location /mystatus {
stub_status;
}
访问localhost/mystatus,显示如下:
Active connections: 1
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 Waiting: 0
2.http_random_index_module
随机展示首页
1.在/opt/app/code目录下新建1.html、2.html、3.html三个页面
2.在nginx.conf(或default.conf)文件的server中配置如下:
location / {
root /opt/app/code;
random_index on;
}
访问locahost,随机显示新建的三个首页中的一个
3.http_sub_module
http内容替换
1.在/opt/app/code目录下新建submodule.html,内容如下:
<html>
<head>
<meta cahrset="utf-8">
<title>submodules</title>
</head>
<body>
<a>learn</a>
<a>learn</a>
</body>
</html>
2.在nginx.conf(或default.conf)文件的server中配置如下:
location / {
root /opt/app/code;
index index.html index.htm;
sub_filter '<a>learn' '<a>LEARN';
}
访问localhost/submodule.html显示如下:
LEARN learn
可以看到第一个匹配字符串被修改,如果希望所有匹配字符串都被修改需要修改配置如下:
location / {
root /opt/app/code;
index index.html index.htm;
sub_filter '<a>learn' '<a>LEARN';
sub_filter_once off;
}
四、Nginx的log
log_format
五、访问限制
1.HTTP的请求和连接
HTTP请求建立在一次TCP连接上
一次TCP连接至少产生一次HTTP请求
2.请求限制与连接限制
连接限制
Syntax: limit_conn_zone key zone=name:size
Default: -
Context: http
含义:1.只可以在http里定义连接限制的zone;
2.key表示被限制的变量,比如客户端的IP;
3.name表示这个zone的名字;
4.size表示zone的大小,比如1m
Syntax: limit_conn zone number
Default: -
Context: http,server,location
含义:1.zone就是上一步的name
2.number是连接个数
请求限制
Syntax: limit_req_zone key zone=name:size rate=rate
Default: -
Context: http
含义:1.只可以在http里定义连接限制的zone;
2.key表示被限制的变量,比如客户端的IP;
3.name表示这个zone的名字;
4.size表示zone的大小,比如1m;
5.rate表示请求的速率,如一秒几次
Syntax: limit_req zone=name [burst=number] [nodelay]
Default: -
Context: http,server,location
含义:1.name就是上一步的name
示例:
#连接限制定义
limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;
#请求限制定义
limit_req_zone $binanry_remote_addr zone=req_zone:1m rate=1r/s;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /opt/app/code;
#limit_conn conn_zone 1;#连接限制,同一时刻,只允许一个客户端连接服务端
#limit_req zone=req_zone burst=3 nodelay;#一秒接受1个请求,有3个请求推迟到下一秒,其余的拒绝
#limit_req zone=req_zone burst=3;
#limit_req zone=req_zone; #请求限制,根据rate配置,一秒只能接受1个请求,其他请求全部拒绝
index index.html index.htm;
}
....
}
Nginx的访问控制:
基于IP的访问控制 http_access_module
基于用户的信任登录 http_auth_basic_module
3.access模块配置语法
location ~ ^/acc.html { # ~是匹配符,^是指根目录
root /opt/app/code;
deny 127.0.0.1; #禁止本机访问
allow all; #允许其他的所有访问
index index.html index.htm;
}
4.请求限制局限性
局限性:
客户端(IP1)--->代理(IP2)--->Nginx(IP3)(<font color="red">remote_addr=IP2</font>)
经过代理之后,Nginx拿到的IP是代理的地址,而不是客户端的地址。
解决方法:
在代理层设置:X_FORWARDED_FOR
结合geo模块
通过HTTP自定义变量传递客户端的IP
*重点介绍X_FORWARDED_FOR
1.Nginx一般不会处理X_FORWARDED_FOR头,除非做了设置:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
;
2.除了$proxy_add_x_forwarded_for
之外还有其他两个变量:$remote_addr
和http_x_forwarded_for
3.$remote_addr
就是上一级客户端的IP,如果上一级是其他代理,那就是其他代理的IP,所以通常是最外层的代理配置remote_addr
来获取用户的真实的IP。
4.$http_x_forwarded_for
获取的是上一级的客户端的http请求头里设置的X_FORWARDED_FOR的值。
5.$proxy_add_x_forwarded_for
存储的是真实客户端发来的HTTP请求头里的X_FORWARDED_FOR的值(或真实IP,这取决与最外层代理的配置)以及中间各级代理的真实IP,这些IP用逗号隔开。
6.所以最安全的的配置应该是:
最外层代理:$remote_addr
,拿到客户端真实IP;
中间代理:$proxy_add_x_forwarded_for
,拿到客户IP和上一级代理的IP,如下:clientIP, proxy1IP,proxy2IP,…
服务器应用:从多个IP里拿到第一个IP,就是最客户端真实IP。
注:如果应用程序只想拿一个IP,不需要拿到这么多IP,再去分割,可以在中间层代理配置$http_x_forwarded_for
,因为这个变量的值是一层一层传下来的,所以一直是真实的客户端IP,到应用程序之后就可以直接用了。
参考:博客文章
5.基本安全认证
http_auth_basic_module
6.auth模块配置语法
7.安全认证局限性
用户信息以来文件方式
操作机械,效率低下
解决:
1.Nginx结合LUA
2.Nginx和LDAP打通,利用nginx-auth-ldap模块
更多推荐
所有评论(0)