近几年来,Nginx逐步进入高速发展的时期,从各类主流的IT媒体到各大著名的IT论坛,我们不时能够看到它的身影。
经过逐步的改进,Nginx已成为一款高性能、功能完善、性能稳定的服务器产品。
Nginx服务器以其功能丰富著称于世。
它既可以作为http服务器
,也可以作为反向代理服务器
;能够快速响应静态页面(HTML)的请求;支持FastCGI、SSL、Virtual Host、URL Rewirte、HTTP Basic Auth、Gzip等大量功能;并且支持第三方
模块扩展。
在这篇博客中,我们主要对 Nginx
提供的 HTTP
服务来讲解。
Nginx
提供基本的HTTP
服务,可以作为HTTP
代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持包过滤功能,支持SSL等。
上图是Nginx
的整体架构图,下面我们就围绕着这张图,来讲解Nginx
关于Nginx
的安装,有两种方法,一种是编译安装,另一种则是使用官方提供的yum仓库进行安装。
为了更深入的了解Nginx
,我们当然是选择编译安装了。不过在安装完成之后,我们还是会使用yum安装的Nginx
来演示和讲解各种功能。
下载源码包并解压
1、到Nginx
的官方站点下载源码包:下载地址
2、拷贝到我们的虚拟机上并解压缩:
|
|
编译安装Nginx
1、安装编译安装所需的开发组包:
|
|
2、开始生成Makefile文件:
|
|
选项 | 说明 |
---|---|
—-prefix=PATH | 指定Nginx软件的安装路径。此项如果未指定,默认为/usr/local/nginx/目录 |
—-conf-path=PATH | 在未给定 -c 选项下,指定默认的 nginx.conf 路径。如果未指定,默认为 prefix/conf/ |
—-error-log-path=PATH | 在nginx.conf中未指定error_log指令的情况下,指定默认的错误日志路径。如果未指定,默认为 prefix/logs/error.log |
—-http-log-path=PATH | 在nginx.conf中未指定access_log指令的情况下,指定默认的错误日志路径。如果未指定,默认为 prefix/logs/access.log |
—-pid-path=PATH | 在nginx.conf中未指定pid指令的情况下,指定默认的 nginx.pid路径。nginx.pid保存了当前运行的Nginx服务的进程号 |
—-lock-path=PATH | 指定nginx.lock文件的路径。nginx.lock是Nginx服务器的锁文件。如果未指定,默认为/var/lock目录 |
-—user=USER | 在nginx.conf中未指定user指令的情况下,指定默认的Nginx服务器进程的属主用户,即Nginx进程运行的用户。如果未指定,默认为nobody。 |
—-group=GROUP | 在nginx.conf中未指定group指令的情况下,指定默认的Nginx服务器进程的属主用户组,即Nginx进程运行的用户组。如果未指定,默认为nobody |
—-with-http_ssl_module | 声明启用HTTP的ssl模块,这样Nginx服务器就可以支持HTTPS请求了。这个模块的正常运行需要安装 openssl库 |
—-with-http_v2_module | 声明启用HTTPv2版本模块。 |
—-with-http_dav_module | 声明启用HTTP的dav模块。默认不启用 |
—-with-http_stub_status_module | 声明启用Server Status页。默认不启用 |
—-with-threads | 声明启用线程池(1.7版本以上) |
—-with-file-aio | 声明启用异步IO(0.8版本以上) |
更多编译选项点击这里
3、开始编译并安装
|
|
安装完成之后,让我们看一看Nginx
生成了哪些配置文件
|
|
其中nginx.conf
是主配置文件,conf.d/
目录下是其他配置文件
主配置文件介绍
让我们使用vim
命令查看一下主配置文件:
|
|
看了上面的图,想必不用我多解释了,各个配置段的内容以及生效范围,已经画出来了。
下面我们就对上面的各个配置段进行详细的介绍
全局块[Main]
全局块是默认配置文件从开始到events
块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置命令,因此,这些指令的作用域是Nginx服务器全局。
Main配置段常见的配置指令:
通过查看官方帮助文档中的 Core Functionnality 即可获得详细帮助
正常运行必备的配置如下
1、user/group:用于配置运行Nginx
服务器用户(组)的指令是user
2、pid:指定存储Nginx
主进程进程号码的文件路径
|
|
3、include file | mask:指定包含进来的其他配置文件片段
4、load_module file:指明要装载的动态模块
5、sendfile on | off:直接在内核中发送响应报文,不经由用户空间
6、keepalive_timeout NUM:是否开启长连接模式,0为关闭
7、include /PATH/TO/SOME/DIR:包含哪些配置文件的目录
8、server_name:虚拟主机名;
|
|
性能优化相关的配置:
1、worker_processes number | auto;
|
|
2、worker_cpu_affinity auto [cpumask];
|
|
3、worker_priority number;
|
|
4、worker_rlimit_nofile number;
|
|
测试、定位选项配置
1、daemon on|off; (在CentOS6上要开启)
|
|
2、master_process on|off; (调试使用,输出错误信息到屏幕)
|
|
3、error_log file [level]; 错误日志级别
事件驱动[events]
1、worker_connections number;
|
|
2、use method;
|
|
3、accept_mutex on | off; (互斥锁)
|
|
与套接字相关的配置
1、server { … }:配置一个虚拟主机
|
|
2、listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
|
|
3、server_name name …;
|
|
配置文件如下:
|
|
4、tcp_nodelay on | off;
|
|
5、tcp_nopush on | off;
|
|
6、sendfile on | off;(默认开启on)
|
|
定义路径相关的配置
1、root path; (适用以下上下文 : http、server、location、if in location)
|
|
2、location [ = | ~ | ~* | ^~ ] uri { … }
|
|
3、alias path;
|
|
4、index file …;
|
|
5、error_page code … [=[response]] uri;
|
|
实例:
|
|
打开网页进行测试:
定义客户端请求相关的配置
1、keepalive_timeout timeout [header_timeout];(时间维度)
|
|
2、keepalive_requests number;(数量维度)
|
|
3、keepalive_disable none | browser …;
|
|
4、send_timeout time;
|
|
5、client_body_buffer_size size;
|
|
6、client_body_temp_path path [level1 [level2 [level3]]];
|
|
注意:启用此项会影响性能
实例:
|
|
对客户端进行限制的相关配置
1、limit_rate rate; (一般不开启)
|
|
2、limit_except method … { … }
|
|
实例:
|
|
|
|
文件操作优化的相关配置
1、aio on | off | threads[=pool]; (一般都要启用)
|
|
2、directio size | off;
|
|
3、open_file_cache off; | open_file_cache max=N [inactive=time];
|
|
4、open_file_cache_valid time;
|
|
5、open_file_cache_min_uses number;
|
|
6、open_file_cache_errors on | off;
|
|
实例:
|
|
其他配置
1、实现基于用户的访问控制,使用basic机制进行用户认证
auth_basic string | off;
auth_basic_user_file file;
|
|
2、使用ngx_http_stub_status_module模块输出nginx的基本状态信息
|
|
其中的各个信息的详细解释:
Active connections | 活动状态的连接数 |
---|---|
accepts | 已经接受的客户端请求的总 |
handled | 已经处理完成的客户端请求的总数 |
requests | 客户端发来的总的请求数 |
Reading | 处于读取客户端请求报文首部的连接的连接数 |
Writing | 处于向客户端发送响应报文过程中的连接数 |
Waiting | 处于等待客户端发出请求的空闲连接数 |
3、使用ngx_http_log_module模块自定义Nginx
日志
- log_format name string …; 只能定义在http段中,不能在server段中配置
|
|
日志格式变量:
变量 | 意义 |
---|---|
$remote | 记录客户端的IP地址 |
$remote_user | 记录客户端用户名 |
$request | 记录请求的URL和HTTP协议 |
$status | 记录请求状态 |
$body_bytes_sent | 发送给客户端的字节数,不包括响应头的大小 |
$connection | 连接的序列号 |
$connection_requests | 当前通过一个连接获得的请求数量 |
$msec | 日志写入时间。单位为秒,精度是毫秒 |
$pipe | 如果请求是通过HTTP流水线(pipelined)发送,pipe值为”p”,否则为”.” |
$http_referer | 记录从哪个页面链接访问过来的 |
$http_user_agent | 记录客户端浏览器相关信息 |
$request_length | 请求的长度(包括请求行,头部、正文) |
$request_time | 请求处理时间,单位为秒,精度毫秒 |
$time_iso8601 | ISO8601标准格式下的本地时间 |
$time_local | 通用格式下的本地时间 |
- access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
|
|
使用Nginx
日志格式变量定义类似于httpd的combined格式的访问日志:
|
|
- open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
|
|
实例:
|
|
gzip相关的配置
如果要查看Nginx
支持的压缩格式有哪些:
|
|
1、gzip on | off; 是否开启gzip压缩功能
2、gzip_comp_level LEVEL; 压缩比
|
|
3、gzip_disable regex …;
|
|
以下是常见的PC以及手机浏览器的UA字符串
|
|
4、gzip_min_length LENGTH;
|
|
5、gzip_buffers NUMBER SIZE;
|
|
6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any …;
|
|
各参数详解:
指令 | 意义 |
---|---|
off | 关闭Nginx服务器对后端服务器返回结果的Gzip压缩(默认设置) |
expired | 当后端服务器相应页头部包含用于指示响应数据过期时间的expired 头域时,启用对响应数据的Gzip压缩 |
no-cache | 当后端…….包含用于通知所有缓存机制是否缓存的Cache-Control头域、且指令值为no-cache时,启用对响应数据的Gzip压缩 |
no-store | 当后端…….包含用于通知所有缓存机制是否缓存的Cache-Control头域、且指令值为no-store时,启用对响应数据的Gzip压缩 |
private | 当后端…….包含用于通知所有缓存机制是否缓存的Cache-Control头域、且指令值为private时,启用对响应数据的Gzip压缩 |
no_last_modified | 当后端服务器响应页头部不包含用于指明需要获取数据最后修改时间的Last-Modified头域时,启用对响应数据的Gzip压缩 |
no_etag | 当后端服务器响应页头部不包含用于标示被请求变量的实体值得ETag头域时,启用对响应数据的Gzip压缩 |
auth | 当后端服务器响应页头部包含用于标示HTTP授权证书的Authorization头域时,启用对响应数据的Gzip压缩 |
any | 无条件启用对后端服务器响应数据的Gzip压缩 |
7、gzip_types mime-type …;
|
|
8、gzip_vary on | off;
|
|
注意:该指令在使用过程中存在bug,会导致IE4及以上浏览器的数据缓存功能失效。
实例:
|
|
HTTP + SSL 相关的配置
HTTPS建立连接的过程:
|
|
1、ssl on | off;
|
|
2、ssl_certificate file;
|
|
3、ssl_certificate file;
|
|
4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
|
|
5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
|
|
6、ssl_session_timeout time;
|
|
7、ssl_ciphers;
|
|
默认我们使用如下配置即可:
|
|
在Nginx上配置一个https
1、自建CA
|
|
2、生成ssl签署请求,并让CA签署
|
|
3、编辑虚拟主机配置文件:使其开启 SSL功能
|
|
4、将CA公钥拷贝至客户端,并导入浏览器,测试
|
|
配置文件:
|
|
Nginx中关于Rewirte功能非常多,这里我们只介绍其中的rewrite指令
、return指令
、if (conndition){...}指令
rewirte指令
该指令通过正则表达式的使用来改变URL。可以同时存在一个或者多个指令。按照顺序依次对URL进行匹配和处理。
提示:URL和URI的区别和联系
|
|
指令的语法结构:
|
|
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI;
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,因此,隐含有循环机制;[flag]所表示的标志位用于控制此循环机制;
1、regex:用于匹配URI的正则表达式,使用括号”( )”标记要截取的内容
2、replacement:匹配成功后用于替换URI中被截取内容的字符。默认情况下,如果该字符是由http://
或者https://
开头的,则不会继续向下对URI进行其他处理,而直接将重写后的URI返回给客户端。
3、flag:用来设置rewrite对URI的处理行为,可以为以下标志中的一个:
|
|
实例1:
如果要实现全站https则使用如下配置:
|
|
实例2:
只要访问本站的任何.jpg文件
都重写至.png文件
|
|
return指令
该指令用于完成对请求的处理,直接向客户端返回响应状态代码。处于该指令后
的所有Nginx配合都是无效的
。
该指令可以在server块和location块以及if块中使用
语法结构如下:
|
|
1、code:为返回给客户端的HTTP状态代码。可以返回的状态代码为0 ~ 999
的任意HTTP状态代码。非标准的444代码可以强制关闭服务器与客户端的连接而不返回任何响应信息给客户端。
2、text:为返回给客户端的响应体内容,支持变量的使用
3、URL:为返回给客户端的URL地址
其中当code
使用 301(表示被请求资源永久移动到新的位置), 302(表示请求的资源限制临时从不同的URL响应,要求使用GET方式请求)。
实例
|
|
if (conndition) 指令
该指令用来支持条件判断,并根据条件判断结果选择不同的Nginx配置,可以在server块或者location块中配置该指令。
语法格式:
|
|
其中花括号代表一个作用域,形成一个if
配置块,是条件为真时的Nginx配置。
condition
:为判断条件(true/false),它可以支持以下几种设置方法:
变量名
|
|
比较操作符
使用比较操作符,比较变量和字符串是否相等;相等时if
条件为true;反之为false
|
|
例子:
如果请求方法是POST,返回405代码
|
|
如果用户agent内包含curl字符串,返回404代码
|
|
##### 文件及目录存在性判断
各判断符详解
| -f | 如果请求的文件存在,if指令认为条件为true;反之,为false |
| — | — |
| !-f | 如果请求的文件不存在,但是文件所在的目录存在,if指令认为条件为true;如果两者都不存在,或者请求的文件存在,则为false |
| -e | 如果请求的目录或者文件存在时,if指令认为条件为true,否则为false |
| !-e | 如果请求的文件和该文件所在路径上的目录都不存在,为true,否则为false |
| -d | 如果请求的目录存在,if指令认为条件为true;反之,为false |
| !-d | 如果请求的目录不存在,但该目录的上级目录存在,if指令认为条件为true;如果该目录和他的上级目录都不存在,或者请求的目录存在,则为false; |
| -x | 如果请求的文件可执行,if指令认为条件为true,否则为false |
| !-x | 如果请求的文件不可执行,为true;反之,为false |
实例
如果请求的文件不存在,则返回404响应码
|
|
referer模块
该模块经常被我们用来做网站的防盗链
,是很有效的。
语法格式
|
|
各个参数详解:
|
|
实例:
|
|
以上所有配置完成后的配置文件
代码版
|
|
资源路径:
|
|
图片详解版
图片可能分辨率过大,为了您的用户体验:请右键在新标签页中打开,或者下载之后查看编译选项
选项 | 说明 |
---|---|
–sbin-path=path | 设置nginx的可执行文件的路径,默认为 prefix/sbin/nginx. |
–with-select_module | 启用一个模块来允许服务器使用select()方法 |
–without-select_module | 禁用一个模块来允许服务器使用select()方法 |
–with-poll_module | 启用一个模块来允许服务器使用poll()方法 |
–without-poll_module | 禁用一个模块来允许服务器使用poll()方法 |
–without-http_gzip_module | 不编译压缩的HTTP服务器的响应模块。编译并运行此模块需要zlib库。 |
–without-http_rewrite_module | 不编译重写模块。编译并运行此模块需要PCRE库支持。 |
–without-http_proxy_module | 不编译http_proxy模块。 |
–with-pcre=path | 设置PCRE库的源码路径。 |
–with-cc-opt=parameters | 设置额外的参数将被添加到CFLAGS变量 |
–with-ld-opt=parameters | 设置附加的参数,将用于在链接期间 |
–with-http_sub_module | 启用sub模块。支持URL重定向功能 |
–with-http_memcached_module | 启用memcache缓存 |
本文出自Maxie’s Notes博客,转载请务必保留此出处。