Nginx是一个开源的高性能的Web服务器和反向代理服务器。其主要特点包括高性能、高并发处理能力、低内存消耗、事件驱动架构、模块化设计以及良好的可靠性和稳定性。它可以处理数千个并发连接,适用于大规模的互联网应用、负载均衡、反向代理以及静态资源缓存等场景。
Nginx通过使用异步非阻塞的事件驱动模型,有效地避免了传统Web服务器中一个线程只能处理一个请求的缺点。这使得Nginx在高并发情况下能够迅速响应并处理大量的请求。
⭐最近我在做一个PHP专栏的面试大集合,Nginx是其中非常重要的一部分,Nginx是目前最流行的Web前端服务器。对于后端、运维、前端都是必须掌握的知识,学会Nginx已经成为一种必须的技能。
Nginx本身作为服务中间件,有非常明显的优势和特点,学习好它也是非常有助于我们技术视野的提升,前一段时间我大量研究了关于Nginx的面试内容,今天将核心高频的20道面试题整理出来,分享给各位粉丝,读者以及朋友们。
⭐⭐⭐先收藏,再浏览。⭐⭐⭐
Nginx和Apache是两种常见的Web服务器软件,它们在一些方面有着明显的区别。以下是Nginx和Apache的一些主要区别的表格描述:
区别 | Nginx | Apache |
---|---|---|
处理方式 | 事件驱动 | 多线程 |
内存消耗 | 低 | 高 |
并发连接 | 高 | 适中 |
静态文件处理能力 | 高 | 适中 |
可用模块 | 少 | 丰富 |
配置灵活性 | 较高 | 较高 |
模块加载方式 | 动态加载 | 静态/动态加载 |
主要应用场景 | 高并发环境、反向代理、负载均衡 | 一般网站、动态内容 |
具体的特性和性能还取决于实际的配置和使用场景。不过目前来说,Nginx已经成为绝对的主流。
下面给出在CentOS上面的安装方式。
第一步:更新系统软件包
首先,需要确保系统中的软件包是最新的。打开终端,并使用以下命令执行系统软件包更新:
sudo yum update
第二步:安装EPEL存储库
Nginx在CentOS默认软件源中不可用,但可以通过EPEL存储库来获取。使用以下命令安装EPEL存储库:
sudo yum install epel-release
第三步:安装Nginx
执行以下命令以安装Nginx:
sudo yum install nginx
第四步:启动Nginx服务
安装完成后,可以使用以下命令启动Nginx服务:
sudo systemctl start nginx
要检查Nginx是否已成功启动,请使用以下命令:
sudo systemctl status nginx
Nginx具有以下几个重要的配置文件,它们各自位于不同的文件夹下面,具体的配置文件和文件夹路径可能因Nginx版本、操作系统以及自定义设置等因素而有所不同。下面提到的路径是在Linux系统上使用默认安装路径时的常规配置。
nginx.conf:主要的Nginx配置文件,包含全局性的设置,例如进程数、工作模式等。该文件位于/etc/nginx/目录下。
sites-available/default:默认的虚拟主机配置文件,用于指定默认虚拟主机的设置。该文件位于/etc/nginx/sites-available/目录下。
sites-available/:该文件夹下存放了用于配置不同虚拟主机的配置文件,每个文件对应一个虚拟主机。可以在该文件夹下创建新的配置文件以配置更多的虚拟主机。
sites-enabled/:该文件夹下存放了启用的虚拟主机的配置文件的符号链接。通常情况下,使用ln -s命令将sites-available/目录下的配置文件链接到sites-enabled/目录,从而启用该虚拟主机。
conf.d/:该文件夹下存放了其他Nginx配置文件的目录,这些配置文件可以包含在主配置文件中。可以在该文件夹下创建新的配置文件以添加其他配置选项。
Nginx有完善的命令操作管理和操作Nginx服务器,以下是一些常用的命令:
要重载Nginx配置文件,可以使用以下命令:
重载配置文件会使Nginx重新加载配置文件,而无需停止和启动整个服务器。这对于更新Nginx配置文件中的更改非常有用,因为它可以避免中断服务器的服务。
打开Nginx的主配置文件。一般情况这个文件位于 /etc/nginx/nginx.conf。如果没有找到,可以用find命令查找一下。
配置反向代理:在 Nginx 配置文件中找到 http 部分,并在该部分添加以下内容来配置反向代理:
http { server { listen 80; server_name demoxxx.com; # 替换为您的域名 location / { proxy_pass http://backend-server; # 替换为您的后端服务器地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } upstream backend-server { server backend1.demoxxx.com; # 替换为您的后端服务器地址 server backend2.demoxxx.com; # 可以添加多个后端服务器 } }
在上面的配置中,demoxxx.com 是您的域名,backend-server 是您的后端服务器地址。您可以根据需要添加多个后端服务器。
这样,您就成功将Nginx设置为反向代理服务器了。现在,当请求到达您的域名时,Nginx将转发该请求到后端服务器,并将响应返回给客户端。
Nginx能够非常好的支持负载均衡,并且有多种方式,可以根据自己实际情况灵活运用。我下面这一篇文章有详细讲解到,请点击前往这个地址查看。
Nginx实现负载均衡的多种方法演示
要限制特定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指令之前,以确保规则正确应用。
这个问题可以说是一个必须掌握的知识点了,基本上实际工作过程中都会用到。我下面这一篇文章有详细讲解到,请点击前往这个地址查看。
HTTP和HTTPS的区别在哪里,如何通过Nginx配置HTTPS
Nginx可以通过配置来处理静态文件和动态请求。
对于静态文件,可以使用以下配置:
server { listen 80; server_name demoxxx.com; root /path/to/static/files; location / { try_files $uri $uri/ =404; } }
在上述配置中,listen指定了Nginx监听的端口号,server_name指定了服务器的域名。root指定了静态文件的根目录。
location /用于匹配所有请求路径,try_files指令用于尝试按照给定顺序寻找请求路径所对应的文件,如果文件不存在,则返回404错误。
对于动态请求,可以使用以下配置:
server { listen 80; server_name demoxxx.com; root /path/to/dynamic/files; location / { try_files $uri $uri/ @backend; } location @backend { proxy_pass http://127.0.0.1:8000; # 将请求转发给后端服务器 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; } }
在这个配置中,@backend是一个自定义的名称,用于指定将请求转发给后端服务器的位置。
proxy_pass指令将请求转发给后端服务器,proxy_set_header用于设置转发请求时的一些HTTP头部信息,比如Host和X-Real-IP等。
需要注意的是,实际的动态请求处理逻辑需要通过后端服务器来完成。在上述配置中,假设后端服务器运行在本地的8000端口上。
URL重写是一个用的非常普遍的功能,如PHP的项目里面,会想要实现隐藏index.php的功能,这样URL看上去会十分优雅。由于内容比较多,我下面这一篇文章有详细讲解到,请点击前往这个地址查看。
Nginx和Apache实现隐藏去除index.php的功能
Nginx通过监听指定的端口来接收客户端请求。
当接收到请求后,Nginx使用配置文件中定义的虚拟主机来确定请求应该被转发到哪个后端服务器。
Nginx使用内部的事件驱动模型来处理请求,而不是为每个连接创建一个新的线程或进程。这使得Nginx能够处理大量并发连接而不耗费过多的系统资源。
Nginx根据配置文件中定义的规则将请求转发给后端服务器。这可以是静态文件的直接传输,也可以是动态请求的转发到后端应用程序服务器。
Nginx还提供了一些额外的功能,如负载均衡、缓存、SSL/TLS协议支持等,以提高性能和安全性。
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可以进行内容压缩。主要通过gzip实现,要配置Nginx以启用内容压缩,需要进行以下步骤:
确保已安装Nginx服务器。
修改Nginx配置文件nginx.conf或虚拟主机配置文件。
找到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; }
上述配置项的含义:
配置完成后,Nginx将自动对指定类型的文件进行压缩,并在响应时添加相应的压缩头。
要查看Nginx的日志文件,可以按照以下步骤操作:
打开终端或命令提示符,登录到服务器上,确保具有足够的权限。
Nginx的日志文件通常位于/var/log/nginx目录下。使用cd /var/log/nginx命令进入该目录。
查看日志文件可以使用cat、less或tail等命令。例如,使用less access.log命令查看access.log文件内容。
如果想实时查看日志文件的变化,可以使用tail -f access.log命令。这将持续显示新的日志内容。
要定义Nginx的日志格式,可以按照以下步骤操作:
打开Nginx配置文件。通常位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。
在http块中找到log_format指令。这条指令用于定义日志的格式。它通常位于http块内的其他指令之前。
使用以下语法定义日志格式:
log_format format_name '$variable1 $variable2 ...';
其中,format_name是你给日志格式起的名称,$variable1、$variable2是可用的变量。变量的选择根据你希望包含的信息而定。
log_format mylog '$time_local $remote_addr $request_method $request_uri';
access_log /var/log/nginx/access.log mylog;
6 保存配置文件并重新加载Nginx:sudo nginx -s reload。
现在,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地址允许的最大连接数。
保存配置文件并重新加载Nginx。
sudo nginx -t # 检查配置文件语法是否正确 sudo systemctl reload nginx # 重新加载Nginx配置
现在,您已经成功限制了同时连接到Nginx的客户端数量。超过设定的连接数时,Nginx会返回503 Service Unavailable错误给客户端。
要限制某个URL的访问速率,可以使用Nginx的ngx_http_limit_req_module模块。该模块提供了一种基于令牌桶算法的限速机制。
以下是如何在Nginx中配置限制某个URL的访问速率的步骤:
在Nginx的配置文件中找到对应的Server块,例如/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。
在Server块中添加一个location指令,用于匹配特定的URL。例如,要限制/api/slow的访问速率,可以添加如下的location指令:
location /api/slow { limit_req zone=api_rate_limit burst=5 nodelay; proxy_pass http://backend; }
在location指令内部使用limit_req指令来定义限速规则。limit_req指令有以下常用参数:
保存配置文件并重新加载Nginx配置。
以上配置将会限制/api/slow的访问速率。你可以根据需要自定义burst和nodelay参数的值,以满足你的需求。
在nginx中,可以通过使用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指令实现了以下几种重定向操作:
需要注意的是,rewrite指令支持正则表达式匹配和重定向,并且支持使用变量来进行动态重定向。
要防止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的应用经验,有很多种方法,我下面这一篇文章详细讲解了用GeoLite2-Country实现这个功能,请前往这个地址查看。
Nginx通过用户IP获取所在国家及地理位置
Nginx可以通过以下几种方式来监控性能。
Nginx Stub Status模块:Stub Status模块为Nginx提供了一组统计信息,可以通过HTTP请求查询这些信息。使用Stub Status模块可以获取当前的请求数、连接数、HTTP状态码等信息,以便于实时监控Nginx的性能指标。
Nginx Plus:Nginx Plus是Nginx官方提供的商业版本,它提供了更多高级的监控和管理功能,包括实时活动监控、实时流量监控、健康检查和负载均衡等功能。
第三方监控工具:可以使用一些第三方的监控工具,如Zabbix、Prometheus等来监控Nginx的性能。这些工具可以通过HTTP API、日志文件等方式获取Nginx的统计信息,并进行图表展示、报警等操作。
日志分析工具:可以使用一些日志分析工具,如ELK Stack(Elasticsearch、Logstash、Kibana)等来分析Nginx的访问日志。通过对访问日志的分析,可以获取Nginx的访问模式、访问量、响应时间等信息,从而判断Nginx的性能状况。
今天的内容就分享到这里,文章很长,创作不易,觉得有用可以来个三联,Nginx是非常容易问到的面试题,后面将会不断分享其他的面试知识。建议关注收藏起来,或许以后有用。