Nginx重点知识

一、Nginx 介绍
1、简介
Nginx具有高度并发(特别是静态资源)、占用系统资源少等特性,且功能丰富。
Nginx 不但是一个优秀的Web服务软件,还具有反向代理负载均衡功能和缓存服务功能。它类似于大名鼎鼎的LVS负载均衡及Haproxy等专业代理软件,但是Nginx部署起来更为简单、方便;在缓存服务功能方面,它又类似于Squid等专业的缓存服务软件。
 
2、Nginx 重要特性
 • 静态资源高速高并发访问及缓存
 • 反向代理加速,数据缓存
 • 简单负载均衡,节点健康检查容错功能
 • FastCGI服务的缓存加速
 • 支持FastCGI,Uwsgi,SCGI,Memcached Servers的加速和缓存
 • 支持SSL,TLS,SNI
 •具有模块化结构:过滤器包括gzip压缩,ranges支持,chunked响应,XSLT,SSL及图像缩放等功能。在SSI过滤器中,一个包含多个SSI的页面,如果经由FastCGI或反向代理处理,可被并行处理。
 
3、WWW 服务特性
 • 支持基于名字,端口及ip的多虚拟主机站点
 • 支持keep-alive 和 pipelined 连接
 • 可进行简单,方便,灵活的配置和管理
 • 支持修改nginx配置时平滑重启,不影响线上业务
 • 可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志
 • 可利用信号控制nginx进程
 • 支持3xx-5xx HTTP状态码重定向
 • 支持rewrite模块,支持URI重写及正则表达式匹配
 • 基于客户端ip地址和HTTP基本认证的访问控制
 • 支持PUT,DELETE,MKCOL,COPY,MOVE等特殊的HTTP请求方法
 • 支持FLV流和MP4流产品应用
 • 支持HTTP响应速率限制
 • 支持同一IP地址并发连接或请求数限制
 • 支持邮件代理服务
 
4、Nginx 重点
 • 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)
 • 资源消耗少:在3万并发连接下,开启10个nginx线程消耗的内存不到200MB
 •可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能
 • 具备Squid等专业缓存软件等的缓存功能
 • 支持异步网络I/O时间模型epoll
 
5、Nginx 企业中应用
 • WEB服务软件
·运行HTML、JS、CSS、小图片等静态数据
·结合FastCGI运行PHP 等动态程序(例如使用fastcgi_pass方式)
·结合Tomcat/Resin等支持Java 动态程序(常用proxy_pass方式)
 • 反向代理负载均衡(upstream)
 • 前端数据缓存 (proxy-cache模块)
 
6、Nginx 与其他 Web软件产品对比
 • apache软件的特点:
·Apache2.2版本非常稳定强大,性能好。
·prefork模式取消了进程开销
·处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在Apache上
·高并发时消耗资源相对多一些
·基于传统的select模型,高并发能力有限
·支持扩展库,可以通过DSO、apxs方法编译安装额外的插件功能,不需要重新编译Apache
·功能多,更稳定,更安全,插件也多
·市场份额逐渐递减
 •处理静态小文件(小于1Mb),nginx比Apache和Lighttpd更有优势,处理动态文件时Apache更有优势,但是差距不大。这是因为处理动态数据的能力取决于PHP(java)和后端数据库的服务能力,也就是说瓶颈不在web服务器上,一般情况下普通的PHP引擎支持的并发连接参考值为300~1000,java引擎和数据库的并发连接参考值为300~1500。
 •nginx使用最新的epoll和kqueue(freebsb)异步网络I/O模型,而Apache使用的是传统的select模型,异步的安全性、稳定性没有同步高,中间容易被人窃取,用户收不到数据
 • select和epoll的释义:
·select:
性能:随着连接数的增加而急剧下降。处理成千上万的并发连接数时,性能很差。
连接数:连接数有限制,处理最大连接数不超过1024.如果超过1024那么就要修改FD_SETSIZE宏,并重新编译。
内在处理机制:性能轮询
开发复杂性:低
·epoll
性能:随着连接数的增加,性能基本没有下降,处理成千上万的并发连接数时,性能好
连接数:连接数无限制
内在处理机制:回调callback
开发复杂性:中
 
7、选用web
 • 静态业务:若是高并发场景,尽量采用nginx或Lighttpd,首选nginx
 •动态业务:理论上采用nginx和Apache均可,为了避免相同业务服务软件多样化,增加维护成本
 • 既有动态又有静态:选用nginx
 
二、Nginx 安装
1、安装nginx有3种方法:
 • rpm –ivh ngin*.rpm(有依赖问题)
 • yum(自动解决rpm的安装依赖问题,安装简单化,缺点:不能定制)
 • make编译安装(./configure(配置),make(编译),makeinstall(安装),缺点:复杂,效率低)
 
2、YUM安装:
2.1、更换国内的yum源
 • CentOS 5
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo
 • CentOS 6
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
 • CentOS 7
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2.2、安装阿里云的epol源
 • 备份epel.repo源
# mv/etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
# mv/etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
 • epel(RHEL 7)
#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
 • epel(RHEL 6)
#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
 • epel(RHEL 5)
#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-5.rep
2.3、配置安装nginx的yum源
# cd /etc/yum.repos.d/
# vimnginx.repo,填写如下内容:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
 
3、编译安装步骤
3.1、安装nginx需要的pcre库
# yum install pcrepcre-devel -y
安装pcre库是为了是nginx支持具备URI重写功能的rewrite模块,不安装那就无法使用rewrite模块的功能。基本上rewrite功能是企业必须的。
3.2、安装openssl-devel
# yum -y installopenssl openssl-devel
3.3、开始安装nginx
# mkdir /application
# wget http://nginx.org/download/nginx-1.12.2.tar.gz
# tar xfnginx-1.12.2.tar.gz
# useradd www -M -s/sbin/nologin
# cd nginx-1.12.2
# ./configure --help
# ./configure--prefix=/application/nginx-1.12.2 --user=www --group=www--with-http_ssl_module --with-http_stub_status_module
# make
# make install
# ls/application/nginx-1.12.2/
auto  CHANGES CHANGES.ru  conf  configure contrib  html  LICENSE Makefile  man  objs README  src
# ln -s/application/nginx-1.12.2/ /application/nginx
# mkdir logs
#/application/nginx/sbin/nginx
3.4、验证安装结果
 • 检查语法
#/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx-V        #显示编译参数
/application/nginx/sbin/nginx-h        #man帮助
 • 启动nginx服务
#/application/nginx/sbin/nginx
 • 查看服务对应的端口是否成功开启
# netstat -tunlp|grep80
tcp        0     0 0.0.0.0:80                 0.0.0.0:*                   LISTEN      12742/nginx     
#  ps -ef|grep nginx
root     12742    1  0 12:55 ?        00:00:00 nginx: master process/application/nginx/sbin/nginx
www      12743 12742  0 12:55 ?        00:00:00 nginx: worker process       
root     12749 2485  0 12:58 pts/0    00:00:00 grep nginx
# lsof -i:80
COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF NODENAME
nginx   12742 root   6u  IPv4  24891     0t0  TCP *:http (LISTEN)
nginx   12743 www    6u  IPv4 24891      0t0  TCP *:http (LISTEN)
 • 结果:用浏览器输入192.168.10.3 看到 Welcome to nginx!就是成功了。
 
