初识Nginx
前言
Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆大部分互联网公司都是用Nginx,有的还进行了二次开发来满足自己的需求,比如阿里、腾讯等。
在17年的十月份nginx的主机的市场份额首次超过了Microsoft,上升到第二位。而在前一百万的站点中的市场份额nginx早已遥遥领先其他主机,与Apache的差距不断缩小。
参考数据来自:https://news.netcraft.com/archives/2017/10/26/october-2017-web-server-survey-13.html
Nginx 介绍
Nginx 特性
Nginx在设计上采用了模块化的结构,这是它拥有较好的扩展性。另外内存消耗方面Nginx的表现也非常好,10000个keep-alive连接模式下的非活动连接,仅需要2.5M内存。而且Nginx支持热部署,可以不停机更新配置文件,升级版本,更换日志文件。Nginx的高可靠性也是大多数互联网企业选择它的重要原因。
Nginx 架构
Nginx架构图
Nginx的程序架构:
master/worker结构
一个master进程:
负载加载和分析配置文件、管理worker进程、平滑升级
一个或多个worker进程:
处理并响应用户请求
- 缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
Nginx 安装
yum安装
yum源地址
- 官网yum源
http://nginx.org/packages/centos/6/x86_64/
- 阿里云epel源
https://mirrors.aliyun.com/epel/6/x86_64/
配置好yum源地址,就可以安装nginx了
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/6/x86_64/
gpgcheck=0
enabled=1
安装
yum -y install nginx
编译安装
安装必要的开发包组
yum -y groupinstall "developments tools"
yum -y install pcre-devel openssl-devel
- 创建账号
useradd -r nginx -s /sbin/nologin
- 更改版本名
tar -xf nginx-1.12.2.tar.gz
cd nginx-1.12.2
vim src/http/ngx_http_header_filter_module.c
static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
#Server: nginx 可以通过修改后面的字段,修改版本名
注意:这里修改的版本名,需要在主配置文件中加入server_tokens off;
,这样才会显示此版本名,并且只显示版本名,不能显示版本号。
如果要同时显示版本名和版本号的更改,可以进行以下设置
vim src/core/nginx.h
#define nginx_version 1020001
#define NGINX_VERSION "2.1" #此处更改的是版本号
#define NGINX_VER "Jenginx/" NGINX_VERSION #此处更改版本名
- 创建Makefile文件
./configure \
--prefix=/usr/share/nginx \ #根目录
--sbin-path=/usr/sbin/nginx \ #主程序文件路径
--modules-path=/usr/lib64/nginx/modules \ #模块文件路径
--conf-path=/etc/nginx/nginx.conf \ #配置文件路径
--error-log-path=/var/log/nginx/error.log \ #错误日志文件路径
--http-log-path=/var/log/nginx/access.log \ #http日志文件路径
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \ #客户端主体文件临时存放路径
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \ #http反向代理服务器响应报文临时文件存放路径
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \ #FastCGI反向代理服务器响应报文临时文件存放路径
--pid-path=/run/nginx.pid \ #pid文件路径
--lock-path=/run/lock/subsys/nginx \ #锁文件路径
--user=nginx \ #wroker进程发起者用户名
--group=nginx \ #wroker进程发起者组名
--with-file-aio \ #文件异步存储模块
--with-http_gunzip_module \ #gunzip压缩模块
--with-http_gzip_static_module \ #gzip压缩模块
--with-http_stub_status_module \ #服务器信息显示模块
--with-pcre \ #支持正则匹配模块
--with-stream=dynamic \
--with-stream_ssl_module \
--with-debug
- 编译安装
make && make install
nginx 目录结构
ls /usr/share/nginx/
html是测试页目录
ls /usr/sbin/nginx
nginx 是主程序,只有一个程序文件
ls /usr/share/nginx/html
index.html 测试网页
nginx 命令
- 启动 nginx 服务
nginx
- 停止 nginx 服务
nginx -s stop
- 重新加载配置文件
nginx -s reload
- 在命令行中指明全局指令
nginx -g directives
- 检查配置文件语法
nginx -t
- 查看帮助选项
nginx -h
- 指定配置文件
nginx -c PATH:file (默认:/etc/nginx/nginx.conf)
nginx 配置
配置文件的组成部分:
- 主配置文件:
/etc/nginx/nginx.conf
- 子配置文件:
/etc/nginx/conf.d/*.conf #子配置文件可以自定义
fastcgi, uwsgi, scgi等协议相关的配置文件
mime.types:支持的mime类型
主配置文件的配置指令:
directive value [value2 ...]
注意:
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义set variable_name value;
引用变量: $variable_name
nginx 配置文件
主配置文件结构
main block: #主配置段,即全局配置段,对http,mail都有效
event {
...
} #事件驱动相关的配置
http {
...
} #http/https 协议相关配置段
mail {
...
} #mail 协议相关配置段
stream {
...
} #stream 服务器相关配置段
http相关配置
http {
...
... #各server的公共配置
server { #每个server用于定义一个虚拟主机
...
}
server {
...
server_name #虚拟主机名
root #主目录
alias #路径别名
location [OPERATOR] URL {
指定URL的特性
...
if CONDITION {
...
}
}
}
}
- Main 全局配置段常见的配置指令分类
- 正常运行必备的配置
- 优化性能相关的配置
- 用于调试及定位问题相关的配置
- 事件驱动相关的配置
正常运行必备的配
- user
Syntax: user user [group];
Default: user nobody nobody;
Context: main
指定worker进程的运行身份,如组不指定,默认和用户名同名
- pid /PATH/TO/PID_FILE
指定存储nginx主进程PID的文件路径
- include file | mask
指明包含进来的其它配置文件片断
- load_module file
模块加载配置文件: /usr/share/nginx/modules/*.conf
指明要装载的动态模块路径: /usr/lib64/nginx/modules
性能优化相关的配置
1、worker进程的数量;通常应该为当前主机的cpu的物理核心数
worker_processes number | auto
2、worker进程和CPU绑定,提高缓存命中率
worker_cpu_affinity cpumask ...
worker_cpu_affinity auto [cpumask]
例如:
# 4颗CPU,启动4个worker进程,将每个进程分别与CPU0, CPU1, CPU2, CPU3绑定
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
# 4颗CPU,启动2个worker进程,第一个进程绑定到CPU0/CPU2上,第二个进程绑定到CPU1/CPU3上
worker_process 2;
worker_cpu_affinity 0101 1010;
#自动绑定
worker_process auto;
worker_cpu_affinity auto;
3、指定worker进程的nice值,设定worker进程优先级: [-20,20]
worker_priority number
4、worker进程所能够打开的文件数量上限,如65535
worker_rlimit_nofile number
事件驱动相关的配置:
events {
...
}
1、每个worker进程所能够打开的最大并发连接数数量,如:10240总最大并发数: worker_processes * worker_connections
worker_connections number
2、指明并发连接请求的处理方法,默认自动选择最优方法
use method
# example
use epoll;
3、处理新的连接请求的方法; on指由各个worker轮流处理新请求, Off指每个新请求的到达都会通知(唤醒)所有的worker进程,但只有一个进程可获得连接,造成“惊群”,影响性能,默认on
accept_mutex on | off
调试和定位问题
1、是否以守护进程方式运行nignx,默认是守护进程方式
daemon on|off
2、是否以master/worker模型运行nginx;默认为on,off 将不启动worker
master_process on|off
3、错误日志文件及其级别;出于调试需要, 可设定为debug;但debug仅在编译时使用了“–with-debug”选项时才有效
error_log file [level]
#设置log文件 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 {
…
}
}