Nginx总结

11 篇文章 0 订阅

一、介绍

   Nginx是一个高性能的HTTP和反向代理服务器,及电子邮件(IMAP/POP3)代理服务器,同时也可以作为负载均衡器

二、Nginx与Apache优缺点比较

通用的方案是,前端 nginx 抗并发,后端 apache 集群,配合起来会更好

优点:

  1. 静态处理性能比 apache 高三倍以上
  2. nginx 配置简洁,而且改完配置能使用 -t 测试配置有没有问题,apache 配置复杂 
  3. 负载能力比 apache 高很多。nginx 以 epoll 和kqueue 作为开发模型,处理请求是异步非阻塞的,而 apache 则是阻塞型
  4. 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源

缺点:

  1. apache 在处理动态请求有优势,nginx 适合静态和反向
  2. apache 的 rewrite 比 nginx 强大
  3. nginx 的 bug 相对较多,apache较稳定
  4. apache 对 PHP 支持比较简单,nginx 需要配合其他后端

三、LVS、HAProxy、Nginx负载均衡比较

LVS:

  1.  工作在网络4层,通过vrrp协议转发(仅作分发之用),不产生流量,具体的流量由linux内核处理
  2. 支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
  3. 应用范围比较广,可以对所有应用做负载均衡;
  4. 配置复杂,对网络依赖比较大
  5. 抗负载能力强。能达到F5硬件的60%;对内存和cpu资源消耗比较低
  6. 不支持虚拟主机
  7. 不支持正则处理,不能做动静分离。

Ngnix:

  1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构
  2. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、lc(最少连接)、Ip-hash(Ip哈希)
  3. Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
  4. 配置简单,Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
  5. 抗负载相对lvs弱些
  6. 支持虚拟主机
  7. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
  8. 不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好
  9. Nginx还能做Web服务器Cache功能。

HAProxy的特点是:

  1. 支持两种代理模式:TCP(四层)和HTTP(七层)
  2. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
  3. 支持虚拟主机
  4. 支持Session的保持,Cookie的引导等工作
  5. 支持url检测后端服务器健康检测。
  6. 不能做Web服务器Cache。
  7. 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,支持对Mysql进行负载均衡,对后端的DB节点进行检测

四、Nginx配置文件结构

  1. 全局作用域块
  2. event 作用域块
  3. http 指令作用域块
  4. server 指令作用域块
  5. location 指令作用域块

五、静态HTTP服务器

server {  
    listen80; # 端口号  
    location / {  
        root /usr/share/nginx/html; # 静态文件路径  
    }  
} 

六、反向代理服务器

    概念:以代理服务器来接受internet上的连接请求,然后将请求,发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

    优点:反向代理服务器可以隐藏源服务器的存在和特征。

   与正向代理服务器区别:在于正向代理代理的是客户端,反向代理代理的是服务端,正向代理能过帮助客户端访问不了服务端实现访问,客户端必须要进行一些特别的设置才能使用正向代理

server {  
    listen80;  
    location / {  
        proxy_pass http://192.168.20.1:8080; # 应用服务器HTTP地址  
    }  
} 

七、负载均衡

1、轮询:默认的策略,把每个请求按顺序逐一分配到不同的server,如果server挂掉,能自动剔除。

upstream  fengzp.com {   
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}
 
server {  
    listen80;  
    location / {  
        proxy_pass http://fengzp.com;  
    }  
} 

 2、最少连接:把请求分配到连接数最少的server

