Nginx大全

1. 简述什么是Nginx ?

Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用nginx网站用户有很多,例如:新浪、网易、腾讯等

Nginx是十分轻量级的HTTP服务器。Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的,它已经在该站点运行超过两年半了。Igor Sysoev在建立的项目时,使用基于BSD许可。

2. 简述Nginx 有哪些优点?

Nginx 跨平台、配置简单。 非阻塞、高并发连接:处理 2-3 万并发连接数,官方监测能支持 5 万并发。 内存消耗小:开启 10 个 Nginx
才占 150M 内存。 成本低廉,且开源。 稳定性高,宕机的概率非常小。
内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上
Nginx应用场景? http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

3. 简述Nginx处理请求流程 ?

简述Nginx处理请求流程:

server { #第一个Server区块开始,表示一个独立的虚拟主机站点 listen 80; #
提供服务的端口,默认80 server_name localhost; #提供服务的域名主机名 location / {
第一个location区块开始
root html; #站点的根目录,相当于Nginx的安装目录
index index.html index.html; #默认的首页文件,多个用空格分开 } #第一个location区块结果

首先,Nginx 在启动时,会解析配置文件,得到需要监听的端口与 IP 地址,然后在 Nginx 的 Master
进程里面先初始化好这个监控的Socket(创建 S ocket,设置 addr、reuse 等选项,绑定到指定的 ip 地址端口,再
listen 监听)。

然后,再 fork(一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子进程 )出多个子进程出来。
之后,子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与nginx进行三次握手,与
nginx 建立好一个连接后。此时,某一个子进程会 accept 成功,得到这个建立好的连接的 Socket ,然后创建 nginx
对连接的封装,即 ngx_connection_t 结构体。
接着,设置读写事件处理函数,并添加读写事件来与客户端进行数据的交换。

最后,Nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了。 Nginx 是如何实现高并发的?
如果一个 server采用一个进程(或者线程)负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。
而 Nginx的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。
Nginx是如何利用的呢,简单来说:同样的 4 个进程,如果采用一个进程负责一个 request 的方式,那么,同时进来 4 个
request 之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第 5 个request进来了。就无法及时反应了,因为 4
个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个 request ,就新开个进程来处理。

4. 简述Nginx应用场景?

Http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

5. Nginx 是如何实现高并发的?

如果一个 server 采用一个进程(或者线程)负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。

而 Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。

Nginx是如何利用的呢,简单来说:同样的 4 个进程,如果采用一个进程负责一个 request 的方式,那么,同时进来 4 个 request 之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第 5 个request进来了。就无法及时反应了,因为 4 个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个 request ,就新开个进程来处理。
Nginx 不这样,每进来一个 request ,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request ,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果 upstream 返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。
这就是为什么说,Nginx 基于事件模型。
由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server 机器上的时间片不多。这是几个进程就解决高并发的秘密所在。即:
webserver 刚好属于网络 IO 密集型应用,不算是计算密集型。
异步,非阻塞,使用 epoll ,和大量细节处的优化。也正是 Nginx 之所以然的技术基石

6. 简述什么是正向代理?

一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

客户端才能使用正向代理。
正向代理总结就一句话:代理端代理的是客户端。

7. 简述什么是反向代理?

反向代理(Reverse Proxy)方式,是指以代理服务器来接受 Internet上的连接请求,然后将请求,发给内部网络上的服务器并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理总结就一句话:代理端代理的是服务端。

8. 反向代理服务器的优点是什么?

(1)提高访问速度
由于目标主机返回的数据会存在代理服务器的硬盘中,因此下一次客户再访问相同的站 点数据时,会直接从代理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点 能明显提高请求速度。

(2)防火墙作用
由于所有的客户机请求都必须通过代理服务器访问远程站点,因此可在代理服务器上设 限,过滤某些不安全信息。

(3)通过代理服务器访问不能访问的目标站点
互联网上有许多开发的代理服务器,客户机可访问受限时,可通过不受限的代理服务器 访问目标站点,通俗说,我们使用的翻墙浏览器就是利用了代理服务器,可直接访问外 网。

9. 简述Nginx目录结构有哪些?

[root@nginx-001 ~]#tree /app/nginx
/app/nginx
├── client_body_temp
├── conf #Nginx所有配置文件的目录
│ ├── fastcgi.conf #fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default #fastcgi.conf的原始备份文件
│ ├── fastcgi_params #fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types #媒体类型
│ ├── mime.types.default
│ ├── nginx.conf #Nginx主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params #scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params #uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp #fastcgi临时数据目录
├── html #Nginx默认站点目录
│ ├── 50x.html #错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│ └── index.html #默认的首页文件
├── logs #Nginx日志目录
│ ├── access.log #访问日志文件
│ ├── error.log #错误日志文件
│ └── nginx.pid #pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp #临时目录
├── sbin #Nginx命令目录
│ └── nginx #Nginx的启动命令
├── scgi_temp #临时目录
└── uwsgi_temp #临时目录

10. 阐述Nginx配置文件nginx.conf 属性模块?

worker_processes 1; #worker进程的数量
events {
#事件区块开始
worker_connections 1024; #每个worker进程支持的最大连接数
}
#事件区块结束
http {
#HTTP区块开始
include mime.types; #Nginx支持的媒体类型库文件
default_type application/octet-stream; #默认的媒体类型
sendfile on; #开启高效传输模式
keepalive_timeout 65; #连接超时
server {
#第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; #提供服务的端口,默认80
server_name localhost; #提供服务的域名主机名
location / {
#第一个location区块开始
root html; #站点的根目录,相当于Nginx的安装目录
index index.html index.htm; #默认的首页文件,多个用空格分开
}
#第一个location区块结果
error_page 500502503504 /50x.html; #出现对应的http状态码时,使用50x.html回应客户
location = /50x.html {
#location区块开始,访问50x.html
root html; #指定对应的站点目录为html
}
}

11. Nginx 不使用多线程?

Apache: 创建多个进程或线程,而每个进程或线程都会为其分配 cpu 和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会耗光服务器资源。

Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量)(epoll),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。

12. 简述Nginx常见的优化配置的措施和方案 ?

1)调整worker_processes
指Nginx要生成的worker数量,最佳实践是每个CPU运行1个工作进程。
了解系统中的CPU核心数,输入
$ grep processor / proc / cpuinfo | wc -l
2)最大化worker_connections
Nginx Web服务器可以同时提供服务的客户端数。与worker_processes结合使用时,获得每秒可以服务的最大客户端数
最大客户端数/秒=工作进程工作者连接数
为了最大化Nginx的全部潜力,应将工作者连接设置为核心一次可以运行的允许的最大进程数1024。
3)启用Gzip压缩
压缩文件大小,减少了客户端http的传输带宽,因此提高了页面加载速度
建议的gzip配置示例如下:( 在http部分内)
4)为静态文件启用缓存
为静态文件启用缓存,以减少带宽并提高性能,可以添加下面的命令,限定计算机缓存网页的静态文件:
location ~
.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d;
}
5)Timeouts
keepalive连接减少了打开和关闭连接所需的CPU和网络开销,获得最佳性能需要调整的变量可参考:
6)禁用access_logs
访问日志记录,它记录每个nginx请求,因此消耗了大量CPU资源,从而降低了nginx性能。
完全禁用访问日志记录
access_log off;
如果必须具有访问日志记录,则启用访问日志缓冲
access_log /var/log/nginx/access.log主缓冲区= 16k

13. 502报错可能原因有哪些?

1)FastCGI进程是否已经启动
2)FastCGI worker进程数是否不够
3)FastCGI执行时间过长
4)FastCGI Buffer不够

14. 解释什么是 Nginx 动态资源、静态资源分离?

动态资源、静态资源分离,是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。

动态资源、静态资源分离简单的概括是:动态文件与静态文件的分离。

15. Web 为什么要做动、静分离?

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do 等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js 等等文件),这些不需要经过后台处理的文件称为静态文件,否则动态文件。

