• Nginx服务介绍


    第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=<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 {

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

    所谓基于域名的虚拟主机,意思就是通过不同的域名区分不同的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站使用的都是基于域名的虚拟主机,例如,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访问认证介绍及配置实践。

  • 相关阅读:
    php中奖概率算法
    phpize: command not found
    使用Mobile_Detect来判断访问网站的设备:安卓,平板,电脑
    jsonp应用
    数组转换一
    PhpStorm2016.3激活
    svn冲突问题详解 SVN版本冲突解决详解
    Pythono 实现 Permutation
    ubuntu 挂载优盘
    Customize R initiallization in Mac
  • 原文地址:https://www.cnblogs.com/a-can/p/234dsrfew32.html
Copyright © 2020-2023  润新知