Nginx实用指南
Nginx是什么?
官网介绍:
nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.
简单来说:
Nginx是一个Web服务器。
Nginx与其他服务器对比

Ngix的特点
- 高性能:
事件驱动的架构:能够并发处理百万级别的TCP连接。
全异步的网络I/O处理机制。
极少的进程间切换。
- 模块化:
高度模块化的设计和自由的许可证。
使得扩展Nginx功能的第三方模块层出不穷。
- 跨平台:
Linux:(sendfile、epoll) Nginx支持其独有的sendfile系统调用。这个系统调用可以高效地把硬盘中的数据发送到网络上(不需要先把硬盘数据复制到用户态内存上再发送),这极大地减少了内核态与用户态数据间的复制动作。 epoll是Linux上处理大并发网络连接的利器。

Nginx的进程

多进程的好处:
master只用于管理真正提供服务的worker进程,所以master进程可以是唯一的,它仅专注于自己的纯管理工作,为管理员提供命令行服务,包括诸如启动服务、停止服务、重载配置文件、平滑升级程序等。master进程需要拥有较大的权限,例如,通常会利用root用户启动master进程。worker进程的权限要小于或等于master进程,这样master进程才可以完全地管理worker进程。
当任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务。
多个worker进程处理互联网请求不但可以提高服务的健壮性(一个worker进程出错后,其他worker进程仍然可以正常提供服务),最重要的是,这样可以充分利用现在常见的SMP多核架构,从而实现微观上真正的多核并发处理。因此,用一个进程(master进程)来处理互联网请求肯定是不合适的。
另外,为什么要把worker进程数量设置得与CPU核心数量一致呢?这正是Nginx与Apache服务器的不同之处。在Apache上每个进程在一个时刻只处理一个请求,因此,如果希望Web服务器拥有并发处理的请求数更多,就要把Apache的进程或线程数设置得更多,通常会达到一台服务器拥有几百个工作进程,这样大量的进程间切换将带来无谓的系统资源消耗。而Nginx则不然,一个worker进程可以同时处理的请求数只受限于内存大小,而且在架构设计上,不同的worker进程之间处理并发请求时几乎没有同步锁的限制,worker进程通常不会进入睡眠状态,因此,当Nginx上的进程数与CPU核心数相等时(最好每一个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的。
nginx.conf配置master/worker:
-
是否以master/worker方式工作: 语法:master_process on|off; 默认:master_process on;
-
worker进程数的配置: 语法:worker_processes number; 默认:worker_processes 1;
-
设置每个worker的连接数: events { worker_connections 1024; }
Nginx缓存
通过配置缓存,可以大大降低服务器的压力,提高响应速度。

Nginx设置静态资源缓存:
location ~ \.(gif | jpg | jpeg | png | bmp | swf | ico)$ { root /www/local/static;
expires 30d;}
当指定时间时,可以使用的单位包括:
- ms(毫秒)
- s(秒)
- m(分钟)
- h(小时)
- d(天)
- w(周,包含7天)
- M(月,包含30天)
- y(年,包含365天)
Nginx反向代理与负载均衡

Nginx提供了3种负载均衡策略:

负载均衡的配置如下:

服务器集群Session共享问题的解决方案:
- 不使用session,换用cookie
- 优点:实现起来简单,方便,也不会加大数据库的负担
- 缺点:依赖客户端、cookie可复制
- session存在数据库中
MySQL等关系型数据库:
- 优点:安全性比cookie高很多
- 缺点:加大数据库的IO,增加数据库的负担,请求量较高时体验不好
redis 或者 memcache 中:
- 优点:安全性比cookie高很多,比从文件中读取要快很多
- 缺点:会产生内存碎片,如果存储块不足,还会产生内存溢出。

