文章目录
四. nginx介绍
apache用的io模
型是select
nginx用的是epool
所以nginx优于apache
nginx有商业版和社区版
nginx 是免费,开源,高性能的HTTP和反向代理服务器
,邮件代理服务器,通用TCP/UDP代理服务器
解决C10K问题(10K Connections)
官网:http://nginx.org
nginx的其它的二次发行版:
Tengine
:由淘宝网发起的Web服务器项目
。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。
Tengine
成为一个开源项目
,官网 http://tengine.taobao.org/
OpenResty
:基于 Nginx 与 Lua 语言的高性能 Web 平台,
官网:http://openresty.org/cn/
特性:
1.模块化设计,较好的扩展性
2.高可靠性
3.支持热部署
:不停机更新配置文件
,升级版本,更换日志文件
4.低内存消耗
:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
5.event-driven,aio,mmap,sendfile
基本功能:
1.静态资源的web服务器
2.http协议反向代理服务器
3.pop3/imap4协议反向代理服务器
4.FastCGI(LNMP),uWSGI(python)等协议
5.模块化(非DSO‘动态模块’),如zip,SSL模块
nginx架构
nginx的程序架构
web服务相关的功能:
虚拟主机(server)
支持 keep-alive
和管道连接( 共享TCP连接发起并发的HTTP请求)
访问日志(支持基于日志缓冲提高其性能)
url rewrite
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
Memcached 的 GET 接口
nginx的程序架构:
master/worker结构
不需要线程
-
一个master进程:
负责加载和分析配置文件、管理worker进程、平滑升级 -
一个或多个worker进程(与cpu内核相关)
处理并响应用户请求 -
缓存相关的进程:
cache loader:载入缓存对象
cache manager:管理缓存对象
nginx模块
nginx高度模块化,但其模块早期不支持DSO
机制;1.9.11版本支持动态装载和卸载
在http://nginx.org/en/dosc/下面查看
模块分类:
- 核心模块: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的功功能
有状态:https
无状态:http静态
- 静态的web资源服务器
html,图片,js,css,txt等静态资源 - 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
- http/https协议的反向代理
- imap4/pop3协议的反向代理
- tcp/udp协议的请求转发(反向代理)
虚拟主机(server)
支持 keep-alive 和管道连接(利用一个连接做多次请求)
访问日志(支持基于日志缓冲提高其性能)
url rewirte
路径别名
基于IP及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
主进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本
工作进程
接受处理客户的请求
将请求以此送入各个功能模块进行处理 IO调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等
nginx的安装
官方yum源:
http://nginx.org/packages/centos/7/x86_64/
官方的nginx的epel源
http://nginx.org/en/linux_packages.html#RHEL-CentOS
首先全装 yum-utils
Fedora-EPEL源:
https://mirrors.aliyun.com/epel/7/x86_64/
下载包
http://nginx.org
编译安装:
建议编译安装中的参数尽量与之前nginx的参数
一样-V
yum install gcc pcre-devel openssl-devel zlib-devel -y
useradd -r -s /sbin/nologin nginx -u 2000
tar xvf nginx.tar.gz
mkdir -p /apps/nginx
chown nginx.nginx /apps/nginx -R
cd nginx/
./configure --prefix=/apps/nginx \
--conf-path=/etc/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 && make install
示例
wget 网络
tar xvf 包
useradd -r -s /sbin/nologin nginx -u 2000
chown nginx.nginx /data /apps/nginx -R
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
make && make install
可以创建软连接
创建一个软连接
ln -s /apps/nginx/sbin/nginx /usr/sbin/
这样就可以用nginx 启动服务
nginx
也可以复制服务脚本
将另一台yum安装的service文件拷贝过来
scp /usr/lib/systemd/system/nginx.service 192.168.245.72:/usr/lib/systemd/system/nginx.service
修改里面的配置
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/apps/nginx/sbin/nginx -t
ExecStart=/apps/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
注意:配置文件
启动服务systemctl start nginx
一般会直接启用主进程 nginx 来启动服务
重点------- nginx命令
ls /apps/nginx/
html是测试页,sbin是主程序
ls /apps/nginx/sbin/
nginx 只有一个程序文件
ls /apps/nginx/html/
50x.html index.html 测试网页
nginx:默认为启动nginx
nginx 命令选项:常用
-h 查看帮助选项
-V (大)查看版本和 配置选项(可以用来参考编译安装)
-v 查看版本信息
-t 测试nginx语法错误
-T 详细设置
-c filename 指定配置文件(default: /etc/nginx/nginx.conf)
-s signal 发送信号给master进程,signal:stop, quit, reopen, reload
示例: nginx -s stop 停止nginx
nginx -s reload 加载配置文件
-g directives 在命令行中指明全局指令
常用:这种方式,与systemctl冲突
nginx
nginx -h
nginx -t 修改完配置文件后检查语法
nginx -v
nginx -V
nginx -s stop
nginx -s reload
五. nginx配置
主配置文件:nginx.conf
子配置文件 include conf.d/*.conf
fastcgi, uwsgi,scgi等协议相关的配置文件
mime.types:支持的mime类型
主配置文件的配置指令:
directive value [value2 ...];
注意:
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建
变量:由Nginx模块引入,可直接引用
自定
义变量:由用户使用set命令定义
set variable_name value;
引用变量:$variable_name
nginx配置文件
配置文档
http://nginx.org/en/docs/
主配置文件结构:四部
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 全局配置段常见的配置指令分类
帮助文档
http://nginx.org/en/docs/
http://tengine.taobao.org/nginx_docs/cn/docs/
正常运行必备的配置:
user
指定worker进程的运行身份
,如组不指定,默认和用户名同名
Syntax: user user [group];
Default: user nobody nobody;
Context: main
注意这里:如果有多个不同的nginx服务器
要让其PID,服务名都一样
useradd -r -s /sbin/nologin nginx -u 2000
-
pid /PATH/TO/PID_FILE;
指定存储nginx主进程PID
的文件路径 -
include file | mask;
指明所需的配置文件或者目录
指明包含进来的其它配置文件片断
也可以自定义配置文件夹nginx/conf/conf.d/*.conf
给主配置文件里面加一个indlude conf.d/*.conf
-
load_module file ;
一般直接用include就可以指定
模块加载配置文件
: /usr/share/nginx/modules/*.conf
指明要装载的动态模块路径:/usr/lib64/nginx/modules
性能优化相关的配置(全局)
-
worker_processes
number | auto;
worker进程的数量;与cpu个数相匹配
auto,自动的识别本机的cpu个数 -
worker_cpu_affinity
cpumask …; 也就是绑定cpu和worker进程
worker_cpu_affinity auto [cpumask]提高缓存命中率
CPU绑定
几个cpu写几个0
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:7号CPU
例如有4个cpu
worker_processes=4
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;
worker_priority
number;
指定worker进程的nice值,设定worker进程优先级
:[-20,19]
默认为0
ps axo pid,cmd,nice |grep nginx
worker_rlimit_nofile
number;
所有worker进程能打开的文件数量上限
,最好与ulimit -n 的值保持一致,如65535
用测试ab -n1000 -c100 http://192.168.245.72/index.html
事件驱动相关的配置(events中)
在events中设置
events {
...
}
-
worker_connections
#;
与(worker数量)及ulimit -n值相对应
每个worker进程所能够打开的最大并发连接数,如10240
总最大并发数:不能超过ulimit -n的值
worker_processes * worker_connections
作为负载均衡时只能设置为最大连接数/CUP -
use
method;
指定使用的io模型
指明并发连接请求的处理方法
,默认自动选择最优方法
示例:use epoll; nginx默认为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 日志级别
可以用ab在另一台机子上测试nginx
配置实例
user nginx;
worker_processes auto;
pid /run/nginx.pid;
events {
use epoll;
worker_connections 20480;
multi_accept on;
accept_mutex on;
}
stream {
include sites-enabled/*.stream;
}
http {
include mime.types;
default_type application/octet-stream;
include vhosts/*.conf;
log_format main '$remote_addr|$remote_user|[$time_local]|"$request"|'
'$status|$body_bytes_sent|$http_host|"$http_referer"|'
'"$http_user_agent"|$http_x_forwarded_for|$upstream_cache_status|'
'"$upstream_http_content_type"|$request_time|$upstream_response_time|$bytes_sent|$request_length|'
'"$upstream_addr"|$uuid|$span_id';
access_log /data/iuap/logs/nginx/access.log main;
error_log /data/iuap/logs/nginx/error.log notice;
sendfile on;
keepalive_timeout 65;
charset utf-8;
server_tokens off;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 800m;
tcp_nopush on;
underscores_in_headers on;
client_body_buffer_size 512k;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /data/iuap/middleware/nginx/proxy_temp;
proxy_cache_path /data/iuap/middleware/nginx/proxy_cache levels=1:2 keys_zone=content:20m inactive=1d max_size=100m;
proxy_cache_path /data/iuap/middleware/nginx/proxy_cache_image levels=1:2 keys_zone=content_image:20m inactive=1d max_size=100m;
proxy_cache_bypass $http_secret_header;
proxy_ignore_client_abort on;
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript application/javascript text/css;
gzip_vary on;
lua_package_path "/data/iuap/middleware/nginx/lualib/?.lua;;";
init_by_lua '
require "resty.core"
uuid4 = require "uuid4"
';
# include conf.d/*.conf;
include sites-enabled/*.conf;
server {
listen 4040 default;
access_log off;
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
allow 127.0.0.1;
allow 172.20.46.224;
allow 172.20.46.78;
deny all;
set_by_lua $uuid '
if ngx.var.http_X_traceId == nil then
return string.sub(ngx.var.request_id,17,-1)
else
return ngx.var.http_X_traceId
end
';
set_by_lua $span_id '
if ngx.var.http_X_spanId == nil then
return ngx.var.uuid
else
return ngx.var.http_X_spanId
end
';
}
}
}