因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗?当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决动、静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问

这里我们将静态资源放到 Nginx 中,动态资源转发到 Tomcat 服务器中去。

当然,因为现在七牛、阿里云等 CDN 服务已经很成熟,主流的做法,是把静态资源缓存到 CDN 服务中,从而提升访问速度。

相比本地的 Nginx 来说,CDN 服务器由于在国内有更多的节点,可以实现用户的就近访问。并且,CDN 服务可以提供更大的带宽,不像我们自己的应用服务,提供的带宽是有限的

16. 简述CDN 服务概念?

DN防御的全称是Content Delivery Network Defense,即内容分流网络流量防御。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,解决Internet网络拥挤的状况以及被同行DDOS攻击的困扰,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、节点分流不均等原因所造成的用户访问网站响应速度慢的问题。

什么是CDN?CDN是一个内容分发网络,它基本上是托管静态内容,如JavaScript、CSS或图像。它有助于减轻服务静态内容的负担,让您的网站能够更快地为动态内容提供服务,而不需要为静态内容提供服务。这些相互连接的服务器组成CDN,将有助于减轻服务器的压力,使你的网站运行速度更快。它们在全球范围内传播,这也允许世界不同地区的用户从距离他们所在位置更近的服务器上访问缓存的内容副本。CDN的好处与其他页面速度解决方案相比,CDNS被称为“低挂的水果”。这是一个非常简单的步骤,可以提高你网站的速度,并提供很多好处。一个更快的网站会导致更低的反弹率,这对你在搜索引擎中的排名有直接的影响。它还有助于为您的访问者提供更高质量的体验。您还可以在主机服务器上使用CDN来节省带宽。这将有助于提高网站的可用性,并在处理过多的流量时提供更好的体验。

网络流量分流:网络流量分流是一种新型的网络构建方式,它是为能在传统的IP网发布宽带丰富媒体而特别优化的网络覆盖层;而从广义的角度,CDN代表了一种基于质量与秩序的网络服务模式。简单地说,网络流量分流是一个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理4个要件,而内容管理和全局的网络流量管理是CDN的核心整体。用户通过本地检测就近性和服务器负载的判断:CDN确保内容以一种极为高效的方式为用户的请求提供服务,内容服务基于缓存服务器,也称作代理缓存,它位于网络的边缘,距用户仅有"一跳"之遥。同时,代理缓存是内容提供商源服务器(通常位于CDN服务提供商的数据中心)的一个透明镜像。这样的架构使得CDN服务提供商能够代表他们客户,即内容供应商,向最终用户提供尽可能好的体验,而这些用户是不能容忍请求响应时间有任何延迟的。据统计,采用CDN防御技术,能处理整个网站页面的70%~95%的内容访问量,减轻服务器的压力,提升了网站的性能和可扩展性。 与目前现有的内容发布模式相比较,CDN强调了网络在内容发布中的重要性。通过引入主动的内容管理层的和全局负载均衡,CDN从根本上区别于传统的内容发布模式。在传统的内容发布模式中,内容的发布由I的应用服务器完成,而网络只表现为一个透明的数据传输通道,这种透明性表现在网络的质量保证仅仅停留在数据包的层面,而不能根据内容对象的不同区分服务质量,由于IP网的"尽力而为"的特性使得其质量保证是依靠在用户和应用服务器之间端到端地提供充分的、远大于实际所需的带宽通量来实现的。在这样的内容发布模式下,不仅大量宝贵的骨干带宽被占用,同时I的应用服务器的负载也变得非常重,而且不可预计。当发生一些热点事件和出现浪涌流量时,会产生局部热点效应,从而使应用服务器过载退出服务。这种基于中心的应用服务器的内容发布模式的另外一个缺陷在于个性化服务的缺失和对宽带服务价值链的扭曲,内容提供商承担了他们不该干也干不好的内容发布服务。

17. Nginx怎么做的动静分离?

只需要指定路径对应的目录。location/可以使用正则表达式匹配。并指定对应的硬盘中的目录。

location /image/ {
root /usr/local/static/;
autoindex on;
}
#创建目录
mkdir /usr/local/static/image

#进入目录
cd /usr/local/static/image

#上传照片
photo.jpg

#重启nginx
sudo nginx -s reload
打开浏览器 输入 server_name/image/1.jpg 就可以访问该静态图片了

18. Nginx负载均衡的算法怎么实现的?策略有哪些?

为了避免服务器崩溃,大家会通过负载均衡的方式来分担服务器压力。将对台服务器组成一个集群,当用户访问时,先访问到一个转发服务器,再由转发服务器将访问分发到压力更小的服务器。

Nginx负载均衡实现的策略有以下五种:

1 .轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。

upstream backserver {
server 192.168.31.12;
server 192.168.31.13;
}

  1. 权重 weight
    weight的值越大,分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。其次是为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

#权重越高,在被访问的概率越大,如上例,分别是20%,80%。
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
}

  1. ip_hash( IP绑定)
    每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题

upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}

  1. fair(第三方插件)
    必须安装upstream_fair模块。

对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。

#哪个服务器的响应速度快,就将请求分配到那个服务器上。
upstream backserver {
server server1;
server server2;
fair;
}

5.url_hash(第三方插件)
必须安装Nginx的hash软件包

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。

upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}

19. 简述Nginx配置文件nginx.conf有哪些核心属性模块?

