Nginx简介_动力节点Java学院整理

1.什么是Nginx

Nginx来自俄罗斯的Igor Sysoev在为Rambler Media(http://www.rambler.ru/)工作期间,使用C语言开发了Nginx。Nginx作为Web服务器,一直为俄罗斯著名的门户网站Rambler Media提供着出色、稳定的服务。

Igor Sysoev将Nginx的代码开源,并且赋予其最自由的2-clause BSD-like license许可证。由于Nginx使用基于事件驱动的架构能够并发处理百万级别的TCP连接,高度模块化的设计和自由的许可证使得扩展Nginx功能的第三方模块层出不穷,而且优秀的设计带来了极佳的稳定性,因此其作为Web服务器被广泛应用到大流量的网站上,包括腾讯、新浪、网易、淘宝等访问量巨大的网站。

Nginx是一个跨平台的Web服务器,可运行在Linux、FreeBSD、Solaris、AIX、Mac OS、Windows等操作系统上,并且它还可以使用当前操作系统特有的一些高效API来提高自己的性能。

例如,对于高效处理大规模并发连接,它支持Linux上的epoll(epoll是Linux上处理大并发网络连接的利器,9.6.1节中将会详细说明epoll的工作原理)、Solaris上的event ports和FreeBSD上的kqueue等。

又如,对于Linux,Nginx支持其独有的 sendfile系统调用,这个系统调用可以高效地把硬盘中的数据发送到网络上(不需要先把硬盘数据复制到用户态内存上再发送),这极大地减少了内核态与用户态数据间的复制动作。

2.为什么选择Nginx

为什么选择Nginx?因为它具有以下特点:

(1)更快

这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的并发请求),Nginx可以比其他Web服务器更快地响应请求。

(2)高扩展性

Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他。而且在HTTP模块中,还设计了HTTP过滤器模块:一个正常的HTTP模块在处理完请求后,会有一串HTTP过滤器模块对请求的结果进行再处理。这样,当我们开发一个新的HTTP模块时,不但可以使用诸如HTTP核心模块、events模块、log模块等不同层次或者不同类型的模块,还可以原封不动地复用大量已有的HTTP过滤器模块。这种低耦合度的优秀设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。

Nginx的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块一样具备极其优秀的性能,充分利用Nginx的高并发特性,因此,许多高流量的网站都倾向于开发符合自己业务特性的定制模块。 模块化设计、较好的扩展性,编译到Nginx,并随Nginx启动而启动,但是Tengine支持模块动态装卸机制。

(3)高可靠性

高可靠性是我们选择Nginx的最基本条件,因为Nginx的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器上大规模使用Nginx。Nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务。

(4)低内存消耗

一般情况下,10 000个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。

(5)单机支持10万以上的并发连接

这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各大公司、网站都需要应付海量并发请求,一个能够在峰值期顶住10万以上并发请求的Server,无疑会得到大家的青睐。理论上,Nginx支持的并发连接上限取决于内存,10万远未封顶。当然,能够及时地处理更多的并发请求,是与业务特点紧密相关的,本书第8~11章将会详细说明如何实现这个特点。

(6)热部署

master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以在7×24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项、更换日志文件等功能。

(7)最自由的BSD许可协议

这是Nginx可以快速发展的强大动力。BSD许可协议不只是允许用户免费使用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布。这吸引了无数开发者继续为Nginx贡献自己的智慧。

(8)支持事件驱动、AIO、mmap

3.Nginx基本功能:

(1)静态资源的web服务器,能缓存打开的文件描述符。

(2)http、smtp、pop3协议的反向代理服务器(保护服务器,为服务器过滤不良用户请求,并封装用户请求,扮演成某些服务区,提供缓存减轻后端压力)

(3)缓存加速、负载均衡

(4)支持FastCGI(fpm,LNMP),uWSGI(Python)

(5)模块化(非DSO机制)过滤器,zip、ssi及图像的大小调整

(6)支持SSL,https服务。

