Nginx 系列一:Nginx 服务器的安装部署

本文所介绍的环境是:
操作系统:CenOS-7-x86_64
环境:虚拟机
Nginx 版本:1.6.3

一、Nginx服务器安装文件的获取

1.1 获取新版本的 Nginx 服务器

Nginx 的官方下载地址为:http://nginx.org/en/download.html。打开后如下图所示:

Nginx 下载官网

网页上提供了Nginx 服务器三种版本的下载,分别是开发版(Mainline version)、稳定版本(Stable version)和过期版本(Legacy versions)。
  页面上下载部分各链接的具体含义:
  “CHANGES-x.xx”链接,记录的是对应版本的功能变更日志。包括新增功能、功能的优化和功能缺陷的修复等。
  紧接着“CHANGES-x.xx”链接后面的“nginx-x.x.x”链接,是 Nginx服务器的 Linux版本下载地址。
  “pgp”链接,记录的是提供下载的版本使用PGP加密自由软件GnuPG计算后的签名。PGP可以理解为Pretty Good Privacy。这些数据可以用于下载文件的验证。
  “nginx/Windows-x.x.x”链接,是 Nginx 服务器的Windows版本下载地址。

1.2 获取历史版本的 Nginx 服务器

下载 Nginx服务器全部历史版本的链接:http://nginx.org/download/

二、安装 Nginx 服务器和基本配置

2.1 Linux 版本的编译和安装:准备工作

在线安装所需工具:

yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel

2.2 Linux版本的编译和安装:Nginx 软件的自动脚本

为了方便管理和使用,我们在文件系统的“/app/”目录下新建nginx-1.6.3目录,最后会把编译好的Nginx安装到此目录中。同时,在此目录中新建nginx-1.6.3-compile,用来编译Nginx 软件。将下载好的nginx-1.6.3.tar.gz文件复制到对应目录。解压下载包,得到Nginx软件安装包的所有资源:

[root@localhost nginx-1.6.3]# tar xf nginx-1.6.3.tar.gz 
[root@localhost nginx-1.6.3]# cd nginx-1.6.3
[root@localhost nginx-1.6.3]# ls -l
总用量 604
drwxr-xr-x. 6 1001 1001   4096 1月  19 14:34 auto
-rw-r--r--. 1 1001 1001 236608 4月   7 2015 CHANGES
-rw-r--r--. 1 1001 1001 360501 4月   7 2015 CHANGES.ru
drwxr-xr-x. 2 1001 1001    168 1月  19 14:34 conf
-rwxr-xr-x. 1 1001 1001   2369 4月   7 2015 configure
drwxr-xr-x. 4 1001 1001     72 1月  19 14:34 contrib
drwxr-xr-x. 2 1001 1001     40 1月  19 14:34 html
-rw-r--r--. 1 1001 1001   1397 4月   7 2015 LICENSE
drwxr-xr-x. 2 1001 1001     21 1月  19 14:34 man
-rw-r--r--. 1 1001 1001     49 4月   7 2015 README
drwxr-xr-x. 8 1001 1001     77 1月  19 14:34 src

部分文件和目录介绍:

  • src 目录存放了 Nginx软件的所有源代码。
  • man 目录中存放了Nginx 软件的帮助文档,Nginx 安装完成后,使用 man 命令可以查看。
  • html 目录中存放了l 两个后缀名为.html的静态网页文件。这两个文件与 Nginx服务器的运行相关。
  • conf 目录存放的是Nginx 服务器的配置文件,包含 Nginx服务器的基本配置文件和对部分特性的配置文件。
  • auto 目录中存放了大量脚本文件,和configure脚本程序有关。
  • configure文件是 Nginx软件的自动脚本程序。运行 configure自动脚本一般会完成两项工作:一是检查环境,根据环境检查结果生成 C 代码;二是生成编译代码需要的Makefile 文件。







将当前工作路径定位到/app/nginx/nginx-1.6.3-compile/nginx-1.6.3,使用以下命令配置并生成Makefile 文件:

[root@localhost nginx-1.6.3]# ./configure --prefix=/app/nginx/nginx-1.6.3

--prefix 指定了Nginx软件的安装路径。

