Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

Nginx基础

前言

apache在设计的时候已经考虑了并发访问模型,select()机制可以响应1024个访问,但是当数量再大,千万级别的时候http就响应不过来了。这个时候,nginx的出现解决了这一个问题。nginx是一个安装简单、配置文件简单、占用内存少、稳定性高、处理并发能力非常强、灵活好用等有点聚集于一身的轻量级服务器。在Linux操作系统中,Nginx使用epoll事件模型,效率相当高,Nginx能够支持高达5万个并发连接数的响应,在高连接并发的情况下,Nginx是apache服务器不错的替代品。

一、IO模型相关概念

1、同步模型:

一个任务的完成需要依赖另一个任务的时候,被依赖的完成后才能完成这个任务。

A依赖于B,B完成了,才能完成A。http进程去调用内核在那等着,内核去磁盘上加载资源,资源加载完了,返回给http进程,http进程才能进行下一步。

2、异步模型:

调用者无需等待被调用者完成,只是通知被依赖的任务,我要完成什么事,你来帮我完成,要依赖于通知,依赖于回调函数。

3、消息通知

被调用者

同步:等待对方返回消息

异步:被调用者通过消息通知或回调,状态是调用者每隔一段时间要检查一次,处于盲等状态。通知是好了就来通知。

调用者

阻塞:block (盲等) 调用结果返回之前,调用者会被挂起

非阻塞:nonblock (非盲等)

4、IO模型

同步阻塞:同步挂起

同步非阻塞:同步没挂起,它是怎么等待数据呢?数据准备好了,开始第二阶段了怎么办,所有那个去干别的事的进程要反复轮巡,过一会跑过来看看,数据加载完了没有,非阻塞的也变成阻塞的了,性能极差。

IO复用:为了解决同步非阻塞的进程老来查询数据,就准备了一个显示器【seletc(),1024】,最多显示1024个,你别来轮巡内核了,直接看轮巡屏幕就好了。

异步:不会阻塞,也可能会阻塞,在等待消息上。

5、IO分类

网络IO:本质是socket读取

磁盘IO:流

6、每次IO经过的两个阶段

数据首先会从磁盘或网络先加载到内核内存(缓冲区),等待数据准备完成

数据从内核缓冲区复制到用户空间的进程的内存中去,数据从内核复制到进程中去。

7、区别

同步阻塞:第一二阶段全部挂起

异步非阻塞:第一阶段没挂起,盲等,第二阶段挂起

IO复用:第一阶段阻塞,到大屏幕上,而不是内核上,第二阶段也阻塞。

二、Nginx概念

1、Nginx特性:

(1)模块化设计,较好的扩展性;

(2)高可靠性,master/worker

(3)支持热部署:不停更新配置文件、更换日志文件更新服务程序版本;

(4)低内存消耗:10000个keep-alive连接模式下的非活动连接仅消耗2.5M内存

(5)基本功能:静态资源的web服务器,可为http做反向代理。还有POP3limap4协议的反向代理服务器,邮件,FASTCGI等协议;lnmp。模块化(非DSO),编译时确定:著名的有zip,ssl,……;与web服务器相关的功能:虚拟主机,keepalive,访问日志,url,rewrite,路劲别名,基于ip及用户的访问控制,速率限制及并发数限制。

2、Nginx的程序架构

master\worker架构:一个master进程,可生成一个或多个work进程;

master:加载配置文件,管理worker进程,平滑升级……

worker:http服务,http代理,fastcgi代理

3、Nginx的模块类型

(1)核心模块:core module (2)标准模块:httpd模块(标准的httpd模块和可选的httpd模块) (3)3rd party modules

4、nginx的安装epel源(下面用编译的方法安装)

1、安装编译环境:

yum groupinstall "Development Tools" "Server Platform Development" -y

2、安装可能要启用的东西:openssl、pcre、zlib等等

yum -y install openssl-devel pcre-devel zlib-devel

3、创建nginx系统用户

useradd -r nginx

4、在nginx官网下载nginx,解压缩,次版本号是双数则是稳定版

wget http://nginx.org/download/nginx-1.8.1.tar.gz

5、根据需要configure

