nginx最详细分析

Nginx

我从下面的几个方面分析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就是一个典型的正向代理。

如下图:

img

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

如下图:

https://img-blog.csdn.net/20161117152428134

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

3、Nginx可以做负载均衡器

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

img


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;
}

你可能感兴趣的:(服务)