Nginx安装与配置

Nginx安装与配置

Posted by 逍遥 on November 19, 2018

Nginx安装与配置

Nginx是一款是由俄罗斯的程序设计师Igor Sysoev所开发的高性能的异步框架的Web服务器,也可以用作反向代理,负载均衡和HTTP缓存,也是一个 IMAP/POP3/SMTP 代理服务器。

详细介绍这里不再赘述,可自行 百度维基百科

官网:https://nginx.org/en/

中文文档:http://www.nginx.cn/doc/

下载地址:http://nginx.org/

安装环境

系统环境:centos 7

nginx版本:nginx-1.14.2

安装编译工具及库文件

1
[root@localhost /]# yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

部分编译环境&库说明:

  • zlib:zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库
  • gcc:安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc
  • openssl:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
  • PCRE:PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。

下载安装包

Nginx版本分为发行版和稳定版,这里以稳定版为例。

下载地址:http://nginx.org/ 本次系统环境为linux,所以需下载“.tar.gz”结尾的源码安装包

首先进入文件系统”/opt/”目录中新建文件夹:nginx-1.14.2,将下载好的安装包上传至该目录中并解压。

(这里新建的文件夹不要使用“nginx”,后面编译时系统会自动生成“nginx”文件夹,会产生冲突导致make失败)

1
2
3
4
[root@localhost /]# cd /opt
[root@localhost opt]# mkdir nginx-1.14.2
[root@localhost opt]# cd nginx-1.14.2/
[root@localhost nginx-1.14.2]# tar zxvf nginx-1.14.2.tar.gz

解压完之后进入nginx目录查看信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost nginx-1.14.2]# cd nginx-1.14.2/
[root@localhost nginx-1.14.2]# ls -l
total 728
drwxr-xr-x 6 1001 1001    326 Jan 23 14:14 auto
-rw-r--r-- 1 1001 1001 288742 Dec  4 22:52 CHANGES
-rw-r--r-- 1 1001 1001 440121 Dec  4 22:52 CHANGES.ru
drwxr-xr-x 2 1001 1001    168 Jan 23 14:14 conf
-rwxr-xr-x 1 1001 1001   2502 Dec  4 22:52 configure
drwxr-xr-x 4 1001 1001     72 Jan 23 14:14 contrib
drwxr-xr-x 2 1001 1001     40 Jan 23 14:14 html
-rw-r--r-- 1 1001 1001   1397 Dec  4 22:52 LICENSE
drwxr-xr-x 2 1001 1001     21 Jan 23 14:14 man
-rw-r--r-- 1 1001 1001     49 Dec  4 22:52 README
drwxr-xr-x 9 1001 1001     91 Jan 23 14:14 src

部分文件和目录介绍:

  • src:存放了 Nginx软件的所有源代码。
    • core:nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
    • event:对系统事件处理机制的封装,以及定时器的实现相关代码
      • modules:不同事件处理方式的模块化,如select、poll、epoll、kqueue等
    • http:nginx作为http服务器相关的代码
      • modules:包含http的各种功能模块
    • mail:nginx作为邮件代理服务器相关的代码
    • misc:一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
    • os:主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口
  • man:存放了Nginx 软件的帮助文档,Nginx 安装完成后,使用 man 命令可以查看。
  • html:存放了两个后缀名为.html的静态网页文件。这两个文件与 Nginx服务器的运行相关。
  • conf:存放的是Nginx 服务器的配置文件,包含 Nginx服务器的基本配置文件和对部分特性的配置文件。
    • cc:关于编译器相关的编译选项的检测脚本
    • lib:nginx编译所需要的一些库的检测脚本
    • os:与平台相关的一些系统参数与系统调用相关的检测
    • types:与数据类型相关的一些辅助脚本
  • auto:存放了大量脚本文件,和configure脚本程序有关。
  • configure文件是 Nginx软件的自动脚本程序。运行 configure自动脚本一般会完成两项工作:一是检查环境,根据环境检查结果生成 C 代码;二是生成编译代码需要的Makefile 文件。

Nginx源码编译和安装

使用以下命令配置并生成Makefile 文件

1
[root@localhost nginx-1.14.2]# ./configure --prefix=/opt/nginx/nginx-1.14.2

得到了 Nginx 的 Makefile 文件后使用 make 文件进行编译

1
[root@localhost nginx-1.14.2]# make

编译完成后,使用 make 的 install命令安装 nginx软件

1
[root@localhost nginx-1.14.2]# make install

命令运行完成后,将当前目录定位到/nginx下,可以查看 Nginx服务器安装后的全部资源

1
2
3
4
5
6
7
[root@localhost nginx-1.14.2]# cd /opt/nginx/nginx-1.14.2/
[root@localhost nginx-1.14.2]# ls -l
total 0
drwxr-xr-x 2 root root 333 Jan 23 16:21 conf
drwxr-xr-x 2 root root  40 Jan 23 16:21 html
drwxr-xr-x 2 root root   6 Jan 23 16:21 logs
drwxr-xr-x 2 root root  19 Jan 23 16:21 sbin

目录介绍:

  • conf:存放了所有配置文件。其中,nginx.conf文件是 Nginx服务器的主配置文件,其它配置文件是用来配置Nginx 的相关功能的。在此目录下,所有的配置文件都提供了以.default结尾的默认配置文件,方便我们将配置过的.conf文件恢复到初始状态。
  • html:存放了Nginx服务器在运行过程中调用的一些 html 文件。
  • logs:用来存放Nginx服务器日志的。
  • sbin:目前只有nginx一个文件,这就是Nginx服务器的主程序了。

Nginx服务的启动暂停控制

Nginx服务的启动

在 Linux 平台下,启动 Nginx 服务器直接运行安装目录下 sbin目录中的二进制文件即可。

二进制文件 nginx 的相关用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost nginx-1.14.2]# ./sbin/nginx -h
nginx version: nginx/1.14.2
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help --显示帮助信息
  -v            : show version and exit --打印版本号并退出
  -V            : show version and configure options then exit --打印版本号和配置并退出
  -t            : test configuration and exit --测试配置正确性并退出
  -T            : test configuration, dump it and exit --测试配置正确性&打印配置并退出 
  -q            : suppress non-error messages during configuration testing --测试配置时只显示错误
  -s signal     : send signal to a master process: stop, quit, reopen, reload --向主进程发送信号
  -p prefix     : set prefix path (default: /opt/nginx/nginx-1.14.2/) --指定 Nginx 服务器路径前缀
  -c filename   : set configuration file (default: conf/nginx.conf) --指定 Nginx 配置文件路径
  -g directives : set global directives out of configuration file --指定 Nginx附加配置文件路径

Nginx服务启动&查看进程:

1
2
3
4
5
[root@localhost nginx-1.14.2]# ./sbin/nginx
[root@localhost nginx-1.14.2]# ps aux|grep nginx
root      53487  0.0  0.0  20488   604 ?        Ss   17:06   0:00 nginx: master process ./sbin/nginx
nobody    53488  0.0  0.0  23016  1380 ?        S    17:06   0:00 nginx: worker process
root      53501  0.0  0.0 112648   956 pts/0    S+   17:07   0:00 grep --color=auto nginx

Nginx服务的停止

停止 Nginx 有两种方法:一种是快速停止;一种是平缓停止。快速停止是指立即停止当前Nginx 服务正在处理的所有网络请求,马上丢弃连接,停止工作;平缓停止是指允许 Nginx服务将当前正在处理的网络请求处理完成,但不再接受新的请求,之后关闭连接,停止工作。

快速停止:

Nginx提供的停止服务

1
[root@localhost nginx-1.14.2]# ./sbin/nginx -s stop

kill命令停止服务

kill命令有很多种,这里例举“-INT”、“-TERM”命令,其他方式请参阅linux kill命令使用说明。