worker_processes 1; #worker进程的数量
events { #事件区块开始
worker_connections 1024; #每个worker进程支持的最大连接数
} #事件区块结束
http { #HTTP区块开始
include mime.types; #Nginx支持的媒体类型库文件
default_type application/octet-stream; #默认的媒体类型
sendfile on; #开启高效传输模式
keepalive_timeout 65; #连接超时
server { #第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80; #提供服务的端口,默认80
server_name localhost; #提供服务的域名主机名
location / { #第一个location区块开始
root html; #站点的根目录,相当于Nginx的安装目录
index index.html index.htm; #默认的首页文件,多个用空格分开
} #第一个location区块结果
error_page 500502503504 /50x.html; #出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { #location区块开始,访问50x.html
root html; #指定对应的站点目录为html
}

20. 如何用Nginx解决前端跨域问题?

在开发静态页面时,类似Vue的应用,我们常会调用一些接口,这些接口极可能是跨域,然后浏览器就会报cross-origin问题不给调。
最简单的解决方法,就是把浏览器设为忽略安全问题,设置–disable-web-security。不过这种方式开发PC页面到还好,如果是移动端页面就不行了。
解决办法
使用Nginx转发请求。把跨域的接口写成调本域的接口,然后将这些接口转发到真正的请求地址。
举个栗子
例如我们在开发一个Vue应用。
原先:
调试页面是:http://192.168.1.100:8080/
请求的接口是:http://ni.hao.sao/api/get/info
步骤一:
请求的接口是:http://192.168.1.100:8080/api/get/info
PS:这样就解决了跨域问题。
步骤二:
安装好Nginx后,去到/usr/local/etc/nginx/目录(这是Mac的),修改nginx.conf文件。
步骤三:
把默认的server配置注释掉。
在下面增加:
复制代码
server {
listen 8888;
server_name 192.168.1.100;
location / {
proxy_pass http://192.168.1.100:8080;
}
location /api {
proxy_pass http://ni.hao.sao/api;
}
}
复制代码
保存后,启动Nginx。
PS:并不需要太了解Nginx的配置,很简单的。
步骤四:
访问:http://192.168.1.100:8888/
搞定。
PS:注意访问的端口是‘8888’,有其他域的地址继续加location就行了。

21. Nginx虚拟主机怎么配置?

1 基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站
2 基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部3 网站,外部网站的管理后台 基于ip的虚拟主机。

  1. 基于虚拟主机配置域名
    需要建立/data/www /data/bbs目录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件;

#当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件
server {
listen 80;
server_name www.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}

#当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/bbs目录下文件
server {
listen 80;
server_name bbs.lijie.com;
location / {
root data/bbs;
index index.html index.htm;
}
}

  1. 基于端口的虚拟主机
    使用端口来区分,浏览器使用域名或ip地址:端口号访问

#当客户端访问www.lijie.com,监听端口号为8080,直接跳转到data/www目录下文件
server {
listen 8080;
server_name 8080.lijie.com;
location / {
root data/www;
index index.html index.htm;
}
}

#当客户端访问www.lijie.com,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080
server {
listen 80;
server_name www.lijie.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}

22. Nginx location的作用是什么?

Location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

location的语法能说出来吗?

匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~* 不区分大小写的正则匹配 4
!~ 区分大小写的不匹配的正则 5
!~* 不区分大小写的不匹配的正则 6
/ 通用匹配,任何请求都会匹配到 7
Location正则案例

#优先级1,精确匹配,根路径
location =/ {
return 400;
}

#优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
location ^~ /av {
root /data/av/;
}

#优先级3,区分大小写的正则匹配,匹配/media*****路径
location ~ /media {
alias /data/static/;
}

#优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
location ~* .*.(jpg|gif|png|js|css)$ {
root /data/av/;
}

#优先7,通用匹配
location / {
return 403;
}

23. 简述Nginx限流怎么做的?

Nginx限流就是限制用户请求速度,防止服务器受不了

限流有3种

正常限制访问频率(正常流量)
突发限制访问频率(突发流量)
限制并发连接数
Nginx的限流都是基于漏桶流算法

1、正常限制访问频率(正常流量):
限制一个用户发送的请求,我Nginx多久接收一个请求。

Nginx中使用ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率。

#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

#绑定限流维度
server{

location/seckill.html{
limit_req zone=zone;
proxy_pass http://lj_seckill;
}

}

1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。

2、突发限制访问频率(突发流量):
限制一个用户发送的请求,我Nginx多久接收一个。

上面的配置一定程度可以限制访问频率,但是也存在着一个问题:如果突发流量超出请求被拒绝处理,无法处理活动时候的突发流量,这时候应该如何进一步处理呢?

Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数。我们可以将之前的例子添加burst参数以及nodelay参数:

#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

#绑定限流维度
server{

location/seckill.html{
limit_req zone=zone burst=5 nodelay;
proxy_pass http://lj_seckill;
}

}

为什么就多了一个 burst=5 nodelay; 呢,多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求

3、 限制并发连接数
Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。接下来我们可以通过一个简单的例子来看下:

http {
limit_conn_zone $binary_remote_addr zone=myip:10m;
limit_conn_zone $server_name zone=myServerName:10m;
}

server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.lijie.net permanent;
}
}

上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。刚才有提到过Nginx是基于漏桶算法原理实现的,实际上限流一般都是基于漏桶算法和令牌桶算法实现的。

24. 简述 Nginx 漏桶流算法和令牌桶算法?

  1. 漏桶算法:
    漏桶算法思路很简单,我们把水比作是请求,漏桶比作是系统处理能力极限,水先进入到漏桶里,漏桶里的水按一定速率流出,当流出的速率小于流入的速率时,由于漏桶容量有限,后续进入的水直接溢出(拒绝请求),以此实现限流。

  2. 令牌桶算法
    令牌桶算法的原理也比较简单,我们可以理解成医院的挂号看病,只有拿到号以后才可以进行诊病。

系统会维护一个令牌(token)桶,以一个恒定的速度往桶里放入令牌(token),这时如果有请求进来想要被处理,则需要先从桶里获取一个令牌(token),当桶里没有令牌(token)可取时,则该请求将被拒绝服务。令牌桶算法通过控制桶的容量、发放令牌的速率,来达到对请求的限制。

25. Nginx怎么限定IP不可访问?

#如果访问的ip地址为192.168.9.115,则返回403
if ($remote_addr = 192.168.9.115) {
return 403;
}

26. Nginx中,如何使用未定义的服务器名称来阻止处理请求?

只需将请求删除的服务器就可以定义为:
服务器名被保留一个空字符串,他在没有主机头字段的情况下匹配请求,而一个特殊的nginx的非标准代码被返回,从而终止连接。

27. Nginx 怎么限制浏览器访问?

##不允许谷歌浏览器访问 如果是谷歌浏览器返回500
if ($http_user_agent ~ Chrome) {
return 500;
}

28. 简述Nginx Rewrite全局变量 ?

$remote_addr //获取客户端ip
$binary_remote_addr //客户端ip(二进制)
$remote_port //客户端port,如:50472
$remote_user //已经经过Auth Basic Module验证的用户名
$host //请求主机头字段,否则为服务器名称,如:blog.sakmon.com
$request //用户请求信息,如:GET ?a=1&b=2 HTTP/1.1
$request_filename //当前请求的文件的路径名,由root或alias和URI request组合而成,如:/2013/81.html
$status //请求的响应状态码,如:200
$body_bytes_sent // 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40
$content_length // 等于请求行的“Content_Length”的值
$content_type // 等于请求行的“Content_Type”的值
$http_referer // 引用地址
$http_user_agent // 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36
a r g s / / 与 args //与 args//query_string相同 等于当中URL的参数(GET),如a=1&b=2
d o c u m e n t u r i / / 与 document_uri //与 documenturi//uri相同 这个变量指当前的请求URI,不包括任何参数(见$args) 如:/2013/81.html
$document_root //针对当前请求的根路径设置值
$hostname //如:centos53.localdomain
$http_cookie //客户端cookie信息
$cookie_COOKIE //cookie COOKIE变量的值
i s a r g s / / 如果有 is_args //如果有 isargs//如果有args参数,这个变量等于”?”,否则等于”",空值,如?
$limit_rate //这个变量可以限制连接速率,0表示不限速
q u e r y s t r i n g / / 与 query_string // 与 querystring//args相同 等于当中URL的参数(GET),如a=1&b=2
$request_body // 记录POST过来的数据信息
$request_body_file //客户端请求主体信息的临时文件名
$request_method //客户端请求的动作,通常为GET或POST,如:GET
$request_uri //包含请求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2
$scheme //HTTP方法(如http,https),如:http
u r i / / 这个变量指当前的请求 U R I ,不包括任何参数 ( 见 uri //这个变量指当前的请求URI,不包括任何参数(见 uri//这个变量指当前的请求URI,不包括任何参数(args) 如:/2013/81.html
$request_completion //如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty),如:OK
$server_protocol //请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1
$server_addr //服务器IP地址,在完成一次系统调用后可以确定这个值
$server_name //服务器名称,如:blog.sakmon.com
$server_port //请求到达服务器的端口号,如:80

29. Nginx 如何实现后端服务的健康检查?

方式一,利用 nginx 自带模块 ngx_http_proxy_module 和 ngx_http_upstream_module 对后端节点做健康检查。

方式二(推荐),利用 nginx_upstream_check_module 模块对后端节点做健康检查。

30. 简述Nginx 如何开启压缩?

开启nginx gzip压缩后,网页、css、js等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,给用户快的体验。虽然会消耗cpu资源,但是为了给用户更好的体验是值得的。

开启的配置如下:

将以上配置放到nginx.conf的http{ … }节点中。

http {
#开启gzip
gzip on;

#启用gzip压缩的最小文件;小于设置值的文件将不会被压缩
gzip_min_length 1k;

#gzip 压缩级别 1-10
gzip_comp_level 2;

#进行压缩的文件类型。

gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

#是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
}

保存并重启nginx,刷新页面(为了避免缓存,请强制刷新)就能看到效果了。
gzip虽然好用,但是以下类型的资源不建议启用。

1、图片类型
原因:图片如jpg、png本身就会有压缩,所以就算开启gzip后,压缩前和压缩后大小没有多大区别,所以开启了反而会白白的浪费资源。(Tips:可以试试将一张jpg图片压缩为zip,观察大小并没有多大的变化。虽然zip和gzip算法不一样,但是可以看出压缩图片的价值并不大)

2、大文件
原因:会消耗大量的cpu资源,且不一定有明显的效果

31. 简述Nginx 负载均衡模块 ngx_http_upstream_module ?

ngx_http_upstream_module 模块用于定义可以被 ​​ ​ proxy_pass​​​、 ​​ ​fastcgi_pass​​​ 以及 ​​ ​memcached_pass​​​ 等指令引用的服务器群。
配置示例

upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;

server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}

