Nginx 是一款轻量级高性能的的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强。事实上 Nginx 的并发能力在同类型的网页服务器中表现较好。

一、常用命令

# 查看配置文件是否正确
nginx -t

# 重载配置
nginx -s reload

# 重启
nginx -s reopen

# 停止
nginx -s stop

二、配置文件详解

基本就分为以下几块:

main
events {
    ....
}
http {
    ....
    upstream myproject {
        .....
    }
    server {
        ....
        location {
            ....
        }
    }
    server {
        ....
        location {
            ....
        }
    }
    ....
}

以上我们可以看出,Nginx 配置文件主要分为六个区域:

1、main      (全局设置)
2、events    (nginx工作模式)
3、http      (http设置)
4、sever     (主机设置)
5、location  (URL匹配)
6、upstream  (负载均衡服务器设置)
1、main 模块

下面是一个 main 区域,他是一个全局的设置:

# 指定 Nginx Worker 进程运行用户以及用户组,默认由 nobody 账号运行
user nobody nobody;

# 指定 Nginx 要开启的进程数,建议设置为等于CPU总核心数
worker_processes 2;

# 定义全局错误日志文件。类型:[ debug | info | notice | warn | error | crit ]
error_log  /usr/local/var/log/nginx/error.log  notice;

# 指定进程 id 的存储文件位置
pid  /usr/local/var/run/nginx/nginx.pid;

# 指定进程可以打开的最大描述符:数目
# 工作模式与连接数上限
# 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
# 现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
# 这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
worker_rlimit_nofile 1024;
2、events 模块

events 模块来用指定 Nginx 的工作模式和工作模式及连接数上限,一般是这样:

events {
    # 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    # 是Linux 2.6以上版本内核中的高性能网络I/O模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型。
    # 补充说明:
    # 与apache相类,nginx针对不同的操作系统,有不同的事件模型
    # A)标准事件模型
    # Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll
    # B)高效事件模型
    # Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X。使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
    # Epoll:使用于Linux内核2.6版本及以后的系统。
    # /dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
    # Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
    use epoll;

    # 定义 Nginx 每个进程的最大连接数
    worker_connections 1024;
}
3、http 模块

http 模块可以说是最核心的模块了,它负责 HTTP 服务器相关属性的配置。

http{
    # 用来设定文件的 mime 类型,来告诉 nginx 来识别文件类型
    include       mime.types;

    # 设定了默认的类型为二进制流,也就是当文件类型未定义时使用这种方式
    default_type  application/octet-stream;

    # 设置日志的格式,和记录哪些参数,这里设置为 main 类型的日志
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # 记录每次的访问日志的文件地址,后面的 main 是日志的格式样式,对应于 log_format 的 main
    access_log  /usr/local/var/log/nginx/access.log  main;

    # 开启高效文件传输模式
    sendfile        on;

    # 设置为 on 用于防止网络阻塞
    tcp_nopush      on;

    # 设置为 on 用于防止网络阻塞
    tcp_nodelay     on;

    # 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接
    keepalive_timeout  10;

    # gzip  on;
    upstream myproject {
        .....
    }
    server {
        ....
    }
}
4、server 模块

sever 模块是 http 的子模块,它用来定一个虚拟主机。

server {
    # 指定虚拟主机的服务端口
    listen       8080;

    # 指定IP地址或者域名,多个域名之间用空格分开
    server_name  localhost 192.168.0.66 www.pengyunjing.com;

    # root 表示在这整个 server 虚拟主机内,全部的 root web 根目录。注意要和 locate {} 下面定义的区分开来
    root   /Users/pengyunjing/www;

     # index 全局定义访问的默认首页地址。注意要和 locate {} 下面定义的区分开来
    index  index.php index.html index.htm;

    # 设置网页的默认编码格式
    charset utf-8;

    # 指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式
    access_log  usr/local/var/log/host.access.log  main; 

    error_log  usr/local/var/log/host.error.log  error;
    ....
}
5、location 模块

location 模块是 Nginx 中用的最多的,负载均衡、反向代理、虚拟域名等都会用到。它提供了强大的正则匹配功能,也支持条件判断匹配,用户可以通过 location 指令实现 Nginx 对网页进行过滤处理。

设定默认首页和虚拟机目录:

location / {      # 表示匹配访问根目录
    # 指定访问根目录时,虚拟主机的 web 目录
    root   /Users/pengyunjing/www;

    # 设定我们只输入域名后访问的默认首页地址
    index  index.php index.html index.htm;
}

正则匹配来链接php:

location ~ \.php$ {
    root           /Users/pengyunjing/www;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    include        fastcgi.conf;
}
6、upstream 模块

upstream 模块负责负载均衡模块,通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。

upstream pengyunjing {
    ip_hash;
    server 192.168.0.1:80;
    server 192.168.0.2:80 down;
    server 192.168.0.3:8080  max_fails=3  fail_timeout=20s;
    server 192.168.0.4:8080;
}

在上面的例子中,通过 upstream 指令指定了一个负载均衡器的名称 pengyunjing。这个名称可以任意指定,在后面需要的地方直接调用即可。

里面是 ip_hash 这是其中的一种负载均衡调度算法,下面会着重介绍。紧接着就是各种服务器了。用 server 关键字表识,后面接 ip。

Nginx 的负载均衡模块目前支持4种调度算法:

1)weight 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。weight 指定轮询权值,值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。

2)ip_hash

每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的 session 共享问题。

3)fair

比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的 upstream_fair 模块。

4)url_hash

按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包。

在 upstream 模块中,可以通过 server 指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

  • down,表示当前的 server 暂时不参与负载均衡。
  • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻。
  • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
  • fail_timeout,在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。

注意 当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup。