参考:Nginx入门-汇智网
nginx概述及常用命令
概述
Nginx (“engine x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、腾讯等。
常用命令
nginx启动
|
|
其中参数-c指定nginx启动时加载的配置文件,当然也可以不指定配置文件,省略-c,也可以启动,表示使用默认的配置文件。
nginx停止
|
|
或者
或者
例如在我们的编辑环境中已经安装好了nginx,并且已启动,在命令提示符下直接输入
就可以停止了。
nginx重载配置
|
|
检查配置文件是否正确
|
|
nginx配置
默认配置
下面的代码为nginx.conf配置文件中的server段的默认配置,nginx所实现的功能都基于这个文件。我们将在后面的内容中继续进行讲解。
nginx配置系统
nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成。这些配置文件均是纯文本文件,全部位于nginx安装目录下的conf目录下。
配置文件中以#开始的行,或者是前面有若干空格或者TAB,然后再跟#的行,都被认为是注释,也就是只对编辑查看文件的用户有意义,程序在读取这些注释行的时候,其实际的内容是被忽略的。
由于除主配置文件nginx.conf以外的文件都是在某些情况下才使用的,而只有主配置文件是在任何情况下都被使用的。所以在这里我们就以主配置文件为例,来解释nginx的配置系统。
在nginx.conf中,包含若干配置项。每个配置项由配置指令和指令参数2个部分构成。指令参数也就是配置指令对应的配置值。
配置指令是一个字符串,可以用单引号或者双引号括起来,也可以不括。但是如果配置指令包含空格,一定要引起来。
指令的参数使用一个或者多个空格或者TAB字符与指令分开。指令的参数有一个或者多个TOKEN串组成。TOKEN串之间由空格或者TAB键分隔。
配置文件结构(nginx.conf)
Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块,HTTP模块用于控制Nginx的HTTP进程。
Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。
主要结构(所有配置以分号结尾)如下:
main段配置指令
定义Nginx运行的用户和用户组用user指令。
定义nginx进程数,用worker_processes指令,建议设置为等于CPU总核心数。
全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]用error_log指令。另外日志还可以定义在http、server及location上下文中,语法格式一样。
定义进程文件用pid指令
用worker_rlimit_nofile指令描述nginx进程打开的最多文件描述符的数目,建议设置为默认值。
event段配置指令
参考事件模型指令:use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
注:epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
设置单个进程最大连接数用指令:worker_connections(最大连接数=连接数*进程数)
http段配置指令
设定mime类型,类型由mime.type文件定义 用include指令.
开启gzip压缩指令
设定负载均衡的服务器列表用指令upstream。
设定虚拟主机用指令server,其中包括端口,主机名称,默认请求等设置。
请求转向指令proxy_pass
负载均衡
负载均衡(又称为负载分担),英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
nginx的upstream目前支持4种方式的分配
- 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
- weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
- ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
- fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。1234567upstream ixdba.net{ip_hash;server 192.168.12.133:80;server 192.168.12.134:80 down;server 192.168.12.135:8009 max_fails=3 fail_timeout=20s;server 192.168.12.136:8080;}
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称ixdba.net。这个名称可以任意指定,在后面需要的地方直接调用即可。
location配置
语法规则:
通配符 | 说明 |
---|---|
= | 开头表示精确匹配 |
^~ | 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可 |
~ | 开头表示区分大小写的正则匹配 |
!~ | 区分大小写不匹配 |
!~* | 不区分大小写不匹配 |
~* | 开头表示不区分大小写的正则匹配 |
/ | 通用匹配,任何请求都会匹配到 |
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
那么产生的效果如下:
访问根目录/, 比如http://localhost/ 将匹配规则A; 访问 http://localhost/login 将匹配规则B; 访问 http://localhost/static/a.html 将匹配规则C; 访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D。
Rewrite规则
Nginx Rewrite 规则相关指令有if,rewrite,set,return,break等,其中最关键的就是rewrite。一个简单的Nginx Rewrite规则语法如下:
正则表达式匹配,其中:
- ~ 为区分大小写匹配;
- ~* 为不区分大小写匹配;
- !~ 和 !~* 分别为区分大小写不匹配及不区分大小写不匹配。
文件及目录匹配,其中:
- -f和!-f用来判断是否存在文件;
- -d和!-d用来判断是否存在目录;
- -e和!-e用来判断是否存在文件或目录;
- -x和!-x用来判断文件是否可执行。
flag标记有:
- last 相当于Apache里的[L]标记,表示完成rewrite;
- break 终止匹配, 不再匹配后面的规则;
- redirect 返回302临时重定向 地址栏会显示跳转后的地址;
- permanent 返回301永久重定向 地址栏会显示跳转后的地址。
当然除了这些以外,Rewrite规则中还会用到一些相应的全局变量,如$args,$url等等。
写自己的nginx配置文件
前面几节中我们已经学过了nginx配置文件中的各个段的配置指令,下面我们就来写一个自己配置文件。如下代码:
这样我们自己的配置文件就完成了,先将nginx的服务停止,然后我们用nginx -c .conf命令来重新启动nginx,.conf 为我们自己的配置文件所在的路径。
反向代理示例
反向代理(Reverse Proxy)是指代理服务器来接收来自Internet上的连接请求,并将请求转发给内部网络上的服务器,并从服务器上得到的结果返回给Internet上请求连接的客户端。
比如要配置后端跑 apache 服务的 ip 和端口,也就是说,我们的目标是实现通过 http://ip:port 能访问到你的网站。配置文件可以修改以下内容,reload nginx就可以了。
虚拟主机示例
Nginx做虚拟主机,尤其是仅仅支持纯静态-html,这是最简单的应用了,可以理解为一个仅支持静态页面的最简单的Web服务器。
例子,同时支持两个虚拟主机(纯静态-html支持)的配置,我们只需要理改server段,如下:
正向代理示例
nginx正向代理配置如下:
以上配置的注意事项:
- 不能有hostname。
- 必须有resolver, 即dns,即上面的x.x.x.x,换成当前机器的DNS服务器ip即可(查看dns方法 cat /etc/resolv.conf 代理使用)。
- $http_host和$request_uri是nginx系统变量,保持原样即可。
检测配置文件无误后,重启nginx,在浏览器中添加代理服务器的IP地址,就可以使用该Nginx正向代理了。
均衡负载示例
|
|
以上代码就是对负载均衡应用的示例。
Upstream可对后端服务器进行健康检查。
- down表示当前的server暂时不参与负载。
- weight默认为1.weight越大,负载的权重就越大。
- max_fails :在fail_timeout时间内对后台服务器请求失败的次数。
- fail_timeout:max_fails次失败后,暂停的时间。
- backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
rewrite简单示例
|
|
按照前面讲的内容以及上面的代码,修改我们自己的配置文件,保存,重新加载nginx。