server {
location / {
proxy_pass http://backend;
}
}

32. 解释什么是C10K问题?

C10K问题是指无法同时处理大量客户端(10,000)的网络套接字

33. Nginx是否支持将请求压缩到上游?

可以使用Nginx模块gunzip将请求压缩到上游。gunzip模块是一个过滤器,它可以对不支持“gzip”编码方法的客户机或服务器使用“内容编码:gzip”来解压缩响应

34. 如何在Nginx中获得当前的时间?

要获得Nginx的当前时间,必须使用SSI模块、 d a t e g m t 和 date_gmt 和 dategmtdate_local 的变量

Proxy_set_header THE-TIME $date_gmt;

35. Nginx服务器解释-s的目的是什么?

用于运行Nginx -s参数的可执行文件

36. 如何在Nginx服务器上添加模块?

本例以增加“gzip_static”模块为例进行说明

二、首先要查看nginx现有已经支持的模块
1、注意:新增新的模块时要记得带上现有的,别捡了芝麻丢了西瓜。
2、命令:
nginx -V

三、前往你的nginx安装目录,找到configure这个文件,执行命令

./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module

#然后再make
make
四、将当前objs目录中的nginx文件覆盖到/usr/local/nginx/sbin目录下的同文件(覆盖前可以先备份一下)

#一些nginx的启动命令
nginx -s reload
nginx -s stop
nginx -c /usr/local/nginx/conf/nginx.conf

OK了,再nginx -V查看是否已经安装上去了

37. Nginx生产中如何设置worker进程的数量呢?

在有多个cpu的情况下,可以设置多个worker,worker进程的数量可以设置到和cpu的核心数一样多,如果在单个cpu上起多个worker进程,那么操作系统会在多个worker之间进行调度,这种情况会降低系统性能,如果只有一个cpu,那么只启动一个worker进程就可以了

38. Nginx状态码 499的含义?

服务端处理时间过长,客户端主动关闭了连接。

39. Nginx状态码 502的含义?

(1).FastCGI进程是否已经启动
(2).FastCGI worker进程数是否不够
(3).FastCGI执行时间过长
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
(4).FastCGI Buffer不够,nginx和apache一样,有前端缓冲限制,可以调整缓冲参数
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;
(5). Proxy Buffer不够,如果你用了Proxying,调整
proxy_buffer_size 16k;
proxy_buffers 4 16k;
(6).php脚本执行时间过长
将php-fpm.conf的0s的0s改成一个时间

40. 整理归纳Nginx返回状态码 ?

200 - 服务器成功返回网页
404 - 请求的网页不存在
304 - Not Modified. 原来缓冲的还可以使用
500 - 大多是代码问题,或者sql报错
501 - 服务器不具备完成请求的功能
502 - Bad Gateway fpm进程挂掉或者后端程序过长时间未返回。
503 - Service Unavailable 当遇到这个状态码的时候表示服务临时不可用,比如nginx配置了频率限制,而client端又超过了配置的限制后就会收到503的响应。
504 - Gateway Time-out nginx的fastcgi模块有一个fastcgi_read_timeout配置,它表示从FastCGI server获取数据的超时时间。如果超过这个配置客户端就是收到504的响应。

41. 整理归纳HTTP 状态码的完整列表 ?

**1xx(**临时响应)
  表示临时响应并需要请求者继续执行操作的状态码。

