Nginx学习

���Ľ�������л�����Ķ�

一、nginx常用命令

===========

1.Nginx启动


1
2
3
4
5
6
7
    nginx   -c /etc/nginx/nginx.conf
```

其中参数-c指定nginx启动时加载的配置文件,当然也可以不指定配置文件,省略-c,也可以启动,表示使用默认的配置文件。

### 2.nginx停止
---------
nginx -s stop 或者
nginx -s quit 或者
pkill -9 nginx
1
2

例如在我们的编辑环境中已经安装好了nginx,并且已启动,在命令提示符下直接输入
nginx -s stop
1
2
3
4
5

就可以停止了。

### 3.nginx重载配置
-----------
nginx -s reload
1
2
3

### 4.检查配置文件是否正确
------------
nginx -t
1
2
3
4
5
6
7
8
9

## 二、配置文件结构
========

Nginx的核心模块为**Main**和**Events**,此外还包括**标准HTTP模块、可选HTTP模块和邮件模块**,其还可以支持诸多第三方模块。Main用于配置错误日志、进程及权限等相关的参数,Events用于配置IO模型,如epoll、kqueue、select或poll等,它们是必备模块,HTTP模块用于控制Nginx的HTTP进程。

Nginx的主配置文件由几个段组成,这个段通常也被称为nginx的上下文,每个段的定义格式如下所示。需要注意的是,其每一个指令都必须使用分号(;)结束,否则为语法错误。

主要结构(所有配置以分号结尾)如下:
##Main段,定义全局属性
events {
          ##定义不同IO模型下的工作机制;
}
http { 
    ##定义作为web服务器的相关属性(还可以反向代理mail)
    server { 
        ##定义一个虚拟主机的属性,所有web服务必须定义成一个虚拟主机,与httpd不同
        location [option] uri { 
            ##定义一个URI的特性
            ##location中可以嵌套location的
            location [option] uri { 
                #嵌套location
            }
               if (condition) {
                ##定义URL重写
            }
        }
    }
    upstream  <Name> {
        ##将多个server结合在一起,实现负载均衡
    }
 }
1
2
3
4
5

## 三、配置指令
======

定义Nginx运行的用户和用户组用user指令。
user www-data;
1
2

定义nginx进程数,用worker_processes指令,建议设置为等于CPU总核心数。
worker_processes 8;
1
2

全局错误日志定义类型,**\[ debug | info | notice | warn | error | crit\]**用error_log指令。另外日志还可以定义在http、server及location上下文中,语法格式一样。
error_log /var/log/nginx/error.log info;
1
2

定义进程文件用pid指令
pid /var/run/nginx.pid;
1
2

用worker\_rlimit\_nofile指令描述nginx进程打开的最多文件描述符的数目,建议设置为默认值。
worker_rlimit_nofile 65535;
1
2

参考事件模型指令:use \[ kqueue | rtsig | epoll | /dev/poll | select | poll \];
use epoll;
1
2
3
4

注:epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。

设置单个进程最大连接数用指令:worker_connections(`最大连接数=连接数*进程数`)
worker_connections 65535;
1
2

设定mime类型,类型由mime.type文件定义 用include指令.
include       /etc/nginx/mime.types;
default_type  application/octet-stream;
1
2

开启gzip压缩指令
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
1
2

设定负载均衡的服务器列表用指令upstream。
upstream mysvr {
    #weigth参数表示权值,权值越高被分配到的几率越大
    #本机上的Squid开启3128端口
    server 192.168.8.1:3128 weight=5;
    server 192.168.8.2:80  weight=1;
    server 192.168.8.3:80  weight=6;
}  
1
设定虚拟主机用指令server,其中包括端口,主机名称,默认请求等设置。
server {
    #侦听80端口
    listen       80;
    #定义使用www.xx.com访问
    server_name  www.xx.com;
    #设定本虚拟主机的访问日志
    access_log  logs/www.xx.com.access.log  main;
    #默认请求
    location / {
          root   /root;      #定义服务器的默认网站根目录位置
          index index.php index.html index.htm;   #定义首页索引文件的名称
          fastcgi_pass  www.xx.com;
          fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
          include /etc/nginx/fastcgi_params;
     }

    # 定义错误提示页面
    error_page   500 502 503 504 /50x.html; 
    location = /50x.html {
    root   /root;
    }
}
1
2

请求转向指令proxy_pass
proxy_pass http://www.hubwiz.com;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

## 四、负载均衡
======

负载均衡(又称为负载分担),英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

nginx的upstream目前支持4种方式的分配

1)、轮询(默认)
---------

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2)、weight
---------

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

3)、ip_hash
----------

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

4)、fair(第三方)
------------

按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream 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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称 [ixdba.net](http://ixdba.net)。这个名称可以任意指定,在后面需要的地方直接调用即可。

## 五、Location配置
============

语法规则: `location \[=||*|^~\] /uri/ { … }`

通配符

说明

=

开头表示精确匹配

^~

开头表示uri以某个常规字符串开头,理解为匹配 url路径即可

~

开头表示区分大小写的正则匹配

!~

区分大小写不匹配

!~*

不区分大小写不匹配

~*

开头表示不区分大小写的正则匹配

/

通用匹配,任何请求都会匹配到

首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
location = / {
   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
那么产生的效果如下:

访问根目录/, 比如http://localhost/ 将匹配规则A;

访问 [http://localhost/login](http://localhost/login) 将匹配规则B;

访问 [http://localhost/static/a.html](http://localhost/static/a.html) 将匹配规则C;

访问 [http://localhost/a.gif](http://localhost/a.gif), [http://localhost/b.jpg](http://localhost/b.jpg) 将匹配规则D。

## 六、Rewrite规则
===========

Nginx Rewrite 规则相关指令有if,rewrite,set,return,break等,其中最关键的就是rewrite。一个简单的Nginx Rewrite规则语法如下:
rewrite ^/b/(.\*)\.html /play.php?video=$1 break; 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

**正则表达式匹配**,其中:

1、~ 为区分大小写匹配;

2、~* 为不区分大小写匹配;

3、!和!*分别为区分大小写不匹配及不区分大小写不匹配。

**文件及目录匹配**,其中:

-f和!-f用来判断是否存在文件;

-d和!-d用来判断是否存在目录;

-e和!-e用来判断是否存在文件或目录;

-x和!-x用来判断文件是否可执行。

**flag标记有**:

last 相当于Apache里的\[L\]标记,表示完成rewrite;

break 终止匹配, 不再匹配后面的规则;

redirect 返回302临时重定向 地址栏会显示跳转后的地址;

permanent 返回301永久重定向 地址栏会显示跳转后的地址。

当然除了这些以外,Rewrite规则中还会用到一些相应的全局变量,如$args,$url等等

## 七、配置自己的文件
=========

前面几节中我们已经学过了nginx配置文件中的各个段的配置指令,下面我们就来写一个自己配置文件。如下代码:
worker_processes  1;
events {
    worker_connections  1024;
}
http {
       server {
            location / {
                      #root   html;      #定义服务器的默认网站根目录位置
                      #index index.php index.html index.htm;   #定义首页索引文件的名称
                      proxy_pass http://www.hubwiz.com;
             }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
           }
         }
}
1
2
3
4

这样我们自己的配置文件就完成了,先将nginx的服务停止,然后我们用nginx -c *.conf 命令来重新启动nginx,*.conf为我们自己的配置文件所在的路径,nginx启动以后,然后点击【访问测试】,看看会出现什么情况,是不是已经转到我们所配置的站点了。

我自己的配置文件名为Mynginx.conf,其中的内容就是以上面代码的内容,保存在/etc/nginx目录下,完成以后我们做如下操作:
nginx -s stop   
nginx -c /etc/nginx/Mynginx.conf 
1
2
3
4
5
6
7
8
9

然后测试。

## 八、反向代理示例
========

反向代理(Reverse Proxy) 是指代理服务器来接收来自Internet上的连接请求,并将请求转发给内部网络上的服务器,并从服务器上得到的结果返回给Internet上请求连接的客户端。

比如要配置后端跑 apache 服务的 ip 和端口,也就是说,我们的目标是实现通过 [http://ip](http://ip):port 能访问到你的网站。配置文件可以修改以下内容,reload nginx就可以了。
## Basic reverse proxy server ##
    upstream apachephp  {
        server ip:8080; #Apache
    }
    ## Start www.nowamagic.net ##
    server {
        listen 80;
        server_name  www.nowamagic.net;
        access_log  logs/quancha.access.log  main;
        error_log  logs/quancha.error.log;
        root   html;
        index  index.html index.htm index.php;

        ## send request back to apache ##
        location / {
            proxy_pass  http://apachephp;
                #……………………
}
}
1
2
3
4
5
6
7

## 九、虚拟主机示例
========

Nginx做虚拟主机,尤其是仅仅支持纯静态-html,这是最简单的应用了,可以理解为一个仅支持静态页面的最简单的Web服务器。

例子,同时支持两个虚拟主机(纯静态-html支持)的配置,我们只需要理改server段,如下:
server {
        listen       80;
        server_name  www.hubwiz.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
                      root   /root; 
                      index index.php index.html index.htm;  

        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
      }
server {
        listen       80;
        server_name  www.baidu.com;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
                      root   /root;     
                      index index.php index.html index.htm; 

        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
1
2
3
4
5

## 十、正向代理示例
========

Nginx正向代理配置如下:
server
{
  listen       8080;
  server_name www.hubwiz.com;
  index index.html index.htm index.php;
  root  /home/wwwroot;
     location / {
         resolver        192.168.8.88;
         proxy_pass      $scheme://$http_host$request_uri;
         proxy_buffers   256 4k;
 }
   access_log off;
}
1
2
3
4
5
6
7
8
9
10
11
12
13

以上配置的注意事项:

1,不能有hostname。

2,必须有resolver, 即dns,即上面的x.x.x.x,换成当前机器的DNS服务器ip即可(查看dns方法 cat /etc/resolv.conf 代理使用)。

3,$http\_host和$request\_uri是nginx系统变量,保持原样即可。

检测配置文件无误后,重启nginx,在浏览器中添加代理服务器的IP地址,就可以使用该Nginx正向代理了。

## 十一、负载均衡示例
=========
upstream backend{
      #定义负载均衡设备的Ip及设备状态
      server 127.0.0.1:9090 down; 
      server 192.168.1.12:8080 weight=2 ;
      server 192.168.1.13:6060 max_fails=3 fail_timeout=30s;
      server 1192.168.1.14:7070 backup;
}
server{
    #…………………………
   location /{
        proxy_pass http://backend;
        #…………………………
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

以上代码就是对负载均衡应用的示例。

Upstream可对后端服务器进行健康检查。

a) down表示当前的server暂时不参与负载。

b) weight默认为1.weight越大,负载的权重就越大。

c) max_fails :在fail_timeout时间内对后台服务器请求失败的次数。

d) fail_timeout:max_fails次失败后,暂停的时间。

e) backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

## 十二、Rewrite简单示例
==============
worker_processes  1;
events {
    worker_connections  1024;
}
http {
       server {
            location /hubwiz {
                      rewrite (.*) http://www.hubwiz.com;
        }
           location /baidu {
                      rewrite (.*) http://www.baidu.com;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
       }
   }
}

`

修改我们自己的配置文件,保存,重新加载nginx,然后测试,在地址栏给出的地址后面分别输入“/hubwiz”、“/baidu”,是不是会和我的结果一样呢?

输入“/hubwiz”转到汇智网,输入“/baidu”是不是转到百度了呢?

0%