本文所介绍的环境是:
操作系统:CenOS-7-x86_64
环境:虚拟机
Nginx 版本:1.6.3
一、Nginx服务器安装文件的获取
1.1 获取新版本的 Nginx 服务器
Nginx 的官方下载地址为:http://nginx.org/en/download.html。打开后如下图所示:
网页上提供了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.com或www.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 的。