Nginx浅学

2017-01-13 10:51:15来源:oschina作者:聆听朝阳的美好人点击

第七城市

一、Nginx简介
1、Nginx三大功能:
①web服务器(解析http协议);②反向代理服务器;③邮箱服务器(支持IMAP/POP3/SMTP协议);
2、Nginx优点
①更快的响应速度
②模块化设计,支持第三方扩展
③Nginx工作时有master进程(主进程)和worker进程(工作进程)

master进程负责与用户交互,同时对其它进程进行监护,worker进程负责处理业务逻辑。这样当一个worker进程出错时,master进程可以再起一个新的worker进程提供服务。


④低内存消耗

一般情况下10000个非活跃的http keep-alive连接仅消耗2.5MB内存,这是它高并发的基础。


⑤支持的连接数与内存有关
⑥支持热部署
⑦可以免费使用并随意修改源代码
3、Nginx官网

下载http://nginx.org/en/download.html


一般下载 stable版本的。


二、Nginx安装
1、安装

依次下载并安装以下库(安装方法查看每个包中的README.md) ①gzip 模块需要 zlib 库 ( 下载: http://www.zlib.NET/ ) ②rewrite 模块需要 pcre 库 ( 下载: http://www.pcre.org/ ) ③ssl 功能需要 openssl 库 ( 下载: http://www.openssl.org/ ) ④Nginx安装 一般安装过程都如下,Linux下的源码安装几乎都是以下步骤(有些可能没有configure文件)


./configure
make
sudo make install

Nginx默认安装到 “/usr/local/nginx/“目录下边,当然也可以在安装时进行手动配置安装路径,这里不做介绍。


2、检查是否安装成功

①执行以下命令,启动Nginx服务器


sudo /usr/local/nginx/nginx

②在浏览器中输入 127.0.0.1 如果网页显示为Nginx页面,则安装成功。


3、Nginx目录结构

在 “/usr/local/nginx/” 目录下会分别创建四个子目录:conf(存放Nginx配置文件)、html(存放网页相关文件)、logs(存放Nginx日志文件)、sbin(存放Nginx命令)


三、Nginx配置

Nginx配置文件存储在 “usr/local/nginx/”目录下,该目录保存了Nginx的主配置文件和一些辅助配置文件,一般主配置(nginx.conf)是Nginx运行过程中必须使用的。以下是配置的大致介绍: ①Nginx注释以“#”开始。 ②Nginx中的命令主要分为简单命令(一个简单字符串)和复杂命令(由大花括号括起来的命令块)。 ③Nginx命令中的键与值之间用空格或Tab键隔开,配置项末尾以分号结束,复杂命令不必以分号结尾。 ④指令的层级结构 这里写图片描述


Nginx主要配置文件
usrnobody; #运行用户
worker_processes1;#启动进程,通常设置成与cpu的数量相等
error_log logs/error.log#全局错误
pidlogs/nginx.pid#Nginx进程pid,根据其中记录的pid可以杀死自己,结束服务。
daemon on/off; #Nginx是否以守护进程方式运行。
master_process on/off; #Nginx是否以master/worker 方式工作。
accept on; #Nginx负载均衡锁,该锁可以让多个worker进程轮流与客户端建立连接。
lock_file path/file; #默认logs/nginx.lock,使用accept时使用。
accept_mutex_delay numberms; #一个worker进程获取accept锁失败后经过 number ms之后才可以再次获取该锁。
multi_accept on/off; #当某一时刻有多个tcp连接时,尽可能对所有请求都建立连接。
events#工作模式及连接上线
{
use epoll; #使用epoll可大大提高Nginx性能(Linux2.6以上内核才支持)
worker_connections 1024; #单个后台worker进程最大并发连接数。(注意:并发总数要少于系统允许打开的最大文件总数,并发总数=单个后台进程最大连接数 * 后台数)
}
http
{
include mime.types;
default_type application/octet-stream;
client_max_body_size 2048m; #客户端发送最大字节数,单位包括k、m、g。默认大小1M
expires 10m; #有效时间10分钟,单位ms、s、m、h、d、w、m、y
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
' $status $body_bytes_sent " $http_referer " '
' "$http_user_agent" " $http_x_forwarded_for " '
access_log logs/access.log main; #设置日志格式及存储路径
sendfile on; #sendfile 指定Nginx是否调用 sendfile 函数(zero copy方式来输出文件),对于普通应用则设置为on,用来下载大文件要设为off
tcp_nopush on; #是否使用tcp传输协议
keepalive_timeout 60; #连接超时时间
gzip on; #开启gzip压缩
gzip_disable "MSIE [ 1 - 6 ].";
}
server #设置虚拟主机配置
{
listen 80; #侦听端口
#isten 127.0.0.1:8000;
#listen localhost;
#listen *:8000;
server_name localhost; #可以设为合法域名
charset utf-8; #设置编码格式
root html; #定义服务器网站的默认根目录位置
access_log logs/nainx.access.log main; #定义本虚拟主机的访问日志路径
location /#默认请求
{
root html; #访问根目录 / 则访问的是 html 文件夹
index index.html index.htm #定义首页文件名称
####################
#limit GET{
#...
#allow 192.111.22.111/200;
#deny all;
#}
#方法名有 PUT HEAD POST DELETE MKCOL COPY MOVE OPTIONS PROPFIND PR
#禁止GET 和HEAD方法,其他方法允许}
location /data#请求为192.113.52/data?aa=xx类型请求(即http中get请求),对应操作
{
fastcgi_pass 127.0.0.1:8014; #请求到达时调用CGI程序,当然会有一个CGI程序在后台监听8014端口。
include fastcgi.conf; #包含的头文件,因为本例使用fastCGI。
}
error_page 500 502 503 504 /50x.html; #定义错误提示页面
location = /50X.html
{
}
location ~ ^/(images|javascript|js|css|flash|media|stati
c)/{
expires 30d; #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
}
location ~ . php$#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastc
gi_script_name;
include fastcgi_params;
}
#禁止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
#error_page 404 =200 /empty.html; 返回错误码重定向。
}
}
四、Nginx常用命令
1、重启Nginx

