暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Nginx分析讲解

Nick技术栈 2019-06-02
168

我从下面的几个方面分析Nginx。

  • Nginx  是什么?

  • Nginx哪里好?

  • Nginx  为什么好?

  • Nginx  使用的情景?

  • Nginx  如何配置?


Nginx是什么?

 Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。是一个开源的项目。后来淘宝在Nginx基础上针对大访问量做出了修改,做出了Tengine。


Nginx哪里好

1、占有内存少,并发能力强,Nginx的并发能力在同类型的网页服务器中表现较好。

2、Nginx相较于Apache\lighttpd具有占有内存少

3、稳定性高等优势,并且依靠并发能力强

   4、有丰富的模块库以及友好灵活的配置

5、支持热部署。即可以在7×24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。

6、可以做反向代理,并且可以支持七层负载均衡


Nginx  为什么好?

Nginx为什么比apache快?

  • 虽然Nginx与Apache都用到了多路复用IO模式,但是两个不同的是,Nginx用的是epoll,而Apache用的是select。(select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长;不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。时间复杂度是O(1)。举个通俗易懂的例子:

    同是在很乱的抽屉找东西,select版本是一个一个找。而epoll版本是先收拾好分类,以后找就很快可以找到了。如果要找10000次东西,就效率很明白了。)二者最核心的区别在于 Apache 是同步多进程模型,一个连接对应一个进程;Nginx 是异步的,多个连接(万级别)可以对应一个进程

  • Nginx 并发性比较好,CPU 内存占用低

  • Nginx配置文件简单,支持正则。而且可以用-t验证配置文件是否正确。

  • Nginx社区比较活跃。各种高性能模块出品快。

但是也有他的缺点:

  • 对动态请求支持不好

  • Rewrite功能不如Apache

  • 模块不如Apache多

  • Bug较Apache多


Nginx  使用的情景?

1、Nginx适用于高并发的情况。但是在并发不高的时候,Nginx的性能并不能体现出来

2、Nginx可以做代理服务器。

说到代理。可以引申出正向和反向代理。

正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。我们平时用的VPN就是一个典型的正向代理。

如下图:

反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。

如下图:

反向代理可以防止外网对内网服务器的攻击、缓存、减少服务器压力以及负载均衡。

3、Nginx可以做负载均衡器

负载均衡器就是图中的Nginx1,通过反向代理,以及一些均衡算法。把client分发给不同的web server。


Nginx  如何配置?

默认的配置文件在/etc/nginx。叫nginx.conf或者是在conf.d下。

日志文件的配置

默认格式

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
 

默认存放位置

     access_log  var/log/nginx/access.log  main;

错误日志

 默认:
 error_log var/log/nginx/error.log;
 
 nginx的error_log类型如下(从左到右:debug最详细 crit最少):
 [ debug | info | notice | warn | error | crit ]
 例如:error_log logs/nginx_error.log crit;
字段说明
字段名称含义
remoteaddr表示客户端IP地址。
remote_user表示客户端用户名称。
request表示请求的URL和HTTP协议。
status表示请求状态。
bodybytessent表示发送给客户端的字节数,不包括响应头的大小;该变量与Apache模块modlogconfig里的bytes_sent发送给客户端的总字节数相同。
connection表示连接的序列号。
connection_requests表示当前通过一个连接获得的请求数量。
msec表示日志写入的时间。单位为秒,精度是毫秒。
pipe表示请求是否通过HTTP流水线(pipelined)发送。通过HTTP流水线发送则pipe值为“p”,否则为“.”。
httpreferer表示从哪个页面链接访问过来的。
“http_user_agent”表示客户端浏览器相关信息,前后必须加上双引号。
requestlength表示请求的长度。包括请求行,请求头和请求正文。
request_time表示请求处理时间,单位为秒,精度为毫秒。从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
[$time_local]表示通用日志格式下的本地时间,前后必须加上中括号
配置工作进程数目
 worker_processes 4;

工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。

配置keepalive超时时间
 keepalive_timeout 60;
配置负载均衡
 location ~* \.(mp3|mp4)$ {
 
 对以“mp3或mp4”结尾的地址进行负载均衡
 
 
 
 proxy_pass http://img_relay$request_uri;
 
 设置被代理服务器的端口或套接字,以及URL
 
 
 
 proxy_set_header Host $host;
 
 proxy_set_header X-Real-IP $remote_addr;
 
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
 以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上
 
 }

负载均衡的几种分配方式:

轮询(默认)、weight、ip_hash、url_hash等

轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

weight:

upstream bakend {server 192.168.0.14 weight=10;server 192.168.0.15 weight=10;}

ip_hash:

upstream bakend {ip_hash;server 192.168.0.14:88;server 192.168.0.15:80;}

url_hash:

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

更详细的配置在下一篇文章说到

文章转载自Nick技术栈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论