admin管理员组

文章数量:1652577

nginx基础篇

1 nginx介绍

1.1 what nginx

Nginx(“engine x”) 是一个开源的、支持高性能、高并发的www服务和代理服务软件,是由俄罗斯人Igor Sysoev开发的,最初被应用在俄罗斯的大型网站www.rambler.ru上,后来作者将源代码以类BSD许可证的形式开源出来共全球使用。

Nginx不但可以做web服务软件,还具有反向代理负载均衡功能和缓存服务功能,在反向代理负载均衡功能方面类似于LVS负载均衡以及Haproxy专业的代理软件,但nginx在部署起来更为简单。在缓存服务功能方面,又和squid等专业的缓存服务软件类似。

1.2 nginx的重要特性

q  可针对静态资源高速高并发访问及缓存

q  可使用反向代理加速,并且可以进行数据缓存

q  具有简单负载均衡、节点健康检查和容错功能

q  支持远程FastCGI服务的缓存加速

q  支持SSLTLSSNI

q  支持FastCGIUwsgiSCGIMemcached Servers的加速和缓存

q  具有模块化的结构:过滤器包括gzip压缩、ranges支持、图像缩放等功能

q  支持基于名字、端口及IP的虚拟主机站点

q  支持Keep-alivepipelined连接

q  可进行简单、方便、灵活的配置和管理

q  支持修改nginx配置,并且在代码上线时,可平滑重启,不中断业务访问

q  可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志

q  可利用信号控制Nginx进程

q  支持3xx-5xx HTTP状态码重定向

q  支持rewrite模块,支持URI重写及正则表达式匹配

q  支持基于客户端IP地址和HTTP基本认证的访问控制

q  支持FLV流和MP4流技术产品应用

q  支持HTTP响应速率限制

q  支持邮件服务代理

q  支持同一IP地址的并发连接或请求数限制

q  支持PUTDELETEMKCOLCOPYMOVE等较特殊的HTTP请求方法

1.3 面试可能被问到的问题

q  支持高并发:能支持几万并发连接(特别是静态小文件业务环境)

q  资源消耗小:在3万并发连接下,开启10nginx线程消耗的内存不到200MB

q  可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的HaproxyLVS的功能

q  具备Squid等专业缓存软件等的缓存功能

q  支持异步网络I/O事件模型epolllinux2.6+

1.4 nginx主要的企业应用功能

1.4.1 作为Web服务软件

Nginx是一个支持高性能、高并发的Web服务软件,他具有很多优秀的特性,作为web服务器与Apache相比,nginx能够支持更多的并发连接访问,但占用的资源却更少,效率更高,在功能上也强大了很多

1.4.2 反向代理或负载均衡服务

在反向代理或负载均衡服务方面,Nginx可以作为Web服务、PHP等动态服务及Memcached缓存的代理服务器,他具有类似专业反向代理软件的功能,同时也是一个优秀的邮件代理软件(最早开发这个产品的目的之一就是作为邮件代理服务),但是nginx的代理功能还是相对简单了些,特别是不支持TCP的代理(但是在1.9.0之后,开始支持TCP的代理)

1.4.3 前端业务数据缓存服务

web缓存服务方面,nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能

Nginx的这三大功能是国内使用nginx的主要场景,特别是前两个

1.5 Nginx作为web服务的主要应用场景

q  使用nginx运行HTMLJSCSS、小图片等静态数据(此功能类似Lighttpd软件)

q  nginx结合FastCGI运行PHP等动态程序(例如使用fastcgi_pass方式)

q  nginx结合Tomcat/Resin等支持Java动态程序(例如常用proxy_pass方式)

1.6 几款常用web软件产品的对比

1.6.1 Apache

q  Apache2.4版本性能稳定强大

q  Prefork模式取消了进程创建开销,性能很高

q  处理动态业务数据时,因为关联到后端的引擎和数据库,瓶颈不在Apache

q  高并发时消耗系统资源相对多一些

q  基于传统的select模型,高并发能力有限

q  支持扩展库,可通过DSOapxs方法编译安装额外的插件功能,不需要重新编译Apache

q  功能多,更稳定,更安全,插件也多

q  市场份额逐年在递减

1.6.2 Nginx

q  基于异步网络I/O模型(epollkqueue

q  具备支持高性能、高并发的特性,并发连接可达数万

q  对于小文件(小于1MB的静态文件)高并发支持很好,性能很高

q  不支持类似ApacheDSO模式,扩展库必须编译进主程序(缺点)

q  进程占用系统资源较低

q  支持web、反向proxycache三大重点功能,并且都很优秀

q  市场份额在逐年快速增加

1.6.3 Lighttpd

q  基于异步网络I/O模型,性能、并发都与nginx相似

q  扩展库是SO模式,比nginx灵活

q  目前国内的使用率比较低,安全性没有ApacheNginx性能高

q  通过插件(mod_secdownload)可实现文件URL地址加密(优点)

q  社区不活跃,市场份额较低

1.7 Apache selectNginx epoll的技术对比

指标

select

epoll

 

性能

随着连接数的增,加性能急剧下降,处理成千上万并发连接时,性能很差

随着连接数的增加,性能几乎没有下降,处理成千上午并发连接时,性能很好

 

连接数

连接数有限制,处理的最大连接数不超过1024,如果要处理的连接数超过1024,则需要修改FD_SETSIZE宏,并重新进行编译

 

连接数无限制

内在处理机制

现行轮询

回调callback

开发复杂性

1.8在企业中如何正确的选择web服务器

1.8.1 静态业务

q  若是高并发场景,尽量选择nginx

1.8.2 动态业务

q  在理论上采用ApacheNginx都可以,但是建议选择Nginx,为了避免相同业务的服务软件多样化,增加额外的维护成本,动态业务可以由Nginx兼做前端代理,在根据页面元素的类型或目录,转发到后端相应的服务器进行处理

1.8.3 既有静态业务又有动态业务

q  选择nginx,但是如果并发不是很大,对Apache又很熟悉,选择Apache也是可以的

2 nginx的安装

2.1 安装前的环境准备

2.1.1 linux的系统环境

[root@oldboy ~]# cat /etc/redhat-release

CentOS release 6.9 (Final)

[root@oldboy ~]# uname -r

2.6.32-696.el6.x86_64

[root@oldboy ~]# uname -m

x86_64

2.1.2 安装Nginx基础依赖包pcrepcre-developensslopenssl-devel

[root@oldboy ~]# yum install -y openssl openssl-devel pcre pcre-devel ==>安装

[root@oldboy ~]# rpm -qa pcre pcre-devel openssl openssl-devel  ==>检查

openssl-devel-1.0.1e-57.el6.x86_64

pcre-7.8-7.el6.x86_64

openssl-1.0.1e-57.el6.x86_64

pcre-devel-7.8-7.el6.x86_64

2.1.3 安装nginx

####建立固定的目录来存放安装的软件

[root@oldboy ~]# mkdir /home/oldboy/tools  ==>建立

[root@oldboy ~]# ll /home/oldboy/tools/ -d  ==>查看

drwxr-xr-x. 2 root root 4096 4   6 00:28 /home/oldboy/tools/

####下载nginx安装包并检查

[root@oldboy ~]# cd /home/oldboy/tools/   ==>进入存放软件的目录

[root@oldboy tools]# wget -q http://nginx/download/nginx-1.6.3.tar.gz  ==>下载

[root@oldboy tools]# ll -h nginx-1.6.3.tar.gz   ==>查看

-rw-r--r--. 1 root root 787K 4   7 2015 nginx-1.6.3.tar.gz

####创建用户

[root@oldboy tools]# useradd www -s /sbin/nologin -M

####解压并进行编译安装

[root@oldboy tools]# tar xf nginx-1.6.3.tar.gz  ==>解压

[root@oldboy tools]# ll  ==> 查看

总用量 792

drwxr-xr-x. 8 1001 1001   4096 4   7 2015 nginx-1.6.3

-rw-r--r--. 1 root root 805253 4   7 2015 nginx-1.6.3.tar.gz

[root@oldboy nginx-1.6.3]# cd nginx-1.6.3  ==>进入解压后的目录

[root@oldboy nginx-1.6.3]#./configure \  ==>配置

--user=www \ ==>进程用户权限

--group=www \ ==>进程用户组权限

--prefix=/application/nginx-1.6.3 \  ==>设置安装路径

--with-http_ssl_module \  ==>激活状态信息

--with-http_stub_status_module \  ==>激活ssl功能

[root@oldboy nginx-1.6.3]#make  ==>编译

[root@oldboy nginx-1.6.3]#make install ==>安装

[root@oldboy nginx-1.6.3]# ln -s /application/nginx-1.6.3/ /application/nginx ==>创建软连接

[root@oldboy nginx-1.6.3]# ll /application/nginx  ==>检查

[root@oldboy ~]# /application/nginx/sbin/nginx  ==>启动

[root@oldboy ~]# lsof -i :80 ==>查看端口

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

nginx   19901 root    6u  IPv4  93888      0t0  TCP *:http (LISTEN)

nginx   19902  www    6u  IPv4  93888      0t0  TCP *:http (LISTEN)

[root@oldboy ~]# ps -ef|grep nginx  ==>查看进程

root      19901      1  0 02:25 ?        00:00:00 nginx: master process /application/nginx/sbin/nginx

www       19902  19901  0 02:25 ?        00:00:00 nginx: worker process       

root      19920   9231  0 02:26 pts/0    00:00:00 grep nginx

2.2 检测是否安装成功的方法

2.2.1 windows浏览器中输入服务端ip进行测试

出现上述内容nginx安装成功!!!

2.2.2 linux客户端输入一下命令

[root@oldboy ~]# wget 127.0.0.1

--2018-04-06 02:31:22--  http://127.0.0.1/

正在连接 127.0.0.1:80... 已连接。

已发出 HTTP 请求,正在等待回应... 200 OK

长度:612 [text/html]

正在保存至: index.html

 

100%[===========================================================================================>] 612         --.-K/s   in 0s     

 

2018-04-06 02:31:22 (61.6 MB/s) - 已保存 index.html [612/612])

或者使用curl命令

[root@oldboy ~]# curl -I localhost

HTTP/1.1 200 OK

Server: nginx/1.6.3

Date: Fri, 06 Apr 2018 06:32:17 GMT

Content-Type: text/html

Content-Length: 612

Last-Modified: Fri, 06 Apr 2018 06:22:46 GMT

Connection: keep-alive

ETag: "5ac71236-264"

Accept-Ranges: bytes

出现上述内容说明nginx安装成功!!!

2.3 访问网站异常的排查三部曲

2.3.1 在客户端上ping服务端的ip

[root@oldboy ~]# ping 10.0.0.61

2.3.2 在客户端上telnet服务端的ip、端口

[root@oldboy ~]# telnet 10.0.0.61 80

2.3.3 在客户端使用wgetcurl命令检测

[root@oldboy ~]# wget 10.0.0.61

[root@oldboy ~]# curl -I 10.0.0.61

3 nginx的配置

3.1 nginx目录的简单总结

[root@oldboy ~]# tree /application/nginx

/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    ==>nginx的主配置文件

   ├── nginx.conf.default    ==>nginx主配置文件的原始备份

   ├── scgi_params    ==>scgi的相关参数文件 一般用不到

   ├── scgi_params.default

   ├── uwsgi_params    ==>uwsgi的相关参数文件 一般用不到

   ├── uwsgi_params.default

   └── win-utf

├── fastcgi_temp   ==>fastcgi临时数据目录

├── html  ==>编译安装时nginx的默认站点目录 Apache的默认站点目录是htdocs

   ├── 50x.html  ==>错误页面优雅的显示文件 502会调用此页面

   └── index.html  ==>默认的首页文件 nginx.conf事先定义好的

├── logs  ==>nginx的默认日志路径

   ├── access.log  ==> nginx默认访问日志文件

   ├── error.log   ==>nginx的错误日志文件

   └── nginx.pid  ==>nginxpid文件,nginx启动后会把所有的进程id写到该文件中

├── proxy_temp   ==>临时目录

├── sbin   ==>nginx的命令目录

   └── nginx  ==>nginx的启动命令

├── scgi_temp  ==>临时目录

└── uwsgi_temp  ==>临时目录

 

3.2 nginx http常用功能模块的总结

nginx   http功能模块

模块说明

ngx_http_core_module

包括一些核心的http参数配置,对应nginx的配置为HTTP区块部分

ngx_http_access_module

访问控制模块,用来控制网站用户对nginx的访问

ngx_http_gzip_module

压缩模块,对nginx返回的数据压缩,属于性能优化模块

ngx_http_fastcgi_module

FastCGI模块和动态应用相关的模块 例如PHP

ngx_http_proxy_module

proxy代理模块

ngx_http_upstream_module

负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

ngx_http_rewrite_module

URL地址重写模块

ngx_http_limit_conn_module

限制用户并发连接数及请求连接数模块

ngx_http_limit_req_module

根据定义的key限制nginx请求过程的速率

ngx_http_log_module

访问日志模块,以指定格式记录nginx客户访问日志等信息

ngx_http_auth_basic_module

web认证模块,设置web用户通过账号、密码访问nginx

ngx_http_ssl_module

ssl模块,用户加密的http连接 https

ngx_http_stub_status_module

记录nginx基本访问状态信息等的模块

3.3 nginx核心配置文件区块总结

[root@oldboy conf]# vim nginx.conf

1  worker_processes  1;  ==>Main区,Nginx核心功能模块

2  events {

3     worker_connections  1024;         24events区,Nginx核心功能模块

4  }

5  http {   ==> http区开始 Nginx核心功能模块

6     include       mime.types;

7     default_type  application/octet-stream;

8     sendfile        on;

9     keepalive_timeout  65;

10     server {    ==>server区块开始

11         listen       80;

12         server_name  localhost;

13         location / {

14             root   html;                       1316location区块

15             index  index.html index.htm;          

16         }

17         error_page   500 502 503 504  /50x.html;

18         location = /50x.html {

19             root   html;

20         }

21     }  ==>server区块结束

22  } ==>http区块结束

 

3.4 nginx核心配置文件总结

[root@oldboy conf]# vim nginx.conf

  1 worker_processes  1;  ==> worker进程的数量

  2 events {  ==>事件区块结束

  3     worker_connections  1024;  ==>每个worker支持的最大连接数

  4 }  ==>事件区块结束

  5 http {  ==>http区块开始

  6     include       mime.types;  ==>nginx支持的媒体类型库文件

  7     default_type  application/octet-stream;  ==>默认的媒体类型

  8     sendfile        on;  ==>开启高效的传输方式

  9     keepalive_timeout  65;  ==> 连接超时时间

 10     server {   ==>server区块开始

 11         listen       80;  ==>提供服务的端口,默认是80

 12         server_name  localhost;  ==>提供服务的域名,主机名

 13         location / {  ==>location区块开始

 14             root   html;   ==>站点的根目录,相对于nginx的安装目录

 15             index  index.html index.htm;  ==>默认的首页文件 多个用空格隔开

 16         }  ==>location区块结束

 17         error_page   500 502 503 504  /50x.html;  ==>出现对应的状态码时,使用50x.html回应客户

 18         location = /50x.html {

 19             root   html;

 20         }

 21     }  ==>server区块结束

 22 }  ==>http区块结束

 

4 虚拟主机的配置实战

4.1 基于域名的虚拟主机配置

####将配置文件中的空行和带#号的行(注释行)去掉

[root@oldboy conf]# egrep -v '^$|#' nginx.conf.default >nginx.conf

##配置文件如下

[root@oldboy html]# vim ../conf/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  www.lzh;

        location / {

            root   html/www;

            index  index.html index.htm;

        }

    }

    server {

        listen       80;

        server_name  blog.lzh;

        location / {

            root   html/blog;

            index  index.html index.htm;

        }

    }

 

} ###建立站点目录

[root@oldboy html]# mkdir /application/nginx/html/{www,blog} 

####编辑测试首页文件

[root@oldboy html]# echo www >/application/nginx/html/www/index.html

[root@oldboy html]# echo blog >/application/nginx/html/blog/index.html

####检测nginx配置文件是否有语法错误

[root@oldboy html]# /application/nginx/sbin/nginx -t

####重启nginx服务

[root@oldboy html]# /application/nginx/sbin/nginx -s reload

q  测试

##编辑客户端编辑域名解析文件

[root@nfs01 ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.16.1.5    lb01

172.16.1.6    lb02

172.16.1.7    web02

172.16.1.8    web01 www.etiantian bbs.etiantian blog.etiantian

172.16.1.31   nfs01

172.16.1.41   backup

172.16.1.61   m01  www.lzh blog.lzh

[root@nfs01 ~]# curl  www.lzh

www

[root@nfs01 ~]# curl blog.lzh

blog

出现上面的www说明配置成功!!!

4.2 基于端口的虚拟主机配置

###配置文件

[root@oldboy html]# vim ../conf/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  www.lzh;

        location / {

            root   html/www;

            index  index.html index.htm;

        }

    }

    server {

        listen       81;

        server_name  blog.lzh;

        location / {

            root   html/blog;

            index  index.html index.htm;

        }

    }

 

}

####检测nginx配置文件是否有语法错误

[root@oldboy html]# /application/nginx/sbin/nginx -t

####重启nginx服务

[root@oldboy html]# /application/nginx/sbin/nginx -s reload

q  测试

[root@nfs01 ~]# curl blog.lzh:81

blog

[root@nfs01 ~]# curl www.lzh

www

出现上述结果说明配置成功!!!

4.3 基于ip的虚拟主机配置

####增加两个ip

[root@nfs01 ~]# ip addr add 10.0.0.101/24 dev eth0 label eth0:0

ifconfig eth0:1 10.0.0.102/24 up

####配置文件

[root@oldboy html]# vim ../conf/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       10.0.0.101:80;

        server_name  www.lzh;

        location / {

            root   html/www;

            index  index.html index.htm;

        }

    }

    server {

        listen       10.0.0.102:80;

        server_name  blog.lzh;

        location / {

            root   html/blog;

            index  index.html index.htm;

        }

    }

 

}

q  测试

[root@nfs01 ~]# curl 10.0.0.101

www

[root@nfs01 ~]# curl 10.0.0.102

blog

出现上述内容说明配置成功!!!

5nginx的深入配置

5.1 将配置文件中的server区块分离出来

####编辑配置文件

root@oldboy extra]# vim ../nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    include extra/www.conf;

    include extra/blog.conf;

注意:上面的两行内容也可以用extra/*.conf;代替

}

###创建extra目录

[root@oldboy conf]#mkdir extra

[root@oldboy conf]# cd extra/

####编辑www.conf配置文件

[root@oldboy extra]# vim www.conf

    server {

        listen       80;

        server_name  www.lzh;

        location / {

            root   html/www;

            index  index.html index.htm;

        }

    }

####编辑blog.conf配置文件

[root@oldboy extra]# vim blog.conf

    server {

        listen       80;

        server_name  blog.lzh;

        location / {

            root   html/blog;

            index  index.html index.htm;

        }

}

####检查配置文件是否有语法错误并重新启动

[root@oldboy extra]# /application/nginx/sbin/nginx -t

[root@oldboy extra]# /application/nginx/sbin/nginx -s reload

q  测试

[root@nfs01 ~]# curl blog.lzh

blog

[root@nfs01 ~]# curl www.lzh

www

出现上述内容说明配置成功!!!

 

5.2 nginx虚拟主机的别名配置

####编辑配置文件

[root@oldboy extra]# vim www.conf

    server {

        listen       80;

        server_name  www.lzh lzh;   别名与主机名之间用空格隔开

        location / {

            root   html/www;

            index  index.html index.htm;

        }

}

####检查nginx的语法是否正确并重新启动

[root@oldboy html]# /application/nginx/sbin/nginx -t

[root@oldboy html]# /application/nginx/sbin/nginx -s reload

q  测试

####编辑/etc/hosts文件

[root@nfs01 ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.16.1.5    lb01

172.16.1.6    lb02

172.16.1.7    web02

172.16.1.8    web01 www.etiantian bbs.etiantian blog.etiantian

172.16.1.31   nfs01

172.16.1.41   backup

172.16.1.61   m01  www.lzh blog.lzh lzh

[root@nfs01 ~]# curl lzh

www

出现上述内容说明配制成功!!!

 

5.3 显示文件的列表

q  只需在http, server, location区域块中加入autoindex on; 即可

q  其中autoindex_exact_size on | off 开启显示文件的大小为MBGB默认是b,该项默认是开启的

其余的详细配置请参考http://nginx/en/docs/http/ngx_http_autoindex_module.html

5.4 开启显示nginx状态信息功能

5.4.1 nginx status简介

nginx软件功能模块中有一个ngx_http_stub_status_module模块,其主要功能是记录nginx的基本访问状态信息,可以让使用者了解nginx的使用状态,例如连接数等,要想使用该模块需要在编译时增加--with-http_stub_status_module模块

可以通过下面的命令查看编译时是否开启此模块

[root@oldboy html]# ../sbin/nginx -V

nginx version: nginx/1.6.3

built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)

TLS SNI support enabled

configure arguments: --prefix=/application/nginx-1.6.3 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module

 

5.4.2 配置nginx status

####编辑配置文件

[root@oldboy extra]# vim status.conf

    server {

        listen       80;

        server_name  status.lzh;

        location / {

            stub_status on;

            access_log off;

        }

}

编辑nginx.conf配置文件

[root@oldboy extra]# vim ../nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    autoindex on;

    include extra/www.conf;

    include extra/blog.conf;

    include extra/status.conf;    ==> 增加这一行

 

}

q  测试

####编辑/etc/hosts文件

[root@nfs01 ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.16.1.5    lb01

172.16.1.6    lb02

172.16.1.7    web02

172.16.1.8    web01 www.etiantian bbs.etiantian blog.etiantian

172.16.1.31   nfs01

172.16.1.41   backup

172.16.1.61   m01  www.lzh blog.lzh lzh status.lzh

[root@nfs01 ~]# curl status.lzh

Active connections: 1

server accepts handled requests

 6 6 3

Reading: 0 Writing: 1 Waiting: 0

5.4.3 nginx status显示结果详解

Active connections: 1

server  accepts handled requests

 6     6       3

Reading: 0 Writing: 1 Waiting: 0

q  Active connections: 1 表示nginx正处理的活动连接数有1

q  第一个server表示nginx启动到现在共处理了6个连接

q  第二个accepts表示nginx启动到现在共成功创建了6次握手

q  请求丢失数=(握手数-连接数),可以看出本次状态显示没有丢失请求

q  3handled requests表示总共处理了3次请求

q  Readingnginx读取到客户端的Header信息数

q  Writingnginx返回客户端的Header信息数

q  Waitingnginx已经处理完正在等候下一次请求指令的驻留连接数,在开启keep-alive的情况下,这个值等于active-reading+writing

注意:为了安全起见,这个状态信息要防止外部用户查看

5.5 nginx的日志配置

5.5.1 nginx的错误日志配置

配置错误日志是调试nginx服务的重要手段,他是属于nginx核心模块(ngx_core_module)的参数

q  【格式】

error_log   file    level;

关键字    日志文件  错误日志级别

其中关键字error_log不能改变,日志文件可以指定任意存放存放日志目录,错误日志级别常见的有【debug|info|notice|warn|error|crit|alert|emerg】,级别越高,记录的信息越少,生产场景一般是warn|error|crit这三个级别之一,注意不要配置info等较低级别,会带来巨大的磁盘I/O消耗

error_log的默认值为:

#error_log  logs/error.log;

可以放置的标签区段为

mainhttpservicelocation

q  【配置】

####编辑nginx.conf配置文件

[root@oldboy conf]# cat nginx.conf

worker_processes  1;

error_log logs/error.log;   ==>只需增加这一行即可

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    autoindex on;

    include extra/www.conf;

    include extra/blog.conf;

    include extra/status.conf;

 

}

 

5.5.2 nginx的访问日志

q  nginx软件会把用户访问网站的日志信息记录到指定的日志文件里,该功能由ngx_http_log_module模块负责

5.5.2.1 nginx访问日志的参数

nginx的访问日志主要由两个参数控制

q  log_format 用来定义记录日志的格式

q  access_log 用来指定日志文件的路径及使用何种日志格式记录日志

5.5.2.2 nginx访问日志的默认配置

#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

    #                  '$status $body_bytes_sent "$http_referer" '

    #                  '"$http_user_agent" "$http_x_forwarded_for"';

5.5.2.3 nginx记录日志默认参数的配置

   #access_log  logs/access.log  main;

 

5.5.2.4 nginx日志变量说明

nginx日志变量

说明

$remote_addr

记录访问网站的客户端地址

$http_x_forwarded_for

当前有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器上也进行了相关的x_forwarded_for设置

$remote_user

远程客户端的名称

$time_local

记录访问时间与时区

$request

用户的http请求起始行信息

$status

http状态码,记录请求返回的状态

$body_bytes_sent

服务器发送给客户端的响应body字节数

$http_referer

记录此次请求是从那个连接访问过来的,可以根据refer进行防盗链设置

$http_user_agent

记录客户端访问信息,例如浏览器、手机客户端等

q  注意:在没有特殊的要求下,采用默认的配置就好

5.5.2.5 nginx访问日志配置

####编辑nginx.conf配置文件

[root@oldboy conf]# cat -n nginx.conf

     1    worker_processes  1;

     2    error_log logs/error.log;

     3    events {

     4        worker_connections  1024;

     5    }

     6    http {

     7        include       mime.types;

     8        default_type  application/octet-stream;

     9        sendfile        on;

    10        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

    11                          '$status $body_bytes_sent "$http_referer" '

    12                          '"$http_user_agent" "$http_x_forwarded_for"';

    13   

    14        keepalive_timeout  65;

    15        autoindex on;

    16        include extra/www.conf;

    17        include extra/blog.conf;

    18        include extra/status.conf;

    19   

20   }

####编辑www.confblog.conf的配置文件

[root@oldboy extra]# cat -n www.conf

     1        server {

     2            listen       80;

     3            server_name  www.lzh lzh;

     4            location / {

     5                root   html/www;

     6                index  index.html index.htm;

     7               access_log logs/www_access.log main;

     8            }

     9        }

10  

[root@oldboy extra]# cat -n blog.conf

     1       server {

     2           listen       80;

     3           server_name  blog.lzh;

     4           location / {

     5               root   html/blog;

     6               index  index.html index.htm;

     7              access_log logs/blog_access.log main;

     8           }

     9       }

    10  

q  【检测】

####在未重启nginx服务前

[root@oldboy extra]# ll ../../logs/

总用量 16

-rw-r--r--. 1 root root 4894 4   6 04:59 access.log

-rw-r--r--. 1 root root 3934 4   6 07:33 error.log

-rw-r--r--. 1 root root    6 4   6 04:59 nginx.pid

[root@oldboy extra]# ll ../../logs/

总用量 16

-rw-r--r--. 1 root root 4894 4   6 04:59 access.log

-rw-r--r--. 1 root root    0 4   6 08:04 blog_access.log

-rw-r--r--. 1 root root 3995 4   6 08:04 error.log

-rw-r--r--. 1 root root    6 4   6 04:59 nginx.pid

-rw-r--r--. 1 root root    0 4   6 08:04 www_access.log

5.5.2.6 nginx访问日志切割的配置

q  【切割的脚本】

[root@oldboy scripts]# cat cut_nginx_log.sh

#!/bin/sh

Dateformat=`date +%Y%m%d`

Basedir="/application/nginx"

Nginxlogdir="$Basedir/logs"

Logname="www_access"

[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1

[ -f ${Logname}.log ]||exit 1

/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log

$Basedir/sbin/nginx -s reload

q  【配置定时任务】

[root@oldboy scripts]# crontab -l

#cut nginx access log by lzh

00 00 * * * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1

注意:nginx常用的日志分析工具有rsyslogawstatsflumeELKstom

5.6 Nginx location

5.6.1 location的语法

location [ = | ~ | ~* | ^~ ] uri {

……

}

q  列表说明

location

[   = | ~ | ~* | ^~ ]

uri

......

指令

匹配标识符

匹配的网站网址

匹配URI后要执行的配置段

5.6.2 标识符的说明

q  ~ 用于区分大小写的匹配

q  ~* 用于不区分大小写的匹配

q  ^~ 的作用是在进行常规的字符匹配检查之后,不做正则表达式的检查

5.6.3 不用URI及特殊字符组合匹配的顺序

顺序

不用URI及特殊字符组合匹配

匹配说明

1

location   = / {

精确匹配 /

2

location   ^~ /images/ {

匹配常规字符串 不做正则匹配检查

3

location   ~* \.(gif|jpg|jpeg)$ {

正则匹配

4

location   /documents/ {

匹配常规字符串,如果有正则,则优先匹配正则

5

location   / {

所有location都不匹配后的默认匹配

5.7 Nginx rewrite

q  Nginx rewrite的主要功能就是实现URI地址重写

5.7.1 nginx rewrite 语法

rewrite 正则 [flag]

应用位置;serverlocationif

5.7.2 regex常用正则表达字符串

字符

描述

\

将后面接着的字符标记为一个特殊饿字符或一个原义字符或一个后向引用,例如 \n 匹配换行符 \$ 匹配$

^

匹配输入字符串的起始位置,如果设置了RegExp对象的Multiline属性,^也匹配   \n  r 之后的位置

$

匹配输入字符串的结束位置如果设置了RegExp对象的Multiline属性,^也匹配   \n  r 之前的位置

*

匹配前面的字符0次或多次

+

匹配前面的字符1次或多次

匹配前面的字符0次或1

.

匹配 \n 之外的任何单个字符,要匹配包括\n在内的任何字符 可以使用[.\n]这样的模式

(pattern)

匹配括号内的pattern,并可以在后面获取对应的匹配,常用$0...$9属性获取小括号中匹配的内容

 

5.7.3 rewrite 指令flag的说明

flag标记符号

说明

last

本条规则匹配完成后,继续向下匹配新的locationURI规则

break

本条规则匹配完成后即终止,不在向下匹配

redirect

返回302临时重定向,浏览器中会显示跳转后的URL地址

permanent

返回301永久重定向,浏览器中会显示跳转后的URL地址

5.7.4 企业应用场景

q  可以调整用户浏览的URL,使其看起来更加规范,合乎开发及产品人员的需求

q  将动态URL伪装成静态地址提供服务,可以让搜索引擎收录网站内容

q  网站更换域名后,可以让旧域名的访问跳转到新域名上

q  根据特殊变量、目录、客户端的信息进行URL跳转


转载于:https://blog.51cto/lzhnb/2095335

本文标签: 基础Nginx