第 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 目录
[root@web02 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[root@web02 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 基础依赖包是否安装,
[root@web02 html]# rpm -qa openssl* pcre* 星代表后缀,不管是啥都显示出来
openssl-1.0.1e-57.el6.x86_64
pcre-7.8-7.el6.x86_64
[root@web02 html]#
1.5.2 第二步安装 openssl-devel
Nginx 在使用 HTTPS 服务的时候要用到此模块,如果不安装 openssl 相关包,安装 Nginx 的过程中会报错,安装 openssl-devel 的命令及检查命令;
[root@web02 html]# yum install -y openssl-devel pcre-devel
[root@web02 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
[root@web02 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
[root@web02 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
[root@web02 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= option.
解决方法,,yum install -y opensll-devel pcre-devel
到此,nginx 的安装工作就完成了
1.5.5 启动并检查安装结果
安装完 nginx 之后,并不能直接对外服务,需要先启动 Nginx 服务才行.具体操作如下,
(1) 启动前检查配置语法
命令如下
[root@web02 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
[root@web02 html]# echo $
0 如果不清楚上一条命令是对是错,可以使用 $? 查看上一条命令的执行结果
[root@web02 html]#
(2) 启动 Nginx 服务
启动命令如下
[root@web02 html]# /application/nginx/sbin/nginx
(3) 查看 Nginx 服务对应的端口是否开启成功
[root@web02 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)
[root@web02 html]#
也可以通过 netstat -lntup |grep 80 查看
[root@web02 html]# netstat -lntup |grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21077/nginx
[root@web02 html]#
(4) 检查 Nginx 启动的实际效果
在 windows 下通过浏览器检测的方式,在浏览器上输入 10.0.0.7
如果看到以下字样说明成功
linux 下使用命令检测
[root@web02 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]
[root@web02 html]#
也可以使用 curl 命令检测
[root@web02 html]# curl 10.0.0.7
Welcome to nginx!
If you see this page, the nginx web server is succes
sfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org .
Commercial support is available at
nginx.com .
Thank you for using nginx.
[root@web02 html]#
上面几种方法都是检测 Nginx 安装及浏览是否正常
1.5.6 conf/nginx.conf 文件
1.5.7 负载均衡概念介绍
第 2 章 虚拟主机配置实战
2.1 虚拟主机的概念和类型介绍
1, 虚拟主机概念
所谓虚拟主机,在 web 服务里就有一个独立的网站站点,这个站点对应的独立的域名(也可能是 IP 或端口),具有独立的程序及资源目录,可以独立地对外提供服务共用户访问
这个独立的站点在配置里是由一定格式的标签标记的,对于 Apache 软件来说一个虚拟主机的段落通常被包含在 <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 时是否设定上述模块;
[root@web02 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 访问认证介绍及配置实践.
来源: http://www.bubuko.com/infodetail-2467993.html