第1章 nginx课程大纲
本章主要对Nginx web服务软件进行介绍,设计Nginx的基础,特性,配置部署,优化以及企业中的日常运维管理和应用,作为HTTP服务软件的后起之秀,Nginx与他的老大哥Apache相比有很多改进之处,比如,在性能上,Nginx占用的系统资源更少,能支持更多的并发连接(特别是静态小文件场景下)达到比更高的访问效率;在功能上,Nginx不但是一个优秀的web服务软件,还可以作为反向代理负载均衡及缓存服务使用;在安装配置上,Nginx更为方便,简单,灵活,可以说,Nginx是一个极具发展潜力的web服务软件。
1.1 Nginx简介
nginx(发音"engine x")是俄罗斯软件工程师Igor Sysoev开发的免费开源web服务器软件。nginx于2004年发布,聚焦于高性能,高并发和低内存消耗问题。并且具有多种web服务器功能特性:负载均衡,缓存,访问控制,带宽控制,以及高效整合各种应用的能力,这些特性使nginx很适合于现代网站架构。目前,nginx已经是互联网上第二流行的开源web服务器软件。
1.1.1 Nginx HTTP服务器的特殊及优点
¨ 支持高并发;能支持几万并发连接(特别是静态小文件环境)
¨ 资源消耗少;在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB
¨ 可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能这相当于专业的Haproxy软件或LVS的功能
¨ 具备Squid等专业缓存软件等的缓存功能
¨ 支持异步网络I/O事件模型epoll(linux 2.6+)
1.1.2 Nginx软件的主要企业功能应用
1) 作为web服务软件
Nginx是一个支持高性能,高并发的web服务软件它具有很优秀的特性,作为web服务器,与Apache相比,nginx能够支持更多的并发连接访问,但占用的资源却更少,效率更高,在功能上也强大了很多,几乎不逊色于Apache
2) 方向代理或负载均衡服务
在反向代理或负载均衡服务方面,Nginx可以作为web服务,php等动态服务及Memcached缓存的代理服务器,它具有类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件(最早开发这个产品的目的之一就是作为邮件代理服务)但是Nginx的代理功能还是相对简单了些,特别是不支持TCP的代理。
3) 前端业务数据缓存服务
在web缓存服务方面,nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能。
Nginx的这三大功能(web服务,反向代理或负载均衡服务,前端业务数据缓存服务)是国内使用Nginx的主要场景,特别是前两个。
1.2 为什么Nginx总性能比Apache高
Nginx使用最新的epoll(Linux 2.6内核)和Kqueue(freebsd)异步网络I/O模型,而Apache使用的是传统的select模型。目前linux下能够承受的高并发访问的Squid,Mencached软件采用的都是epoll模型,
处理大量连接的读写时,Apache所采用的select网络I/O模型比较低效。
1.3 目录
[[email protected] html]# tree /application/nginx 如果tree命令找不到需要 yum install -y 安装
/application/nginx
├── client_body_temp
├── conf 这是Nginx所配置文件的目录,及其重要
│?? ├── fastcgi.conf fastcgi相关参数的配置文件
│?? ├── fastcgi.conf.default fastcgi.conf的原始备份
│?? ├── fastcgi_params fastcgi的参数文件
│?? ├── fastcgi_params.default
│?? ├── koi-utf
│?? ├── koi-win
│?? ├── mime.types 媒体类型,前面的章节讲解过
│?? ├── mime.types.default
│?? ├── nginx.conf scgi相关参数文件,一般用不到
│?? ├── nginx.conf.default
│?? ├── scgi_params
│?? ├── scgi_params.default
│?? ├── uwsgi_params uwsgi相关参数文件,一般用不到
│?? ├── uwsgi_params.default
│?? └── win-utf
├── fastcgi_temp fastcgi临时数据目录
├── html 这是编译安装时Nginx的默认站点目录,前面以说明;类似Apache的默认站点htdocs目录,相关于网站根目录
│?? ├── 50x.html 错误页面优雅代替显示文件,例如,出现502错误时会调用 error_page 500 502 504 /50x.html
│?? ├── ao.png
│?? ├── asong.html
│?? ├── bing.png
│?? ├── haha.png
│?? ├── hehe.png
│?? ├── html.zip
│?? ├── index.html 默认的首页文件,在实际环境中,大家习惯用(不是必须)index.html index.php index.jsp来做网站的首页文件,首页文件名是在nginx.conf中实现定义好的
│?? ├── li.png
│?? ├── sha.png
│?? ├── songc.html
│?? └── wo.png
├── logs 这是Nginx默认的日志路径,包括错误日志及访问日志
│?? ├── access.log 这是Nginx的默认访问日志文件,使用tail -f access.log可以实现观看网站用户情况信息
│?? ├── error.log 这是Nginx的错误日志文件,如果Nginx出现启动故障问题,一定要看看这个错误日志
│?? └── nginx.pid Nginx的pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp 临时目录
├── sbin 这是Nginx命令的目录,如Nginx的启动命令nginx
│?? └── nginx Nginx的启动命令 nginx
├── scgi_temp 临时目录
└── uwsgi_temp 临时目录
9 directories, 31 files
[[email protected] html]#
1.4 下面介绍客户端排查的思路
第一步,在客户端上ping服务端IP,命令如下。
ping 10.0.0.7 排除物理线路问题影响
第二步,在客户端上telnet服务器端IP端口,命令如下;
telnet 10.0.0.7 80 排除防火墙等影响
第三步,在服务端使用wget命令检测,如下:
wget 10.0.0.7 (curl -I 10.0.0.7)
1.5 安装Nginx
1.5.1 第一步,检查并安装Nginx基础依赖包pcre pcre-devel
要想正确安装Nginx首先必须安装好 pcre-devel,openssl-devel包,因此先要检查这些Nginx基础依赖包是否安装,
[[email protected] html]# rpm -qa openssl* pcre* 星代表后缀,不管是啥都显示出来
openssl-1.0.1e-57.el6.x86_64
pcre-7.8-7.el6.x86_64
[[email protected] html]#
1.5.2 第二步安装openssl-devel
Nginx在使用HTTPS服务的时候要用到此模块,如果不安装openssl相关包,安装Nginx的过程中会报错,安装openssl-devel的命令及检查命令;
[[email protected] html]# yum install -y openssl-devel pcre-devel
[[email protected] html]# rpm -qa openssl* pcre*
openssl-1.0.1e-57.el6.x86_64
pcre-devel-7.8-7.el6.x86_64
pcre-7.8-7.el6.x86_64
openssl098e-0.9.8e-20.el6.centos.1.x86_64
openssl-devel-1.0.1e-57.el6.x86_64
[[email protected] html]#
1.5.3 开始安装Nginx
操作命令如下;
mkdir -p /home/oldboy/tools
cd /home/oldboy/tools
wget -q http://nginx.org/download/nginx-1.10.2.tar.gz
下载软件包,进入 http://nginx.org/download/复制对应的版本的链接地址。
ls -l nginx-1.10.2.tar.gz
tar xf nginx-1.10.2.tar.gz
cd nginx.1.10.2
./configure --user=www --group=www --prefix=/application/nginx-1.10.2 --with-http_stub_status_module --with-http_ssl_module
make 编译
make install 编译安装,编译安装的意思;一个中介,先把一个语言转换为二进制,然后再转化为人类能看懂的语言,就叫编译安装
ln -s / application/nginx-1.10.2 application/nginx
[[email protected] html]# ls -l /application/nginx/
total 36
drwx------ 2 www root 4096 May 18 10:55 client_body_temp
drwxr-xr-x 2 root root 4096 May 18 14:23 conf
drwx------ 2 www root 4096 May 18 10:55 fastcgi_temp
drwxr-xr-x 2 root root 4096 May 18 14:09 html
drwxr-xr-x 2 root root 4096 May 18 10:55 logs
drwx------ 2 www root 4096 May 18 10:55 proxy_temp
drwxr-xr-x 2 root root 4096 May 18 10:44 sbin
drwx------ 2 www root 4096 May 18 10:55 scgi_temp
drwx------ 2 www root 4096 May 18 10:55 uwsgi_temp
[[email protected] html]#
1.5.4 报错
安装时如果报以下错误
./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.
解决方法,,yum install -y opensll-devel pcre-devel
到此,nginx的安装工作就完成了
1.5.5 启动并检查安装结果
安装完nginx之后,并不能直接对外服务,需要先启动Nginx服务才行。具体操作如下,
(1) 启动前检查配置语法
命令如下
[[email protected] html]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2/conf/nginx.conf syntax is
nginx: configuration file /application/nginx-1.10.2/conf/nginx.conf test is succesl
[[email protected] html]# echo $?
0 如果不清楚上一条命令是对是错,可以使用$?查看上一条命令的执行结果
[[email protected] html]#
(2) 启动Nginx服务
启动命令如下
[[email protected] html]# /application/nginx/sbin/nginx
(3) 查看Nginx服务对应的端口是否开启成功
[[email protected] html]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 21077 root 6u IPv4 51082 0t0 TCP *:http (LISTEN)
nginx 21675 www 6u IPv4 51082 0t0 TCP *:http (LISTEN)
[[email protected] html]#
也可以通过netstat -lntup |grep 80查看
[[email protected] html]# netstat -lntup |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21077/nginx
[[email protected] html]#
(4) 检查Nginx启动的实际效果
在windows下通过浏览器检测的方式,在浏览器上输入10.0.0.7
如果看到以下字样说明成功
linux下使用命令检测
[[email protected] html]# wget 10.0.0.7
--2017-05-18 15:46:36-- http://10.0.0.7/
Connecting to 10.0.0.7:80... connected.
HTTP request sent, awaiting response... 200 OK 200 成功
Length: 643 [text/html]
Saving to: “index.html.1”
100%[=======================================>] 643 --.-K/s in 0s
2017-05-18 15:46:36 (43.4 MB/s) - “index.html.1” saved [643/643]
[[email protected] html]#
也可以使用curl命令检测
[[email protected] html]# curl 10.0.0.7
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head>
<title>欢迎来到Nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif
;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is succes
sfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[[email protected] html]#
上面几种方法都是检测Nginx安装及浏览是否正常
1.5.6 conf/nginx.conf 文件
1.5.7 负载均衡概念介绍
第2章 虚拟主机配置实战
2.1 虚拟主机的概念和类型介绍
1, 虚拟主机概念
所谓虚拟主机,在web服务里就有一个独立的网站站点,这个站点对应的独立的域名(也可能是IP或端口),具有独立的程序及资源目录,可以独立地对外提供服务共用户访问
这个独立的站点在配置里是由一定格式的标签标记的,对于Apache软件来说一个虚拟主机的段落通常被包含在<VirtualHost>< VirtualHost >内,而nginx软件咋使用一个server{}标签来标示一个虚拟主机,一个Web服务里面可以有多个虚拟主机签对,即可以同时支持多个虚拟主机站点
2, 虚拟主机类型
1) 基于域名的虚拟主机
所谓基于域名的虚拟主机,意思就是通过不同的域名区分不同的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站使用的都是基于域名的虚拟主机,例如,www.etiantian.org
2) 基于端口的虚拟主机
同理,所谓基于端口的虚拟主机,意思就是通过不同的端口来区分不同的虚拟主机,此类虚拟主机应企业应用主要为公司内部的网站,例如:一些不希望直接对外提供用户访问的网站后台等,访问基于端口的虚拟主机,地址里要带有端口,例如:http://www.etiantian.org:9000
3) 基于IP的虚拟主机
同理,所谓基于IP的虚拟主机,意思就是通过不同的IP区分不同的虚拟主机,此类虚拟主机对应的企业应用非常少见,一般不同的业务需要使用多IP的场景都会在复制均衡器上进行VIP绑定,而不是在Web上绑定IP来区分不同的虚拟机
三种虚拟主机类型均可独立使用,也可以混合使用,读者应把基于域名的虚拟主机类型当做重点来学习,其他两类了解即可。
2.2 nginx配置虚拟主机的步骤
nginx配置虚拟主机的步骤如下(适合各类虚拟主机类型);
1)增加一个完整的server标签段到结尾处,注意,要放在http的结束大括号前也,也就是将server标签段放入http标签
2)更改server_name及对应网页的root根目录,如果需要其他参数,可以增加或修改。
3)创建server_name域名对应网页的根目录,并且建立测试文件,如果没有index首页访问会出现403错误。
4)检查Nginx配置文件语法,平滑重启Nginx服务,快速检查启动结果。
5)在客户端对server_name处配置的域名做host解析或DNS配置,并检查(ping域名看返回的IP是否正确)
6)在win32浏览器中输入地址访问,或者在Linux客户端hosts解析,用wget或curl接地址访问。
nginx虚拟主机的官方帮助网站为:http://Nginx.org/en/docs/http/request_processing.html。
2.3 配置文件别名功能说明
2.3.1 Nginx状态信息功能实战
1,Nginx status介绍
nginx软件的功能模块中一个ngx_http_sutb_satus_module模块,这个模块的主要功能是记录Nginx的基本访问状态信息,让使用者了解Nginx的工作状态,例如连接数等信息,要使用模块,在编译Nginx时必须增加http_stub_status_module模块来支持。
可通过如下方法检查编译安装Nginx时是否设定上述模块;
[[email protected] conf]# ../sbin/nginx -V 检查编译安装时,设置的编译参数
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/application/nginx-1.10.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module 有这个-with-http_stub_status_module就对了
2.3.2 参数表格
参数 |
说明 |
第一行状态模块输出信息说明 |
|
Active connections |
表示建立创建的连接数值信息,即表示正在处理的活动连接数 |
第二行状态模块输出信息说明 |
|
server |
表示Nginx启动到现在共处理了多少请求连接 |
accepts |
表示Nginx启动到现在共成功创建了29431211次握手,请求丢失数=(握手数-连接数) |
handled requests |
表示总共接受了多少个请求 |
第三行状态模块输出信息说明 |
|
Reading |
为Nginx读取到客户端的Header信息数 |
Writing |
为Nginx返回给客户端的Header信息数 |
Waiting |
Nginx已经处理完正在等候下一次请求指令的驻留连接,在开启keep-alive的情况下,这个值等于active-(reading+writing) |
2.3.3 Nginx错误日志信息介绍
配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(ngx_core_module)的参数,该参数名字为error_log,可以放在main区块中全局配置,也可以放置不同的虚拟主机中单独记录。
error_log的语法格式及参数语法说明如下
error_log file level 关键字 日志文件 错误日志级别 |
期中,关键字error_log不能改变,日志文件可以指定任意存放日志的目录,错误日志级别常见的有[debug|info|notice|warn|error|crit|alert|emerg]级别越高,记录的信息越少,生产场景一般是warn|error|crit这三个级别之一,注意不要配置info等较低级别,会带来巨大磁盘I/O消耗
error_log的默认值为:
#defult:error_log logs/error.log error;
2.3.4 日志变量内容
main是为日志格式指定 的标签,记录日志时通过这个main标签选择指定的格式,其后所接的所有内容都是可以记录的日志信息,具体下表,注意所有的日志段以空格分隔,一行可以记录多个,不同列的意思也在下标中进行了说明。
tail -1 logs/access.log
10.0.0.7 - - [19/May/2017:15:31:22 +0800] "GET /inetx.html HTTP/1.1" 404 169 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
Nginx日志变量 |
说明 |
$remote_addr |
记录访问网站的客户端地址,即源IP地址 |
$http_x_forwarded_for |
当前端有 代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的x_forwarded_for设置 可以记录用户真实的IP地址信息 |
$remote_user |
远程客户端用户名称 |
$time_local |
记录访问时间与时区 |
$request |
用户的http请求起始行信息 |
$status |
http状态码,记录请求放回的状态,例如,200 404 301等 |
第3章 Ngixn location
3.1.1 location作用
location指令的作用是根据用户请求的URI来执行不同的应用,URI的知识前面章节已经讲解过,其实就是根据用户请求的网站地址,URI进行匹配,匹配成功即进行相关的操作。
下面是官方提供的常见的location匹配语法
location |
[=|~*|^~|@] |
uri |
{...} |
指令 |
匹配标识 |
匹配的网站网址 |
匹配URI后要执行的配置段 |
匹配这两种特殊字符"~"或"~*" 的区别为"~"用于区分大小写(大小写敏感)的匹配;"~*"用于不区分大小写的匹配,还可以用逻辑操作符,"!"对上面的匹配取反,即"!~" 和"!~*"此外,"^~"的作用是在进行常规的字符串匹配检查之后,不做正则表达式的检查,即如果最明确的那个字符串匹配的location配置中有此前缀,那么不做正则表达式的检查。
3.1.2 location语法
location = / {
[configuration A]
}
location / {
[configuration B]
}
location /documents/ {
[configuration C]
}
location ^~ /images/ {
[configuration D]
}
location ~*\.(gif|jipg|peg) $ {
[configuration E]
}
3.1.3 用户请求URI说明
用户请求的URI |
设置的状态码 |
说明 |
当为空或/时 |
返回402即匹配了 location = / { return 402 } 和上述官方示例说明表configuration A一致 |
|
/index.html或任意不匹配其它location的字符串 |
返回401 即匹配了 location / { return 401 } 和上述官方示例说明表configuration B一致 |
/ 为默认匹配,即如果没有匹配上其他的location,咋最后匹配“默认匹配”的部分 |
/documents/document.htm |
返回403 即匹配了 location = /documents/ { return 403 } 和上述官方示例说明表configuration C一致 |
此部分为路径匹配,即匹配了路由/documents/注意后面的/documents/1.jpg,这表示没有匹配此次的location,而是匹配了结尾的1.jpg |
/images/1.gif |
返回404 即匹配了 location = /images/ { return 404 } 和上述官方示例说明表configuration D一致 |
此部分为路径匹配,但是前面增加了特殊字符^~所有优先匹配路径,而没有匹配结尾的1.gif |
/documents/1.jpg |
返回500 即匹配了 location = (gif|jpg|jpeg) $ { return 500 } 和上述官方示例说明表configuration D一致 |
此部分匹配了1.jpg属于扩展名匹配,虽然有/documents/但还是匹配了扩展名 |
从以上多个location的配置匹配可以看出匹配的优先顺序,具体见下表
顺序 |
不用URI及特殊字符组合匹配 |
匹配说明 |
1 |
location = / { |
精确匹配 / |
2 |
location ^~ /images/ { |
匹配常规字符串,不做正则匹配检查 |
3 |
location ~* \. (gif|jpg|jpeg) $ { |
正则匹配 |
4 |
location /documents/ { |
匹配常规字符串,如果有正则,则优先匹配正则 |
5 |
location / { |
所有location都不能匹配后的默认匹配 |
第4章 Nginx rewrite语法
4.1 rewite指令语法
指令语法;rewrite regex replacement [fiag]
默认值;none
应用位置;server location if
rewrite 是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记,下面是一个简单是URL rewrite
跳转的例子;
rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,表示匹配所有,匹配成功后跳转到 http://www.etiantian.org/$1 这里的$1是取前面regex部分括号里的内容,结尾的permanent;是永久301重定向标记,即跳转到后面的http://www.etiantian.org/$1地址上。
4.1.1 最后一项参数
flag标记符号 |
说明 |
last |
本条规则匹配完成后,继续向下匹配新的location URL规则 |
break |
本条规则匹配完成即终止,不再匹配后面的任何规则 |
redirect |
返回302临时重定向,浏览器地址栏会显示跳转后的URI地址 |
permanent |
返回301永久重定向,浏览地址会显示跳转后的URL地址 |
在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化,redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址
4.2 Nginx rewrite的企业应用场景
Nginx的rewrite功能在企业里应用非常广泛
¨ 可以跳转用户浏览的URL使其看起来更规范,合乎开发及产品人员的需求。
¨ 为了让搜索引擎收录网站内容并让用户体验更好,企业会将动态URL地址伪装成静态地址提供服务
¨ 网站换新域名后,让旧域名的访问跳转到新的域名上,例如:让京东的360buy换成了jd.com
¨ 根据特殊变量,目录,客户端的信息进行URL跳转等。
4.3 本章重点回顾
1)Nginx的特性优点。
2)主流Web动态静态性能对比。
3)Apache select和Nginx epoll模型的区别(面试常考)。
4)虚拟主机概念及类型分类详解
5)基于域名和端口虚拟主机的介绍及搭建
6)Nginx错误,访问日志,以及访问日志切割。
7)Nginx location介绍及配置实践。
8)Nginxrewrtie介绍及配置实践。
9)Nginx Web访问认证介绍及配置实践。