目录
- 为什么要用Nginx?
- 为什么Nginx性能这么高?
- Nginx 是如何实现高并发的?
- Nginx怎么处理请求的?
- Nginx的工作流程
- 给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日志
- 如何限制特定IP地址或IP地址段的访问?
- Nginx可以缓存静态文件吗?如何配置缓存?
- Nginx可以进行内容压缩吗?如何配置?
- 设定某个文件的浏览器缓存过期时间;这里为 600 秒,并不记录访问日志
- 只充许固定 ip 访问网站,并加上密码,设定账号是 admin,密码是 123456
- 如果访问服务器的 ip 地址是 223.40.97.124 的话,给他展现的主页是/home.html,其他人就展现 index.html。
- 什么是正向代理和反向代理?
- 反向代理的用途
- 正向代理和反向代理的区别
- Nginx负载均衡的算法怎么实现的?策略有哪些?
- 在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
- 如何防止DDoS攻击
- 如何查看Nginx的日志文件?
- 如何限制同时连接到Nginx的客户端数量?
- 如何限制某个URL的访问速率?
- 如何实现HTTP重定向?
- Nginx如何通过IP获取所在国家及地理位置?
- 系列文章
- 版本记录
为什么要用Nginx?
因为跨平台,配置简单,支持高并发,耗费内存少。
为什么Nginx性能这么高?
因为nginx是异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决
Nginx 是如何实现高并发的?
nginx启动
service nginx start
然后输入
#ps -ef|grep nginx
会发现 Nginx 有一个 master 进程和若干个 worker 进程,
Master进程:读取及评估配置和维持
Worker进程:处理请求
这些 worker 进程是平等的,都是被 master fork 过来的。
在 master 里面,先建立需要 listen 的 socket(listenfd),然后再 fork 出多个 worker 进程。
当用户进入 nginx 服务的时候,每个 worker 的 listenfd 变的可读,并且这些 worker 会抢一个叫 accept_mutex 的东西,accept_mutex 是互斥的,一个 worker 得到了,其他的worker 就歇菜了。而抢到这个 accept_mutex 的 worker 就开始“读取请求–解析请求–处理请求”,数据彻底返回客户端之后(目标网页出现在电脑屏幕上),这个事件就算彻底结束。
nginx 用这个方法是底下的 worker 进程抢注用户的要求,同时搭配“异步非阻塞”的方式,实现高并发量。
【评析】在 nginx.conf 里第二行就是 work_process,有默认是 4 的,也可以更改成 auto,这个值不是越大越好,要可实际服务器 CPU 的情况而定,一般是 CPU 有几个,工作进程就有几个。
Nginx怎么处理请求的?
nginx接受一个请求后,首先由listen和server_name 匹配server模块,
在匹配的server模块里location,location就是实际地址
Nginx的工作流程
-
Nginx通过 listen 监听指定的端口来接收客户端请求。
-
当接收到请求后,Nginx使用配置文件中定义的server_name 虚拟主机来确定请求应该被转发到哪个后端服务器。
-
Nginx使用内部的事件驱动模型来处理请求,而不是为每个连接创建一个新的线程或进程。这使得Nginx能够处理大量并发连接而不耗费过多的系统资源。
-
Nginx根据配置文件中定义的规则将请求转发给后端服务器。这可以是静态文件的直接传输,也可以是动态请求的转发到后端应用程序服务器。
-
Nginx还提供了一些额外的功能,如负载均衡、缓存、SSL/TLS协议支持等,以提高性能和安全性。
给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日志
location ~(favicon.ico) {
log_not_found off; expires 99d;
break;
}
location ~(robots.txt) {
log_not_found off; expires 7d;
break;
}
如何限制特定IP地址或IP地址段的访问?
要限制特定IP地址或IP地址段的访问,可以使用Nginx的ngx_http_access_module模块提供的allow和deny指令。下面是一个具体配置的示例:
location / {
# 允许特定IP地址范围的访问
allow 192.168.1.0/24;
allow 10.0.0.0/16;
# 拒绝其他IP地址的访问
deny all;
}
在上述配置中,allow指令用于允许特定的IP地址或IP地址段的访问,而deny指令用于拒绝其他IP地址的访问。
192.168.1.0/24表示允许以192.168.1.开头并且子网掩码为255.255.255.0的IP地址范围的访问。
10.0.0.0/16表示允许以10.0.开头并且子网掩码为255.255.0.0的IP地址范围的访问。
deny all;表示拒绝所有其他IP地址的访问。
注意:配置的顺序很重要。allow和deny指令按顺序进行匹配,所以必须将allow指令放在deny指令之前,以确保规则正确应用。
【评析】防火墙是层层深入的,可以从硬件上用 acl(访问控制列表)实现,如果没有钱买一个防火墙,那么还可以在 linux 上设置 iptables,如果 iptables 不设置,还可以在 nginx 上设置。
Nginx可以缓存静态文件吗?如何配置缓存?
- 打开Nginx配置文件,一般位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。
- 在http块中添加以下配置:
http {
# ... 其他配置 ...
# 定义缓存路径和缓存时间
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
proxy_temp_path /path/to/temp;
server {
# ... 其他配置 ...
location / {
# 检查缓存,如有则直接返回
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_key $uri$is_args$args;
# 如果没有缓存,则从后端服务器获取文件并缓存
proxy_pass http://backend_server;
proxy_cache_bypass $http_cache_control;
proxy_no_cache $http_pragma $http_authorization;
}
}
}
在上述示例中,
/path/to/cache
是指定缓存存储路径,
levels=1:2
表示使用两级目录结构进行存储,
keys_zone=my_cache:10m
定义了缓存区域的名称和大小,
inactive=60m
表示在60分钟内未被访问的缓存将被清理。
proxy_cache_valid
指令定义了特定HTTP状态码的缓存有效时间。
在上面的示例中,
对于200和302的响应,缓存将保持10分钟有效,
对于404的响应,缓存将在1分钟后失效。
proxy_cache_key
用于定义缓存的键名,这里使用了URI、请求参数和请求参数。
proxy_cache_bypass
和proxy_no_cache
指令用于控制是否绕过或禁用缓存。
最后,proxy_pass
指令用于将请求转发到后端服务器。
Nginx可以进行内容压缩吗?如何配置?
Nginx可以进行内容压缩。
主要通过gzip实现,要配置Nginx以启用内容压缩,需要进行以下步骤:
1. 修改Nginx配置文件nginx.conf或虚拟主机配置文件。
2. 找到http块,并添加以下配置项:
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/javascript;
gzip_min_length 1000;
gzip_comp_level 2;
gzip_proxied any;
gzip_vary on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_static on;
}
上述配置项的含义:
gzip on
:启用gzip压缩gzip_types
:指定要压缩的文件类型gzip_min_length
:指定压缩文件的最小长度gzip_comp_level
:指定压缩级别,范围从1到9(1表示压缩比较低,但速度快,9表示压缩比较高,但速度慢)gzip_proxied
:指定在代理服务器上启用压缩gzip_vary
:启用Vary头部,用于根据Accept-Encoding请求头选择正确的压缩版本gzip_disable
:禁用压缩的用户代理列表gzip_buffers
:指定压缩缓冲区的数量和大小gzip_http_version
:指定支持gzip的HTTP版本gzip_static
:启用预压缩文件的发送
- 保存配置文件并重新启动Nginx服务器。
设定某个文件的浏览器缓存过期时间;这里为 600 秒,并不记录访问日志
location ^~ /html/scripts/loadhead_1.js {
access_log off;
expires 600;
break;
}
只充许固定 ip 访问网站,并加上密码,设定账号是 admin,密码是 123456
printf "admin:$(openssl passwd -crypt 123456)\n" >>/usr/local/nginx/conf/passwd
location \ {
allow 22.27.164.25; #允许的 ipd
deny all;
auth_basic “KEY”; #登陆该网页的时候,会有这个“KEY”的提示,提示只能是英文,中文不识别。
auth_basic_user_file /conf/htpasswd;
}
如果访问服务器的 ip 地址是 223.40.97.124 的话,给他展现的主页是/home.html,其他人就展现 index.html。
location / {
if ($remote_addr = 223.40.97.124 ) { rewrite ^.*$ /home.html;
}
root /usr/local/nginx/html;
index index.html;
}
什么是正向代理和反向代理?
正向代理:客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端(访问国外网站)
反向代理:代理服务器来接受请求,然后将请求转发给内网服务器,再将获得的内容返回给客户端。
反向代理的用途
隐藏服务器真实IP
负载均衡
正向代理和反向代理的区别
正向代理代理的是客户端,反向代理代理的是服务器
正向代理解决访问限制问题,反向代理解决了高并发问题
Nginx负载均衡的算法怎么实现的?策略有哪些?
轮询:如果有服务器宕机,能够自动剔除
权重:将服务器性能高的权值设置大点。
ip绑定:使同一ip的访客固定访问一台服务器
在Nginx中,如何使用未定义的服务器名称来阻止处理请求?
只需将请求删除的服务器就可以定义为:
Server {
listen 80;
server_name “ “ ;
return 444;
}
如何防止DDoS攻击
要防止DDoS(分布式拒绝服务)攻击,Nginx可以采取以下措施。
配置反向代理服务器:使用Nginx作为反向代理服务器,将请求转发给后端真实服务器进行处理。这样可以隐藏真实服务器的IP地址,使其难以被攻击者直接攻击。
配置HTTP限制:使用Nginx的模块,如limit_req和limit_conn,对每个客户端的请求数量和连接数进行限制,防止攻击者通过发送大量请求来耗尽服务器资源。
配置访问限制:使用Nginx的模块,如GeoIP和IP黑名单等,对恶意IP进行拦截或限制访问。可以基于地理位置、IP地址段、用户代理字符串等进行限制。
加载均衡和泛洪限制:通过Nginx的负载均衡功能,将请求分散到多个后端服务器上,从而分摊DDoS攻击的压力。同时,配置Nginx的模块,如 ngx_http_limit_req_module和ngx_http_limit_conn_module,限制每个请求的速率,防止泛洪攻击。
使用Nginx的缓存功能:将动态页面转换为静态页面,并使用Nginx的缓存功能,将结果缓存在内存中,减轻后端服务器的负载。
配置防火墙:结合Nginx与防火墙工具(如iptables),对网络流量进行过滤和限制。可以设置特定规则,只允许合法的请求通过,阻止恶意流量。
监控和日志分析:通过监控Nginx的访问日志和网络流量,及时发现异常流量和攻击行为,并采取相应的应对措施。
以上是一些基本的防止DDoS攻击的方法,但需要根据实际情况进行调整和优化。同时,还可以考虑使用专业的DDoS防护设备或服务来提高安全性。
如何查看Nginx的日志文件?
要查看Nginx的日志文件,可以按照以下步骤操作:
- 打开终端或命令提示符,登录到服务器上,确保具有足够的权限。
- Nginx的日志文件通常位于/var/log/nginx目录下。使用cd /var/log/nginx命令进入该目录。
3.查看日志文件可以使用cat、less或tail等命令。例如,使用less access.log命令查看access.log文件内容。
4.如果想实时查看日志文件的变化,可以使用tail -f access.log命令。这将持续显示新的日志内容。
要定义Nginx的日志格式,可以按照以下步骤操作:
1.打开Nginx配置文件。通常位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。
2.在http块中找到log_format指令。这条指令用于定义日志的格式。它通常位于http块内的其他指令之前。
3.使用以下语法定义日志格式:
log_format format_name '$variable1 $variable2 ...';
其中,format_name
是你给日志格式起的名称,$variable1
、$variable2
是可用的变量。变量的选择根据你希望包含的信息而定。
4.示例:定义一个名为mylog的日志格式,包含时间、客户端IP、请求方法和URL。
log_format mylog ‘$time_local $remote_addr $request_method $request_uri’;
5.定义好日志格式后,可以在access_log指令中使用该格式。例如,在server块中的access_log指令中添加以下内容:
access_log /var/log/nginx/access.log mylog;
- 保存配置文件并重新加载Nginx:sudo nginx -s reload。
现在,Nginx将按照你定义的日志格式记录访问日志。
如何限制同时连接到Nginx的客户端数量?
在Nginx配置文件中设置limit_conn指令来限制同时连接到Nginx的客户端数量。
以下是设置的步骤:
- 打开Nginx的配置文件。默认位置是/etc/nginx/nginx.conf。
- 在http块中添加以下代码:
http {
# ...
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; # 定义IP地址的连接限制区域
# ...
}
这里的10m
表示分配给连接限制区域的内存大小,可以根据需要进行调整。
- 在需要限制连接数量的http、server或location块中使用limit_conn指令来设置限制。例如:
http {
# ...
server {
# ...
limit_conn conn_limit_per_ip 10; # 设置每个IP地址最大连接数为10
# ...
}
}
这里的conn_limit_per_ip
是刚刚定义的连接限制区域名字,10
表示每个IP地址允许的最大连接数。
4.保存配置文件并重新加载Nginx。
sudo nginx -t # 检查配置文件语法是否正确
sudo systemctl reload nginx # 重新加载Nginx配置
现在,您已经成功限制了同时连接到Nginx的客户端数量。超过设定的连接数时,Nginx会返回503 Service Unavailable错误给客户端。
如何限制某个URL的访问速率?
可以使用Nginx的
ngx_http_limit_req_module
模块。该模块提供了一种基于令牌桶算法的限速机制。
以下是如何在Nginx中配置限制某个URL的访问速率的步骤:
1.在Nginx的配置文件中找到对应的Server块,例如/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。
2.在Server块中添加一个location指令,用于匹配特定的URL。例如,要限制/api/slow的访问速率,可以添加如下的location指令:
location /api/slow {
limit_req zone=api_rate_limit burst=5 nodelay;
proxy_pass http://backend;
}
3.在location指令内部使用limit_req指令来定义限速规则。limit_req指令有以下常用参数:
zone
: 定义限速区域名称,多个限速指令可以共享相同的限速区域。burst
: 定义允许的最大并发请求数。nodelay
: 指定是否立即处理超过限速阈值的请求,默认为等待处理。
保存配置文件并重新加载Nginx配置。
以上配置将会限制/api/slow的访问速率。你可以根据需要自定义burst和nodelay参数的值,以满足你的需求。
如何实现HTTP重定向?
使用rewrite指令来实现HTTP重定向。
rewrite指令用于修改URL或执行重定向操作。
下面是一个示例配置,演示了如何实现HTTP重定向:
server {
listen 80;
server_name demoxxx.com;
# 重定向到指定URL
location /old-url {
rewrite ^/old-url$ http://demoxxx.com/new-url permanent;
}
# 重定向到HTTPS
location /secure {
rewrite ^ https://demoxxx.com$request_uri? permanent;
}
# 正则表达式匹配并重定向
location ~ ^/redirect/(.*)$ {
return 301 http://demoxxx.com/new-location/$1;
}
}
上述示例中,通过rewrite指令实现了以下几种重定向操作:
将http://demoxxx.com/old-url重定向到http://demoxxx.com/new-url,采用永久重定向。
将http://demoxxx.com/secure重定向到https://demoxxx.com/secure,采用永久重定向。
使用正则表达式匹配http://demoxxx.com/redirect/{任意内容},将其重定向到http://demoxxx.com/new-location/{匹配内容},采用永久重定向。
需要注意的是,rewrite指令支持正则表达式匹配和重定向,并且支持使用变量来进行动态重定向。
Nginx如何通过IP获取所在国家及地理位置?
这个面试题主要查考对Nginx的应用经验,有很多种方法,我下面这一篇文章详细讲解了用GeoLite2-Country实现这个功能
系列文章
内容 | 地址 链接 |
---|---|
JAVA介绍 | Linux (实战)常用命令 |
nginx | 记录自己使用nginx 的所用知识点(包含 安装、查看地址、配置文件、卸载、重启、各种类型配置文件(更新中)、文件大小限制、session共享等) |
Mysql | 【电商】mysql 建表的一些规则 和注意事项 |
版本记录
- 2023-10-18 第一版