文档章节

Nginx浅学

聆听朝阳的美好
 聆听朝阳的美好
发布于 2017/01/12 18:47
字数 2763
阅读 3
收藏 0

一、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主要配置文件

usr  nobody;   #运行用户
worker_processes  1;  #启动进程,通常设置成与cpu的数量相等
error_log logs/error.log  #全局错误
pid    logs/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之后会有更深层次的总结。

© 著作权归作者所有

聆听朝阳的美好
粉丝 0
博文 6
码字总数 17622
作品 0
海淀
程序员
私信 提问
学习大纲:两周搭建Demo理解机器学习

     很多互联网PM都想转型到人工智能产品经理,作者也一样,还是零编程基础、零算法基础、零AI实战经验。渴望对神经网络和机器学习理解得多一点,就亲自验证了一条有效的极简路径:40-...

人人都是产品经理社区
2017/12/28
0
0
fast.ai 深度学习笔记:第一部分第五课

原文:Deep Learning 2: Part 1 Lesson 5 作者:Hiromi Suenaga 课程论坛 一,引言 没有足够的关于结构化深度学习的出版物,但它肯定出现在行业中: 结构化深度学习,作者:Kerem Turgutlu ...

ApacheCN_飞龙
2018/10/17
0
0
浅学JSON——Json.NET之首次试手

首次遭遇Json格式,缘由项目中用到Json数据,需要进行解析,为此,将Json数据转为了自己较为熟悉的DataTable格式,以此展示至DataGridView中,验证是否成功。 直接上代码: /// <summary>///...

奇葩史
2013/09/04
0
0
自然语言处理扫盲·第一天——自然语言处理的背景、应用、推荐资料

自然语言处理在很多APP中都有实际应用的场景,比如在电商软件中,客服问答系统、评论情感分析、带有语义识别的搜索、商品自动分类、用户画像等等。那么本篇作为自然语言处理浅学的第一篇,就...

青夜之衫
2017/12/04
0
0
升级Nginx到1.12.2的脚本

#!/bin/bash #Nginx版本升级到1.12.2 export LANG="en_US.UTF-8" #获取Nginx的安装目录 nginxcutpath= nginxpath=/$nginxcutpath nginxdir= #nginx-v查询的版本相关信息保存在nginxverinfo ......

sjianfa168
2017/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nproc systemd on CentOS 7

Increasing nproc for processes launched by systemd on CentOS 7 Ask Question I have successfully increased the nofile and nproc value for the local users, but I couldn't find a p......

MtrS
23分钟前
1
0
了解微信小程序下拉刷新功能

小程序提供了这个事件。 onPullDownRefresh() 监听用户下拉刷新事件。 如果要开启下拉刷新功能,要先到json配置: "enablePullDownRefresh":true 配置后下拉有反应了但是没有加载效果,在onP...

oixan__
48分钟前
2
0
springmvc java对象转json,上传下载(未完)拦截器Interceptor以及源码解析(未完待续)

package com.atguigu.my.controller;import java.util.Collection;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Contr......

architect刘源源
今天
29
0
[日更-2019.5.24、25、26] Android系统中的Binder通信机制分析(一)--servicemanager

声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得去年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾... 最近,刚好在做...

Captain_小馬佩德罗
昨天
24
0
聊聊dubbo的DataStore

序 本文主要研究一下dubbo的DataStore DataStore dubbo-2.7.2/dubbo-common/src/main/java/org/apache/dubbo/common/store/DataStore.java @SPI("simple")public interface DataStore { ......

go4it
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部