sudo /usr/local/sbin/nginx -s reload


2、关闭Nginx
sudo /usr/local/sbin/nginx -s stop
3、启动Nginx
sudo /usr/local/sbin/nginx
五、Nginx工作原理
1、Nginx进程模型

Nginx启动之后,会以守护进程的方式在后台运行,其中包括一个master进程和多个worker进程。master进程主要负责监控管理worker进程,而worker进程负责业务处理。 当客户端有请求需要处理时,worker进程之间会争夺请求资源,最终会有一个worker完成业务。master在其中监控worker进程,当worker进程异常退出时,master可以再次启动worker进程。master进程还可以接受管理员的指令,比如对Nginx的启动、重启和关闭指令。


2、Nginx的事件处理。

对于服务端来说,socket接收和发送数据,其本质就是对I/O的操作。为了提高并发,Nginx采用了异步非阻塞的事件处理机制(类似select、epoll等系统调用),服务端可以使用一个线程同时监控多个事件,当事件准备好了就去处理它,当事件没有准备好,就让epoll去监控。这样可以大大提高并发。 在服务器端是比较忌讳多进程与多线程一起使用的,多进程和多线程一起使用,每个请求对应一个线程,虽然表面看来可以提高并发,但是当请求很多时,线程与进程去处理请求时难免要执行系统调用,系统调用很花费时间,而且有些I/O并不一定处于就绪状态,这样还会加大cup在进程或线程之间的切换。从结果来看,cpu时间片多数花费在了进程或线程之间的切换上。Nginx为了减少切换,那么服务端有多少个cup就配置多少个worker,Nginx内部可以配置将一个worker进程绑定到一个核上,巧妙避免了cup的切换,提高了服务端并发数。


六、Nginx模块化

Nginx核心是“Nginx core”(实现了Nginx底层的通信协议,为其它模块和Nginx进程郭建基本运行环境),中间层封装了“http”模块(处理http协议)和“mail”模块(处理email相关协议)。上层提供了event module(独立于操作系统的事件处理机制框架)、phase handler(负责处理客户端请求并产生待响应内容)、output filter(主要负责对输出的内容进行处理)、upstream(实现反向代理功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应返回客户端)、load-balancer(负载均衡模块)、extend(根据特定业务编写的第三方模块)。 具体可以参见Nginx官网的“Modules reference”


七、处理http请求的过程

当Nginx读取到一个HTTP Request的header时,首先查找与这个请求关联的虚拟主 机的配置,如果找到了则这个请求将会经历以下几个阶段的处理( phase handlers) : NGX_HTTP_POST_READ_PHASE:读取请求内容阶段 NGX_HTTP_SERVER_REWRITE_PHASE:Server请求地址重写阶段 NGX_HTTP_FIND_CONFIG_PHASE:配置查找阶段 NGX_HTTP_REWRITE_PHASE:Location请求地址重写阶段 NGX_HTTP_POST_REWRITE_PHASE:请求地址重写提交阶段 NGX_HTTP_PREACCESS_PHASE:访问权限检查准备阶段 NGX_HTTP_ACCESS_PHASE:访问权限检查阶段 NGX_HTTP_POST_ACCESS_PHASE:访问权限检查提交阶段 NGX_HTTP_TRY_FILES_PHASE:配置项try_files处理阶段 NGX_HTTP_CONTENT_PHASE:内容产生阶段 NGX_HTTP_LOG_PHASE:日志模块处理阶段


Nginx的模块化体系 在内容产生阶段,为了给一个request产生正确的response,Nginx必须把这个请求 交给一个合适的content handler去处理。如果这个request对应的location在配置文 件中被明确指定了一个content handler,那么Nginx就可以通过对location的匹配, 直接找到这个对应的handler,并把这个request交给这个content handler去处理。 这样的配置指令包括perl、flv、proxy_pass、mp4等。 如果一个request对应的location并没有直接配置的content handler,那么Nginx依次 作如下尝试: ( 1) 如果一个location里面有配置random_index on,那么随机选择一个文件发送 给客户端。 ( 2) 如果一个location里面有配置index指令,那么发送index指令指定的文件给客 户端。 ( 3) 如果一个location里面有配置autoindex on,那么就发送请求地址对应的服务 端路径下的文件列表给客户端。 ( 4) 如果这个request对应的location上有设置gzip_static on,那么就查找是否有 对应的.gz文件存在,如果有的话,就发送这个给客户端( 客户端支持gzip的情况 下) 。 ( 5) 请求的URI如果对应一个静态文件,static module就发送静态文件的内容到客 户端。 内容产生阶段完成以后,生成的输出会被传递到filter模块去进行处理。filter模块也 是与location相关的。所有的fiter模块都被组织成一条链。输出会依次穿越所有的 filter,直到有一个filter模块的返回值表明已经处理完成。接下来就可以发送 response给客户端了。


待续:以上总结仅是Nginx服务器的一些简单介绍仅当使用时的参考,学习自然概从简入繁,关于Nginx之后会有更深层次的总结。

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台