生成的 Nginx 软件的Makefile文件就保存在当前的工作目录。

2.3 Linux 版本的编译和安装:Nginx 源代码的编译和安装

得到了 Nginx 的 Makefile 文件后,在/app/nginx/nginx-1.6.3-compile/nginx-1.6.3目录下使用 make 文件进行编译:

[root@localhost nginx-1.6.3]# make

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

[root@localhost nginx-1.6.3]# make install

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

[root@localhost nginx-1.6.3]# cd /app/nginx/nginx-1.6.3
[root@localhost nginx-1.6.3]# ls -l
总用量 4
drwxr-xr-x. 2 root root 4096 1月  20 03:21 conf
drwxr-xr-x. 2 root root   40 1月  20 03:21 html
drwxr-xr-x. 2 root root    6 1月  20 03:21 logs
drwxr-xr-x. 2 root root   19 1月  20 03:21 sbin
  • conf 目录存放了所有配置文件。其中,nginx.conf文件是 Nginx服务器的主配置文件,其它配置文件是用来配置Nginx 的相关功能的。在此目录下,所有的配置文件都提供了以.default结尾的默认配置文件,方便我们将配置过的.conf文件恢复到初始状态。
  • html 目录存放了Nginx服务器在运行过程中调用的一些 html 文件。
  • logs 目录用来存放Nginx服务器日志的。
  • sbin 目录,目前只有nginx一个文件,这就是Nginx服务器的主程序了。

三、Nginx 服务的启动暂停控制

3.1 Nginx 服务的启动

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

[root@localhost nginx-1.6.3]# ./sbin/nginx -h
nginx version: nginx/1.6.3
Usage: nginx [-?hvVtq] [-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  测试配置正确性并退出
  -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: /app/nginx/nginx-1.6.3/)  指定 Nginx 服务器路径前缀
  -c filename   : set configuration file (default: conf/nginx.conf)  指定 Nginx 配置文件路径
  -g directives : set global directives out of configuration file  指定 Nginx附加配置文件路径

Nginx 服务启动命令:

[root@localhost nginx-1.6.3]# ./sbin/nginx 
[root@localhost nginx-1.6.3]# ps aux|grep nginx
root      8993  0.0  0.0  24812   760 ?        Ss   03:50   0:00 nginx: master process ./sbin/nginx
nobody    8994  0.0  0.1  25236  1212 ?        S    03:50   0:00 nginx: worker process
root      8996  0.0  0.0 112680   976 pts/0    R+   03:50   0:00 grep --color=auto nginx

3.2 Nginx 服务的停止

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

[root@localhost nginx-1.6.3]# ./sbin/nginx 
[root@localhost nginx-1.6.3]# ps aux|grep nginx
root      9630  0.0  0.0  24812   760 ?        Ss   16:14   0:00 nginx: master process ./sbin/nginx
nobody    9631  0.0  0.1  25236  1212 ?        S    16:14   0:00 nginx: worker process
root      9633  0.0  0.0 112680   976 pts/0    R+   16:15   0:00 grep --color=auto nginx
[root@localhost nginx-1.6.3]# kill -INT 9630
[root@localhost nginx-1.6.3]# ps aux|grep nginx
root      9637  0.0  0.0 112680   972 pts/0    R+   16:15   0:00 grep --color=auto nginx

或者

[root@localhost nginx-1.6.3]# ./sbin/nginx 
[root@localhost nginx-1.6.3]# ps aux|grep nginx
root      9639  0.0  0.0  24812   760 ?        Ss   16:16   0:00 nginx: master process ./sbin/nginx
nobody    9640  0.0  0.1  25236  1212 ?        S    16:16   0:00 nginx: worker process
root      9642  0.0  0.0 112680   976 pts/0    R+   16:16   0:00 grep --color=auto nginx
[root@localhost nginx-1.6.3]# kill -TERM 9639
[root@localhost nginx-1.6.3]# ps aux|grep nginx
root      9644  0.0  0.0 112680   972 pts/0    R+   16:17   0:00 grep --color=auto nginx

或者

[root@localhost nginx-1.6.3]# ./sbin/nginx 
[root@localhost nginx-1.6.3]# ps aux|grep nginx
root      9646  0.0  0.0  24812   756 ?        Ss   16:17   0:00 nginx: master process ./sbin/nginx
nobody    9647  0.0  0.1  25236  1212 ?        S    16:17   0:00 nginx: worker process
root      9649  0.0  0.0 112680   976 pts/0    R+   16:17   0:00 grep --color=auto nginx
[root@localhost nginx-1.6.3]# kill -QUIT 9646
[root@localhost nginx-1.6.3]# ps aux|grep nginx
root      9651  0.0  0.0 112680   976 pts/0    R+   16:18   0:00 grep --color=auto nginx

其中,TERM 和 INT 信号用于快速停止,QUIT 用于平缓停止。
  当然也可以使用 kill 命令发送-9,但不建议使用:

[root@localhost nginx-1.6.3]# ./sbin/nginx 
[root@localhost nginx-1.6.3]# ps aux|grep nginx
root      9654  0.0  0.0  24812   764 ?        Ss   16:20   0:00 nginx: master process ./sbin/nginx
nobody    9655  0.0  0.1  25236  1216 ?        S    16:20   0:00 nginx: worker process
root      9657  0.0  0.0 112680   972 pts/0    R+   16:20   0:00 grep --color=auto nginx
[root@localhost nginx-1.6.3]# kill -9 9654
[root@localhost nginx-1.6.3]# ps aux|grep nginx
nobody    9655  0.0  0.1  25236  1472 ?        S    16:20   0:00 nginx: worker process
root      9659  0.0  0.0 112680   972 pts/0    R+   16:20   0:00 grep --color=auto nginx

3.3 Nginx 服务的重启

平滑重启是这样一个过程,Nginx服务进程接受到信号后,首先读取新的Nginx 配置文件,如果配置语法正确,则启动新的 Nginx 服务,然后平滑关闭旧的服务进程;如果新的 Nginx 配置有问题,将显示错误,仍然使用旧的Nginx进程提供服务。
  使用以下命令实现Nginx服务的平滑重启:

# ./sbin/nginx -g HUP [-c newConfFile]

HUP 信号用于发送平滑重启信号。
  newConfFile,可选项,用于指定新配置文件的路径。
  或者,使用新的配置文件代替了旧的配置文件后,使用

# kill HUP `/Nginx/logs/nginx.pid`

也可以实现平滑重启。

3.4 Nginx 服务器的升级

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

./sbin/Nginx -g USR2

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

kill USR2  `/Nginx/logs/nginx.pid`

通过ps ef|grep nginx查看新的Nginx服务启动正常,再使用:

./sbin/Nginx -g WINCH

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

kill WINCH `/Nginx/logs/nginx.pid`

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

四、nginx.conf的内容和基本配置方法

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

#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;        #在 events部分中生效
}