4.扩展功能

基于名称和IP的虚拟机

支持Keepalive

支持平滑升级

定制访问日志、支持使用日志缓冲区提供日志存储性能

支持url rewrite

支持路径别名

支持基于IP及用户的访问控制

支持速率限制,支持并发数限制

5.Nginx的基本架构:

一个master进程。负责生成多个worker进程。

事件驱动:epoll(边缘触发,Linux) kqueue(BSD)

I/O复用器:select,poll,rt signal

支持sendfile、sendfile64

支持AIO

支持mmap内存映射

nginx的工作模式:非阻塞、事件驱动,由一个master进程生成多个worker进程,每个worker响应n个请求。

6.模块类型:

核心模块、Standard HTTP modules、Optional HTTP modules、Mail modules、第三方模块

7.源码安装

yum -y install gcc gcc-c++
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
tar xf nginx-VERSION.tar
cd nginx-VERSION
groupadd -r nginx
useradd -r nginx -g nginx
./configure --help(获取帮助)
--with-xx:原本没有启动,启动起来;--without-xx:原本已启动,停止启动
./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/conf/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/log/nginx.lock --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_mp4_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi
make -j 4 && make install
mkdir -pv /var/tmp/nginx/{client,proxy,fastcgi,uwsgi}
启动nginx
/usr/local/nginx/sbin/nginx

8.配置文件介绍

main配置段:全局配置段

event{}:定义event模型工作特性

http{}:定义http协议相关的配置

配置指令:要以分号结尾。

支持使用变量:

内置变量:模块会提供内置变量定义

自定义变量:set var_name value;

主配置段的指令:

正常运行必备的配置

1.user  username [groupname];指定运行worker进程的用户和组;

2.pid  /path/to/pid_file;指定nginx守护进程的pid文件

pid /var/run/nginx/nginx.pid

3.worker_rlimit_nofile   number;指定所有worker进程所能打开最大文件句柄数

优化性能的配置

1.worker_processes  #;worker进程的个数;通常应该略少于CPU物理核心数;支持auto

2.worker_cpu——affinity cpumask...  (例子:00000001  00000010 00000100)

优点:提升缓存的命中率
                       cpumask:

0000 0001:1号cpu
                                 0000 0010:2号cpu

3.timer_resolution:计时器解析度,降低此值,可以减少gettimeofday()系统调用的次数

4.worker_priotity number;指明worker进程的nice值(越小,优先级越高)

事件相关的配置

1.accept_mutex {off|on};

master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地区响应新请求。

2.lock_file file;

accept-mutex用到的锁文件路径

3.use [epoll | rtsing | select | poll];

指明使用的事件模式,建议让Nginx自行选择;

4.worker_connections number;

设定单个worker进程所能够处理的最大并发连接数量;(但套接字有限)

worker_connections * work_processes < 60000

用于调试、定位问题(编译时加入--with-debug)

1.daemon {on|off};

是否以守护进程方式运行nginx;调试时应该设置为Off

2.master_process {on|off};

是否以master/worker模型来运行nginx,调试时可设置为Off

3.error_log 位置级别{debug,info,notice,warn,error,crit,altert,emerg}

     总结:

常需要进行调整的参数:worker_processes,worker_connections,worker_cpu_affinity,worker_priority

nginx  -s {stop,quit,reopen,reload} 
              nginx -t :测试语法

9.Nginx作为web服务器时使用的配置:

http{}:由ngx_http_core_module模块所引入;

配置框架:

    http{
              upstream{...}
              server {
                   location {...} 类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系,可有多个
              }#每个server类似于httpd中的一个<VirtualHost>
           } 

配置指令

1.server{}:定义一个虚拟主机

 server{
               listen 8080;
               server_name www.bearlu.com;
               root "/vhost/web1";
           }

2.listen:指定监听的地址和端口

  listen address[:port]
                listen port;

3.server_name Name...:名称还可以使用正则表达式(~开头)通配符

