nginx介绍
nginx: engine X,是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间是2004年10月4日,版本号是0.1.0
nginx有商业版和社区版,2019年3月11日F5 Networks 6.7亿美元的价格收购
nginx 是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器
官网:http://nginx.org
nginx的其它的二次发行版:
Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。从2011年12月开始,Tengine成为一个开源项目
官网 http://tengine.taobao.org/
OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春
官网:http://openresty.org/cn/
基本功能:
静态资源的web服务器
http协议反向代理服务器
pop3/imap4协议反向代理服务器
FastCGI(LNMP),uWSGI(python)等协议
模块化(非DSO),如zip,SSL模块
特性:
模块化设计,较好的扩展性
高可靠性
支持热部署:不停机更新配置文件,升级版本,更换日志文件
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
event-driven,aio,mmap,sendfile
web服务相关的功能:
虚拟主机(server)
支持 keep-alive 和管道连接( 共享TCP连接发起并发的HTTP请求)
访问日志(支持基于日志缓冲提高其性能)
url rewrite
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached 的 GET 接口
nginx的程序架构
master/worker结构
一个master进程:
负载加载和分析配置文件、管理worker进程、平滑升级
一个或多个worker进程:
负责处理并响应用户请求
缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载
模块分类
核心模块:core module
标准模块:
HTTP 模块: ngx_http_*
HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定
Mail 模块 ngx_mail_*
Stream 模块 ngx_stream_*
第三方模块
各类模块的作用
核心模块是 Nginx 服务器正常运行 必不可少 的模块,提供 错误日志记录 、配置文件解析 、 事件驱动机制 、 进程管理 等核心功能
标准HTTP模块提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
可选HTTP模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、IMAP 协议和 SMTP协议的支持
第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如:Json 支持、 Lua 支持等
nginx的功用
1.静态的web资源服务器,例如html,图片,js,css,txt等静态资源
2.结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
3.http/https协议的反向代理
4.imap4/pop3协议的反向代理
5.tcp/udp协议的请求转发(反向代理)
nginx编译示例
安装开发相关包组
yum install gcc pcre-devel openssl-devel zlib-devel -y
创建用户
useradd -r -s /sbin/nologin nginx
开始编译步骤
./configure --prefix=/app/nginx \
--conf-path=/app/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_dav_module \
--with-http_stub_status_module \
--with-threads \
--with-file-aio
make -j 2 && make install
nginx:默认为启动nginx
-h 查看帮助选项
-V 查看版本和配置选项
-t 测试nginx语法错误
-c filename 指定配置文件(default: /etc/nginx/nginx.conf)
-g directives 在命令行中指明全局指令
-s signal 发送信号给master进程,signal:stop, quit, reopen, reload
示例:
nginx -s stop 停止nginx
nginx -s reload 加载配置文件
nginx配置文件介绍
配置文件的组成部分:
主配置文件:nginx.conf
子配置文件 include conf.d/*.conf
fastcgi, uwsgi,scgi等协议相关的配置文件
mime.types:支持的mime类型
主配置文件的配置指令:
directive value [value2 …];
注意:指令必须以分号结尾,支持使用配置变量
内建变量:
由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义
set variable_name value;
引用变量:
$variable_name
主配置文件结构:四部分
main block:主配置段,即全局配置段,对http,mail都有效
事件驱动相关的配置
event {
…
}
http/https 协议相关配置段
http {
…
}
mail 协议相关配置段
mail {
…
}
stream 服务器相关配置段
stream {
…
}
http {
各server的公共配置
...
...
server { 每个server用于定义一个虚拟主机
...
}
server {
server_name 虚拟主机名
root 主目录
alias 路径别名
location [OPERATOR] URL { 指定URL的特性
if CONDITION {
...
}
}
}
}
Main 全局配置段常见的配置指令分类
总共有4部分:
正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
事件驱动相关的配置
正常运行必备的配置
user
指定worker进程的运行身份,如组不指定,默认和用户名同名
Syntax: user user [group];
Default: user nobody nobody;
Context: main
pid /PATH/TO/PID_FILE;
指定存储nginx主进程PID的文件路径
include file | mask;
指明包含进来的其它配置文件片断
load_module file ;
模块加载配置文件: /usr/share/nginx/modules/*.conf
指明要装载的动态模块路径: /usr/lib64/nginx/modules
性能优化相关的配置
worker_processes number | auto;
worker进程的数量;通常应该为当前主机的cpu的物理核心数
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;
worker_priority number;
指定worker进程的nice值,设定worker进程优先级:[-20,20]
worker_rlimit_nofile number;
所有worker进程能打开的文件数量上限,最好与ulimit -n 的值保持一致,如65535
事件驱动相关的配置
events {
…
}
worker_connections #;
每个worker进程所能够打开的最大并发连接数,如10240总最大并发数:worker_processes * worker_connections
use method;
指明并发连接请求的处理方法,默认自动选择最优方法
示例:use epoll;
accept_mutex on | off;
处理新的连接请求的方法;on指由各个worker轮流处理新请求,Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能,默认值为off,可优化为on
multi_accept on|off;
此指令默认为off,即默认为一个worker进程只能一次接受一个新的网络连接, on表示每个woker进程可以同时接受所有新的网络连接
调试和定位问题
1、daemon on|off;
是否以守护进程方式运行,默认是on,即守护进程方式,off 用于调试或docker环境
2、master_process on|off;
是否以master/worker模型运行nginx,默认为on,当指定off 将不启动worker
3、error_log file [level] ;
错误日志文件及其级别;出于调试需要,可设定为debug;但debug仅在编译时使用了“–with-debug”选项时才有效
/path/logfile: 记录到文件中
stderr: 发送到标准错误
syslog:server-address[,parameter=values] 发送到syslog
memory:size 内存
level:debug|info|notice|warn|error|crit|alter|emerg 日志级别