Nginx是什么
Nginx是一个Web服务器,也是个高性能方向代理服务器,Nginx起初为了解决基于进程模型产生的C10k问题,由俄罗斯lgor sysoev研发。
Nginxy有企业版本Nginx Plus,还有二次发行版Tengine,OpenResy(淘宝研发)
nginx反向代理支持两种协议 HTTP和MAIL
C10K 连接超过10K ,1W个请求,1M =100万个请求
Netcraft可以查看全球服务器Web服务器占有率。
传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。生成一个新的进程/线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用CPU,而且过多的进程/线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。
在设计的最初阶段,nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在nginx中,连接请求由为数不多的几个仅包含一个线程的进程worker以高效的回环(run-loop)机制进行处理,而每个worker可以并行处理数千个的并发连接及请求。
如果负载以CPU密集型应用为主,如SSL或压缩应用,则worker数应与CPU数相同;如果负载以IO密集型为主,如响应大量内容给客户端,则worker数应该为CPU个数的1.5或2倍。
Nginx特性
模块化设计,较好的扩展性,早期不支持模块的动态装载和卸载
高可靠性,基于Master/Worker模式
支持热部署(平滑升级迁移),不停机的状态下更新配置文件,跟换日志文件,更新服务器程序版本
内存消耗低,10K个keep-alive连接模式下的非活动连接只消耗2.5M内存
支持event-driven事件驱动模型,AIO驱动机制,MMAP内存映射机制
Nginx基本功能
静态资源的web服务器,自身只能简单的接收和响应http
http协议的反向代理服务器
pop3,smtp imap4等邮件协议的反向代理
能缓存打开的文件(元数据缓存:文件的描述符等信息),能加快文件的打开速度
支持FastCGI(php-fpm),UWSGI 等协议机制,实现代理后端应用程序交互
支持过滤器,例如ZIP,SSI(服务端包含)
支持SSL加密机制
模块化(非DSO机制)
standard HTTP modules 标准(核心)HTTP模块:自动编译进程序不止一个
Optional HTTP modules 可选http模块
Mail modules 邮件模块
3rd party modules第三方模块,在编译时需手动指明加载方式加载
Nginx服务相关功能
虚拟主机,Keepalive,访问日志,日志缓冲(提高存取西能),URL重写,路径别名,访问控制(IP和用户),支持速率限制,并发限制
Nginx架构
Master/Worker模型:
一个master进程可以生成一个或者多个worker进程,每个worker基于事件驱动,响应用户请求, 其支持sendfile,sendfile64,这两种支持的文件大小不同
事件驱动:Linux(epoll),FreeBSD(kqueue),Solaris(/dev/poll)
除此之外配置了缓存时还会有缓存加载器进程cache loader
和缓存管理器进程cache manager
等,所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。
主进程Master以root用户身份运行,而Worker、Cache Loader和Cache Manager均应以非特权用户身份运行。
Master
加载,验证配置文件
创建,绑定,关闭套接字
管理worker进程(启动,终止,维护)
平滑重启(无需终止服务重载配置)
平滑升级(启用新的二进制程序并在需要时回滚到老版本)
重新打开日志文件,实现日志滑动
其他嵌入式perl,go脚本
Worker
响应客户端请求,提供HTTP服务和代理,提供FastCGI,uWSGI,SCGI等代理
Cache Loader
检查缓存存储中的缓存对象;
使用缓存元数据建立内存数据库;
Cache Manager
缓存的失效及过期检验;
Nginx安装
可使用yum或者源码方式安装
yum安装
yum方式很简单,直接使用yum源来安装
1 | yum install nginx #自动安装依赖关系 |
源码安装
1 | yum install -y pcre-devel openssl-devel zlib-devel |
Nginx常用命令
1 | nginx -t #测试配置文件是否正确 |
配置文件说明
1 | /etc/nginx/nginx.conf #主配置文件 |
主配置文件
/etc/nginx/nginx.conf 格式如下
1 | worker_process |
MAIN
该段落主要是配置Nginx运行启动时候必备参数 和 性能优化 以及 调试定位问题的配置
1 | user nginx; |
HTTP
HTTP上下文配置用于http的各模块,此类指令很多,每个模块都有专用指令,具体参考nginx官方wiki模块部分的说明。大致上这些模块所提供的配置指令还可以分为以下几个类别:
1 | 客户端指令:client_body_buffer_size,client_header_buffer_size,client_header_timeout,keepalive_timeout... |
1 | ...; |
UPSTREAM
upstream模块可定义一个新的上下文,位于server之上http之下,包含一组upstream服务器,这些服务器可能被赋予不同权重,不同类型,设置可以基于维护原因被标记为down。
1 | http{ |
SERVER
用于定义虚拟服务器相关的属性,位于http上下文,常见的指令有backlog、rcvbuf、bind及sndbuf等
1 | ....; |
LOCATION
通常位于server上下文,用于设定某URI的访问属性,location也可以嵌套,
1 | ....; |
location说明
1 | location语法格式: |
Nginx If判断
在location中使用if语句可以实现条件判断,其通常有一个return语句,且一般与有着last或break标记的rewrite规则一同,防盗链模块使用。但其也可以按需要使用在多种场景下,需要注意的是,不当的使用可能会导致不可预料的后果。
1 | #if语句中的判断条件 |
Nginx全局变量
1 | $args |
Nginx反向代理
Nginx通过proxy模块实现反向代理功能。在作为web反向代理服务器时,nginx负责接收客户请求,并能够根据URI、客户端参数或其它的处理逻辑将用户请求调度至上游服务器上(upstream server)。nginx在实现反向代理功能时的最重要指令为proxy_pass,它能够将location定义的某URI代理至指定的上游服务器(组)上。
反向代理:正对外部网络,如果客户端访问某个网站,但该网站不提供页面,只把请求代理只后端,在从后端返回至代理,在响应给客户端,该代理称作反向代理。
正向代理:针对内部网络,如果客户端不能访问外网,需要设置通过某台机器代理至外网,外网结果返回至代理机,在返回给客户端,该代理称作正向代理。
透明代理:针对内部网络,不需要设置任何代理服务器地址,但是需要将网关指向代理服务器。
proxy模块指令
proxy模块的可用配置指令非常多,它们分别用于定义proxy模块工作时的诸多属性,如连接超时时长、代理时使用http协议版本等.下面对常用的指令做一个简单说明。
1 | proxy_pass [domain | ip | upstream_name]|:PORT; |
proxy缓冲
nginx在默认情况下在将其响应给客户端之前会尽可能地接收来upstream服务器的响应报文,它会将这些响应报文存暂存于本地并尽量一次性地响应给客户端。然而,在来自于客户端的请求或来自upsteam服务器的响应过多时,nginx会试图将之存储于本地磁盘中,这将大大降低nginx的性能。因此,在有着更多可用内存的场景中,应该将用于暂存这些报文的缓冲区调大至一个合理的值。
1 | proxy_buffer_size size |
proxy缓存
nginx做为反向代理时,能够将来自upstream的响应缓存至本地,并在后续的客户端请求同样内容时直接从本地构造响应报文。
1 | proxy_cache_path PATH [levels=levels] keys_zone=name:size [inactive=time][max_size=size]; |
Nginx常用模块
nginx-limit模块
ngx_http_core_module,ngx_http_limit_conn_module,ngx_http_limit_req_module中的limit相关参数
1 | limit_except METHOD {...}; |
访问控制
1 | #allow和deny可用于http,server,location上下文中 |
基本认证模块
1 | auth_basic STRING; |
自定义头信息
1 | add_header_name value [always] |
nginx状态功能
1 | #stub_statu功能,编译时添加--with-http_stub_status_module选项 |
nginx防盗链模块
基于请求报文中的referer首部的值, 做访问控制 ,可以防止盗链,其只应用于server,location上下文
1 | referer_hash_bucket_size SIZE; |
nginx重写模块
将请求的url基于正则表达式进行重写(URL重定向),
在如下情况下可以使用:
http转换成httpd服务(http —- https)
域名转换domain.tld —-domain2.tld,
URL转换uri1—-url2
1 | rewrite regex replacement [flag]; |
nginx ssl
1 | listen 443; |
nginx压缩模块
1 | gzip on|off |
小结
对于nginx模块还有很多很多,以上是最基础的一些安装配置说明,后期还需要总结关于nginx的一些奇淫技巧