linux命令大全(手册):http://man.linuxde.net/

方式1:kill -INT

1
2
3
4
5
6
7
[root@localhost nginx-1.14.2]# ps aux|grep nginx
root      53487  0.0  0.0  20488   604 ?        Ss   Jan23   0:00 nginx: master process ./sbin/nginx
nobody    53488  0.0  0.0  23016  1380 ?        S    Jan23   0:00 nginx: worker process
root      66121  0.0  0.0 112648   960 pts/0    S+   08:57   0:00 grep --color=auto nginx
[root@localhost nginx-1.14.2]# kill -INT 53487
[root@localhost nginx-1.14.2]# ps aux|grep nginx
root      67679  0.0  0.0 112648   960 pts/0    S+   11:35   0:00 grep --color=auto nginx

方式2:kill -TERM

1
2
3
4
5
6
7
[root@localhost nginx-1.14.2]# ps aux|grep nginx
root      67689  0.0  0.0  20488   608 ?        Ss   11:36   0:00 nginx: master process ./sbin/nginx
nobody    67690  0.0  0.0  23016  1380 ?        S    11:36   0:00 nginx: worker process
root      67700  0.0  0.0 112648   960 pts/0    S+   11:36   0:00 grep --color=auto nginx
[root@localhost nginx-1.14.2]# kill -TERM 67689
[root@localhost nginx-1.14.2]# ps aux|grep nginx
root      67703  0.0  0.0 112648   960 pts/0    S+   11:37   0:00 grep --color=auto nginx

平缓停止:kill -QUIT

1
2
3
4
5
6
7
[root@localhost nginx-1.14.2]# ps aux|grep nginx
root      67713  0.0  0.0  20488   612 ?        Ss   11:38   0:00 nginx: master process ./sbin/nginx
nobody    67714  0.0  0.0  23016  1384 ?        S    11:38   0:00 nginx: worker process
root      67716  0.0  0.0 112648   960 pts/0    S+   11:38   0:00 grep --color=auto nginx
[root@localhost nginx-1.14.2]# kill -QUIT 67713
[root@localhost nginx-1.14.2]# ps aux|grep nginx
root      67726  0.0  0.0 112648   956 pts/0    S+   11:39   0:00 grep --color=auto nginx

Nginx服务的重启

重启Nginx有两种方式:一种是平滑重启,一种是普通重启。平滑重启是这样一个过程,Nginx服务进程接受到信号后,首先读取新的Nginx 配置文件,如果配置语法正确,则启动新的 Nginx 服务,然后平滑关闭旧的服务进程;如果新的 Nginx 配置有问题,将显示错误,仍然使用旧的Nginx进程提供服务;普通重启则类似于先停止再启动的一种过程,直接结束当前进程,读取配置进行启动。

普通重启

1
[root@localhost nginx-1.14.2]# ./sbin/nginx -s reload

平滑重启

检查配置文件正确性,分两种检查模式,一种是nginx默认的配置文件,一种是自定义的放在其他路径下的配置文件。

默认检查(检查nginx默认路径下的配置文件)

1
2
3
[root@localhost nginx-1.14.2]# ./sbin/nginx -t
nginx: the configuration file /opt/nginx/nginx-1.14.2/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx/nginx-1.14.2/conf/nginx.conf test is successful

指定检查自定义的配置文件

1
2
3
[root@localhost nginx-1.14.2]# ./sbin/nginx -t -c /opt/nginx-1.14.2/nginx-1.14.2/conf/nginx.conf 
nginx: the configuration file /opt/nginx-1.14.2/nginx-1.14.2/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx-1.14.2/nginx-1.14.2/conf/nginx.conf test is successful

重启

1
[root@localhost nginx-1.14.2]# kill -HUP 进程号

Nginx服务器的升级

