nginx配置系统
nginx的配置系统由一个主配置文件和其他一些辅助的配置文件构成。
这些配置文件均是纯文本文件,全部位于nginx安装目录下的conf目录下。
配置文件中以#开始的行,或者是前面有若干空格或者TAB,然后再跟#的行,都被认为是注释,
也就是只对编辑查看文件的用户有意义,程序在读取这些注释行的时候,其实际的内容是被忽略的。
由于除主配置文件nginx.conf以外的文件都是在某些情况下才使用的,而只有主配置文件是在任何情况下都被使用的。
所以在这里我们就以主配置文件为例,来解释nginx的配置系统。
在nginx.conf中,包含若干配置项。每个配置项由配置指令和指令参数_2个部分构成。
指令参数_也就是配置指令对应的配置值。
配置指令是一个字符串,可以用单引号或者双引号括起来,也可以不括。但是如果配置指令包含空格,一定要引起来。
指令的参数使用一个或者多个空格或者TAB字符与指令分开。指令的参数有一个或者多个TOKEN串组成。TOKEN串之间由空格或者TAB键分隔。
配置文件结构
Nginx的核心模块为Main和Events,此外还包括标准HTTP模块、可选HTTP模块和邮件模块,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块,HTTP模块用于控制Nginx的HTTP进程。
Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。
<section> {
2. <directive> <parameters>
3.}
主要结构(所有配置以分号结尾)如下:
##Main段,定义全局属性
2.events {
3. ##定义不同IO模型下的工作机制;
4.}
5.http {
6. ##定义作为web服务器的相关属性(还可以反向代理mail)
7. server {
8. ##定义一个虚拟主机的属性,所有web服务必须定义成一个虚拟主机,与httpd不同
9. location [option] uri {
10. ##定义一个URI的特性
11. ##location中可以嵌套location的
12. location [option] uri {
13. #嵌套location
14. }
15. if (condition) {
16. ##定义URL重写
17. }
18. }
19. }
20. upstream <Name> {
21. ##将多个server结合在一起,实现负载均衡
22. }
23. }
main段配置指令
定义Nginx运行的用户和用户组用user指令。
user www-data;
定义nginx进程数,用worker_processes指令,建议设置为等于CPU总核心数。
worker_processes 8;
全局错误日志定义类型,[ debug | info | notice | warn | error | crit]用error_log指令。
另外日志还可以定义在http、server及location上下文中,语法格式一样。
error_log /var/log/nginx/error.log info;
定义进程文件用pid指令
pid /var/run/nginx.pid;
用worker_rlimit_nofile指令描述nginx进程打开的最多文件描述符的数目,建议设置为默认值。
worker_rlimit_nofile 65535;
event段配置指令
参考事件模型指令:use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
use epoll;
注:epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
设置单个进程最大连接数用指令:worker_connections(最大连接数=连接数*进程数)
worker_connections 65535;
http段配置指令
设定mime类型,类型由mime.type文件定义 用include指令
include /etc/nginx/mime.types;
2.default_type application/octet-stream;
开启gzip压缩指令
gzip on;
2.gzip_disable "MSIE [1-6]\.(?!.*SV1)";
设定负载均衡的服务器列表用指令upstream。
upstream mysvr {
2. #weigth参数表示权值,权值越高被分配到的几率越大
3. #本机上的Squid开启3128端口
4. server 192.168.8.1:3128 weight=5;
5. server 192.168.8.2:80 weight=1;
6. server 192.168.8.3:80 weight=6;
7.}
设定虚拟主机用指令server,其中包括端口,主机名称,默认请求等设置。
server {
2. #侦听80端口
3. listen 80;
4. #定义使用www.xx.com访问
5. server_name www.xx.com;
6. #设定本虚拟主机的访问日志
7. access_log logs/www.xx.com.access.log main;
8. #默认请求
9. location / {
10. root /root; #定义服务器的默认网站根目录位置
11. index index.php index.html index.htm; #定义首页索引文件的名称
12. fastcgi_pass www.xx.com;
13. fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
14. include /etc/nginx/fastcgi_params;
15. }
16.
17. # 定义错误提示页面
18. error_page 500 502 503 504 /50x.html;
19. location = /50x.html {
20. root /root;
21. }
22.}
请求转向指令proxy_pass
proxy_pass http://www.hubwiz.com;
负载均衡
负载均衡(又称为负载分担),英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
nginx的upstream目前支持4种方式的分配
1)、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3)、ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4)、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream ixdba.net{
2. ip_hash;
3. server 192.168.12.133:80;
4. server 192.168.12.134:80 down;
5. server 192.168.12.135:8009 max_fails=3 fail_timeout=20s;
6. server 192.168.12.136:8080;
7.}
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称ixdba.net。这个名称可以任意指定,在后面需要的地方直接调用即可。
Location配置
语法规则: location [=|~|~*|^~] /uri/ { … }
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。
当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
location = / {
2. #规则A
3.}
4.location = /login {
5. #规则B
6.}
7.location ^~ /static/ {
8. #规则C
9.}
10.location ~ \.(gif|jpg|png|js|css)$ {
11. #规则D
12.}
访问根目录/, 比如http://localhost/ 将匹配规则A; 访问 http://localhost/login 将匹配规则B;
访问 http://localhost/static/a.html 将匹配规则C; 访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D。
Rewrite配置
Rewrite规则
Nginx Rewrite 规则相关指令有if,rewrite,set,return,break等,其中最关键的就是rewrite。
一个简单的Nginx Rewrite规则语法如下:
rewrite ^/b/(.\*)\.html /play.php?video=$1 break;
正则表达式匹配,其中:
- ~ 为区分大小写匹配;
- ~* 为不区分大小写匹配;
- !~和!~*分别为区分大小写不匹配及不区分大小写不匹配。
文件及目录匹配,其中:
- -f和!-f用来判断是否存在文件;
- -d和!-d用来判断是否存在目录;
- -e和!-e用来判断是否存在文件或目录;
- -x和!-x用来判断文件是否可执行。
flag标记有:
- last 相当于Apache里的[L]标记,表示完成rewrite;
- break 终止匹配, 不再匹配后面的规则;
- redirect 返回302临时重定向 地址栏会显示跳转后的地址;
- permanent 返回301永久重定向 地址栏会显示跳转后的地址。
当然除了这些以外,Rewrite规则中还会用到一些相应的全局变量,如$args,$url等等