100(继续)请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
  101(切换协议)请求者已要求服务器切换协议,服务器已确认并准备切换。
  2xx (成功)
  表示成功处理了请求的状态码。
  200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。如果是对您的 robots.txt 文件显示此状态码,则表示 Googlebot 已成功检索到该文件。
  201(已创建)请求成功并且服务器创建了新的资源。
  202(已接受)服务器已接受请求,但尚未处理。
  203(非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一来源。
  204(无内容)服务器成功处理了请求,但没有返回任何内容。
  205(重置内容)服务器成功处理了请求,但没有返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如,清除表单内容以输入新内容)。
  206(部分内容)服务器成功处理了部分 GET 请求。
  **3xx **(重定向)
  要完成请求,需要进一步操作。通常,这些状态码用来重定向。Google 建议您在每次请求中使用重定向不要超过 5 次。您可以使用网站管理员工具查看一下 Googlebot 在抓取重定向网页时是否遇到问题。诊断下的网络抓取页列出了由于重定向错误导致 Googlebot 无法抓取的网址。
  300(多种选择)针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
  301(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。
  302(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置,但您不应使用此代码来告诉 Googlebot 某个网页或网站已经移动,因为 Googlebot 会继续抓取原有位置并编制索引。
  303(查看其他位置)请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。对于除 HEAD 之外的所有请求,服务器会自动转到其他位置。
  304(未修改)自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。

42. Nginx返回4xx的原因综述 ?

一、由于启动用户和nginx工作用户不一致所致

查看nginx的启动用户,发现是nobody,而为是用root启动的
命令:
ps aux | grep “nginx: worker process” | awk’{print $1}’
1.2将nginx.config的user改为和启动用户一致,
命令:
vi conf/nginx.conf

二、缺少index.html或者index.php文件,就是配置文件中index index.html index.htm这行中的指定的文件。
server {
listen 80;
server_name localhost;
index index.php index.html;
root /data/www/;
}
如果在/data/www/下面没有index.php,index.html的时候,直接文件,会报403 forbidden。

三、权限问题,如果nginx没有web目录的操作权限,也会出现403错误。
解决办法:修改web目录的读写权限,或者是把nginx的启动用户改成目录的所属用户,重启Nginx即可解决
chmod -R 777 /data
chmod -R 777 /data/www/

四、SELinux设置为开启状态(enabled)的原因。
查看当前selinux的状态
/usr/sbin/sestatus
将SELINUX=enforcing 修改为 SELINUX=disabled 状态
vi /etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled
重启生效
reboot

404 NOT FOUND
一、 页面找不到 ,可能是url错了。

二、 也可能是配置文件的问题。
在/etc/nginx/conf.d 下有default.conf 和nginx.conf 两个配置文件,
前者是默认的配置,后者是我的个性化配置
nginx 运行的时候加载了conf.d文件夹下的所有.conf结尾的文件
default.conf 覆盖了nginx.conf配置,原因:
因为在nginx的配置中,conf.d文件夹中的配置文件优先级是按照字母顺序来的,default.conf 的优先级大于nginx.conf,覆盖了nginx.conf的配置

43. 如何处理解决504 Bad Gateway timeout ?

504 即 nginx 超过了自己设置的超时时间,不等待 php-fpm 的返回结果,直接给客户端返回 504 错误。但是此时 php-fpm 依然还在处理请求(在没有超出自己的超时时间的情况下).

这里有三个相关的配置:

fastcgi_connect_timeout 300;

指定连接到后端 FastCGI 的超时时间.

fastcgi_send_timeout 300;

向 FastCGI 传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间.

fastcgi_read_timeout 300;

接收 FastCGI 应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间.

网关超时,客户端所发出的请求没有到达网关,在限定时间内没有得到php-fpm,或者完成php-fpm的传输数据的工作而超时 。比方说:即nginx的worker去php-fpm进程池去处理,但是没有fpm进程可以使用了,等啊等,还是没有,返回504。

场景
nginx的fastcgi模块有一个fastcgi_read_timeout配置,它表示从FastCGI server获取数据的超时时间。如果超过这个配置客户端就是收到504的响应。比如执行了一段非常耗时的查询语句,nginx的相关fastcgi等待配置超时后,就会返回504,但是php-fpm还在运行。

解决办法

location ~ .php$ {
fastcgi_connect_timeout 180;//优化点
fastcgi_read_timeout 600;//优化点
fastcgi_send_timeout 600;//优化点
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
调高上面标红的3个值后,主要是read和send两项(默认Nginx超时为60),完美地解决了504错误。

并且可以配置在http,server级别,也可以配置在location级别。

factcgi_connect_{read|send|timeout}是对fastcgi_pass生效
proxy_connect_{read|send|timeout|是对proxy_pass生效

44. 简述Nginx 内核参数优化 ?

如果是高并发架构,需要在nginx的服务器上添加如下的内核参数
这些参数追加到/etc/sysctl.conf,然后执行sysctl -p 生效。
每个网络接口接收数据包速度比内核处理速度快的时候,允许发送队列数目数据包的最大数
net.core.netdev_max_backlog = 262144
调节系统同时发起的tcp连接数
net.core.somaxconn = 262144
该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上,主要目的为防止Ddos攻击
net.ipv4.tcp_max_orphans = 262144
该参数用于记录尚未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 262144
nginx服务上建议关闭(既为0)
net.ipv4.tcp_timestamps = 0
该参数用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量,为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发送SYN并附带一个回应前一个SYN的ACK,这个参
数主要影响这个过程,一般赋予值为1,即内核放弃连接之前发送一次SYN+ACK包。
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1

45. 简述Nginx和LVS作对比的结果?

lvs和nginx都可以用作多机负载方案,他们各有优缺点,在生产环境中需要好好分析实际情况并加以利用。

【LVS方面】
一、lvs的优势
1.抗负载能力强,因为lvs工作方式的逻辑是非常简单的,而且工作再网络层第4层,仅作请求分发用,没有流量,所以在效率上基本不需要太过考虑。lvs一般很少出现故障,即使出现故障一般也是其他地方(如内存、CPU等)出现问题导致lvs出现问题。
2.配置性地,这通常是一大劣势同时也是一大优势,因为没有太多的可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率。
3.工作稳定,因为其本省抗负载能力很强,所以稳定性高也是顺理成章的事,另外各种lvs都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,lvs会自动判别,所以系统整体式非常稳定的。
4.无流量,lvs仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。
5.lvs基本上能支持所有应用,因为绿色工作在第4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等。
另外:lvs也不是完全能判别节点故障的,比如在wlc分配方式下,集群里有一个节点没有配置vip,会使整个集群不能使用,这时使用wrr分配方式则会丢掉一台机器。目前这个问题还在进一步测试中。所以用lvs也得多多当心为妙

【Nginx方面】
1.nginx工作在网络的第7层,所以它可以针对http应用本身来做分流策略,比如针对域名、目录结构等,相比之下lvs并不具备这样的功能,所以nginx单凭这点可以利用的场合就远多于lvs了;但nginx有用的这些功能使其可调整度要高于lvs,所以经常要去触碰触碰,由lvs的第2条优点来看,触碰多了,人为出现问题的几率也就会大。
2.nginx对网络的依赖较小,理论上只要ping得通,网页访问正常,nginx就能连得通,nginx同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;lvs就比较依赖于网络环境,目前来看服务器在同一网段内并且lvs使用direct方式分流,效果较能得到保证。另外注意,lvs需要向托管商至少申请多于一个ip来做visual ip,貌似是不能用本省的ip来做VIP的。要做好lvs管理员,确实得跟进学习很多有关网络通信方面的知识,就不再是一个http那么简单了。
3.nginx安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。lvs的安装和配置、测试就要花比较长的时间,因为同上所述,lvs对网络依赖性比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦的多。
4.nginx也同样能承受很高负载且稳定,但负载度很稳定度差lvs还有几个等级:nginx处理所有流量所以受限于机器IO和配置;本身的bug也还是难以避免的;nginx没有现成的双机热备方案,所以跑在单机上还是风险比较大,单机上的事情全都很难说。
5.nginx可以检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前lvs中ldirectd也能支持针对服务器内部的情况来监控,但lvs的原理使其不能重发请求。重发请求这点,比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,nginx会把上传切到另一台服务器重新处理,而lvs就直接断掉了,如果是上传一个很大的文件或者很重要的文件的话,用户可能会因此而恼火。
6.nginx对请求的异步处理可以帮助节点服务器减轻负载,键入使用Apache直接对外服务,那么出现很多的窄带链接时Apache服务器将会占用大量内存而不能释放,使用多于一个nginx做Apache代理的话,这些窄带链接会被nginx挡住,Apache上就不会堆积过多的请求,这样就减少了相当多的内存占用。这点使用squid也有相同的作用,即使squid本身配置为不缓存,对Apache还是有很大帮助你的。lvs没有这些功能,也就无法能比较。
7.nginx能支持http和Email(Email的功能估计比较少人用),lvs所支持的应用在这点上会比nginx更过。
在使用上,一般最前端所采取的的策略应是lvs,也就是dns的指向应为lvs均衡器,lvs的优点另它非常适合做这个任务。
重要的ip地址,最好交由lvs托管,比如数据库的ip、webservice服务器的ip等等,这些ip地址随着时间推移,使用面会越来越大,如果更换ip则故障会接踵而来。所以将这些重要ip交给lvs托管式最为稳妥的,这样做的唯一缺点是需要VIP数量会比较多。
nginx可以作为lvs节点机器使用,一是可以利用nginx的功能,二是可以利用nginx的性能。当然这一层面也可以直接使用squid,squid的功能方面就比nginx弱不少,性能上也有所逊色于nginx。
nginx也可以作为中层代理使用,这一层面nginx基本上无对手,唯一可以撼动nginx的就只有lighttpd了,不过lighttpd目前还没有能做到nginx完全的功能,配置也不那么清晰易读。另外,中层代理的ip也是重要的,所以中层代理业拥有一个VIP和lvs是最完美的方案了。
nginx也可以作为网页静态服务器。
具体的应用还得具体分析,如果是比较小的网站(日pv<1000万),用nginx就完全可以了,如果机器也不少,可以用dns轮询,lvs所耗费的机器还是比较多的;大型网站或者重要的服务,机器不发愁的时候要多多考虑利用lvs。
说明
使用nginx+keepalived实现负载均衡,解决单点与高流量并发问题。为什么要用nginx而不用lvs?
7个理由:
1.高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2——3万并发连接数。
2.内存消耗少:在3万并发连接数下,开启的10个nginx进程才消耗150M内存(150*10=150M)。
3.配置文件非常简单:风格跟程序一样通俗易懂。
4.成本低廉:nginx为开源软件,可以免费使用。而购买F5 big-ip、netscaler等硬件负载均衡交换机则需要十多万至几十万人民币。
(使用nginx做七层负载均衡的理由?)
5.支持rewrite重写规则:能够根据域名、url的不同,将http请求分到不同的后端服务器群组。
6.内置的健康检查功能:如果nginx proxy后端的某台web服务器宕机了,不会影响前端访问。
7.节省带宽:支持gzip压缩,可以添加浏览器本地缓存的header头。

46. 简述Nginx配置Https ?

#server端基本配置 server {
listen 80;
listen 443 ssl spdy;
server_name io.123.com;
include ssl/io.com; #注意看下一个文件
location / {
proxy_pass http://lb_io; if(KaTeX parse error: Expected '}', got 'EOF' at end of input: …`301 https:``//host$request_uri; #此项配置为转换为https的基本配置
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection"upgrade";
}
access_log /data/logs/nginx/access/niuaero.log main;
}
ssl_certificate ssl/ca/io.com.pem;    #这个为购买的https证书,供应商会生成
ssl_certificate_key ssl/ca/io.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#启用TLS1.1、TLS1.2要求OpenSSL1.0.1及以上版本,若您的OpenSSL版本低于要求,请使用 ssl_protocols TLSv1;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
ssl_prefer_server_ciphers on;

47. 简述Nginx配置反爬虫?

#以下内容添加nginx虚拟主机配置里,proxypass之后

if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
return``403;
}

#禁止指定UA及UA为空的访问
if(KaTeX parse error: Expected group after ‘^’ at position 413: …ts|Linguee Bot|^̲") {
return 403; `
}

#禁止非GET|HEAD|POST方式的抓取

if`( r e q u e s t m e t h o d !   ( G E T ∣ H E A D ∣ P O S T ) request_method !~ ^(GET|HEAD|POST) requestmethod! (GETHEADPOST)) {
return 403;
}

48. 分析Nginx 统计日志中访问最多的10个IP?

对第一列进行去重,并输出出现的次数
方法1:
awk ‘{a[$1]++}END{for(i in a)print a[i],i|“sort -k1 -nr|head -n10”}’ access.log
1
方法2:
awk ‘{print $1}’ access.log |sort |uniq -c |sort -k1 -nr |head -n10
说明:a[$1]++ 创建数组a,以第一列作为下标,使用运算符++作为数组元素,元素初始值为0。处理一个IP时,下标是IP,元素加1,处理第二个IP时,下标是IP,元素加1,如果这个IP已经存在,则元素再加1,也就是这个IP出现了两次,元素结果是2,以此类推。因此可以实现去重,统计出现次数。

49. 分析Nginx日志统计日志中访问大于100次的IP ?

方法1:awk ‘{a[$1]++}END{for(i in a){if(a[i]>100)print i,a[i]}}’ access.log
方法2:awk ‘{a[$1]++;if(a[$1]>100){b[$1]++}}END{for(i in b){print i,a[i]}}’ access.log
说明:方法1是将结果保存a数组后,输出时判断符合要求的IP。方法2是将结果保存a数组时,并判断符合要求的IP放到b数组,最后打印b数组的IP

50. 分析Nginx日志统计2019年3月14日一天内访问最多的10个IP?

先过滤出这个时间段的日志,然后去重,统计出现次数

方法1:awk ‘$4>=“[14/Mar/2019:00:00:01” && $4<=“[14/Mar/2019:23:59:59” {a[$1]++}END{for(i in a)print a[i],i|“sort -k1 -nr|head -n10”}’ access.log

方法2: sed -n ‘/[14/Mar/2019:00:00:01/,/[14/Mar/2019:23:59:59/p’ access.log |sort |uniq -c |sort -k1 -nr |head -n10 #前提开始时间与结束时间日志中必须存在

51. 分析Nginx日志统计访问最多的前10个页面($request)?

awk ‘{a[$7]++}END{for(i in a)print a[i],i|“sort -k1 -nr|head -n10”}’ access.log

52. 分析Nginx日志统计每个URL访问内容的总大小($body_bytes_sent) ?

awk ‘{a[$7]++;size[$7]+=$10}END{for(i in a)print a[i],size[i],i}’ access.log

53. 分析Nginx日志统计每个IP访问状态码数量($status) ?

awk ‘{a[$1" "$9]++}END{for(i in a)print i,a[i]}’ access.log

54. 分析Nginx日志统计访问状态码为404的IP及出现次数 ?

awk ‘{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}’ access.log

55. 简述如何优化Nginx中FastCGI参数 ?

fastcgi_cache_path/usr/local/nginx/fastcgi_cache levels=1:2keys_zone=TEST:10minactive=5m;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 464k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_cache TEST;
fastcgi_cache_valid 2003021h;
fastcgi_cache_valid 3011d;
fastcgi_cache_valid any 1m;
说明
第一行是为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。
fastcgi_connect_timeout指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout指定向FastCGI传送请求的超时时间,这个值是已经完成两次握手后向FastCGI传送请求的超时时间。
fastcgi_read_timeout指定接收FastCGI应答的超时时间,这个值是已经完成两次握手后接收FastCGI应答的超时时间。
fastcgi_buffer_size用于指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。
fastcgi_buffers指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。
fastcgi_busy_buffers_size的默认值是fastcgi_buffers的两倍。
fastcgi_temp_file_write_size表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍。
fastcgi_cache表示开启FastCGI缓存并为其指定一个名称。开启缓存非常有用,可以有效降低CPU的负载,并且防止502错误的发生,但是开启缓存也会引起很多问题,要视具体情况而定。
fastcgi_cache_valid、fastcgi用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时,将301应答缓存1天,其他应答均缓存1分钟。

56. 简述Nginx的七层负载均衡( 以及与四层负载的区别 )?

四层负载均衡:

所谓四层负载均衡是指OSI七层模型中的传输层, 那么传输层Nginx已经支持TCP/IP的控制, 所以只需要对客户端的请求进行TCP/IP协议的包转发就可以实现负载, 那么他的好处是性能非常快, 只需要底层进行应用处理,而不需要进行一些复杂的逻辑.

七层负载均衡:

七层负载均衡是在应用层,那么他可以完成后很多应用方面的协议请求,
当然四层有四层的好处,七层七层的好处,四层就不支持协议的转发,(http,https,DNS等)只支持IP,但是它的速度快.
应用层虽然没有四层负载快,但是支持很多功能,比如说他支持http信息的改写、头部信息的改写、(意识是,七层代理着用户往后请求的时候把我们用户请求的头部信息加上,长连接协议也可以修改等)、安全应用规则控制、URL匹配规则控制、以及转发、rewrite等一些规则,所以在应用层的服务里面,可以做的内容就更多了。Nginx是一个典型的七层负载均衡

【四层和七层的区别】

四层负载均衡数据在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发,由此可以看出,七层负载均衡效率没有四层负载均衡高。
但是七层负载均衡更贴近于服务,如HTTP协议就是七层协议,我们可以用Nginx可以作会话保持,URL路径规则匹配,head头改写等等,这些都是四层负载均衡无法实现的。

注意:四层负载均衡不识别域名,七层负载均衡识别域名

57. 简述Nginx负载均衡实现过程 ?

http模块中配置使用upstream模块定义后台的webserver的池子,并且给池子命名, 比如命名为proxy-web,在池子中我们可以添加多台后台webserver,其中状态检查、调度算法都是在池子中配置;
然后在server模块中定义虚拟 location 地址,但是这个虚拟location 地址 不指定自己的web目录站点它将使用location 匹配url然后转发到上面定义好的web池子中,后台的webserver的池子,最后根据调度策略再转发到后台web server上。

【Nginx负载均衡配置】
Upstream proxy_nginx {
server 192.168.0.254 weight=1max_fails=2 fail_timeout=10s ;
server 192.168.0.253 weight=2 max_fails=2fail_timeout=10s;
server192.168.0.252 backup; server192.168.0.251 down;
}

server{
listen 80;
server_name xiaoka.com;
}

location / {
proxy_pass http:// proxy_nginx;
proxy_set_header Host
proxy_set_header X-Real-IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

58. 简述Nginx IO事件模型以及连接数上限 ?

events {
use epoll; #epoll 是多路复⽤ IO(I/O Multiplexing)中的⼀种⽅式,但是仅⽤于 linux2.6
#以上内核,可以⼤⼤提⾼ nginx 的性能
worker_connections 1024;#单个后台 worker process 进程的最⼤并发链接数
#multi_accept on;
}

59. 简述Nginx 和 Apache、Tomcat 之间的不同点 ?

Tomcat 和Nginx/Apache区别:

1、Nginx/Apache 是Web Server,而Apache Tomact是一个servlet container
2、tomcat可以对jsp进行解析,nginx和apache只是web服务器,可以简单理解为只能提供html静态文件服务。

Nginx和Apache区别:

1)Nginx轻量级,同样起web 服务,比apache占用更少的内存及资源 。
2)Nginx 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 。
3)Nginx提供负载均衡,可以做做反向代理,前端服务器
4)Nginx多进程单线程,异步非阻塞;Apache多进程同步,阻塞。

60. 详细阐述Nginx与Apache对比 ?

优点:
轻量级,采用 C 语言 进行编写,同样的 web 服务,会占用更少的内存及资源。
抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,多个连接对应一个进程,负载能力比 apache 高很多,而 apache 则是同步多进程模型,只能一个连接对应一个进程,当压力过大时,它是会被阻塞型的。
在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
设计高度模块化,编写模块相对简单。
配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃。
一般用于处理静态文件,静态处理性能比 apache 高三倍以上。
作为负载均衡服务器,支持 7 层负载均衡。
本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器。
nginx 启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,支持热部署,比如:实现不间断服务的情况下进行软件版本的升级与版本的回退。
社区活跃,各种高性能模块出品迅速。

缺点:
apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache。
apache 发展到现在,模块超多,基本想到的都可以找到。
apache 更为成熟,少 bug ,nginx 的 bug 相对较多。
apache 超稳定,Nginx 一个进程死掉时,会影响到多个用户的使用,稳定性差。
apache 对 PHP 支持比较简单,nginx 需要配合其他后端用。
apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区

61. 阐述Nginx与Apache选择标准 ?

Apache
● apache 的 rewrite 比 nginx 强大,在 rewrite 频繁的情况下,用 apache
● apache 发展到现在,模块超多,基本想到的都可以找到
● apache 更为成熟,少 bug ,nginx 的 bug 相对较多
● apache 超稳定
● apache 对 PHP 支持比较简单,nginx 需要配合其他后端用
● apache 在处理动态请求有优势,nginx 在这方面是鸡肋,一般动态请求要 apache 去做,nginx 适合静态和反向。
● apache 仍然是目前的主流,拥有丰富的特性,成熟的技术和开发社区

Nginx
● 轻量级,采用 C 语言 进行编写,同样的 web 服务,会占用更少的内存及资源
● 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数飙升,从而拒绝服务的现象。
● nginx 处理静态文件好,静态处理性能比 apache 高三倍以上
● nginx 的设计高度模块化,编写模块相对简单
● nginx 配置简洁,正则配置让很多事情变得简单,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 ,重启的时候发现配置出错了,会很崩溃
● nginx 作为负载均衡服务器,支持 7 层负载均衡
● nginx 本身就是一个反向代理服务器,而且可以作为非常优秀的邮件代理服务器
● 启动特别容易, 并且几乎可以做到 7*24 不间断运行,即使运行数个月也不需要重新启动,还能够不间断服务的情况下进行软件版本的升级
● 社区活跃,各种高性能模块出品迅速

62. 简述归纳Nginx处理HTTP请求过程的 11 个阶段?

Nginx 处理 HTTP 请求的过程大概可以分为 11 个阶段,如下:

Read Request Headers:解析请求头。
Identify Configuration Block:识别由哪一个 location 进行处理,匹配 URL。
Apply Rate Limits:判断是否限速。例如可能这个请求并发的连接数太多超过了限制,或者 QPS 太高。
Perform Authentication:连接控制,验证请求。例如可能根据 Referrer 头部做一些防盗链的设置,或者验证用户的权限。
Generate Content:生成返回给用户的响应。为了生成这个响应,做反向代理的时候可能会和上游服务(Upstream Services)进行通信,然后这个过程中还可能会有些子请求或者重定向,那么还会走一下这个过程(Internal redirects and subrequests)。
Response Filters:过滤返回给用户的响应。比如压缩响应,或者对图片进行处理。
Log:记录日志

如下所示,每一个模块处理之间是有序的,那么这个顺序怎么才能得到呢?其实非常简单,在源码 ngx_module.c 中,有一个数组 ngx_module_name,其中包含了在编译 Nginx 的时候的 with 指令所包含的所有模块,它们之间的顺序非常关键,在数组中顺序是相反的。

char *ngx_module_names[] = {
… …
“ngx_http_static_module”,
“ngx_http_autoindex_module”,
“ngx_http_index_module”,
“ngx_http_random_index_module”,
“ngx_http_mirror_module”,
“ngx_http_try_files_module”,
“ngx_http_auth_request_module”,
“ngx_http_auth_basic_module”,
“ngx_http_access_module”,
“ngx_http_limit_conn_module”,
“ngx_http_limit_req_module”,
“ngx_http_realip_module”,
“ngx_http_referer_module”,
“ngx_http_rewrite_module”,
“ngx_http_concat_module”,
… …
}

63. 简述Nginx惊群效应 ?

惊群效应(thundering herd)是指多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),

如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的 “控制权”,对该事件进行处理,

而其他进程(线程)获取 “控制权” 失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应。

64. 简述Docker安装Nginx的流程和指令 ?

1 : 下载Nginx镜像
命令 描述
docker pull nginx 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest )
docker pull nginx:xxx 下载指定版本的Nginx镜像 (xxx指具体版本号)

2:检查当前所有Docker下载的镜像
docker image

3:创建Nginx配置文件
启动前需要先创建Nginx外部挂载的配置文件( /home/nginx/conf/nginx.conf)
之所以要先创建 , 是因为Nginx本身容器只存在/etc/nginx 目录 , 本身就不创建 nginx.conf 文件
当服务器和容器都不存在 nginx.conf 文件时, 执行启动命令的时候 docker会将nginx.conf 作为目录创建 , 这并不是我们想要的结果 。

#创建挂载目录
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/log
mkdir -p /home/nginx/html
容器中的nginx.conf文件和conf.d文件夹复制到宿主机

#生成容器
docker run --name nginx -p 9001:80 -d nginx
#将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
#将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
#将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/nginx/

4:创建Nginx容器并运行
Docker 创建Nginx容器

#直接执行docker rm nginx或者以容器id方式关闭容器
#找到nginx对应的容器id
docker ps -a
#关闭该容器
docker stop nginx
#删除该容器
docker rm nginx

#删除正在运行的nginx容器
docker rm -f nginx
docker run
-p 9002:80
–name nginx
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /home/nginx/conf/conf.d:/etc/nginx/conf.d
-v /home/nginx/log:/var/log/nginx
-v /home/nginx/html:/usr/share/nginx/html
-d nginx:latest

65. 简述Nginx安全配置指南 ?

Nginx是一款高性能的Web服务器和反向代理服务器,广泛应用于互联网行业中。然而,在使用Nginx时,安全问题也非常重要,因为一旦Nginx被黑客攻击,将可能暴露网站的重要信息并造成经济损失。因此,本文将介绍Nginx的一些安全配置指南,以帮助您增强Nginx的安全性。
使用HTTPS协议
HTTP协议是明文传输,容易被攻击者窃听和篡改。因此,使用安全的HTTPS协议可以有效避免这些安全问题。要启用HTTPS协议,您需要在Nginx配置文件中配置SSL证书和私钥,然后将HTTP端口重定向到HTTPS端口。
防止DDoS攻击
DDoS攻击是一种利用多个计算机同时攻击目标服务器的攻击方式,目的是让目标服务器瘫痪。要避免此类攻击,可以在Nginx中配置限制连接数,并设置连接超时和响应超时等参数。此外,可以使用防火墙和CDN等工具来进一步防范DDoS攻击。
防止SQL注入攻击
SQL注入攻击是一种非常常见的攻击方式,攻击者将恶意的SQL语句注入到Web应用程序中,从而获取用户的敏感信息。为了避免这种攻击,您可以使用Nginx的变量和正则表达式等功能来拦截恶意请求。此外,建议使用ORM框架或参数化查询来避免SQL注入攻击。
增强访问控制
访问控制是保障服务器安全的重要措施之一。您可以在Nginx中使用基本认证、客户端证书和IP地址黑白名单等方式来增强访问控制。通过基本认证,可以使用用户名和密码来认证访问者的身份;通过客户端证书,可以在客户端和服务器之间建立加密通道;通过IP地址黑白名单,可以限制特定IP地址的访问权限。
隐藏服务器信息
在默认情况下,Nginx会发送服务器信息,包括服务器软件版本号等,这样会让攻击者更容易对服务器进行攻击。为了避免这种情况,可以在Nginx中禁用服务器信息。通过更改Nginx配置文件中的server_tokens指令,可以轻松实现此目的。
备份和监控
备份和监控是服务器安全保障的重要措施之一。您可以定期备份Nginx和相关配置文件,以便在出现意外情况时迅速恢复服务器。此外,监控服务器的运行状态也非常重要。您可以使用监控工具,如Zabbix、Nagios等,及时掌握服务器的运行状态、资源使用情况和异常报警等信息。
结语
通过上述措施,您可以确保Nginx服务器的安全性,从而避免出现数据泄漏、DDoS攻击、SQL注入等安全问题。当然,这些只是Nginx安全措施中的一部分,根据实际情况,您也可以根据需要进行相关配置和调整。希望上述Nginx安全配置指南能够为您提供参考和指导,确保服务器的安全稳定运行。

66. Nginx中rewrite有哪⼏个flag标志位(last、break、redirect、permanent)的概念 ?

• last : 相当于Apache的[L]标记,表⽰完成当前的rewrite规则
• break : 停⽌执⾏当前虚拟主机的后续rewrite指令集
• redirect : 返回302临时重定向,地址栏会显⽰跳转后的地址
• permanent : 返回301永久重定向,地址栏会显⽰跳转后的地址
301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令⽆法返回301,302的原因了。这⾥ last
和 break 区别有点难以理解:
• last⼀般写在server和if中,⽽break⼀般使⽤在location中
• last不终⽌重写后的url匹配,即新的url会再从server⾛⼀遍匹配流程,⽽break终⽌重写后匹配
• break和last都能组织继续执⾏后⾯的rewrite指令

67. Nginx中500、502、503、504 有什么区别?

500:
Internal Server Error 内部服务错误,⽐如脚本错误,编程语⾔语法错误。
502:
Bad Gateway错误,⽹关错误。⽐如服务器当前连接太多,响应太慢,页⾯素材太多、带宽慢。
503:
Service Temporarily Unavailable,服务不可⽤,web服务器不能处理HTTP请求,可能是临时超载或者是服务器进⾏停机维护。
504:
Gateway timeout ⽹关超时,程序执⾏时间过长导致响应超时,例如程序需要执⾏20秒,⽽nginx最⼤响应等待时间为10秒,这样就会出现超时。

68. 简述Nginx 如何开启压缩?

开启nginx gzip压缩后,图⽚、css、js等静态资源的⼤⼩会减⼩,可节省带宽,提⾼传输效率,但是会消耗CPU资源。
开启:
#开启gzip
gzip off;
#启⽤gzip压缩的最⼩⽂件,⼩于设置值的⽂件将不会压缩怎样修复ie
gzip_min_length 1k;图片浏览软件
#gzip 压缩级别,1-9,数字越⼤压缩的越好,也越占⽤CPU时间,后⾯会有详细说明
gzip_comp_level 1;
注册表编辑器在哪里
#进⾏压缩的⽂件类型。javascript有多种形式。其中的值可以在 pes ⽂件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif im age/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;

69. 简述Nginx采用多进程好处 ?

1 进程之间不共享资源,不需要加锁,减少了使用锁对性能造成的影响,同时降低编程的复杂度,降低开发成本;
2 采用独立的进程,可以让进程互相之间不会影响,如果一个进程发生异常退出时,其它进程正常工作,master 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低。

70. 详细阐述Nginx处理HTTP请求过程 ?

1 Nginx 处理 HTTP 请求的过程大概可以分为 11 个阶段,如下:
2 Read Request Headers:解析请求头。
3 Identify Configuration Block:识别由哪一个 location 进行处理,匹配 URL。
4 Apply Rate Limits:判断是否限速。例如可能这个请求并发的连接数太多超过了限制,或者 QPS 太高。
5 Perform Authentication:连接控制,验证请求。例如可能根据 Referrer 头部做一些防盗链的设置,或者验证用户的权限。
6 Generate Content:生成返回给用户的响应。为了生成这个响应,做反向代理的时候可能会和上游服务(Upstream Services)进行通信,然后这个过程中还可能会有些子请求或者重定向,那么还会走一下这个过程(Internal redirects and subrequests)。
7 Response Filters:过滤返回给用户的响应。比如压缩响应,或者对图片进行处理。
8 Log:记录日志。

71. 简述Nginx限制IP访问 ?

有时候我们需要针对屏蔽某些恶意的 IP 访问我们的网站,或者限制仅仅某些白名单 IP 才能访问我们的网站。这时候我们就可以在 Nginx 中通过简单的配置来达到目的。

Nginx限制IP访问配置
屏蔽单个ip访问
#格式: deny ip;
deny 123.68.23.5;
允许单个ip访问
#格式: allow ip;
allow 123.68.25.6;
屏蔽所有ip访问
deny all;
允许所有ip访问
allow all;
屏蔽ip段访问
#deny ip/mask
#屏蔽172.12.62.0到172.45.62.255访问的命令
deny 172.12.62.0/24;
允许ip段访问
#allow ip/mask
#屏蔽172.102.0.0到172.102.255.255访问的命令
allow 172.102.0.0/16;
配置说明
可新建一个配置文件,如 blockip.conf。在其中编写相关的 ip 限制语句,然后在 nginx.conf 中加入如下配置:

#配置ip限制策略
include blockip.conf;
nginx 会根据配置文件中的语句,从上至下依次判断。因此,写在前面的语句可能会屏蔽后续的语句。除部分 ip 白名单外,屏蔽所有 ip 的错误示例:

deny all; #该语句已经禁止所有ip的访问,后续的配置不会生效
allow 123.45.25.6;
allow 123.68.52.125;
allow 123.125.25.106;
正确示例:

#允许部分ip访问
allow 123.45.25.6;
allow 123.68.52.125;
allow 123.125.25.106;
#禁止其余ip访问
deny all;
屏蔽策略文件可以放在 http, server, location, limit_except 语句块中,我们可以根据需要合理的配置。

放置位置 效果
http nginx 中所有服务起效
server 指定的服务起效
location 满足的 location 下起效
limit_except 指定的 http 方法谓词起效

72. 简述Nginx限制IP访问频率?

限制所有单个ip的访问频率
http中的配置
http {
#$limit_conn_zone:限制并发连接数
limit_conn_zone KaTeX parse error: Expected 'EOF', got '#' at position 35: …zone=one1:10m; #̲limit_req_zone:…binary_remote_addr:以客户端IP进行限制
#zone=one:10m:创建IP存储区大小为10M,用来存储访问频率
#rate=10r/s:表示客户端的访问评率为每秒10次
limit_req_zone KaTeX parse error: Expected 'EOF', got '}' at position 46: …0m rate=10r/s; }̲ server配置 serve…limited变量,默认值为1,如果客户端ip在上面的范围内,$limited的值为0
geo $limited{
default 1;
10.0.0.140 0; #把10.0.0.140设置为白名单
10.0.0.141 0; #白名单ip,可继续添加
}
#使用map指令映射搜索引擎客户端的ip为空串,如果不是搜索引擎就显示本身真是的ip
#这样搜索引擎ip就不能存到limit_req_zone内存session中,所以不会限制搜索引擎的ip访问
map $limited $limit {
1 $binary_remote_addr;
0 “”;
}
limit_conn_zone $limit zone=one:20m;
limit_req_zone $limit zone=one2:20m rate=10r/s;
}
server配置
server {
listen 80;
server_name localhost;
location / {
limit_conn one 2;
limit_req zone=one2 burst=10 nodelay;
root html;
index index.html index.htm;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我思故我在6789

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值