初识nginx
先来一波官方站点关于nginx介绍。nginx相关历史这里不再赘述啦。
nginx 是免费,开源,高性能 HTTP 服务器和反向代理服务器,也可作为IMAP/POP3代理服务器。nginx以它的高性能,稳定性,丰富的特征设定,配置简单和资源消耗低而著称。
nginx是为数不多可以解决C10K问题的服务器。不像传统服务器,nginx不依赖线程处理请求。它使用的是更为高明事件驱动(异步)架构。在高负荷下,也能保持低消耗,更重要的是可预估的内存占用量。如果你不期望去解决上千的并发请求难题,你也可以从nginx的高性能,低消耗而尝到好处。nginx应用规模可大可小:小至 VPS,大至组建服务器集群。
了解nginx架构
nginx为什么是高性能,低消耗的,可解决高并发问题
首先是master/worker二层架构,master负责加载配置文件、管理worker进程、平滑升级;worker负责 处理请求。而且是基于事件驱动模型设计的处理模型,这使得
worker数量和cpu核心数相当即可,但是一个worker进程可以同时处理多个请求,在高并发访问的情况下使用较少的资源从容应对。
简单来讲,异步非阻塞,事件驱动机制是其核心特征。
同时nginx拥有一套缓存机制,可以进一步降低网络压力,加速用户响应。
模块化设计
nginx总体设计理念秉承模块化设计思想,把各功能细分模块进行开发,实现灵活地装卸载所需模块,方便后续功能拓展。
nginx模块 分为五类
1)核心模块
2)标准http模块
3)可选http模块
4)mail模块
5)第三方模块
安装nginx
rpm包,官方预制,下载地址: http://nginx.org/packages
了解nginx配置
主配置文件:nginx.conf从此处为入口,开始你的nginx配置吧。主配置文件中,使用include命令引用分支配置文件。
nginx配置风格为划地而治,要严格按照模块为区域进行配置
配置结构如下:
事件驱动相关的配置;
}
http/https 协议相关的配置段;
mail相关模块
}
tcp/udp 传输层负载均衡配置段;
再来讲讲配置语法
directive value...; #语法格式
内建变量传送门:http://nginx.org/en/docs/varindex.html 数量繁多,用起来也是非常方便滴,想用什么变量,来这里查查。
配置nginx,从基础开始————
主配置段
1、定义进程用户,用户组
user username usergroup;
默认为nobody。 指定一个系统用户。
2、定义主程序pid文件路径
pid /PATH/TO/PID_FILE;
3、 引入分支配置文件
include file;
~ include conf.d/*.conf ####“~”在本文中表示配置实例语句####
4、装载动态模块
load_modulefile;
~ load_module modules/ngx_mail_module.so;
5、error 日志
error_logfile[level]
~ error_log logs/error.log info
主配置段中,性能调优的指令
1、指定worker数量
worker_processes number | auto;
数量最宜和cpu核心数相同。
2、绑定worker与cpu核心对应关系
worker_cpu_affinity auto | cpumask;
如果不设置此项,worker会在不同的工作内核上切换,这会造成不必要的开销,将它们固定起来就好,一般设置为auto即可。
worker_cpu_affinity0001 0010 0100 1000 #指定cpumask例子
3、指定worker进程的nice值 范围[-20,20]
worker_priority number;
4、设置worker打开文件数量限制
worker_rlimit_nofile number;
~ worker_rlimit_nofile 2390251
当然系统内核参数要改大,sysctl -w fs.file-max=2390251;sysctl -p
Event 区域设置
1、每个worker进程所能够打开的最大并发连接数数量;
worker_connections number;
~ worker_connections 65535; #一般设置为65535,最大端口数量
use method;
accept_mutex on | off;
4、多路接收
multi_accept on|off;
on表示一个worker同时接受尽可能多的请求。建议开启
Http区域设置----进阶开始
1、配置虚拟主机:server
使用server指令配置虚拟主机,一般格式如下:
server {
listen address[:PORT]|PORT;
server_name SERVER_NAME;
root /PATH/TO/DOCUMENT_ROOT;
}
1.1 listen 指令
配置监听地址,端口指令
有三种形式:
1) listen address[:port] [args..];
监听在指定IP,指定端口;当端口省略时,监听所有端口
2) listen port [args...];
监听主机所有IP的80端口
3) listen unix:path [args...];
监听unix socket,一种本机内部通信IPC机制,非重点。
-----介绍上面[args] 内容:
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
default_server: 标识符,表示此虚拟主机为address:port 的默认主机
ssl:标识符,虚拟主机使用https协议通信时,标识此项
backlog=number:设置允许同时最大网络监听连接处于挂起状态的个数,默认为511
rcvbuf=size:设置监听socket接收缓冲区大小
sndbuf=size:设置监听socket发送缓冲区大小
-----小结:
一般listen 指令无需太过复杂
~ listen 10.1.0.1:8080 default_server backlog=1024
~ listen 8080;
1.2 server_name 指令
使用server_name 指令配置基于名称或基于IP的虚拟主机
1)基于名称的虚拟主机
格式: server_name name... 允许跟多个名称,空格符分隔
------name支持glob通配符*
*可以出现在三段式名称中的首段或尾段;以及两段式名称中的尾段
server_name *.cutemsyu.com www.cutemsyu.* cutemsyu.*;
------name支持正则表达式~
以~起始表示正则表达式标记
server_name ~^www\d+\.cutemsyu\.com$
其中\d代表数字0-9,像这样的表达式可匹配www1.cutemsyu.com,www2.cutemsyu.com 等等
拓展:nginx 支持name 正则表达式字符捕捉功能
server_name ~^([^.]+)\.cutemsyu\.com$
如此定义,当该表示式匹配www.cutemsyu.com 名称时,在server块中可使用$1 表示 www 字符串
-----关于一个名称被多个表达式匹配的问题
如果一个主机配置多个虚拟主机,则有可能发生此种情况
nginx有如下server_name 匹配规定:
对于一个名称匹配多个表达式情况,按以下规则处理,排在前面优先级高
1.准确匹配
2.左侧*通配符
3.右侧*通配符
4.正则表达式
如果被同一级别的多个表达式匹配,则按第一个匹配的表达式处理
2)基于IP的虚拟主机
用法: server_name IP;
1.3 配置请求根目录指令:root
root指令定义根路径目录,可定义在http,server,location块;
语法:root path;
web服务器接收到请求后,首先在根目录下寻找资源。后面会介绍location块,root在location用到的情况比较多。
2、配置location块
用法:
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
应用在server块中,或在location块中嵌套使用。
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;
uri部分方便下面叙述,称不含正则表达式的uri为标准uri;反之,含有正则的uri称为正则uri,而且正则uri 前必须使用~或~*。同时支持正则字符串捕捉,使用$1等应用。
[ = | ~ | ~* | ^~ ] 这部分符号是具有特殊定义的符号,表示特定含义,可省略。
server接收到一个请求uri后,先与所有标准uri进行匹配,并记录匹配度最高的一个。然后按序与正则uri进行匹配,匹配到第一个正则uri后,立即按相应location块处理。如果所有正则匹配失败,则应用之前记录的标准uri对应的location块进行处理。
1) = 使用在标准uri前,表示精准匹配,如果请求uri与此对应,则该请求立即由该location块进行处理,不再与正则uri匹配。
2) ~ 使用在正则uri前,并且区分大小写字母
3) ~* 使用在正则uri前,不区分大小写字母
4) ^~ 使用在标准uri前,要求与标准uri匹配,找到匹配度最高的一个后不进行与正则uri匹配
如,对于"/" 的请求较多的话,使用以下定义
location = / {
....
}
则能实现快速匹配。
看一看nginx官方文档给出的例子:
location = / {
[ configuration A ]
} location / {
[ configuration B ]
} location /documents/ {
[ configuration C ]
} location ^~ /images/ {
[ configuration D ]
} location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
请求URI 应用的location配置
/ configuration A
/index.html configuration B
/documents/document.html configuration C
/images/1.gif configuration D
/documents/1.jpg configuration E
至于@name 形式的location,是用来处理重定向类型的请求。在try_files 指令中会提到。
3、路径重定向类的指令
3.1 路径别名 alias
用法: alias path;
定义路径别名,文档映射的另一种机制;仅能用于location上下文。
与root 指令容易混淆。参考下面示例
location /data {
alias /documents/www;
}
请求uri为/data/index.html,则nginx服务器将在路径 /documents/www 下寻找index.html 文件。
3.2 设置网站默认首页
作用是用户不需输入完整的uri来访问默认主页
用法: index filename... ;
可设置多个默认网页,如果前一个页面文件不存在则显示下一页面文件,以此类推。
3.3 错误页面重定向
用法:error_page code ... [=[response]] uri|path;
当客户端访问遇到问题时,nginx支持自定义错误页面显示,并返回一个指定状态码,如果指定的话。
作用域为 http,server,location 。具有在子域有效的特征。
Example:
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
此示例跳转的资源使用相对路径方式,意味着从定义的根路径下查找文件。
Example:
error_page 404 =200 /empty.gif;
此示例指定转换的状态码。
Example:
error_page 404 = /404.php;
如果响应的错误状态码来自代理服务器,或者FastCGI/uwsgi/SCGI 服务器,应使用该示例方式返回代理服务器返回的状态码。
Example:
error_page 403 http://example.com/forbidden.html;
error_page 404 =301 http://example.com/notfound.html;
该示例重定向为一个指定uri。此种情况重定向的状态码为302。可修改为 301,302,303,307。
3.4 尝试查找文件
用法: try_files file ... uri;
try_files file ... =code;
按顺序检查文件,如果都不存在,则定向最后一个参数。最后一个参数如果是文件则必须存在;可以是状态码;内部重定向。
example:
location /images/ {
try_files $uri /images/default.gif;
}location / {
try_files $uri $uri/index.html $uri.html =404;
}
example:重定向型
location / {
try_files $uri $uri/ @wordpress;
} location ~ \.php$ {
try_files $uri @wordpress; #这里使用重定向,如果请求的资源页不在会自动跳转@wordpress块中的index.php。如果使用uri的话,不会显示动态资源页面。 fastcgi_pass ...; fastcgi_param SCRIPT_FILENAME /path/to$fastcgi_script_name;
... other fastcgi_param's
} location @wordpress {
fastcgi_pass ...; fastcgi_param SCRIPT_FILENAME /path/to/index.php;
... other fastcgi_param's
}
4、套接字相关配置
作用域:http
, server
, location
4.1 tcp_nodelay on | off;
在keepalived模式下的连接是否启用TCP_NODELAY选项;默认开启;建议开启
4.2 sendfile on|off;
是否开启sendfile 特性,减少数据在内核与用户空间之间的copy次数。建议开启。详见标题6内容
4.3 sendfile_max_chunk size;
worker process 每次调用sendfile() 传输数据的最大值,减少一次调用sendfile()最大阻塞时长,0为不限制,建议设置128K
5、定义客户端请求的相关配置
作用域:http
, server
, location
5.1 keepalive_timeout timeout [header_timeout];
设定保持连接的超时时长,0表示禁止长连接;默认为75s;header_timeout 可选项,在应答报文首部中表示keepalive超时时间
5.2 keepalive_requests number;
在一次长连接上所允许请求的资源的最大数量,默认为100;
5.3 keepalive_disable none | browser ...;
对哪种浏览器禁用长连接;
5.4 send_timeout time;
向客户端发送响应报文的超时时长,此处,是指两次写操作之间的间隔时长;如果客户端在规定时长内无任何活动则关闭连接
send_timeout 10s;
5.5 client_header_buffer_size size
;
设置客户端请求报文首部缓冲区大小,默认值为1K。有时客户端请求首部带有cookie很大的信息,会造成400错误,强烈建议增大大小
大小设置为系统分页大小,命令 getconf PAGESIZE 可查看
一般设置为 client_header_buffer_size 4K;
5.6 client_body_buffer_size size;
用于接收客户端请求报文的body部分的缓冲区大小;默认为16k;超出此大小时,其将被暂存到磁盘上的由client_body_temp_path指令所定义的位置;
5.7 client_body_temp_path path [level1 [level2 [level3]]];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;16进制的数字;
client_body_temp_path path /var/tmp/client_body 1 2 2 #可定义在高性能磁盘分区上
6、文件操作优化的配置
作用域:http
, server
, location
6.1 aio on | off | threads[=pool];
是否启用aio功能;
6.2 directio size | off;
在Linux主机启用O_DIRECT标记,此处意味文件大于等于给定的大小时使用,例如directio 4m;
6.3 directio_alignment size
;
为directio设置 alignment 大小,默认512字节,一般不用调整。但是xfs 文件系统需要增大至4k。
--------这里花一定篇幅讲讲aio,directio,和sendfile之间的关系-------
首先aio和sendfile是互相排斥的。启用aio,必须也启用directio,不然的话read()将成为阻塞。
sendfile适合小文件,占用的是系统缓存。当传输大文件时,而且系统内存不够大的情况,使用sendfile()将较不适宜。此时应使用aio机制。
推荐的一个配置示例:文件小于8M,使用sendfile,大于或等于8M使用aio
location /video/ {
sendfile on;
sendfiel_max_chunk 256K;
aio on;
directio 8m;
output_buffers 1 128k;}
特别地,在大文件传输较多的情况下,适宜启用aio threads 。nginx编译需要--with-threads 选项
location /video/ {sendfile on;
sendfiel_max_chunk 256K;
aio threads; #这里使用默认的线程池,可自行创建。
directio 8m;
output_buffers 1 128k;}
6.4 open_file_cache off;
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) 文件的描述符、文件大小和最近一次的修改时间;
(2) 打开的目录结构;
(3) 没有找到的或者没有权限访问的文件的相关信息;
max=N:可缓存的缓存项上限;达到上限后会使用LRU算法实现缓存管理;
inactive=time:缓存项的非活动时长,在此处指定的时长内未被命中的或命中的次数少于open_file_cache_min_users指令所指定的次数的缓存项即为非活动项;
6.5 open_file_cache_valid time;
缓存项有效性的检查频率;默认为60s;
6.6 open_file_cache_min_uses number;
在open_file_cache指令的inactive参数指定的时长内,至少应该被命中多少次方可被归类为活动项;
6.7 open_file_cache_errors on | off;
是否缓存查找时发生错误的文件一类的信息;
Example:
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
本篇就介绍到这里,nginx余下内容请关注后续博客。
初识nginx的更多相关文章
- 初识nginx——内存池篇
初识nginx——内存池篇 为了自身使用的方便,Nginx封装了很多有用的数据结构,比如ngx_str_t ,ngx_array_t, ngx_pool_t 等等,对于内存池,nginx设计的十分精炼 ...
- 初识Nginx及编译安装Nginx
初识Nginx及编译安装Nginx 环境说明: 系统版本 CentOS 6.9 x86_64 软件版本 nginx-1.12.2 1.什么是Nginx? 如果你听说或使用过Apache软件 ...
- 初识nginx之第一个demo
商城项目做了一个多月了,想到必须用到负载均衡,简单了解了一下nginx,首先分享第一个demo,五月份上线后,会继续分享一系列相关知识. 在nginx根目录下,用了一个园友的批处理文件nginx.ba ...
- nginx(四)初识nginx日志文件
nginx 日志相关指令主要有两条,一条是log_format,用来设置日志格式,另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,通俗的理解就是先用log_format来定 ...
- 初识nginx+tomcat
百度百科说: Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由Igor Sysoev为俄罗斯 ...
- nginx(一)初识nginx
什么是nginx?Nginx (engine x) 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. Nginx应用场景(都很常用): 1:http服务器.N ...
- 初识 Nginx
Nginx 是一个免费的,开源的,高性能的HTTP服务器和反向代理,以及IMAP / POP3代理服务器. Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名.很多高知名度的网站 ...
- 初识nginx反向代理和缓存机制
实现的需求图: 环境: nginx缓存和反向代理服务器:192.168.0.224 实际存储数据机器:192.168.0.37 一.实现反向代理 1.安装nginx,两台服务器都需要安装 1)安装 ...
- [web][nginx] 初识nginx -- 使用nginx搭建https DPI解码测试环境
环境 CentOS 7 X86 文档: https://nginx.org/en/docs/ 安装: [root@dpdk ~]# cat /etc/yum.repos.d/nginx.repo [n ...
随机推荐
- MS - 1 - 把二元查找树转变成排序的双向链表
## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10 ...
- Memcache的使用和协议分析详解
Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.NET/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linu ...
- EI目录下载地址及保护密码
EI目录下载地址:http://www.elsevier.com/solutions/engineering-village/content EI工作薄保护密码:AAAAABABAABD
- WebServices(转)
一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...
- 【转】如何在Mac系统中安装R的rattle包
[转自知乎]:https://www.zhihu.com/question/28944497 1. 安装 xquartz (http://xquartz.macosforge.org)2. 安装 GT ...
- Runtime Reconfiguration
https://coreos.com/etcd/docs/latest/runtime-configuration.html Runtime Reconfiguration 运行时重新配置 etcd ...
- BAT的面试经验_摘抄
一.心态 心态很重要! 心态很重要! 心态很重要! 重要的事情说三遍,这一点我觉得是必须放到前面来讲. 找工作之前,有一点你必须清楚,就是找工作是一件看缘分的事情,不是你很牛逼,你就一定能进你想进的公 ...
- Support Vector Machine (3) : 再谈泛化误差(Generalization Error)
目录 Support Vector Machine (1) : 简单SVM原理 Support Vector Machine (2) : Sequential Minimal Optimization ...
- Tomcat 实现双向SSL认证
大概思路: 使用openssl生产CA证书,使用keytool生产密钥库 实验环境:RHEL6.4+Tomcat8 一.生成CA根证书,并自签名 1.生成CA密钥 # genrsa [产生密钥命令] ...
- MSSQL订阅库索引对齐
需求如下图: 在原来的架构中是每台web服务器都固定访问某一台数据库服务器,所以就造成了每台数据库订阅服务器上的索引不一致.现在的需求就是要把所有的订阅库上的索引调整为一致,为了就是实现高可用+负载均 ...