http {
    include       mime.types;        #以下指令在 http部分中生效
    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 {       #以下指令在http 的server部分中生效
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {        #以下指令在http/server的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;
    #    }
    #}

}

4.1 nginx.conf文件的结构

nginx.conf 文件的基本结构为:(在同一配置块中嵌套的配置块,各个之间不存在次序关系。)

...                            #全局块
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块中提供功能。

4.2 配置运行Nginx服务器用户(组)

用于配置运行Nginx 服务器用户(组)的指令是user,其语法格式为:

user user [group];

user,指定可以运行Nginx服务器的用户。
group,可选项,指定可以运行Nginx 服务器的用户组。

只有被设置的用户或用户组成员才有权限启动Nginx 进程。
  如果希望所有用户都可以启动Nginx 进程,有两种办法:一是将此指令行注释掉:

#user [user] [group];

或者将用户(和用户组)设置为nobody:

user nobody nobody;

这也是 user指令的默认配置。user 指令只能在全局块中配置。
  注意:在 Nginx 配置文件中,每一条指令都必须以分号结束,请不要忘记。

4.3 配置允许生成的worker process数

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

worker_processes number | auto;

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

在默认的配置文件中,number=1。启动Nginx服务器以后,使用以下命令可以看到Nginx服务器除了主进程master process ../sbin/nginx 之外,还生成了一个worker process:

[root@k-master sbin]# ps aux|grep nginx
root      5875  0.0  0.0  24812   760 ?        Ss   09:54   0:00 nginx: master process ./nginx
nobody    5876  0.0  0.1  25236  1212 ?        S    09:54   0:00 nginx: worker process
root      5878  0.0  0.0 112680   972 pts/1    R+   09:54   0:00 grep --color=auto nginx

如果将 number 改为3,重新运行Nginx 进程,再次使用以上命令,则可以看到此时的Nginx 服务器除了主进程之外,已经生成了3个worker process。此指令只能在全局块中设置。

4.4 配置Nginx进程PID存放路径

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

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

配置文件默认将此文件存放在Nginx 安装目录 logs下,名字为nginx.pid。path 可以是绝对路径也可以是以 Nginx安装目录为根目录的相对路径。比如要把 Nginx.pid放置到Nginx 安装目录sbin 下,文件名为web_nginx,则可以使用以下配置:

pid sbin/web_nginx

此指令只能在全局块中进行配置。

4.5 配置错误日志的存放路径

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

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

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

error_log logs/error.log error;

4.6 配置文件的引入

Nginx 提供了include指令来完成配置文件的引入,其语法结构为:

include file;

其中,file是要引入的配置文件,它支持相对路径。
  此指令可以放在配置文件的任意地方。

4.7 设置网络连接的序列化

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

accept_mutex on | off;

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

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

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

multi_accept on | off

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

4.9 事件驱动模型的选择

Nginx服务器提供了多种事件驱动模型来处理网络消息。指令为 use,语法结构为:

use method;

其中,method可选择的内容有:select、poll、kqueue、epoll、rtsig、/dev/poll以及eventport。
  此指令只能在events块中进行配置。

4.10 配置最大连接数

指令worker_connections主要用来设置允许每一个worker process同时开启的最大连接数。其语法结构为:

worker_connections number;

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

4.11 定义MIME-Type

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

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

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

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/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    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.ms-excel              xls;
    application/vnd.ms-fontobject         eot;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    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;

    application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;

    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类型,其语法结构为:

default_type mime-type;

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

4.12 自定义服务日志

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

access_log path [format [buffer=size]];

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

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

access_log logs/access.log combined;

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

access_log off;

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

log_format name string ...;

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

示例:

log_format exampleLog '$remote_addr - [$time_local] $request ' '$status $body_bytes_sent $http_referer ' '$http_user_agent';

此指令只能在 http 块中进行配置。

4.13 配置允许sendfile 方式传输文件

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

sendfile on | off;

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

sendfile_max_chunk size;

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

sendfile_max_chunk 128k;

4.14 配置连接超时时间

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

keepalive_timeout timeout [header_timeout];

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

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

keepalive_timeout 120s 100s;

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

4.15 单连接请求数上限

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

keepalive_requests number;

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

4.16 配置网络监听

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

  • 第一种配置监听的IP 地址,语法结构为:
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];
  • 第二种配置监听端口,其语法结构为:
listen port [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [ssl];
  • 第三种配置UNIX Domain Socket,其语法结构为:
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 指令的使用看起来比较复杂,但其实在一般的使用过程中,相对来说比较简单,默认的设置为:

listen *:80 | *:8000

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

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网络连接同时处于挂起状态。

4.17 基于名称的虚拟主机配置

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

server_name name ...;

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

server_name myserver.com www.myserver.com;

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

4.18 基于 IP 的虚拟主机配置

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

...
http
{
    ...
    server
    {
        listen: 80;
        server_name: 192.168.1.31;
        ...
    }
    server
    {
        listen: 80;
        server_name: 192.168.1.32;
        ...
    }
    ...
}

4.19 配置 location 块

在Nginx的官方文档中定义的location的语法结构为:

location [ = | ~ | ~* | ^~ ] uri {...}

其中,uri 变量是待匹配的请求字符串,可以是不含正则表达式的字符串;也可以是包含有正则表达式的字符串。

4.20 配置请求的根目录

Web 服务器接受到网络请求后,首先要在服务器端指定目录中寻找请求资源。在 Nginx 服务器中,指令 root就是用来配置这个根目录的,其语法结构为:

root path;

其中,path 为Nginx 服务器接受到请求以后查找资源的根目录路径。
  此指令可以在http 块、server 块或者 location 块中配置。由于使用 Nginx服务器多数情况下要配置多个location 块对不同的请求分别做出处理,因此该指令通常在location块中进行设置。这个指令的一个示例为:

location /data/
{
    root /locationtest1;
}

当location 块接收到“/data/index.htm”的请求时,将在/locationtest1/data/目录下找到index.htm响应请求。

4.21 更改location的 URI

在location 块中,除了使用root 指令指明请求处理根目录,还可以使用alias指令改变location接收到的URI的请求路径,其语法结构为:

alias path;

其中,path即为修改后的根路径。

location ~ ^/data/(.+\.(htm|htm))$
{
    alias /locationtest1/other/$1;
}

当此location块接收到“/data/index.htm”的请求时,匹配成功,之后根据alias指令的配置,Nginx 服务器将到/locationtest1/other目录下找到index.htm并响应请求。可以看到,通过alias指令的配置,根路径已经从/data更改为/locationtest1/other了。

4.22 设置网站的默认首页

指令 index 用于设置网站的默认首页,它一般可以有两个作用:一是,用户在发出请求访问网站时,请求地址可以不写首页名称;二是,可以对一个请求,根据其请求内容而设置不同的首页。该指令的语法结构为:

index file ...;

其中,file 变量可以包括多个文件名,其间使用空格分隔,也可以包含其它变量。此变量默认为“index.html”。
  看一个示例:

location ~ ^/data/(.+)/web/ $
{
    index index.$1.html index.my1.html index.html;
}

当 location 块接受到“/data/locationtest/web/”时,匹配成功,它首先将欲置变量$1置为“locationtest”,然后在/data/locationtest/web/路径下按照index 的配置次序依次寻找index.locationtest.html页、index.my1.html页和index.html页,首先找到哪个页面,就使用哪个页面响应请求。

4.23 设置网站的错误页面

Nginx 服务器设置网站错误页面的指令为error_page,语法结构为:

error_page code ... [=[response]] uri

code,要处理的HTTP 错误代码。
response,可选项,将 code 指定的错误代码转化为新的错误代码response。
uri,错误页面的路径或者网站地址。如果设置为路径,则是以Nginx服务器安装路径下的html目录为根路径的相对路径;如果设置为网址,则 Nginx 服务器会直接访问该网址获取错误页面,并返回给用户端。

看几个error_page指令的示例:

error_page 404 /404.html;

设置 Nginx服务器使用“Nginx安装路径/html/404.html”页面响应404错误。再如:

error_page 403 http://somewebsite.com/forbidden.html;

设置Nginx 服务器使用http://somewebsite.com/forbidden.html页面响应403错误。再如:

error_page 410 = 301 /empth.gif

设置Nginx 服务器产生410的 HTTP消息时,使用“Nginx 安装路径/html/empty.gif”返回给用户端301消息。
  将错误页面放到自定义路劲下,比如,我们希望Nginx 服务器使用“/myserver/errorpage/404.html”页面响应404错误,那么在设置完:

error_page 404 /404.html

之后,我们再添加这样一个 location 块:

location /404.html
{
    root /myserver/errorpages/
}

首先捕获“/404.html”请求,然后将请求定向到新的路径下面即可。
  error_page 指令可以在http 块、server 块和 location 块中配置。

4.24 基于 IP 配置 Nginx 的访问权限

allow 指令,用于设置允许Nginx的客户端 IP,语法结构为:

allow address | CIDR | all;

address,允许访问的客户端的 IP,不支持同时设置多个。如果有多个 IP需要设置,需要重复使用allow 指令。
CIDR,允许访问的客户端的 CIDR 地址,例如202.80.18.23/25,前面是32位IP 地址,后面“/25”代表该 IP地址前25位是网络部分,其余位代表主机部分。
all,代表允许所有客户端访问。

另一个指令是deny,作业刚好和 allow指令相反。示例:

location / {
    deny 192.168.1.1;
    allow 192.168.1.0/24;
    deny all;
}

如果遇到匹配的配置时,则停止继续向下搜索相关配置。因此,当192.168.1.0/24客户端访问时,Nginx 在第三行解析配置发现允许客户端访问,就不会向下解析第4行了。

4.25 基于密码配置Nginx 的访问权限

auth_basic 指令,用于开启或者关闭该认证功能,语法结构为:

auth_basic string | off;

string,开启该认证功能,并配置认证时的指示信息。
off,关闭该认证功能。

auth_basic_file 指令,用于设置包含用户名和密码信息的文件路径,语法结构为:

auth_basic_user_file file;

其中,file 为密码文件的绝对路径。

五、Nginx 服务器基础配置实例

nginx.conf文件示例的完整内容:


#### 全局块 开始 ####
# 配置允许运行Nginx服务器的用户和用户组
user  nobody  nobody;
# 配置允许 Nginx 进程生成的 worker process 数
worker_processes  3;
# 配置Nginx服务器运行的错误日志存放路径
error_log  logs/error.log;
# 配置 Nginx 服务器运行时的 pid文件存放路径和名称
pid  logs/nginx.pid;
#### 全局块 结束 ####

#### events 块 开始 ####
events {
    # 配置事件驱动模型
    use epoll;
    # 配置最大连接数
    worker_connections  1024;
}
#### events 块 结束 ####

#### http 块 开始 ####
http {
    # 定义 MIME-Type
    include       mime.types;
    default_type  application/octet-stream;
    # 配置允许使用sendfile方式传输
    sendfile        on;
    # 配置连接超时时间
    keepalive_timeout  65;
    # 配置请求处理日志的格式
    log_format  access.log  '$remote_addr-[$time_local]-"$request"-"$http_user_agent"';

    #### sever 块 开始 ####
    # 配置虚拟主机 myServer1
    server {
        # 配置监听端口和主机名称(基于名称)
        listen       8081;
        server_name  myServer1;
        # 配置请求处理日志存放路径
        access_log  /myweb/server1/log/access.log;
        # 配置错误页面
        error_page  404              /404.html;
        # 配置处理/server1/location1请求的 location
        location /server1/location1 {
            root   /myweb;
            index  index.svr1-loc1.htm;
        }

        # 配置处理/server1/location2请求的 location
        location /server1/location2 {
            root  /myweb;
            index  index.svr1-loc2.htm;
        }
    }


    # 配置虚拟主机 myServer2
    server {
        # 配置监听端口和主机名称(基于名称)
        listen       8082;
        server_name  192.168.1.3;
        # 配置请求处理日志存放路径
        access_log  /myweb/server2/log/access.log;
        # 配置错误页面,对错误页面 404.html做了定向配置
        error_page  404              /404.html;
        # 配置处理/server2/location1请求的 location
        location /server2/location1 {
            root   /myweb;
            index  index.svr2-loc1.htm;
        }

        # 配置处理/svr2/loc2请求的 location
        location /svr2/loc2 {
            # 对 location的 URI进行更改
            alias  /myweb/server2/location2;
            index  index.svr2-loc2.htm;
        }

        # 配置错误页面转向
        location = /404.html {
            root  /myweb/;
            index  404.html;
        }
    }
    #### sever 块 结束 ####
}
#### http 块 结束 ####

在该示例中,我们配置了两个虚拟主机myServer1和myServer2,前者是基于名称的,后者是基于 IP 的。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 84,423评论 14 122
  • 配置运行Nginx服务器用户(组) 用于配置运行Nginx服务器用户(组)的指令是user,其语法格式为: use...
    吃瓜的东阅读 2,862评论 0 37
  • Rewrite功能是大多数Web服务器支持的一项功能,其在提供重定向服务时起到的主要作用。Nginx服务器的Rew...
    吃瓜的东阅读 1,252评论 0 3
  • pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 ...
    王震阳阅读 89,011评论 26 538
  • 你紧紧攥着拳头 死死的把自己捆绑在安全的地带。 他们来看你了 你害怕的卷曲着身体, 心里开始呐喊不要靠近我,嘴巴却...
    许之欢喜阅读 27评论 1 1