upstream  fengzp.com {   
    least_conn;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

 3、权重:使用weight来指定server访问比率,weight默认是1。以下配置会是server2访问的比例是server1的两倍

upstream  fengzp.com {   
    server   192.168.99.100:42000 weight=1; 
    server   192.168.99.100:42001 weight=2;  
}

 4、ip_hash:每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除 ;ip_hash可以和weight结合使用

upstream  fengzp.com {   
    ip_hash;
    server   192.168.99.100:42000; 
    server   192.168.99.100:42001;  
}

八、虚拟主机 

有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上

server {  
    listen 80 default_server;  
    server_name _;  
    return444; # 过滤其他域名的请求,返回444状态码  
}  
server {  
    listen 80;  
    server_name www.aaa.com; # www.aaa.com域名  
    location / {  
        proxy_pass http://localhost:8080; # 对应端口号8080  
    }  
}  
server {  
    listen 80;  
    server_name www.bbb.com; # www.bbb.com域名  
    location / {  
        proxy_pass http://localhost:8081; # 对应端口号8081  
    }  
} 

九、Nginx常用命令

  1. 启动nginx  ./sbin/nginx
  2. 停止nginx ./sbin/nginx -s stop    ./sbin/nginx -s quit
  3. 重载配置  ./sbin/nginx -s reload(平滑重启)  service nginx reload 
  4. 重载指定配置文件 ./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
  5. 查看nginx版本 ./sbin/nginx -v
  6. 检查配置文件是否正确 ./sbin/nginx -t
  7. 显示帮助信息 ./sbin/nginx -h

十、Nginx的master进程和worker进程

nginx在启动后,会有一个master进程和多个worker进程。

master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

而基本的网络事件,则是放在worker进程中来处理了。一个请求,只可能在一个worker进程中处理,它们相互独立。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。独立的进程,不需要加锁,所以省掉了锁带来的开销

十一、Nginx处理请求

  1. 首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面, 先初始化好这个监控的socket,再进行listen,然后再fork出多个子进程出来
  2. 此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,然后创建nginx对连接的封装,接着,根据事件调用相应的事件处理模块,如http模块与客户端进行数据的交换。
  3. 最后,nginx或客户端来主动关掉连接

十二、fastcgi与cgi的区别

cgi:服务器收到一个请求时,然后会fork一个新进程来处理请求,处理完请求后,fork出来的进程会退出

fastcgi:服务器收到一个请求时,他不会重新fork一个进程来处理请求,因为这个进程在web服务器启动时就开启了,当请求处理后,它会等待下一个请求的到来,而不是退出。

十三、问题总结

1、为什么Nginx性能这么高?
    得益于它的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

2、为什么不使用多线程?

   nginx采用epoll(io多路复用),能够解决每个线程同时处理多个连接

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

   在server作用域中,设置server_name为空字符串,并设置return为444非http标准的返回码,它可以用来关闭连接

4、是否有可能将Nginx的错误替换为502错误、503?

    502 代表错误网关,503代表服务器超载。有可能,但是要确保fastcgi_intercept_errors被设置为ON,并使用错误页面指令

Location / {
   fastcgi_pass 127.0.01:9001;
   fastcgi_intercept_errors on;
   error_page 502 =503/error_page.html;
   #…
}

 5、在Nginx中,解释如何在URL中保留双斜线?

         merge_slashes设置为off,默认是on;例:设置off,当url存在//test///a.txt路径,能匹配到,单斜线不匹配

6、stub_statussub_filter指令的作用是什么? 

 Stub_status指令:该指令用于了解Nginx当前状态的当前状态,如当前的活动连接,接受和处理当前读/写/等待连接的总数

 Sub_filter指令:它用于搜索和替换响应中的内容,并快速修复陈旧的数据

7、ngx_http_upstream_module的作用是什么?

 ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组。

8、Nginx是否支持将请求压缩到上游?

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

9、如何在Nginx中获得当前的时间?

   要获得Nginx的当前时间,必须使用SSI模块、$date_gmt$date_local的变量。

 Proxy_set_header THE-TIME $date_gmt;

10、如何在Nginx服务器上添加模块?

   在编译过程中,必须选择Nginx模块,因为Nginx不支持模块的运行时间选择

11、Nginx服务器解释-s的目的是什么?

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

12、nginx -s stop and -s quit 有什么区别?

   nginx -s quit 在退出前完成已经接受的连接请求

   nginx -s stop 是快速关闭,不管有没有正在处理的请求

13、502错误可能原因

  1. FastCGI进程是否已经启动
  2. FastCGI worker进程数是否不够
  3. FastCGI执行时间过长(fastcgi_connect_timeout 300;    fastcgi_send_timeout 300;     fastcgi_read_timeout 300;)
  4. FastCGI Buffer不够(fastcgi_buffer_size 32k;)
  5. Proxy Buffer不够(proxy_buffer_size   16k;)
  6. php脚本执行时间过长(将php-fpm.conf的<value name="request_terminate_timeout">0s</value>的0s改成一个时间)
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值