平滑升级的过程是这样的,Nginx 服务接受到USR2信号后,首先将旧的nginx.pid文件(如果在配置文件中更改过这个文件的名字,也是相同的过程)添加后缀.oldbin,变为nginx.pid.oldbin文件;然后执行新版本Nginx 服务器的二进制文件启动服务。如果新的服务启动成功,系统中将有新旧两个 Nginx 服务共同提供 web 服务。之后,需要向旧的Nginx 服务进程发送WINCH 信号,使旧的Nginx 服务平滑停止,并删除nginx.pid.oldbin文件。在发送WINCH信号之前,可以随时停止新的 Nginx 服务。   注意:为了实现Nginx服务器的平滑升级,新的服务器安装路径应该和旧的保持一致。因此建议用户在安装新服务器之前先备份旧服务器。

做好准备工作以后,使用以下命令实现Nginx服务的平滑升级:

1
[root@localhost nginx-1.14.2]# ./sbin/Nginx -g USR2

其中,USR2信号用于发送平滑升级信号。或者,使用:

1
[root@localhost nginx-1.14.2]# kill USR2  `/Nginx/logs/nginx.pid`
通过ps ef grep nginx查看新的Nginx服务启动正常,再使用:
1
[root@localhost nginx-1.14.2]# ./sbin/Nginx -g WINCH

其中,WINCH 信号用于发送平滑停止旧服务信号。或者,使用:

1
[root@localhost nginx-1.14.2]# kill WINCH `/Nginx/logs/nginx.pid`

这样就在不停止提供Web 服务的前提下完成了 Nginx服务器的平滑升级。

Nginx.conf的内容和基本配置方法

默认的Nginx.conf文件内容

默认的nginx.conf文件中的完整内容如下,注释标识为“#”。

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

nginx.conf文件的结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...                            #全局块
events{                        #events 块
    ...
}
http{                          #http 块
    ...                        #http 全局块
    server{                    #server 块
        ...                    #server 全局块
        location [PATTERN]{    #location 块
            ...
        }
        location [PATTERN]{    #location 块
            ...
        }
    }
    server{                    #server 块
        ...
    }
    ...                        #http 全局块
}

配置文件支持大量可配置的指令,绝大多数指令不是特定属于某一个块的。同一个指令放在不同层级的块中,其作用域也不同,一般情况下,高一级块的指令可以作用于自身所在的块和此块包含的所有低层级块。如果某个指令在两个不同层级的块中同时出现,则采用“就近原则”,即以较低层级的块中的配置为准。比如,某指令同时出现在http全局块中和 server 块中,并且配置不同,则应该以 server 块中的配置为准。   各个块的作用如下:   1.全局块   全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。   通常包括配置运行Nginx 服务器的用户(组)、允许生成的worker process数、Nginx 进程 PID存放路径、日志的存放路径和类型以及配置文件引入等。   2.events 块   events 块涉及的指令主要影响Nginx 服务器与用户的网络连接。常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个 worker process可以同时支持的最大连接数等。   这一部分指令对 Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。   3.http 块   http块是Nginx 服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块。可以在 http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接q 请求数上限等。   4.server 块   server 块和“虚拟主机”的概念有密切联系。在 server 全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或 IP 配置。   5.location 块   location 块的主要作用是,基于Nginx服务器接受到的q 请求字符串,对除虚拟主机名称之外的字符串j 进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。

配置允许生成的worker process数

worker process是 Nginx服务器实现并发处理服务的关键所在。从理论上来说,worker process的值越大,可以支持的并发处理量也越多,但实际上它还要受到来自软件本身、操作系统本身资源和能力、硬件设备等的制约。 配置允许生成的worker process数的指令是worker_processes,此指令只能在全局块中设置,其语法格式为:

1
2
3
4
worker_processes number | auto;

number,指定 Nginxj 进程最多可以产生的worker process数。
auto,设置此值,Nginx进程将自动检测。

示例:

默认配置情况:

1
2
3
4
[root@localhost nginx-1.14.2]# ps aux|grep nginx
nobody    21060  0.0  0.0  23004  1480 ?        S    10:28   0:00 nginx: worker process
root      21062  0.0  0.0 112648   960 pts/0    S+   10:28   0:00 grep --color=auto nginx
root      70306  0.0  0.0  20488  1372 ?        Ss   Jan24   0:00 nginx: master process ./sbin/nginx

