Nginx 进阶(不断学习更新中)

1.Nginx 作为一个 web 服务器, 只能做基于80端口或者mail 的 负载均衡是基于应用层的负载均衡,这一点LVS 就是一个专门的负载均衡软件没有针对什么端口,什么FTP啦,都可以
这个是文档里面找的

LVS负载调度器能够支持绝大多数的TCP和UDP协议:
协议内 容TCPHTTP,FTP,PROXY,SMTP,POP3,IMAP4,DNS,LDAP,HTTPS,SSMTP等UDPDNS,NTP,ICP,视频、音频流播放协议等无需对客户机和服务器作任何修改,可适用大多数Internet服务。
性能:LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s


2.Nginx 与 Apache 怎么说 Apache 这么长时间了,模块那是超级多,还有Nginx 是基于事件驱动的。而Apache是线程的。什么的什么的。这个我不明白。可能要多学点。反正知道的就是Nginx的并发处理非常不错。

3.突然想到,其实nginx 和这些web 服务器不冲突,可以nginx 做前端的负载均衡和反向代理,后端开启httpd 服务,共用一个db设备,比如Mysql 利用 Master/Slave 来做后端 ,呼呼 这算是一个架构么。。。其实都是空话。。。额。。

4nignx 的 features
1).keep-alive and pipeline
2).智能DNS
3).ip访问控制和基本的身份验证
            location /test {
                auth_basic "Restricted";
                auth_basic_user_file  /usr/local/test;
        }
4).流媒体 MP4/FLV
5).相应线程
6).支持perl

5.nginx 重写 rewrite 才用 PCRE的正则表达式的语法
if($http_usr_agent ~ MSIE){
   rewrite ^(.*)$/web1/$1 break
}

location ~ .*\.(sh|bash)?${
  return 403;
}

使用last会对server标签重新发起请求,而break就直接使用当前的location中的数据源来访问
在location / { 配置里:
1、使用root指定源:使用last和break都可以
2、使用proxy_pass指定源:使用last和break都可以
3、使用alias指定源:必须使用last
在location /a/或使用正则的location ~ ^/a/里:
1、使用root指定源:使用last和break都可以
2、使用proxy_pass指定源:使用break和last结果有所区别
3、使用alias指定源:必须使用last


6.nginx 对 fastcgi的支持



-----------------------------------

Nginx 指令大全 http://howtocn.org/nginx:directiveindex

-----------------------------------
扯了这么多。开始看看大神们对Nginx的解释 ,感觉茅塞顿开。。。。。



首先 我们ps -ef|grep nginx 发现nginx 是由一个master 和多个worker 来组成的,顾名思义,Master是管理那些worker的, master 会fork出worker ,有请求的时候,worker就会去接受那些请求,大神说nginx 有个 accept_mutex 参数 ,可以防止一个worker 接受成功,其他worker都接受失败的错误设定,对 就是对请求加共享锁,每个worker进程处理一个请求,进水不犯河水,这样 nignx 的 从容的重启就可以实现了,不会全盘杀掉,你跑你的,我重启我的,你跑完了 我再fork worker就行了,当然,在此期间,旧的worker肯定不能接受新的请求。

那这么多worker进程,请求多了来了也吃不消呀,哪里有说的 nignx处理高并发的特点。貌似apache就是每个请求都会有一个工作线程(多线程模式),然后纷纷多的线程一下来,然后就是各种alert邮件。在这里 nignx异步非阻塞版本,可以同时处理很多请求。

就像是具体到系统调用就是像select/poll/epoll/kqueue这样的系统调用,我们的请求最后就是事件驱动的,一个请求请求一个事件处理,enginx就是把事件放到epoll中,事件准备好了,我们就去读写,当读写返回EAGAIN时,我们将它再次加入到epoll里面。这样,只要有事件准备好了,我们就去处理它,只有当所有事件都没准备好时,才在epoll里面等着。这样,我们就可以并发处理大量的并发了,只是线程只有一个,所以处理就是在这些事件中不断的切换 切换。。

我们之前说过,推荐设置worker的个数为cpu的核数,在这里就很容易理解了,更多的worker数,只会导致进程来竞争cpu资源了,从而带来不必要的上下文切换。而且,nginx为了更好的利用多核特性,提供了cpu亲缘性的绑定选项,我们可以将某一个进程绑定在某一个核上,这样就不会因为进程的切换带来cache的失效。像这种小的优化在nginx中非常常见,同时也说明了nginx作者的苦心孤诣。比如,nginx在做4个字节的字符串比较时,会将4个字符转换成一个int型,再作比较,以减少cpu的指令数等等。(这一段抄得。。还没用到,所以不知道怎么理解)

一个nginx能建立的最大连接数,应该是worker_connections * worker_processes

比如图片服务器,通常一个网页会包含很多个图片。打开keepalive也会大量减少time-wait的数量。




猜你喜欢

转载自zhanghaj00.iteye.com/blog/2017417