我从下面的几个方面分析Nginx。
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。是一个开源的项目。后来淘宝在Nginx基础上针对大访问量做出了修改,做出了Tengine。
1、占有内存少,并发能力强,Nginx的并发能力在同类型的网页服务器中表现较好。
2、Nginx相较于Apache\lighttpd具有占有内存少
3、稳定性高等优势,并且依靠并发能力强
4、有丰富的模块库以及友好灵活的配置
5、支持热部署。即可以在7×24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。
6、可以做反向代理,并且可以支持七层负载均衡
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多
1、Nginx适用于高并发的情况。但是在并发不高的时候,Nginx的性能并不能体现出来
2、Nginx可以做代理服务器。
说到代理。可以引申出正向和反向代理。
正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。我们平时用的VPN就是一个典型的正向代理。
如下图:
反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
如下图:
反向代理可以防止外网对内网服务器的攻击、缓存、减少服务器压力以及负载均衡。
3、Nginx可以做负载均衡器
负载均衡器就是图中的Nginx1,通过反向代理,以及一些均衡算法。把client分发给不同的web server。
默认的配置文件在/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_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掉,能自动剔除。
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}