一、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
检查语法,重启生效。