修改worker process

1.打开配置文件

1
[root@localhost nginx-1.14.2]# vim ./conf/nginx.conf

2.按下键盘“Insert”键进入编辑模式,修改worker_processes的值为3

1
2
#user  nobody;
worker_processes 3;

3.保存编辑好的配置文件,按下键盘“Esc”键,然后输入“:wq”退出并保存,重启nginx之后再次查看服务

1
2
3
4
5
6
7
[root@localhost nginx-1.14.2]# ./sbin/nginx -s reload
[root@localhost nginx-1.14.2]# ps aux|grep nginx
nobody    21125  0.0  0.0  23020  1400 ?        S    10:35   0:00 nginx: worker process
nobody    21126  0.0  0.0  23020  1400 ?        S    10:35   0:00 nginx: worker process
nobody    21127  0.0  0.0  23020  1400 ?        S    10:35   0:00 nginx: worker process
root      21129  0.0  0.0 112648   960 pts/0    S+   10:35   0:00 grep --color=auto nginx
root      70306  0.0  0.0  20488  1372 ?        Ss   Jan24   0:00 nginx: master process ./sbin/nginx

这时候会看到比默认配置除了主进程之外多了两个新的worker process

配置Nginx进程PID存放路径

Nginx进程作为系统的守护进程,我们需要在某文件中保存当前运行程序的主进程号。Nginx 支持对它的存放路径进行自定义配置,指令是 pid,此指令只能在全局块中进行配置,其语法格式为:

1
2
pid file;
其中,file 指定存放路径和文件名称。

配置文件默认将此文件存放在Nginx 安装目录 logs下,名字为nginx.pid。path 可以是绝对路径也可以是以 Nginx安装目录为根目录的相对路径。

再次打开配置文件可以看到默认的pid配置路径

1
#pid        logs/nginx.pid;

这时将其路径指向修改为自定义路径

1
2
#pid        logs/nginx.pid;
pid        sbin/web_nainx;

打开sbin文件夹,这时会多出一份名为“web_nginx”的文件,就是刚才自定义存放的Pid文件

1
2
3
4
5
[root@localhost nginx-1.14.2]# cd ./sbin
[root@localhost sbin]# ls -l
total 3664
-rwxr-xr-x 1 root root 3746688 Jan 23 16:21 nginx
-rw-r--r-- 1 root root       6 Jan 30 10:52 web_nainx

注意:使用此指令时需先关闭nginx,否则修改完文件重启或停止Nginx服务时都会报错

1
nginx: [error] open() "/opt/nginx/nginx-1.14.2/sbin/web_nainx" failed (2: No such file or directory)

配置错误日志的存放路径

在全局块、http 块和 Server 块都可以对Nginx服务器的日志进行相关配置。使用的指令是error_log,其语法结构是:

1
error_log file | stderr [debug | info | notice | warn | error | crit | alert | emerg];

Nginx服务器的日志支持输出到某一固定的文件file 或者输出到标准错误输出stderr。 Nginx默认的日志存放和级别设置:

1
2
3
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

配置文件的引入

Nginx 提供了include指令来完成配置文件的引入,此指令可以放在配置文件的任意地方,其语法结构为:

1
2
include file;
file是要引入的配置文件,它支持相对路径

设置网络连接的序列化

Nginx配置中包含了这样一条指令 accept_mutex,当其设置为开启的时候,将会对多个Nginx进程接收连接进行序列化,防止多个进程对连接的争抢。其语法结构为:

1
accept_mutex on | off;

此指令默认为开启(on)状态,其只能在events块中进行配置。

设置是否允许同时接收多个网络连接

每个 Nginx 服务器的worker process 都有能力同时接收多个新到达的网络连接,但是这需要在配置文件中进行设置,其指令为 multi_accept,语法结构为:

1
multi_accept on | off

此指令默认为关闭(off)状态,即每个 worker process一次只能接收一个新到达的网络连接。此指令只能在events块中进行配置。

事件驱动模型的选择

Nginx服务器提供了多种事件驱动模型来处理网络消息。指令为 use,此指令只能在events块中进行配置,语法结构为:

1
2
use method;
其中,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport。

配置最大连接数

指令worker_connections主要用来设置允许每一个worker process同时开启的最大连接数,此指令只能在events块中进行配置,其语法结构为:

1
worker_connections number;

此指令的默认设置为1024。 注意:这里的 Number不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。另外,number 值不能大于操作系统支持打开的最大文件句柄数量。

定义MIME-Type

在默认的Nginx 配置文件中,http全局块中有以下两行配置:

1
2
include       mime.types;        #以下指令在 http部分中生效
default_type  application/octet-stream;

第一行从外部引用了mime_types文件,看一下它的内容:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    application/font-woff                            woff;
    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}

第二行中使用指令default_type配置了用于处理前端请求的 MIME类型,其语法结构为:

1
default_type mime-type;

其中,mime-type为 types 块中定义的MIME-type,如果不加此指令,默认值为text/plain。此指令还可以在 http 块、server 块或者location块中进行配置。

自定义服务日志

errer_log指令用于配置Nginx 进程运行时的日志存放和级别,此处所指的日志是指记录Nginx服务器提供服务过程应答前端要求的日志,我们将其称为服务日志。 Nginx 服务器支持对服务日志的格式、大小、输出等进行配置,需要使用两个指令,分别是access_log和 log_format 指令,此指令只能在 http 块中进行配置。 access_log指令的语法结构为:

1
2
3
4
5
access_log path [format [buffer=size]];

path:配置服务日志的文件存放路径和名称。
format:可选项,自定义服务日志的格式字符串,也可以通过“格式串的名称”使用log_format指令定义好的格式。“格式串的名称”在log_format指令中定义。
size:配置临时存放日志的内存缓存区大小。

此指令可以在http、Server块或者 location 块中进行设置。默认的配置为:

1
access_log logs/access.log combined;

其中,combined为log_format指令默认定义的日志格式字符串的名称。 如果要取消记录服务日志的功能,则使用:

1
access_log off;

和 access_log联合使用的另一个指令是log_format,它专门用于定义服务日志的格式,并且可以为格式字符串定义一个名字,以便access_log指令可以直接调用。其语法格式为:

1
2
3
4
log_format name string ...;

name:格式字符串的名字,默认的名字为combined。
string:服务日志的格式字符串。可以使用 Nginx配置项预设的一些变量获取相关内容,变量的名称使用双引号括起来,string 整体使用单引号括起来。

配置允许sendfile 方式传输文件

用于开启或关闭使用sendfile传输文件指令:

1
sendfile on | off;

默认值为 off,可以在 http 块、server 块或者location块中进行配置。

1
sendfile_max_chunk size;

其中,size 值如果大于0,Nginx进程的每个worker process每次调用sendfile传输的数据量最大不能超过这个值;如果设置为0,则无限制。默认值为0.此指令可以在http块、server块或 location块中配置。

1
sendfile_max_chunk 128k;

配置连接超时时间

与用户建立会话连接后,Nginx 服务器可以保持这些连接打开一段时间,指令keeplive_timeout就是用来设置此时间的,其语法结构为:

1
2
3
4
keepalive_timeout timeout [header_timeout];

timeout:服务端对连接的保持时间。默认值为75s。
header_timeout:可选项,在应答报文头部的 Keep-Alive域设置超时时间:“Keep-Alive:timeout=header_timeout”。报文中的这个指令可以被Mozilla或者Konqueror识别。

此指令还可以出现在server 块和 location 块中。

1
keepalive_timeout 120s 100s;

其含义是,在服务端保持连接的时间设置为120s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100s。 此指令可以在http 块、server 块或location块中配置。

