博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx服务介绍
阅读量:5291 次
发布时间:2019-06-14

本文共 12709 字,大约阅读时间需要 42 分钟。

第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

下载软件包,进入 复制对应的版本的链接地址。

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=<path> 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

<!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>

 

[root@web02 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)    基于域名的虚拟主机

所谓基于域名的虚拟主机,意思就是通过不同的域名区分不同的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站使用的都是基于域名的虚拟主机,例如,

2)    基于端口的虚拟主机

同理,所谓基于端口的虚拟主机,意思就是通过不同的端口来区分不同的虚拟主机,此类虚拟主机应企业应用主要为公司内部的网站,例如:一些不希望直接对外提供用户访问的网站后台等,访问基于端口的虚拟主机,地址里要带有端口,例如:

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虚拟主机的官方帮助网站为:。

 

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 ^/(.*) permanent;

在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,regex部分是^/(.*),这是一个正则表达式,表示匹配所有,匹配成功后跳转到 这里的$1是取前面regex部分括号里的内容,结尾的permanent;是永久301重定向标记,即跳转到后面的地址上。

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访问认证介绍及配置实践。

转载于:https://www.cnblogs.com/a-can/p/234dsrfew32.html

你可能感兴趣的文章
ajax连接服务器框架
查看>>
wpf样式绑定 行为绑定 事件关联 路由事件实例
查看>>
利用maven管理项目之POM文件配置
查看>>
用HttpCombiner来减少js和css的请问次数
查看>>
FUSE-用户空间文件系统
查看>>
将tiff文件转化为jpg文件并保存
查看>>
ubuntu 16.04 开机脚本
查看>>
 VS2012 C#调用C++ dll
查看>>
TCL:表格(xls)中写入数据
查看>>
SQL SERVER 2005中如何获取日期(一个月的最后一日、一年的第一日等等)
查看>>
django 学习笔记(转)
查看>>
控制台程序秒变Windows服务(Topshelf)
查看>>
字节流与字符流的区别详解
查看>>
20141026--娱乐-箱子
查看>>
自定义分页
查看>>
Oracle事务
查看>>
任意输入10个int类型数据,把这10个数据首先按照排序输出,挑出这些数据里面的素数...
查看>>
String类中的equals方法总结(转载)
查看>>
图片问题
查看>>
bash使用规则
查看>>