一、nginx 介绍
1.1 特性:
模块化设计,较好的扩展性
高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗:10000 个keep-alive 连接模式下的非活动连接,仅需要2.5M 内存
event-driven,aio,mmap,sendfile
基本功能:
静态资源的web 服务器
http 协议反向代理服务器,负载均衡
pop3/imap4 协议反向代理服务器
FastCGI(lnmp),uWSGI(python) 等协议
模块化(非DSO ),如zip ,SSL模块
web 服务相关的功能:
虚拟主机(server)
支持 keep-alive 和管道连接
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP 及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached 的GET 接口
1.2 nginx 架构
nginx 的程序架构:master/worker 结构
一个master 进程:
负载加载和分析配置文件、管理worker 进程、平滑升级
一个或多个worker 进程
处理并响应用户请求
缓存相关的进程:
cache loader :载入缓存对象
cache manager:管理缓存对象
1.3 nginx 高度模块化
但其模块早期不支持DSO 机制;1.9.11版本支持动态装载和卸载
模块分类:
核心模块:core module
标准模块:
• HTTP : 模块: ngx_http_*
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定
• Mail 模块 ngx_mail_*
• Stream 块 模块 ngx_stream_*
第三方模块
1.4 nginx 的功用
静态的web 资源服务器
html,图片,js ,css ,txt 等静态资源
结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求:
http/https 协议的反向代理
imap4/pop3 协议的反向代理
tcp/udp 协议的请求转发(反向代理)
二、nginx 目录结构和命令
2.1 nginx 命令
ls /usr/local/nginx/
html 是测试页,sbin 是主程序 ls/usr/local/nginx/sbin/
nginx 只有一个程序文件 ls/usr/local/nginx/html/
50x.html index.html 测试网页
Nginx:
默认为启动nginx
-h 查看帮助选项
-V 查看版本和配置选项
-t 测试nginx语法错误
-c filename 指定配置文件(default:/etc/nginx/nginx.conf)
-s signal 发送信号给master 进程,signal 可为:
stop, quit,reopen, reload 示例:-s stop 停止nginx -s
reload 加载配置文件
注意:不要和systemctl 混合使用
-g directives 在命令行中指明全局指令
2.2 配置文件的组成部分:
主配置文件:nginx.conf
子配置文件:include conf.d/*.conf
fastcgi,uwsgi ,scgi 等协议相关的配置文件
mime.types :支持的mime 类型
主配置文件的配置指令:
directive value [value2 ...];
注意:
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx 模块引入,可直接引用
自定义变量:由用户使用set 命令定义
set variable_name value;
引用变量:$variable_name
三、nginx 主配置文件的介绍和设置
3.1 Main 全局配置段常见的配置指令分类
3.1.1 介绍
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
3.1.2 一些设置
3.2 http 协议段的相关配置
格式介绍
3.3 与套接字相关的配置
1)server 配置虚拟主机
2)listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number]
[rcvbuf=size] [sndbuf=size]
default_server 设定为默认虚拟主机
ssl 限制仅能够通过ssl 连接提供服务
backlog=number 超过并发连接数后,新请求进入后援队列的长度
rcvbuf=size 接收缓冲区大小
sndbuf=size 发送缓冲区大小
注意:
(1)基于port:
listen PORT; 指令监听在不同的端口
(2)基于ip 的虚拟主机:
listen IP:PORT; IP 地址不同
(3)基于hostname:
server_name fqdn; 指令指向不同的主机名
3) server_name name ...;
虚拟主机的主机名称后可跟多个由空白字符分隔的字符串
支持* 通配任意长度的任意字符
server_name .magedu.com www.magedu.
支持~ 起始的字符做正则表达式模式匹配,性能原因慎用
server_name ~^www\d+.magedu.com$
\d 表示 [0-9]
匹配优先级机制从高到低:
(1)首先是字符串精确匹配 如:www.magedu.com
(2)左侧 通配符 如:.magedu.com
(3)右侧 通配符 如:www.magedu.
(4)正则表达式 如: ~^.*.magedu.com$ ,因为消耗cpu运算
(5)default_server
4)tcp_nodelay on | off;
在长连接的情况下,是否延迟
在keepalived 模式下的连接是否启用TCP_NODELAY 选项
当为off 时,延迟发送,合并多个请求后再发送
默认On 时,不延迟发送
可用于:http, server, location
5)sendfile on | off;
是否启用sendfile功能,在内核中封装报文直接发送,默认Off
6)server_tokens on | off | build | string
是否在响应报文的Server 首部显示nginx版本
3.4 定义路径相关的配置
7)root
设置web 资源的路径映射;用于指明请求的URL 所对应的文档的主目录路径。
示例:
注意:root 不仅可以用在server段,还可用于http、server、location、if in locatin
8)location [ = | ~ | ~* | ^~ ] uri { ... }
主要控制URL路径
location @name { … }
在一个server 中location 配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix 会根据用户请求的URI 来检查定义的所有location ,并找出一个最佳匹配,而后应用其配置
示例:
(1)
http://www.magedu.com/images/logo.jpg –> /data/imgs/images/logo.jpg
(2) = :对URI 做精确匹配;
http://www.magedu.com/index.html 不匹配
(3) 正则符号的作用
^~ :对URI 的最左边部分做匹配检查,不区分字符大 小写
~ :对URI 做正则表达式模式匹配,区分字符大小写
~* :对URI 做正则表达式模式匹配,不区分字符大小写
不带符号:匹配起始于此uri 的所有的uri
(4) 匹配优先级从高到低:
=, ^~, ~/ ~*, 不带符号
9)alias path;
路径别名,文档映射的另一种机制;仅能用于location 上下文
示例:
注意:location 中使用root 指令和alias 指令的意义不同
(a) root ,给定的路径对应于location 中的/uri/左 侧的/
(b) alias ,给定的路径对应于location 中的/uri/右 侧的/,完全置换
(10)index file ... ;
指定默认网页资源,注意:ngx_http_index_module
模块
例:
(11)error_page code ... [=[response]] uri;
错误页面
基于ngx_http_core_module
模块。
定义错误页, 以指定的响应状态码进行响应
可用位置:http, server,location, if in location
(12)try_files file ... uri ;
try_files file ... =code ;
按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI 的指向。最后一个参数是回退URI 且必须存在,否则会出现内部500 错误
3.5 定义客户端请求的相关配置
(13)keepalive_timeout timeout [header_timeout];
设定保持长连接超时时长,0 表示禁止长连接,默认为75s
(14)keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100
(15)keepalive_disable none | browser …
略,没有那么老版本的浏览器对哪种浏览器禁用长连接
(16)send_timeout time;
向客户端发送响应报文的超时时长,此处是指两次写操作之间的间隔时长,而非整个响应过程的传输时长
(17)client_body_buffer_size size; 缓存,hash值,取32位的后1位,2位,2位做几级目录
用于接收每个客户端请求报文、上传的body 部分的缓冲区大小;默认为16k ;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置
(18)client_body_temp_path path
[level1 [level2 [level3]]];
设定用于存储客户端请求报文的body 部分的临时存储路径及子目录结构和数量
目录名为16 进制的数字;
1级目录占1 位16进制,即2^4=16个目录 0-f
2级目录占2 位16进制,即2^8=256个目录 00-ff
3级目录占2 位16进制,即2^8=256个目录 00-ff
3.6 对客户端进行限制的相关配置
(19)limit_rate rate; 限速
限制响应给客户端的传输速率,单位是bytes/second,默认值0表示不限速
(20)limit_except method … { … } ,仅用于location,限制客户端使用除了指定的请求方法之外的其它方法
method
:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH
上述代码的意思是:除了GET 和HEAD 之外的其它方法,仅允许192.168.1.0/24网段主机
3.7文件操作优化的配置
(21)aio on | off | threads[=pool]; 是否启用aio 异步io功能,异步写磁盘
(22)directio size | off; 是否同步(直接)写磁盘,而非写缓存,在Linux 主机启用O_DIRECT标记, 则文件大于等于给定大小时使用,例如directio 4m
(23)open_file_cache off;
nginx 可以缓存以下三种信息:(缓存详细介绍见我的下一篇博客
Nginx实现负载均衡&Nginx缓存功能)
① 文件元数据:文件的描述符、文件大小和最近一次的修改时间
② 打开的目录结构
③ 没有找到的或者没有权限访问的文件的相关信息
max=N:可缓存的缓存项上限;达到上限后会使用LRU (最近最少使用)算法实现管理
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_uses 指令所指定的次数的缓存项,即为非活动项,将被删除
(24)open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息 ,默认值为off
(25)open_file_cache_min_uses number;
open_file_cache 指令的inactive 参数指定的时长内,至少被命中此处指定的次数方可被归类为活动项,默认值为1
(26)open_file_cache_valid time;
缓存项有效性的检查频率,默认值为 为60s
四、nginx重要配置
4.1 权限控制
实现权限控制的是ngx_http_access_module
模块,他是用来实现基于ip
的访问控制功能:
设置语法如下:
这个设置在http
,server
,location
,limit_except
段都可以使用。
在读取的时候,是自上而下的检查,一旦匹配,就会生效,所以,我们在设置的时候,需要把条件严格的置前。
示例:
4.2 身份验证
nginx
中实现身份验证的模块是ngx_http_auth_basic_module
,这个模块是用来实现基于用户的访问控制,使用basic
机制进行用户认证。
我们使用以下命令来控制该验证是否开启:
具体的设置语法如下:
下面我们来看看用户口令文件:
1)明文文本
格式为:
2)加密文本
由htpasswd
命令实现。该命令由httpd-tools
包提供。具体实现如下图:
我们来具体说一下选项的作用:
-c
创建新用户-m
使用基于md5的加密
4.3 状态信息页面
该页面是基于ngx_http_stub_status_module
模块实现的。用于输出nginx
的基本状态信息。
我们可以用浏览器来查看一下这个状态页面:
其中的“1 1 1”,这三个数字分别对应accepts,handled,requests 三个值。
上图中每一段的含义如下: Active connections
: 当前状态,活动状态的连接数 accepts
:统计总值,已经接受的客户端请求的总数 handled
:统计总值,已经处理完成的客户端请求的总数 requests
:统计总值,客户端发来的总的请求数 Reading
:当前状态,正在读取客户端请求报文首部的连接的连接数 Writing
:当前状态,正在向客户端发送响应报文过程中的连接数 Waiting
:当前状态,正在等待客户端发出请求的空闲连接数
4.4 日志的设置
基于ngx_http_log_module
模块,该模块可以指定日志格式记录的请求:
log_format name string …;
用来定义日志的格式,其中,string
可以使用nginx核心模块及其他模块内嵌的变量。
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
用来调用日志。定义了访问日志文件的路径,格式及相关的缓冲的配置。其中:
buffer=size
缓存大小
flush=time
多长时间清除缓存
示例如下:
(略) open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
缓存个日志文件相关的元数据信息,其中: max
:缓存的最大文件描述符数量; min_uses
:在inactive指定的市场内访问大于等于此值,方可被当做活动项; inactive
:非活动时长; valid
:验证缓存中各个缓存项是否为活动项的时间间隔。
4.5 压缩
基于ngx_http_gzip_module
模块。使用gzip方法压缩相应数据,节约带宽,默认设置没有开启。
gzip on | off ;
启用或禁用gzip压缩
gzip_comp_level level ;
压缩比由低到高:1-9。默认为1。
gzip_disable regex … ;
匹配到客户端浏览器不执行压缩
gzip_min_length length ;
启用压缩功能的响应报文大小
gzip_http_version 1.0 | 1.1 ;
设定启用压缩功能时,协议的最小版本。默认为:1.1版本。
gzip_buffers number size ;
支持实现压缩功能时缓冲区数量及每个缓存区的大小。默认为324k或168k。
gzip_types mime-type … ;
指明仅对哪些类型的资源执行压缩操作;即压缩过滤器
默认包含有text/html,不用显示指定,否则会出错
查看nginx的mime类型:cat /etc/nginx/mime.types
gzip_vary on | off ;
如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”
gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any … ;
nginx:对于代理服务器请求的响应报文,在何种条件下启用压缩功能
off :对被代理的请求不启用压缩
expired,no-cache, no-store ,private :对代理服务器请求的响应报文首部Cache-Control 值任何一个,启用压缩功能
示例:
我们来测试一下压缩效果:
4.6 ssl 加密的实现
1)server中的选项:
ssl on | off ;
为指定虚拟机启用HTTPS protocol,建议用listen 指令代替
ssl_certificate file ;
当前虚拟主机使用PEM 格式的证书文件路径
ssl_certificate_key file ;
当前虚拟主机上与其证书匹配的私钥文件路径
ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] ;
支持ssl 协议版本,默认为后三个
ssl_session_cache off | none | [builtin[:size]] [shared:name:size] ;
builtin[:size]
:使用OpenSSL 内建缓存,为每worker 进程私有
[shared:name:size]
:在各worker 之间使用一个共享的缓存
ssl_session_timeout time;
客户端连接可以复用ssl session cache 中缓存的ssl 参数的有效时长,默认5m
示例:
下面的实验会讲到在nginx中实现ssl加密的具体步骤,有兴趣的走传送器。
4.7 地址重写
基于ngx_http_rewrite_module
模块。
The ngx_http_rewrite_module module is used to change request URI using PCRE regular expressions,return redirects, and conditionally select configurations.
将用户请求的URI 基于PCRE regex 所描述的模式进行检查,而后完成重定向替换
示例:
4.7.1 rewrite 用法
将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为replacement指定的新的URI。
其语法是:
注意:如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查。
隐含有循环机制,但不超过10次;如果超过,提示500响应码, [flag]
所表示的标志位用于控制此循环机制。
如果replacement是以http://或https://开头,则替换结果会直接以重向返回给客户端。
下面我们来说一说flag
的具体选项: [flag]
:
last
:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后对新的URI启动新一轮(从第一个开始)重写检查;提前重启新一轮循环。break
:重写完成后停止对当前URI在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用。redirect
:临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求;不能以http://或https://开头,使用相对路径,状态码: 302。permanent
:重写完成后以永久重定向方式直接返回重写后生成的新URI给客户端,由客户端重新发起请求,状态码:301。
由下图我们可以更清楚的看出跳转到的位置:
4.7.2 return用法
return的用法语法如下:
停止处理,并返回给客户端指定的响应码。
例:连续跳转,image永久重定向到img,img又跳到www.baidu.com
4.7.3 一些其他的用法
rewrite_log on | off ;
把跳转的信息写到日志中
是否开启重写日志, 发送至error_log (notice level)
set $variable value ;
用户自定义变量,注意:变量定义和调用都要以$ 开头
if (condition) { … }
引入新的上下文, 条件满足时,执行配置块中的配置指令;server, location。其中: condition
可以为以下内容:
比较操作符:
== 相同
!= 不同
~ :模式匹配,区分字符大小写
~* :模式匹配,不区分字符大小写
!~ :模式不匹配,区分字符大小写
!~* :模式不匹配,不区分字符大小写
文件及目录存在性判断:
-e, !-e 存在(包括文件,目录,软链接)
-f, !-f 文件
-d, !-d 目录
-x, !-x 执行
举例:
实验一:搭建lnmp及类小米等商业网站的实现
环境:关闭防火墙,selinux
1、安装包,开启服务
2、修改nginx的配置文件
我们将模板例子复制一份,去覆盖我们的配置文件,接着,对配置文件进行修改:
修改下面几类:
1)user nobody;
使用用户 error_log /var/log/nginx/error.log info;
错误日志
2)
3)
4)
5)
以上五段全部修改完成后,可以使用nginx -t
检查有没有语法错误,如果没有错误,就可以开启服务了:
我们重启服务,发现有warn(警告),这是因为我们的文件描述符最大值超出了系统的设置:
我们可以使用上述的命令来查看linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值
现在我们就可以再次重启服务了,就不会有问题了。
3、修改php-fpm的配置文件
然后我们就可以重启服务了:
4、运行mysql ,创建一会网页需要的库
5、把事先找好的小米网站传进来 rz
6、网页登录
1)用户:admin
密码:123456
2)参数设置:就是连接上自己的数据库
也可以在命令行连上自己的数据库:
3)把数据写到数据库中,恢复数据
7、实验成功,登录查看
后台登录,可以自己随便修改:http://192.168.30.107/admin
8、ab 可以压力测试
实验二:实现ssl 加密
1、 修改总配置文件
在/etc/nginx/nginx.conf中加一行:
2、修改子配置文件
3、创建自签名证书
由于我们之前设定了秘钥加密,这样接下来比较不方便。所以,我们把私钥解密: