第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 $/p>
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软件来说一个虚拟主机的段落通常被包含在
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访问认证介绍及配置实践。
相关资源:实例讲解分布式缓存软件Memcached的Java客户端使用-其它代码类…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!