4、安装目录信息
# tree/application/nginx-1.12.2/
/application/nginx-1.12.2/
├── client_body_temp
├── conf                                  #Nginx所有配置文件的目录
│   ├── fastcgi.conf                      # fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default                # fastcgi.conf的原始备份文件
│   ├── fastcgi_params                     # fastcgi的参数文件
│   ├── fastcgi_params.default              # 所有结尾为default的文件都是备份文件
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                        # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                        # Nginx主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                        # scgi相关参数文件
│   ├── scgi_params.default
│   ├── uwsgi_params                     # uwsgi相关参数文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                         # fastcgi临时数据目录
├── html                                    # Nginx默认站点目录
│   ├── 50x.html              #错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│   └── index.html                           # 默认的首页文件
├── logs                                      # Nginx日志目录
│   ├── access.log                          # 访问日志文件
│   ├── error.log                          # 错误日志文件
│   └── nginx.pid               #pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp                            # 临时目录
├── sbin                                    # Nginx命令目录
│   └── nginx                               # Nginx的启动命令
├── scgi_temp                             # 临时目录
└── uwsgi_temp                          # 临时目录
 
5、编译安装nginx参数详解
编译安装nginx软件时。可以使用./configure--help查看相关参数帮助。
--prefix                                        #设置安装路径
--user=USER                              #进程用户权限
--group=GROUP                         #进程用户组权限
--with-http_stub_status_module      #激活状态信息
--with-http_ssl_module                    #激活ssl功能
 
6、Nginx http 功能模块
Nginx http 功能模块                #模块说明
ngx_http_core_module             #包括一些核心的http参数配置对应的配置为http区块部分
ngx_http_access_module                 #访问控制模块,用来控制网站用户对Nginx的访问
ngx_http_gzip_module                #压缩模块,对Nginx返回的数据压缩,属于性能优化模块
ngx_http_fastcgi_module            #FastCGI模块,和动态应用相关的模块,例如PHP
ngx_http_proxy_moduleproxy     #代理模块
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_moduleweb   #认证模块,设置web用户通过账号、密码访问Nginx
ngx_http_ssl_module                   #ssl模块,用于加密的http连接,如https
ngx_http_stub_status_module     #记录Nginx基本访问状态信息等的模块
 