./configure --prefix=/usr/local/nginx  --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module  --with-debug --with-http_stub_status_module  --with-http_gzip_static_module

6、启动:/usr/local/nginx/sbin/nginx

7、报错如下:

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

问题是,错误的原因是没有创建nginx这个用户,应该在服务器系统中添加nginx用户组和用户nginx,方法如下:

/usr/sbin/groupadd -f nginx
/usr/sbin/useradd -g nginx nginx

ps aux 可以看到进程

8、然后可以启动了,命令太长了怎么办,修改一下

vim /etc/profile.d/nginx.sh

export PATH=/usr/local/nginx/sbin:$PATH

exec bash /etc/profile.d/nginx.sh (立即生效)

nginx -t 是检测配置文件是否正确的

nginx -s reload 重载nginx

nginx -s stop 停止启动

nginx 启动

9、配置文件(主配置文件/etc/nginx下的nginx.conf)

主要配置文件是:nginx.conf

可以自定义 conf.f/*.conf

还有facsgi、scgi、uwscgi的相关配置

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

配置指令(必须以分号结尾);

支持使用变量:内置变量(由模块引入,可以直接使用),自定义变量(set variablename value),引入变量($variablename)

三、配置文件结构(三大块)

main block :全局配置,对http及mail模块均有效;

worker-processes 1;表示有几个worker进程
worker-connectios 1024;表示每个worker进程同时可以响应多少个进程

event 部分:事件驱动的相关配置

http部分:http协议相关配置,web相关的都放在这里面

http {
    …… 公共配置
        server {
            ……虚拟主机自己的配置
        }
        server{
            ……
            server_name 主机名
            root -->DocumentRoot
            alias-->http alias
            location /url/{
                    ……
                            }
            }
    }

1、main配置段:全局配置

官网可以看具体使用方法:http://nginx.org/en/docs/ngxcoremodule.html

配置指令的类别:正常运行必备的配置;优化性能的配置;用于调试、定位问题的配置

(1)正常运行必备的配置

1、user USERNAME [GROUPNAME];
    指定用户运行work进程的用户和组;
例如:user nginx nginx;

2、pid /PAEH/TO/PID_FILE;指明运行时的pid文件在哪,指定nginx进程的pid文件路径:
    pid /var/run/nginx.pid;

3、worker_rlimit_nofile number:单个work进程可以打开的最大文件数,默认是1024个,如果有很多,可以调大一点

(2)性能优化相关配置:

1、worker_processes number |auto;自动设定,1.8以后才支持
用来指明work作进程的进程数
通常应该为cpu的核心数减1,可以是auto

16核服务器,14个隔离出来,2个运行,剩下14个每个绑一个work,不这样做,每个cpu核心都需要被work进程去调度的,不断的被进程切换着,nginx被切换出去以后,下次再切换过来就不一定是原来那个核了,cpu本地缓存就不能应用了,性能得不到提升,nginx性能很重要。

ps aux 有几个worker process
lscpu 看cpu有几个  可以相同,也可以-1.

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)


2、work_cpu_affinity cpumask ...;
  worker_cpu_affinity auto [cpumask],auto是自动绑定,也可能不支持

  work_processes 2;
  work_cpu_affinity 0010 0100;  
  含义就是选的两个work_process,绑定在哪两个cpu上

(3)指明进程优先级,nice越小,优先级越高

1、worker_priority number;优先级
nice:[-20,19]
ps axo command,pid,psr,ni

例子:worker_priority -5;检测,重载

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

(4)调试定位问题:

1、daemon on |off;
是否以守护进程方式启动Nginx,默认是

2、master——process on|off;
是否以master|work 模式启动,正常都应该启动

3、error_log 错误日志文件记录方式及日志级别
    debug要使用,在编译时--with要加上

方式:
    file /PATH/TO/SOME_LOG_FILE;
    stderr:发送到错误输出,在当前终端
    syslog:server=address[parameter=value]:发送到syslog服务器;
    memory:size,记录内存中,已关机就没了

日志级别:
    debug依赖于configure  --with-debug选项

2、event配置段

官方文档:http://nginx.org/en/docs/ngxcoremodule.html

1、worker_connections number;最大并发响应数
    每个work进程所能够打开的最大连接数;默认是512个

最大连接数=work_process*work_connections

2、use method;
    指明并发连接请求处理时使用的方法;

3、accept_mutex on
    让work processes轮流的接受新的连接,一般都启用,启用时表示用于让多个work轮流地序列化地响应请求

4、lock_file file;
    nginx使用锁机制去管理互斥

3、http配置段(重点)

官方参考:http://nginx.org/en/docs/http/ngxhttpcore_module.html

五大块:定义套接字相关功能,定义路径相关配置,定义客户端请求的相关配置,对客户的请求进行限制的相关配置,文件操作优先的配置。

(1)定义套接字相关功能

1、server{……} 定义虚拟主机的
    对于nginx,基于ip与主机名没什么区分


server { 很容易
    listen port;
    server_name HOSTNAME;(主机名,可以使用正则表达式的模式)
    root /PATH/TO/DOCUMENTROOT;
    ……
    }

2、listen  监听在哪个端口,格式如下:
    listen address
    listen port
    listen unix

例如:
    listen 127.0.0.1:8000;
    listen 127.0.0.1;
    listen 8000;
    listen *:8000;
    listen localhost:8000;

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

    default_server :设置默认虚拟主机
    ssl:限制通过ssl连接提供服务
    backlog:后缓队列的长度
    rcvbuf:接收缓冲大小
    sndbuf:发送缓冲区大小

3、server_name  name ...;
指明当前server的主机名;后可跟一个或空白字符分隔的多个主机,支持使用*,任意长度的任意字符

例如:www.magedu.com   支持~起始的正则表达式模块字符串

server_name www.magedu.com;
server_name *.magedu.com;
server_name www.magedu.*;
server_name -^.*\.magedu\.*$;

mail.magedu.com 2,4  优先是2
www.magedu.com  1,2,3,4  优先是1
越精确,优先级越高

(2)定义路径相关配置:

1、root path:设置web资源路径映射,用于指明用户请求的url所对应的本地文件系统的文档目录路径;可用上下文有:http,server,location,if

例子:把location的root注释掉,自己在server下面加,http下也可以加,可以对多个server生效

root /web/html/;

测试如下:(果然比http简单多了)

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

vim nginx.conf,再加个server
    server {
        listen 80;
        server_name www.cwj.com www.a.com;
        root /web/html2;
        }

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

为了便于管理,我们也可以令创建一个文件,专门编辑这些主机文件,如下,在/etc/nginx 下创建一饿个conf.d的目录,然后编辑host2.conf:

vim conf.d/host2.conf
vim nginx.conf
include conf.d/*.conf;

注意事项:

(1)基于port的虚拟主机:listen指令要使用不同的端口
(2)基于hostname的虚拟主机:server_name指令指向不同的主机名
(3)基于ip的虚拟主机:listen ip:port;

2、tcp_nodelay on|off
    对keepalived模式下的连接是否启用TCP_NODELAY选项

3、tcp_nopush on|off ;默认的选off

4、sendfile:在内核封装后直接发送给客户端,不反回httpd或者nginx,默认是off,要on起来

5、location 很有用,根据用户请求的url来匹配定义的location,匹配到时,请求将被相应的location块中的配置所处理;

例如:
    root /web/host1;
    路径是:/web/host1/images/1.jpg
    主机名是:www.cwj.com
    网址应该是:http://www.cwj.com/images/1.jpg

location 含有if之意,引入一个新的上下文,里面如果可以匹配到,则执行
location ~*\.txt {
    gzip on ;
                }

server {可以多个,嵌套
    ……
    location {
            }
    location {
            }
        ……
        }

=:url精确匹配,用户使用的与这里完全不差
~:正则表达式模式匹配,区分大小写
~*:正则表达式模式匹配,不区分大小写
^~:牟定行首的,url左半部分进行匹配
优先级:越精确,越优先:=   ^~   ~|~*   不带符号的


6、alias 同http alias  ,路径别名
alias path;定义路径别名,文档映射的一种机制,仅能用于location上下文

例如:
alias /bbs/  /web/forum/    ,既是  /bbs/  = /web/forum/

http://www.magedu.com/bbs/a.jpg
    /web/forum/a.jpg


location /bbs/ {
    alias /web/forum/;
            }

    /web/forum/a.jpg



location /bbs/ {
    root /web/forum/;
            }

    /web/forum/bbs/a.jpg

root指令:给定的路径对于location中的/url/最左侧的/

7、index:
可用的位置:http,server,location,默认主页

8、error_page:自定义错误页面,基本能力
    根据用户请求的http响应状态码实现错误重定向
例如:
    error_page 404             /404.html;
    error_page 500 502 503 504 /50x.html;

9、try_files  尝试文件  查找页面不在时

(3)定义客户端请求的相关配置

1、keepalive
设定保持连接的超时时长,0表示禁止启用长连接,默认是75s

2、keepalive_requests number
在一次长连接上所允许请求的资源的最大数量,默认是100

3、keepalive_disable name|browser ...
说明对哪种浏览器禁用

4、send_timeout time:向客户端发送响应报文的超时时长,默认是60s

5、client_body_buffer_size size;
用于接受客户请求报文body部分的缓冲区大小;
默认是16K;超出此大小时,其将被暂存到磁盘上

6、client_body_temp_path path [level1 |level2 ……];
设定用于存储客户端请求报文的body部分的临时存储路径及子目录结构和数量;

(4)客户端请求进行限制的相关匹配

1、limit_rate (限制速率)默认为0,限制每秒钟响应给客户端的传输速率,字节/秒

    location /download/ {
        limit_rate 20480;
            }
2、limit_except method 限制请求方法
    限制对指定的请求方法之外的其他方法的使用客户端

    limit_except GET POST {
        allow 192.168.1.109;
        deny all;
            }
    表示除了GET和POST之外的其他方法,仅允许172.18.0.0/16中的主机使用

3、密钥访问:
    htpasswd -c -m /etc/nginx/.ngxpasswd tom
    htpasswd  -m /etc/nginx/.ngxpasswd jerry

    location /admin/ {
        auth _basic "Admin Area";
        auth_basic_user_file /etc/nginx/.ngxpasswd;
            }
    mkdir /web/html2/admin
    vim /web/html2/admin/index.html

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

    nginx -t
    nginx -s reload

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

输入密码

Nginx 基础 (IO模型、编译安装、几大块配置文件详解)

原创文章,作者:N24_yezi,如若转载,请注明出处:http://www.178linux.com/64591

(1)
N24_yeziN24_yezi
上一篇 2016-12-23
下一篇 2016-12-24

相关推荐

  • 第二周- -问题总结

    前言:这周学习了文件的基本操作、用户和权限管理、重定向和管道。 1.在centos6.9当中,创建虚拟机的时候,网络无法获取地址,ping也不通,出现  device eth0 does not seem to be present, delaying initialization 答:(1).虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟…

    2017-07-23
  • Linux用户和组管理

    使用对象:Linux初学者   Linux系统中用户和组管理是很重要的一部分内容。许多初学者在学习或刚接触到用户管理的时候会觉得很难理解,命令多、选项多、配置文件也多,用命令可以修改,用配置文件也可以修改,三两下就被绕进去了。其实完全没必要晕,只要了解了用户管理的方式,就会很容易理解命令选项与配置文件之间的关系。下面我们就来了解下用户管理命令与配置…

    Linux干货 2016-10-23
  • 马哥教育网络班22期+第7周课程练习

    week7: 1、创建一个10G分区,并格式为ext4文件系统;    (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;    (2) 挂载至/data/mydata目录,要求挂载时禁止程…

    Linux干货 2016-09-26
  • Linux基础知识之GUN awk

    awk:报告生成器,格式化文本输出    基本用法:    gawk [options] 'program' FILE …    options:     &…

    Linux干货 2016-09-20
  • 【yum安装程序】Centos7.4使用yum光盘安装httpd

    举例:Centos7.4使用yum光盘安装httpd

    Linux干货 2018-03-17
  • N25-week7 作业

    1. 创建一个10G的分区,并格式为ext4文件系统  (1) 要求block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;  (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳 #创建文件系统,首先使用fdisk对磁盘进行分区操作 [root@loca…

    Linux干货 2017-02-22