Nginx简介_动力节点Java学院整理
1.什么是nginx
nginx来自俄罗斯的igor sysoev在为rambler media()工作期间,使用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
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学院整理,希望对大家有所帮助
下一篇: Nginx 多域名配置的方法