单连接请求数上限

Nginx 服务器端和用户端建立会话连接后,用户端通过此连接发送请求。指令keepalive_requests用于限制用户通过某一连接向 Nginx服务器发送请求的次数。其语法结构为:

1
keepalive_requests number;

此指令还可以出现在Server 块和 location 块中,默认设置为100。

配置网络监听

配置监听使用指令listen。其配置方法主要有三种:

  • 第一种配置监听的IP 地址,语法结构为:

    1
    
    listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
    
  • 第二种配置监听端口,其语法结构为:

    1
    
    listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [ssl];
    
  • 第三种配置UNIX Domain Socket,其语法结构为:

    1
    
    listen unix:path [default_server] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ssl];
    

address:IP 地址,如果是IPv6地址,需要使用中括号“[]”括起来,比如[fe80::1]等。 port:端口号,如果只定义了IP 地址没有定义端口号,就使用80端口。 path:socket文件路径,如/var/run/nginx.sock 等。 default_server:标识符,将此虚拟主机设置为address:port 的默认主机。

注意:在 Nginx-0.8.21之前的版本,使用的是default。 setfib=number:Nginx-0.8.44中使用这个变量为监听socket关联路由表,目前只对FreeBSD 起作用,不常用。 backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在FreeBSD中默认为-1,其它平台默认为511。 rcvbuf=size,设置监听socket接受缓存区大小。 sndbuf=size,设置监听socket发送缓存区大小。 deferred:标识符,将 accept()设置为Deferred 模式。 accept_filter=filter,设置监听端口对请求的过滤,被过滤的内容不能被接收和处理。本指令只在FreeBSD和NetBSD 5.0+平台下有效。filter可以设置为dataready或httpready。 bind:标识符,使用独立的bind()处理此address:port;一般情况下,对应端口相同而 IP地址不同的多个连接,Nginx 服务器将只使用一个监听命令,并使用bind()处理端口相同的所有连接。 ssl:标识符,设置会话连接使用 SSL模式进行,此标识符和Nginx服务器提供的HTTPS服务有关。 listen 指令的使用看起来比较复杂,但其实在一般的使用过程中,相对来说比较简单,默认的设置为:

1
listen *:80 | *:8000

即监听所有80端口和8000端口。下面给出一些示例来说明listen 的用法:

1
2
3
4
listen 192.168.1.10:8000;    #监听具体的 IP和具体的端口上的连接
listen 192.168.1.10;             #监听具体IP 的所有端口上的连接
listen 8000;                          #监听具体端口上的所有 IP 连接,等同于listene *:8000;
listen 192.168.1.10 default_server backlog=1024;    #设置192.168.1.10的连接请求默认由此虚拟主机处理,并且允许最多1024网络连接同时处于挂起状态。

基于名称的虚拟主机配置

这里的“主机”,j 就是指此server 块对外提供的虚拟主机。设置了主机的名称并配置好 DNS,用户就可以使用这个名称向此虚拟主机发送请求了。配置主机名称的指令为server_name,其语法结构为:

1
server_name name ...;

对于 name 来说,可以只有一个名称,也可以由多个名称并列,之间用空格隔开。每个名字就是一个域名,由两段或三段组成,之间由点号“.”隔开。下面是一个简单的示例:

1
server_name myserver.com www.myserver.com;

在该例中,此虚拟主机的名称设置为myserver.comwww.myserver.com。Nginx服务器规定,第一个名称作为此虚拟主机的主要名称。 在 name 中可以使用通配符“*”和正则表达式。

基于 IP 的虚拟主机配置

配置基于 IP 的虚拟主机,即为 Nginx 服务器提供的每台虚拟主机配置一个不同的 IP,因此需要将网卡设置为同时能够监听多个 IP 地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
http
{
    ...
    server
    {
        listen: 80;
        server_name: 192.168.1.31;
        ...
    }
    server
    {
        listen: 80;
        server_name: 192.168.1.32;
        ...
    }
    ...
}