nginx概述
nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。
这里主要通过三个方面简单介绍nginx
反向代理
负载均衡
nginx特点
正向代理
说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们会从两个方面来说关于正向代理的处理模式,分别从软件方面和生活方面来解释一下什么叫正向代理
在如今的网络环境下,我们如果由于技术需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,此时大家可能都会用一个操作FQ进行访问,FQ的方式主要是找到一个可以访问国外网站的代理服务器,我们将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们!
上述这样的代理模式称为正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
反向代理
明白了什么是正向代理,我们继续看关于反向代理的处理方式,举例如我大天朝的某宝网站,每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署;也就是通过部署多台服务器来解决访问人数限制的问题;某宝网站中大部分功能也是直接使用nginx进行反向代理实现的,并且通过封装nginx和其他的组件之后起了个高大上的名字:Tengine,有兴趣的童鞋可以访问Tengine的官网查看具体的信息:http://tengine.taobao.org/ 通过上述的图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色
反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!
2. 负载均衡
我们已经明确了所谓代理服务器的概念,那么接下来,nginx扮演了反向代理服务器的角色,它是以依据什么样的规则进行请求分发的呢?不用的项目应用场景,分发的规则是否可以控制呢?
这里提到的客户端发送的、nginx反向代理服务器接收到的请求数量,就是我们说的负载量
请求数量按照一定的规则进行分发到不同的服务器处理的规则,就是一种均衡规则
所以~将服务器接收到的请求按照规则分发的过程,称为负载均衡。
特性:
1模块化设计,较好的扩展性 2高可靠性 3支持热部署:不停机更新配置文件,升级版本,更换日志文件 4低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存 5event-driven,aio,mmap,sendfile
基本功能:
1静态资源的web服务器 2http协议反向代理服务器 3pop3/imap4协议反向代理服务器 4FastCGI(LNMP),uWSGI(python)等协议 5模块化(非DSO),如zip,SSL模块
nginx的程序架构
web服务相关的功能:
虚拟主机(server)
支持 keep-alive 和管道连接
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached 的 GET 接口
master/worker结构
1一个master进程:
负载加载和分析配置文件、管理worker进程、平滑升级
2一个或多个worker进程
处理并响应用户请求
3缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
### nginx模块
1nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载
模块分类:
1核心模块:core module 2标准模块: • HTTP 模块: ngx_http_* HTTP Core modules 默认功能 HTTP Optional modules 需编译时指定 • Mail 模块 ngx_mail_* • Stream 模块 ngx_stream_* 3 第三方模块
1核心模块:是 Nginx 服务器正常运行 必不可少 的模块,提供 错误日志记录 、配置文件解析 、 事件驱动机制 、 进程管理 等核心功能
2标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
3可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊
的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全
协议 SSL 支持等
4邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、
IMAP 协议和 SMTP协议的支持
5第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如:Json 支持、 Lua 支持等
nginx的功用
1 静态的web资源服务器 html,图片,js,css,txt等静态资源 2 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求 3 http/https协议的反向代理 4 imap4/pop3协议的反向代理 5 tcp/udp协议的请求转发(反向代理)
nginx目录结构和命令
1 ls /usr/local/nginx/
html是测试页,sbin是主程序
2 ls /usr/local/nginx/sbin/
nginx 只有一个程序文件
3 ls /usr/local/nginx/html/
50x.html index.html 测试网页
Nginx:默认为启动nginx
-h 查看帮助选项
-V 查看版本和配置选项
-t 测试nginx语法错误
-c filename 指定配置文件(default: /etc/nginx/nginx.conf)
-s signal 发送信号给master进程,signal:stop, quit, reopen, reload
示例: nginx -s stop 停止nginx
nginx -s reload 加载配置文件
-g directives 在命令行中指明全局指令
nginx配置
1 配置文件的组成部分: 主配置文件:nginx.conf 子配置文件 include conf.d/*.conf fastcgi, uwsgi,scgi等协议相关的配置文件 mime.types:支持的mime类型 2 主配置文件的配置指令: directive value [value2 ...]; 注意: (1) 指令必须以分号结尾 (2) 支持使用配置变量 内建变量:由Nginx模块引入,可直接引用 自定义变量:由用户使用set命令定义 set variable_name value; 引用变量:$variable_name
#### 主配置文件结构:四部
1 main block:主配置段,即全局配置段,对http,mail都有效
event {
...
} 事件驱动相关的配置
2 http {
...
} http/https 协议相关配置段
3 mail {
...
} mail 协议相关配置段
4 stream {
...
} stream 服务器相关配置段
#### http协议相关的配置结构
http {
...
... 各server的公共配置
server { 每个server用于定义一个虚拟主机
...
}
server {
...
server_name 虚拟主机名
root 主目录
alias 路径别名
location [OPERATOR] URL { 指定URL的特性
...
if CONDITION {
...
}
}
}
}
nginx配置
Main 全局配置段常见的配置指令分类
1正常运行必备的配置
2优化性能相关的配置
3用于调试及定位问题相关的配置
4事件驱动相关的配置
5帮助文档
http://nginx.org/en/docs/
正常运行必备的配置:
1、user
指定worker进程的运行身份,如组不指定,默认和用户名同名
Syntax: user user [group];
Default: user nobody nobody;
Context: main
2、pid /PATH/TO/PID_FILE;
指定存储nginx主进程PID的文件路径
3、include file | mask;
指明包含进来的其它配置文件片断
4、load_module file ;
模块加载配置文件: /usr/share/nginx/modules/*.conf
指明要装载的动态模块路径:/usr/lib64/nginx/modules
性能优化相关的配置:
1、worker_processes number | auto
worker进程的数量;通常应该为当前主机的cpu的物理核心数
2、worker_cpu_affinity cpumask ...
worker_cpu_affinity auto [cpumask] 提高缓存命中率
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:7号CPU
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;
3、worker_priority number
指定worker进程的nice值,设定worker进程优先级:[-20,20]
4、worker_rlimit_nofile number
worker进程所能够打开的文件数量上限,如65535
事件驱动相关的配置:
events {
...
}
1、worker_connections number
每个worker进程所能够打开的最大并发连接数数量,如10240
总最大并发数:worker_processes * worker_connections
2、use method
指明并发连接请求的处理方法,默认自动选择最优方法
use epoll;
3、accept_mutex on | off 互斥
处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能
调试和定位问题:
1、daemon on|off
是否以守护进程方式运行nignx,默认是守护进程方式
2、master_process on|off
是否以master/worker模型运行nginx;默认为on
off 将不启动worker
3、error_log file [level]
错误日志文件及其级别;出于调试需要,可设定为debug;但debug仅在编译时使用了“--with-debug”选项时才有效
方式:file /path/logfile;
stderr:发送到标准错误
syslog:server-address[,parameter=values]:发送到syslog memory:size 内存
level:debug|info|notice|warn|error|crit|alter|emerg
http协议的相关配置:
http {
... ...
server {
...
server_name
root
location [OPERATOR] /uri/ {
...
}
}
server {
...
}
}