一、Nginx概述 1.Nginx简介 解决基于进程模型产生的C10k问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万现状。2006年俄罗斯编写。全称为engine X,缩减合并称为nginx。 官方站点:http:///。 2013年发出企业版Nginx Plus 二次发行版:tengine, OpenResty… …
2.Nginx的特性 1) 模块化设计、较好扩展性;早期不支持模块的动态装卸载 2) 高可靠性:基于master/worker模式 master:负责启动服务,分析配置文件,父子启动子进程和worker进程 worker:真正响应用户请求进程 3) 支持热部署(平滑迁移):不停机更新配置文件、更换日志、更新服务器程序版本; 4) 内存消耗低:10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存; 5) 支持event-driven事件驱动模型, aio一步驱动机制, mmap内存映射;
3.Nginx基本功能 1) 静态资源的web服务器; 2) http协议的反向代理服务器; 3) pop3, smpt,imap4等邮件协议的反向代理; 4) 能缓存打开的文件(元数据:文件的描述符等等信息) 5) 支持FastCGI(php-fpm), uWSGI(Python WebFramwork)等协议机制,实现代理后端应用程序交互 6) 高度模块化(非DSO机制) 模块类型:
7) 支持过滤器,例如zip,SSI 8) 支持SSL加密机制; 9) web服务相关的功能:虚拟主机(server)、keepalive、访问日志(支持基于日志缓冲提高其性能)、urlrewirte、路径别名、基于IP及用户的访问控制、支持速率限制及并发数限制; …… 4.Nginx的基本架构:master/worker master/worker模型:一个master进程可生成一个或多个worker进程;每个worker基于时间驱动机制可以并行响应多个请求 master:加载配置文件、管理worker进程、平滑升级,... worker:http服务,http代理,fastcgi代理,...
事件驱动:epoll(Linux),kqueue(FreeBSD), /dev/poll(Solaris) 消息通知:select,poll, rt signals 支持sendfile, sendfile64 支持AIO,mmap
二、Nginx编译安装配置 1.编译安装nginx (1)编译环境准备 [root@localhost~]# yum install -y make [root@localhost~]# yum install -y gcc [root@localhost~]# yum -y groupinstall "开发工具""服务器平台开发" [root@localhost~]# yum install -y pcre-devel openssl-develzlib-devel [root@localhost~]# useradd -r nginx (2)解压安装 [root@localhost~]# tar xf nginx-1.8.0.tar.gz [root@localhostnginx-1.8.0]# ./configure --prefix=/usr/local/nginx--conf-path=/etc/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/lock/nginx.lock --with-http_ssl_module--with-http_stub_status_module --with-http_gzip_static_module --with-debug 注意:check时,在Linux上epoll机制要存在 [root@localhostnginx-1.8.0]#make &&make install (3)启动服务,检测端口是否启用 [root@localhost~]# /usr/local/nginx/sbin/nginx [root@localhost~]# ss-tnl
2.Nginx配置文件 (1)配置指令有类型 1) 全局指令:放置于mainblock中,即文档根 main配置段类别:正常运行必备的配置;优化性能相关的配置;用于调试、定位问题的配置; 2) 模块指令:由模块引入,其也必须放置于相应的Directive blocks中;block之间可能存在嵌套关系。用{}嵌套
(2)组成部分 主配置文件:nginx.conf 在主配置文件中加入include语句,可以将主配置文件切割成端例如include conf.d/*.conf ===> /etc/nginx/conf.d/*.conf fastcgi的配置文件:fastcgi_params … ... (3)配置文件内容语法格式 1) 配置指令(必须以分号结尾):Directive value1 [value2...]; 2) 支持使用变量: 内置变量:由模块引入; 自定义变量:set variable value; 引用变量:$variable
三、主配置文件框架解析 1.MAIN配置段常用参数 (1)常规配置指令
(2)性能优化相关指令
(3)调试定位Bug相关指令
2.event配置段常用参数
四、Nginx:http常规配置 说明:http的所有配置需要在http{ } 配置段进行定义。未具体说明指令基于ngx_http_core_module模块配置 1.主机或套接字相关指令 (1) server {}:定义一个虚拟主机;server可以出现一次货多次 server{ listenPORT; server_name NAME; root /PATH/TO/DOCUMENTROOT; } ... 注意: 1) 基于port:listen指令监听在不同的端口; 2) 基于hostname:server_name指令指向不同的主机名; (2) listen:配置监听端口 使用格式:listen address[:port] [default_server] [ssl] [http2 | spdy] listen port [default_server] [ssl] [http2 | spdy] 注释: default_server:设置默认虚拟主机;用于基于IP地址,或使用了任意不能对应于任何一个server的name时所返回站点; ssl:用于限制只能通过ssl连接提供服务; spdy:SPDYprotocol(speedy),在编译了spdy模块的情况下,用于支持SPDY协议; http2:支持httpversion 2第二版http协议; (3) server_name NAME [...];:指明主机名称 后可跟一个或多个主机名;名称还可以使用通配符和正则表达式(~引导整个正则表达式); 匹配顺序: 1) 首先做精确匹配;例如:www. 2) 左侧通配符;例如:*. 3) 右侧通配符,例如:www.xxx.* 4) 正则表达式,例如:~^.*\.xxx\.com$ 5)default_server (4) tcp_nodelay on|off; 对keepalive模式下的连接是否使用TCP_NODELAY选项;一般为off 提高带宽利用率,将发往同一主机很小的TCP报文合并成一个;实际生产上对于用户请求即使浪费带块也不能合并请求 (5) tcp_nopush on|off; 是否启用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)选项;仅在sendfile为on时有用; 尝试将多个报文首部压缩成一个发送,默认off,不启用该功能 (6) sendfile on|off; 是否启用sendfile功能;静态文件直接在内核中封装响应,而不是从内核空间到用户空间再发往内和空间
2.路径相关指令 (1) root:指明根文件路径 设置web资源的路径映射;用于指明请求的URL所对应的文档的目录路径;可用与server或localtion中 实例: server{ ... root /data/www/vhosts; } http://www./images/logo.jpg --> /data/www/vhosts/images/logo.jpg server{ ... server_name www.; location/images/ { root /data/imgs/; ... } } http://www./images/logo.jpg --> /data/imgs/images/logo.jpg (2) location 允许根据用户请求的URI来匹配定义的各location。匹配到时,此请求将被相应的location块中的配置所处理;即用于为需要用到专用配置的uri提供特定配置; 使用格式: 1) location @name { ... } 2) location[ = | ~ | ~* | ^~ ] uri { ... } 当能匹配多次时,其匹配优先级:精确匹配=、^~、~或~*、不带符号的URL; =:URI的精确匹配,其后多一个字符都不可以,精确匹配根 ~:做正则表达式匹配,区分字符大小写; ~*:做正则表达式匹配,不区分字符大小写; ^~:URI的左半部分匹配,不区分字符大小写; server { ... server_name www.; root/data/www; location /admin/ { ... } } (3) alias:定义路径别名,只能用于location配置段 location /images/ { root/data/imgs/; } location /images/ { alias/data/imgs/; } 注意: root指令:给定的路径对应于location的“/”这个URL;/images/test.jpg --> /data/imgs/images/test.jpg alias指令:给定的路径对应于location的“/uri/"这个URL;/images/test.jpg--> /data/imgs/test.jpg (4) index :设置默认主页(ngx_http_index_module模块引入) 可以带上变量,如$geo更具不同IP地区来设置不同的语言主页 indexfile ...; (5) error_page code ... [=[response]] uri;:自定义错误页面,根据http的状态码重定向错误页面; 实例: 1)指明错误页面 error_page 404 /404.html error_page 500 502 503 504 /50x.html location = /50x.html { root html; } 2) 以指定的响应状态码进行响应 error_page 404 =200 /404.html (6) try_files file ... uri;:以指定的顺序检查文件的存在性响应 try_files file ... =code; 尝试查找第1至第N-1个文件,第一个即为返回给请求者的资源;若1至N-1文件都不存在,则跳转至最一个uri(必须不能匹配至当前location,而应该匹配至其它location,否则会导致死循环);
3.面向客户端请求相关的配置 (1) keepalive_timeout # ; 设定keepalive连接的超时时长;0表示禁止长连接;默认为启用为75s; (2) keepalive_requests # ; 在keepalived连接上所允许请求的最大资源数量;默认为100; (3) keepalive_disable … ….; 指明禁止为何种浏览器使用keepalive功能;默认none,也可以指明具体浏览器名称 (4) send_timeout #; 发送响应报文的超时时长,默认为60s; (5) client_body_buffer_size size; 接收客户请求报文body的缓冲区大小;默认为16k;超出此指定大小时将被移存于磁盘上; (6) client_body_temp_pathpath [level1 [level2 [level3]]]; 设定用于存储客户端请求body的临时存储路径及子目录结构和数量; client_body_temp_path /var/tmp/client_body 2 2;
4.对客户端请求的进行限制 (1) limit_excpet METHOD {...}:对指定范围之外的其它的方法进行访问控制; limit_except GET { allow 172.16.0.0/16; denyall; } (2) limit_rate # ; 制客户端每秒钟所能够传输的字节数,默认为0表示无限制;
5.文件操作优化相关的配置 (1) aio on|off; 是否启用异步IO模式 (2) directio size|off; 直接IO;不在内存中缓冲,直接从硬盘加载使用(当大于指定size) Enablesthe use of the O_DIRECT flag (FreeBSD, Linux), the F_NOCACHE flag (Mac OS X),or the directio() function (Solaris), when reading files that are larger thanor equal to the specified size. (3) open_file_cache :打开文件缓存 open_file_cache off; open_file_cachemax=N [inactive=time]; 注释:nginx可以缓存以下三种信息 1)文件描述符、文件大小和最近一次的修改时间; 2)打开的目录的结构; 3)没有找到的或者没有权限操作的文件的相关信息; max=N表示可缓存的最大条目上限;一旦达到上限,则会使用LRU算法从缓存中删除最近最少使用的缓存项; inactive=time:在此处指定的时长内没有被访问过的缓存项是为非活动缓存项,因此直接删除; (4) open_file_cache_errorson | off; 是否缓存找不到其路径的文件,或没有权限没有权限访问的文件相关信息; (5) open_file_cache_valid # ; 每隔多久检查一次缓存中缓存项的有效性;默认为60s; (6) open_file_cache_min_uses # ; 缓存项在非活动期限内最少应该被访问的次数;
6.ngx_http_access_module模块调用配置(基于IP的访问控制) allow address | CIDR | unix: | all; 允许 deny address | CIDR | unix: | all; 拒绝 可以应用于http, server, location, limit_except上下文范围内,直接指定IP
7.ngx_http_auth_basic_module模块调用配置(basic认证) (1) auth_basic string |off;:使用httpbasic认证协议对用户进行认证; string为所给定字符,其作用在于认证时显示的提示所信息 (2) auth_basic_user_file FILE ;:实现用户认证的账号文件; 认证文件格式(需手动创建): name1:password1 name2:password2:comment 注意:密码需要加密,加密方式可以为encryptedwith the crypt() function; md5加密; 密码可以用htpasswd创建:htpasswd-c -m /etc/nginx/.ngxhtpasswd tom(创建第二个用户时需要将-c去掉) 实例: location/admin/ { auth_basic"Admin Area"; auth_basic_user_file/etc/nginx/.ngxhtpasswd; }
8.ngx_http_log_module模块调用配置(访问日志) (1) log_format name string ...;:定义日志格式及其名称; 日志格式一般通过调用内置变量来定义; string:通过nginx所支持的变量(每个模块会引入自变量)来支持的 (2) access_log:访问日志 access_logpath [format [buffer=size [flush=time]]]; access_logoff; 访问日志文件路径,格式名称以及缓存大小和刷写时间间隔;建议定义缓冲以提升性能; (3) open_log_file_cachemax=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cacheoff;
9.ngx_http_stub_status_module模块调用配置:
实例: location /staus{ stub_status; } 通过指定的uri输出stub status;其具体输出结果如下: Activeconnections: 291 serveraccepts handled requests 1663094816630948 31070465 Reading:6 Writing: 179 Waiting: 106
10.ngx_http_referer_module模块调用配置(基于请求报文中的Referer首部的值做访问控制) valid_referers none | blocked | server_names | string ...;
注意:内置变量:$invalid_referer(所有不能符合valid_referer指定定义的引用请求均为不合法引用),需加上条件判断语句 示例: valid_referers none blocked server_names *.example.com example.* www./galleries/ ~\.google\.; if($invalid_referer) { return 403; }
11.ngx_http_gzip_module模块:gip压缩
实例: gzip on; gzip_http_version1.0; gzip_comp_level6; gzip_disablemsie6; gzip_min_length2; gzip_typestext/plain text/css text/xml application/x-javascript application/xmlapplication/jsonapplication/java-script;
五、Nginx:https配置(基于ngx_http_ssl_module)
说明:(ssl_session_cache) off:禁止缓存,关闭缓存,不支持缓存功能 none:禁止缓存,不响应缓存 builtin:使用OpenSSL内置的ssl会话缓存,对机制为各worker私有; shared:在各worker之间使用一个共享的缓存;name:独有名称;size:缓存空间大小,默认1M,可以调到10M; 注意: 1) https定义时候也是定义在http{ }配置段,其监听配置定义:listen 443 ssl。不是以监听在443端口作为限定。用于限制只能通过ssl连接提供服务。 2) 若不在listen处定义,也可以在server{ }中定义ssl on; 来启用https服务
六、Nginx:http请求重写(ngx_http_rewrite_module) 1.ngx_http_rewrite_module功能 将请求的url基于正则表达式进行重写(URL重定向),在如下情况下可以使用:ttp转换成httpd服务http--> https、域名转换domain1.tld --> domain2.tld,、URL转换uri1 --> uri2、实现SEO搜索引擎优化效果 …
2.指令 (1)rewrite regex replacement [flag]; regex:正则表达式,用于匹配用户请求的url; replacement:重写(重定向、替换)成为的结果; [flag]: last:重写完成之后停止对当前uri的进一步处理,重新请求URL,对新url的新一轮从第一条开始匹配处理; 可能会出现死循环情况,此时可以设置循环次数,超过次数后返回给客户端错误 break:重写完成之后停止对当uri的处理,重写检查结果结束,转向其后面的其它配置; redirect:重写完成之后会返回客户端一个临时的重定向,由客户端对新的url重新发起请求(302); permanent:重写完成之后会返回客户端一个永久的重定向,由客户端对新的url重新发起请求(301); 实例: server{ ... rewrite^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... } 验证请求:http://www.xxx.com/download/a/b/c/media/32.wmv --> /download/a/b/c/mp3/32.mp3 注意: 1)last和break请求处理是在服务器内部完成,客户端仅请求一次。redirect和permanent需要客户端再次请求 2)URL重写时所用的正则表达式需要使用PCRE格式。PCRE正则表达式元字符: 字符匹配:.,[ ], [^] 次数匹配:*,+, ?, {m}, {m,}, {m,n} 位置锚定:^,$ 或者:| 分组:(),后向引用, $1, $2, ...
3.if (condition) { ... }:条件判断,引用新的配置上下文 condition可以为以下格式 : 1) 比较表达式: ==,!= ~:模式匹配,区分字符大小写; ~*:模式匹配,不区分字符大小写; !~:模式不匹配,区分字符大小写; !~*:模式不匹配,不区分字符大小写; 2) 文件及目录判断: -f,!-f:是否存在且为普通文件; -d,!-d: 是否存在且为目录; -e,!-e:是否存在; -x,!-x:是否存在且可执行; 实例: 1) cookie首部检测匹配 if($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } 2) 请求报文的请求方法是POST,返回405 if($request_method = POST) { return 405; } 3) 限速(如会员认为不是slow不做限速) if($slow) { limit_rate 10k; } 4) 非法引用,返回403。注:也可以对非法引用到其他网页 if($invalid_referer) { return 403; } 4.reture:立即停止对请求的uri的处理,并返回指定的状态码; returncode [text]; returncode URL; returnURL; 5.set:设定变量值,或者自定义变量 set $variable value; 变量赋值; 6.rewrite_log 重写日志 rewrite_log on | off;:是否将重写日志记入errorlog中,默认为关闭; 错误日志调试方法:错误日志debug,并开启rewrite_log; 本文出自 “许鼎的博客” 博客,请务必保留此出处http://xuding.blog.51cto.com/4890434/1743666 |
|