前言
什么是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_lognginx的错误日志
pidnginx服务启动时候pid
名称子名称作用
eventsworker_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_addrhttp_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模块

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