文章目录
- nginx配置概述
- 全局块
- events块
- http块
- server块
- 配置反向代理
- 配置一个
- 配置一个服务
- 配置多个,前面有~是正则用法,
- 配置负载均衡
- 配置禁ip(ip网段)
- 配置限频
- 配置限流
nginx配置概述
全局块
- 全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。
- 通常包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、Nginx进程PID存放路径、日志的存放路径和类型以及配置文件引入等。
- 常用配置
- user root;
- Nginx 服务的默认用户是nobody,最好显式设置为root用户,不然可能会报没权限错误。比如使用/tmp下面的socket文件可能没权限
events块
- events块涉及的指令主要影响Nginx服务器与用户的网络连接。常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个worker process可以同时支持的最大连接数等。
- 这一部分的指令对Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。
http块
server块
- server块对应一个虚拟主机(虚拟服务器)
- listen指令
- server块中最重要的指令就是listen指令,这个指令有三种配置语法。这个指令默认的配置值是:listen *:80 | *:8000;只能在server块种配置这个指令。
- listen指令常用参数
- address:监听的IP地址(请求来源的IP地址),如果是IPv6的地址,需要使用中括号“[]”括起来,比如[fe80::1]等。
- port:端口号,如果只定义了IP地址没有定义端口号,就使用80端口。这边需要做个说明:要是你压根没配置listen指令,那么那么如果nginx以超级用户权限运行,则使用*:80,否则使用*:8000。多个虚拟主机可以同时监听同一个端口,但是server_name需要设置成不一样;
- default_server:假如通过Host没匹配到对应的虚拟主机,则通过这台虚拟主机处理。具体的可以参考这篇文章,写的不错。
- backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其他平台默认为511。
- accept_filter=filter,设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。filter可以设置为dataready或httpready,感兴趣的读者可以参阅Nginx的官方文档。
- bind:标识符,使用独立的bind()处理此address:port;一般情况下,对于端口相同而IP地址不同的多个连接,Nginx服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接。
- ssl:标识符,设置会话连接使用SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。
- server_name指令
- 用于配置虚拟主机的名称。(可以是ip)
- 在开始处理http请求时,Nginx会取出header中的host,与每个server中的server_name匹配,从此决定哪一个server去处理这个请求。
- location指令
- 每个server块中可以包含多个location块。在整个Nginx配置文档中起着重要的作用,而且Nginx服务器在许多功能上的灵活性往往在location指令的配置中体现出来。
- location块的主要作用是,基于Nginx服务器接收到的请求字符串(例如, server_name/uri-string),对除虚拟主机名称(也可以是IP别名,后文有详细阐述)之外的字符串(前例中“/uri-string”部分)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。
- root指令
- 这个指令用于设置请求寻找资源的跟目录,此指令可以在http块、server块或者location块中配置。由于使用Nginx服务器多数情况下要配置多个location块对不同的请求分别做出处理,因此该指令通常在location块中进行设置。
- index指令
- 这应该是默认请求的文件名优先级列表
配置反向代理
配置一个
- location是http.server下面的子块
配置一个服务
location / {
proxy_pass http://127.0.0.1:8000
}
配置多个,前面有~是正则用法,
# /svc1开头的走这里
location ~ /svc1 {
proxy_pass http://127.0.0.1:8000
}
# /svc2开头的走这里
location ~ /svc2 {
proxy_pass http://127.0.0.1:8001
}
配置负载均衡
upstream myserver {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}
配置禁ip(ip网段)
- deny 10.29.44.0/24;
location /{
include fastcgi.conf;
deny 10.29.44.0/24;
fastcgi_pass 127.0.0.1:9000;
}
在Nginx中,你可以使用deny指令来禁止特定的IP地址或IP地址范围访问你的网站。以下是一个基本的示例:
location / {
deny 192.168.1.1;
allow all;
}
在这个示例中,IP地址192.168.1.1被禁止访问网站的所有页面。allow all;指令允许所有其他IP地址访问网站。
你也可以使用CIDR表示法来禁止一个IP地址范围,如下所示:
location / {
deny 192.168.1.0/24;
allow all;
}
在这个示例中,192.168.1.0/24表示从192.168.1.0到192.168.1.255的所有IP地址。
如果你想禁止多个IP地址或IP地址范围,你可以使用多个deny指令,如下所示:
location / {
deny 192.168.1.1;
deny 10.0.0.0/8;
allow all;
}
在这个示例中,IP地址192.168.1.1和从10.0.0.0到10.255.255.255的所有IP地址都被禁止访问网站。
请注意,你需要将这些指令添加到你的Nginx配置文件中的适当位置,然后重新加载或重启Nginx以使更改生效。在大多数系统中,你可以使用sudo systemctl reload nginx或sudo service nginx reload命令来重新加载Nginx配置。
配置限频
在Nginx中,你可以使用limit_req模块来限制请求的频率。这对于防止恶意用户或脚本进行洪水攻击(flood attack)或者DDoS攻击非常有用。
以下是一个基本的配置示例:
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
location /login {
limit_req zone=mylimit burst=20 nodelay;
...
}
}
}
在这个示例中,我们首先定义了一个名为mylimit的限制区域,使用$binary_remote_addr(即客户端的IP地址)作为关键字,分配了10MB的内存,并设置了请求的速率为每秒10个请求。
然后,在/login位置,我们应用了这个限制。burst=20参数表示如果请求超过了设定的速率,Nginx可以将多余的请求(最多20个)暂时存储起来,而不是立即拒绝。nodelay参数表示不对超出速率的请求进行延迟处理,如果超出burst值的请求将会立即得到503错误响应。
这只是一个基本的示例,你可能需要根据你的具体需求来调整这些参数。你也可以为不同的位置或服务器定义不同的限制。更多详细的信息,你可以查阅Nginx的官方文档。
配置限流
在Nginx中,你可以使用limit_rate指令来限制每个连接的数据传输速率,这就是所谓的"限流"。这个指令可以在http,server,location,或者if的上下文中使用。
以下是一个简单的例子:
server {
location / {
limit_rate 500k;
}
}
在这个例子中,对/路径的请求的数据传输速率被限制为每秒500KB。
你也可以使用变量来动态设置limit_rate。例如,你可以根据请求的参数来设置传输速率:
server {
location / {
if ($arg_rate) {
set $limit_rate $arg_rate;
}
}
}
在这个例子中,如果请求的URL包含一个rate参数(例如/path?rate=500k),那么数据传输速率将被限制为该参数的值。
请注意,你需要重新加载或重启Nginx以使更改生效。在大多数系统中,你可以使用sudo systemctl reload nginx或sudo service nginx reload命令来重新加载Nginx配置。