7、nginx.conf 配置信息详解
# egrep -v '#|^$'nginx.conf
worker_processes  1;                               #work进程的数量
events {                                            #事件区块开始
    worker_connections  1024;                          #每个worker进程支持的最大连接数
}                                                    #事件区块结束
http {                                             #http区块开始
    include       mime.types;                   #nginx支持的媒体类型库文件
    default_type  application/octet-stream;     #默认的媒体类型
    sendfile        on;                            #开启高效的传输模式
    keepalive_timeout  65;                      #连接超时
 include  path/*.conf;                          #如果server标签过多可以摘出去,到任何路径下
    server {                                #第一个server区块开始,表示一个独立的虚拟主机站点
        listen       80;                           #提供服务的端口,默认是80
        server_name  localhost;                     #提供服务的域名主机名
        location / {                                #第一个location区块开始
            root   html;                         #站点的根目录,相当于nginx安装目录
            index  index.html index.htm;      #默认的首页文件,如果没有首页文件报403,报403的除了添加首页文件的另一个解决方法,在这放置autoindex on
        }                                        #第一个location区块结束
        error_page   500 502 503 504  /50x.html;  #出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html {                   #location区块开始,访问50x.html
            root   html;                           #指定站点目录html
        }
    }
}                                                #http区块结束
 
三、nginx虚拟主机配置
1、虚拟主机
  所谓的虚拟主机,在web访问里就是一个独立的网站站点,这个站点对应独立的域名(也可能是IP或端口),具有独立的程序和目资源录,可以独立的对外提供服务供用户访问。
  这个独立的站点在配置里由一定的格式的标签段标记的。在nginx软件里是使用一个server{}标签来标识一个虚拟主机,一个web服务里可以有多个虚拟主机,即可以支持多个虚拟主机站点。
 
2、虚拟主机类型
2.1、域名(应用层)
企业外网场景,通过不同的域名区分不同的虚拟主机,企业应用最广的类型
 • 配置基于域名的nginx.conf内容
# egrep -v '#|^$'nginx.conf.default >nginx.conf
# cat 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.wuyutang.top;
        location / {
            root   html;            
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
 • 检查语法重新加载
#/application/nginx/sbin/nginx -t
#/application/nginx/sbin/nginx -s reload
2.2、端口(传输层)
公司后台,测试场景,内部服务。这类虚拟主机主要是针对企业内部网站,一些不希望直接对外提供用户访问的网站后台
# cat 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.wuyutang.top;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
   }
    server {
        listen       81;
        server_name  bbs.wuyutang.top;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
   }
    server {
        listen       82;
        server_name  blog.wuyutang.top;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
   }
}
2.3、IP(网络层)
 • 网卡上增加IP
·法一:
# ip addr add10.0.0.3/24 dev eth0 label eth0:3
# ip addr add10.0.0.4/24 dev eth0 label eth0:4
·法二:
# ifconfig eth0:010.0.0.101/24 up
# cat 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.8:80;
        server_name  www.wuyutang.top;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
   }
    server {
        listen       10.0.0.3:81;
        server_name  bbs.wuyutang.top;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
   }
    server {
        listen       10.0.0.4:82;
        server_name  blog.wuyutang.top;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
   }
}
 
3、nginx状态信息功能
也就是新添加一个server标签打开stub_statuson;,编译安装nginx的时候的参数--with-http_stub_status_module
server {
        listen       80;
        server_name  status.wuyutang.top;
        location / {
          stub_status on;
          access_log off;
        }
    }
浏览器访问 status.wuyutang.top 查看状态信息。
或者在server块下面加上如下配置:
location/nginx_status {
stub_status  on;
access_log    off;
#allow127.0.0.1;允许哪个ip可以访问
}
# nginx -s reload
在浏览器中输入"域名/nginx_status" 就会显示nginx上次启动以来工作状态的统计的结果。
 
4、nginx访问日志
4.1、日志配置
server {
        listen       80;
        server_name  blog.wuyutang.top;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
        access_log  logs/access.log  [format buffer=size [flush=time]]  main;
   }
 • 注意
       1.这行配置中的main是http标签中配置的log_format后面的main对应的格式,可以多个格式,方便使用.
       2. 配置行的[]括号内的选项是可选的,配置缓存,防止高并发的大量IO
       3. format gzip[=level]
 • 错误日志级别
default:error_log     logs/error.log      level;
         关键配置    日志文件            错误日志级别[debug|info|warn|error|alert|notice|crit|emerg]
生产场景一般用warn|error|crit三个级别
 • 标签端的配置
  main,http,server,location
4.2、nginx日志变量说明
 • 日志格式
http {
    log_format main  '$remote_addr - $remote_user[$time_local] "$request" '
                                 '$status$body_bytes_sent "$http_referer" '
                               '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log logs/access.log main;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include extra/*.conf;
}
 • 日志变量参数详解:
nginx日志变量                        说明
$remote_addr                记录访问网站客户端地址
$remote_user                远程客户端用户名称
$time_local                访问时间和时区
$request                用户的http请求的起始行信息
$status                        http状态码,记录请求返回的状态
$body_bytes_sent        服务器发送给客户端的响应body字节数
$http_referer                此链接是从哪个连接访问过来的
$http_user_agent        记录客户端的访问信息
$http_x_forwarded_for        当前有代理服务器时,设置了web节点机理客户端地址的配置
4.3、nginx 访问日志切割
# mv access.log $(date+%F -d "-1day")_access.log
#/application/nginx/sbin/nginx -sreload                        #重新启动就会重新生成access.log文件,然后写定时任务。
 • 使用定时任务加脚本的形式:
# crontab -l
  ################ timesync
  */5 * * * */usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
  ################ catnginx access.log
  00 00 * * * /bin/sh/server/scripts/cut_log.sh >/dev/null 2>&1
# vim cut_log.sh
#!/bin/bash
cd/application/nginx/logs &&\
mvaccess.log $(date +%F -d "-1day")_access.log
/application/nginx/sbin/nginx-s reload
Nginx常用日志收集及分析工具有rsyslog、awstats、flume、ELK(Elasticsearchlogstash Kibana)、storm等。
 
5、nginx location
 • 作用:是根据用户请求的URI来执行不同的应用
 • 语法:location { = | ~ | ~* | ^~ } uri {
  …
  }
 • 注意:   = 精确匹配,~区分大小写,~*不区分大小写,!匹配取反,^~在常规字符串检查之后,不做正则表达式的检查
    URI是关键部分,可以是普通字符串地址路径,或者是正则表达式
 • location示例:
server {
        listen       80;
        server_name  blog.wuyutang.top;
        location / {
           return 401;
        }
        location = / {
            return 402;
        }
        location /documents/ {
            return 403;
        }
        location ^~ /images/ {
            return 404;
        }
        location ~* \.(gif|jpg|jpeg)$ {
            return 500;
        }
   }
检查语法,重启生效。
实验返回状态码:
  # curl -s -o/dev/null -I -w "%{http_code}\n" http://blog.wuyutang.top/
  # curl -s -o/dev/null -I -w "%{http_code}\n" http://www.wuyutang.top/images/
参数解释:-s静默,-o不输出,-I请求头,-w"%{http_code}\n"状态码
“location = / {”                                精确匹配
“location ^~ /images/ {”                匹配常规字符串,不做正则匹配检查
“location ~*\.(gif/jpg/jpeg)$ { ”        正则匹配
“location /documents/ {”                路径匹配
“location / {”                                所有location都不能匹配后的默认匹配
 
6、nginx rewrite
 • rewrite用法
  和Apache等的web服务软件一样,nginxrewrite的主要功能也是实现URL地址重写,nginx的rewrite规则需要PCRE软件的支持,通过Perl兼容正则表达式语法进行规则匹配。
 • rewrite指令语法:
  rewrite regexreplacement [flag]
默认值:none    应用位置:server、location、if
例子:rewrite ^/(.*) http://www.wuyutang.top/$1 permanent;
server标签下:
  直接rewrite ^/(.*) http://www.wuyutang.top/$1permanent;
 • 正则表达式
字符                描述
\        将后面的字符标记为一个特殊字符或一个后项引用,例:\\和\n匹配换行符
^        匹配输入字符串的起始位置
$        匹配输入字符串的结束位置
*        匹配前面字符0次或多次,例:ol*匹配“o”或者“olllll”
+        匹配前面字符1次或多次,例:ol*匹配“ol”或者“olllll”
?        匹配前面字符0次或1次
.        匹配除‘\n’之外的任何单个字符
(pattern)        匹配括号内得pattern,并且在后面获取对应的匹配,会后项通过$1~n引用
 • flag标记的说明
flag标记符号                说明
last                本条规则匹配完成后,继续向下匹配新的locationURI规则
break                本条规则匹配完成即终止,不再匹配后面的任何规则
redirect        返回302临时重定向,浏览器地址栏会显示跳转后的URL地址
permanent        返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
##rewrite ^(.*)/bbs/ h有关rewrite特殊flag标记last与break的说明:
在根location中或者server标签中编写rewrite规则,建议使用last标记,而在普通的location或if{}中编写rewrite规则,则建议使用break标记。
注意:
last和break用来URL重写,浏览器的URL地址不变,
redirect和permanent用来实现URL跳转,浏览器的URL地址显示跳转后的地址
 
7、nginx 访问认证
示例:
  location / {
   auth_basic           "accessauthentication";             #这是个提示
   auth_basic_user_file/application/nginx/conf/htpasswd;  #认证读取的文件
  }
创建账号密码:此账号就是登陆时需要的
# htpasswd -cb/application/nginx/conf/htpasswd tang 123456
  Adding password foruser tang
# chmod 400/application/nginx/conf/htpasswd
# chown www/application/nginx/conf/htpasswd
检查语法,重启生效。