(1)先做精确匹配检查;

(2)左侧通配符匹配检查:*.magedu.com

(3)右侧通配符匹配检查:mail.*

(4)正则表达式匹配检查:~*.*\magedu\.com$

(5)default_server

4.root path;设置资源路径映射;用于指明请求的URL所对应的资源所在的文件系统上的起始路径

5.location [= | ~ | ~* | ^~ | url] {...}

location @name {...}

允许根据用户请求的URL来匹配定义的各location;匹配到时,此请求将被相应的location配置块中的配置所处理,例如访问控制。

=:精确匹配检查
                            ~:正则表达式模式匹配检查,区分字符大小写
                            ~*:正则表达式模式匹配检查,不区分字符大小写
                           ^~:URI的前半部分匹配,不支持正则表达式
                          记住:匹配的优先级:=、^~、~、~*、不带符号的location(越后,优先级越低)

6.alias path;

用于location配置段,定义路径别名;

注意:root表示指明路径为对应的location  "/" URL

alias表示路径映射,即location指令后定义的URL是相对与alias所指明的路径而言;

7.index file; 默认主页面

8.error_page code [...] 状态码  [=code] URL|@name

根据http响应状态码来指明特用的错误页面;

error_page 404  /404_customed.html
                             error_page 404 =200 /404_customed.html

[=code]:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的状态码为其响应码

9.基于IP的访问控制

allow、deny IP/network
                            allow  IP、网络

10.基于用户的访问控制

basic、digest

auth_basic "验证原因"
                                       auth_basic_user_file /etc/nginx/users/.htpasswd;
                          用htpasswd  -c (第一次创建) -m(使用MD5码)  /etc/nginx/users/.htpasswd tom 创建用户账号和密码文件

11.SSL

listen 443 ssl
                             server_name www.magedu.com
                             ssl_certificate  /etc/nginx/ssl/nginx.crt;(证书)
                             ssl_certificate_key /etc/nginx/ssl/nginx.key;(私钥)

12.stub_status {on | off};nginx状态统计页面

仅能用户location上下文。并且allow IP;  deny all;

显示结果:

Active connections:6  ----->  当前所有处于打开状态的连接数
                                     server       已接受的连接数          
                                     accepts     已处理过的连接数
                                     handled    已处理的请求书,在保持连接模式下
                                     requests
                                     Reading  正在接收请求状态的连接数
                                     Writing     请求已经接收完成,正处理请求或发送响应的过程中的连接数
                                     Waiting    处于保持Keepalive连接模式,且处于活动状态的连接数。

13.rewrite URL重写

格式:rewrite regex replacement flag 
                             rewrite ^/images/(.*\.jpg)$  /imgs/$1 break;
                              IP/images/a/b/c/1.jpg ---> IP/imgs/a/b/c/1.jpg
                              作用:域名切换、重定向
                             flag: last:此rewrite规则重写完成后,不再被后面其他rewrite规则处理,而由User Agent重新对重写后URL再一次发起请求,并从头开始执行类似的过程;
                                         break:一旦此rewrite规则重写完成后,发起请求,且不会再被当前location内的任何rewrite规则检测
                                         redirect:临时重定向,以302响应码返回新的URL。(域名可改变)
                                         permanent:永久重定向,以301响应码返回的URL。

14.if上下文

语法:if(condition) {...}
                         应用场景:server、location
                        condition:
                                 (1)变量名:变量值为空串,或者以“0”开始,则为false
                                 (2)以变量为操作数构成的比较表达式(=,!=)
                                 (3)正则表达式的模式匹配操作
                                                    ~:区分大小写的模式匹配
                                                    ~*:不区分大小写的模式匹配
                                                     !~和!~*:对上面两种测试取反
                                   (4)测试路径是否为文件:-f、!-f
                                   (5)测试指定路径是否为目录:-d、!-d
                                   (6)测试文件的存在性:-e、!-e
                                    (7)测试文件是否有执行权限:-x、!-x
                         例如:

if($http_user_agent ~* MSIE){
                          rewrite ^(.*)$ /msie/$1   break;
                   }

15.防盗链

     location ~* \.(jpg | gif | jpeg | png)$ {
                    valid_referer none blocked www.magedu.com;
                    if ($invalid_referer) {
                         rewrite ^/ http://www.magedu.com/403.html
                    }
             }

16.定制访问日志格式

  log_format   main    "$remote_addr $remote_user [$time_local] $request"
             access_log logs/access.log main;

此处可以使用nginx各模块内建变量;

17.网络连接相关的配置

1. keepalive_timeout  #;长连接的超时时长

2.keepalive_requests #;在一个长连接上所能够允许请求的最大资源数

3.keepalive_disable [msie6 | safari | none];为指定类型的UserAgent禁用长连接

4.tcp_nodelay on|off;是否对长连接使用TCP_NODELAY选项;更优化用户体验就打开,否则,等待充足的量才返回

5.client_header_timeout #;读取http请求报文首部的超时时长

6.client_body_timeout #;读取http请求报文body部分的超时时长

7.send_timeout #;发送相应报文的超时时长

总结

以上所述是小编给大家介绍的Nginx简介_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 简介使用Nginx Plus的在线活动监控功能的方法

    想了解你的 NGINX 服务器现在是什么情况? 是被 DoS 攻击, 还是网站出现一堆错误? NGINX Plus 现在推出一个时实活动监视接口,提供关键负载(key load )和性能监控. 通过简单的 RESTful JSON 接口,连接实时监控统计数据(stats to live dashboards) 和第三方监控工具,都变得轻轻松松. NGINX Plus 的 平衡负载状态时实监控 细节: 在线活动监控 – JSON feed 在NGINX Plus中启用该状态提示,只需简单地在服务器

  • 基于Nginx的衍生版服务器Tengine简介

    Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验.它的最终目标是打造一个高效.稳定.安全.易用的Web平台. Nginx的特性: 1.基本的HTTP服务器特性 1.处理静态文件,索引文件以及自动索引:打开文件描述符缓存: 2.使用缓存加速反向代理:简单负载均衡以及容错: 3.远程FastCGI,uwsgi,SCGI,和memcached服务的缓

  • 简介Nginx中的location匹配规则

    location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写 ~*    #表示执行一个正则匹配,不区分大小写 ^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 =      #进行普通字符精确匹配 @     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files location 匹配的优先级(与location在配置文件中的顺序无关) = 精确匹配会第一个

  • 一些优化Nginx服务器的技巧简介

    大多数的Nginx安装指南告诉你如下基础知识--通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了!而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能很好地工作了.然而,如果你真的想挤压出nginx的性能,你必须更深入一些.在本指南中,我将解释Nginx的那些设置可以微调,以优化处理大量客户端时的性能.需要注意一点,这不是一个全面的微调指南.这是一个简单的预览--那些可以通过微调来提高性能设置的概述.你的情况可能不同. 基本的 (优化过的)配置

  • 简介Nginx服务器的Websockets配置方法

    Nginx 1.3.13 已经发布了,该版本支持 Connection: upgrade 和 Upgrade 头,这就意味着支持WebSocket代理了.很多人都在等这个新特性以至于 "Nginx 支持 websockets 吗?" 成为了 freenode上的#nginx频道最常问的问题. 有了这种方式,让我们来看看Nginx的WebSocket实现. Nginx新添加的Websockets配置指令 文档中提到的配置如下:(译者注:原文中的链接其实不是文档的链接.现在nginx的官方

  • Nginx简介_动力节点Java学院整理

    1.什么是Nginx Nginx来自俄罗斯的Igor Sysoev在为Rambler Media(http://www.rambler.ru/)工作期间,使用C语言开发了Nginx.Nginx作为Web服务器,一直为俄罗斯著名的门户网站Rambler Media提供着出色.稳定的服务. Igor Sysoev将Nginx的代码开源,并且赋予其最自由的2-clause BSD-like license许可证.由于Nginx使用基于事件驱动的架构能够并发处理百万级别的TCP连接,高度模块化的设计和自

  • Java Map简介_动力节点Java学院整理

    Map简介 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序.某些映射实现可明确保证其顺序,如 TreeMap 类:另一些映射实现则不保证顺序,如HashMap 类. 注:将可变对象用作映射键时必须格外小心.当对

  • Java中Object toString方法简介_动力节点Java学院整理

    一.Object类介绍  Object类在Java里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能有一个,JAVA为了组织这个类组织得比较方便,它提供了一个最根上的类,相当于所有的类都是从这个类继承,这个类就叫Object.所以Object类是所有JAVA类的根基类,是所有JAVA类的老祖宗.所有的类,不管是谁,都是从它继承下来的. 二.toString方法介绍  一个字符串和另外一种类型连接

  • Java Set简介_动力节点Java学院整理

    1. 概述   Java 中的Set和正好和数学上直观的集(set)的概念是相同的.Set最大的特性就是不允许在其中存放的元素是重复的.根据这个特点,我们就可以使用Set 这个接口来实现前面提到的关于商品种类的存储需求.Set 可以被用来过滤在其他集合中存放的元素,从而得到一个没有包含重复新的集合. 2. 常用方法 按照定义,Set 接口继承 Collection 接口,而且它不允许集合中存在重复项.所有原始方法都是现成的,没有引入新方法.具体的 Set 实现类依赖添加的对象的 equals()

  • RandomAccessFile简介_动力节点Java学院整理

    RandomAccessFile RandomAccessFile 是随机访问文件(包括读/写)的类.它支持对文件随机访问的读取和写入,即我们可以从指定的位置读取/写入文件数据. 需要注意的是,RandomAccessFile 虽然属于java.io包,但它不是InputStream或者OutputStream的子类:它也不同于FileInputStream和FileOutputStream. FileInputStream 只能对文件进行读操作,而FileOutputStream 只能对文件进

  • Java字符编码简介_动力节点Java学院整理

    1. 概述 本文主要包括以下几个方面:编码基本知识,Java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示". 2. 编码基本知识 最早的编码是iso88

  • Java7之forkjoin简介_动力节点Java学院整理

    Java7引入了Fork Join的概念,来更好的支持并行运算.顾名思义,Fork Join类似与流程语言的分支,合并的概念.也就是说Java7 SE原生支持了在一个主线程中开辟多个分支线程,并且根据分支线程的逻辑来等待(或者不等待)汇集,当然你也可以fork的某一个分支线程中再开辟Fork Join,这也就可以实现Fork Join的嵌套. 有两个核心类ForkJoinPool和ForkJoinTask. ForkJoinPool实现了ExecutorService接口,起到线程池的作用.所以

  • Java List简介_动力节点Java学院整理

    Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解.  List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引  ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步  LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)  Vector:底层是数组数据结构 线

  • jQuery Autocomplete简介_动力节点Java学院整理

    jQuery UI Autocomplete是jQuery UI的自动完成组件,是我用过的最强大.最灵活的Autocomplete,它支持本地的Array/JSON数组.通过ajax请求的Array/JSON数组.JSONP.以及Function(最灵活)等方式来获取数据. 支持的数据源 jQuery UI Autocomplete主要支持字符串Array.JSON两种数据格式. 普通的Array格式没有什么特殊的,如下: ["bjpowernode","动力节点"

  • JDBC简介_动力节点Java学院整理

    前言:什么是JDBC 维基百科的简介: Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.JDBC也是Sun Microsystems的商标.它JDBC是面向关系型数据库的. 简单地说,就是用于执行SQL语句的一类Java API,通过JDBC使得我们可以直接使用Java编程来对关系数据库进行操作.通过封装,可以使开发人员使用纯Java API完成S

随机推荐