zoukankan      html  css  js  c++  java
  • Nginx的核心模块

    Nginx文档地址:http://nginx.org/en/docs/

    Nginx中文文档地址:https://www.nginx.cn/doc/

    一、Nginx简介与安装

    1、简介

    Nginx是一个高性能WEB服务器,除它之外Apache、Tomcat、Jetty、IIS,它们都是Web服务器,或者叫做WWW(World Wide Web)服务器,相应地也都具备Web服务器的基本功能;

    2、编译与安装

    2.1 环境的准备

    (1)linux 内核2.6及以上版本;只有2.6之后才支持epool,在此之前使用select或pool多路复用的IO模型,无法解决高并发压力的问题。通过命令uname -a 即可查看linux 内核。

    (2)GCC编译器: GCC(GNU Compiler Collection)可用来编译C语言程序。Nginx不会直接提供二进制可执行程序,只能下载源码进行编译。

    (3)PCRE库:PCRE(Perl Compatible Regular Expressions,Perl兼容正则表达式)是由Philip Hazel开发的函数库,目前为很多软件所使用,该库支持正则表达式。

    (4)zlib库:zlib库用于对HTTP包的内容做gzip格式的压缩,如果我们在nginx.conf里配置了gzip on,并指定对于某些类型(content-type)的HTTP响应使用gzip来进行压缩以减少网络传输量。

    (5)OpenSSL开发库如果我们的服务器不只是要支持HTTP,还需要在更安全的SSL协议上传输HTTP,那么就需要拥有OpenSSL了。另外,如果我们想使用MD5、SHA1等散列函数,那么也需要安装它。

    上面几个库都是Nginx 基础功能所必需的,为简单起见我们可以通过yum 命令统一安装;

    yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel

    2.2 安装

    (1)下载并解压:下载nginx 最新稳定版本;(http://nginx.org/en/download.html )

    wget http://nginx.org/download/nginx-1.14.0.tar.gz
    tar -zxvf nginx-1.14.0.tar.gz   #解压

    (2)将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录;

    mkdir -p /var/temp/nginx

    (3)进入到解压的目录,使用cofigure命令创建一个makeFile文件

    ./configure 
    --prefix=/usr/local/nginx 
    --pid-path=/var/run/nginx/nginx.pid 
    --lock-path=/var/lock/nginx.lock 
    --error-log-path=/var/log/nginx/error.log 
    --http-log-path=/var/log/nginx/access.log 
    --with-http_gzip_static_module 
    --http-client-body-temp-path=/var/temp/nginx/client 
    --http-proxy-temp-path=/var/temp/nginx/proxy 
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi 
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi 
    --http-scgi-temp-path=/var/temp/nginx/scgi 
    --with-http_stub_status_module 
    --with-http_ssl_module 
    --with-file-aio 
    --with-http_realip_module
    说明:--prefix=/usr/local/nginx  表示软件安装到/usr/local/nginx下面。

    (4)编译和安装

    make & make install

    (5)进入安装位置 /usr/local/nginx 查看目录结构下有 html、sbin、conf 目录;

     其中html是里面首页html文件。conf里面是配置文件。sbin里面只执行文件。

    (6)启动nginx

    进入sbin目录,执行命令;

    ./nginx

    (7) 查看 nginx 的启动

    ps -aux | grep nginx

    2.3 控制命令

    (1)查看命令帮助

    ./nginx -?

    (2)启动方式

    ./nginx     #默认方式启动
    ./nginx -c /tmp/nginx.conf     #指定配置文件启动
    ./nginx -p /usr/local/nginx/   #指定nginx程序目录启动

    (3)停止方式

    ./nginx -s stop      #强制停止
    ./nginx -s quit      #优雅停止

    (4)检查一下配置文件

    ./nginx -t

    (5)重新加载配置文件

    ./nginx -s reload

    (6)重新打开日志文件

    ./nginx -s reopen

    (7)设置全局命令,如下表示设置启动用户为root

    ./nginx -g "user root;"

    二、架构说明

      Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程;(CPU为几核就设置几个工作进程,效率最高);使用的是非阻塞的模型;用户通信是和 Master 进程去通信,然后交由工作进程去处理;

    架构说明

    (1)nginx启动时,会生不处理网络请求,主要负责调度工作进程,也就是图示的三项:加载配置、启动工作进程及非停升级。所以,nginx启动以后,查看操作系统的进程列表,我们就能看到至少有两个nginx进程。

    (2)服务器实际处理网络请求及响应的是工作进程(worker),在类unix系统上,nginx可以配置多个worker,而每个worker进程都可以同时处理数以千计的网络请求。

    (3)模块化设计。nginx的worker,包括核心和功能性模块,核心模块负责维持一个运行循环(run-loop),执行网络请求处理的不同阶段的模块功能,如网络读写、存储读写、内容传输、外出过滤,以及将请求发往上游服务器等。而其代码的模块化设计,也使得我们可以根据需要对功能模块进行适当的选择和修改,编译成具有特定功能的服务器。

    (4)事件驱动、异步及非阻塞,可以说是nginx得以获得高并发、高性能的关键因素,同时也得益于对Linux、Solaris及类BSD等操作系统内核中事件通知及I/O性能增强功能的采用,如kqueue、epoll及event ports。

      Nginx大量使用多路复用和事件通知,并且给不同的进程分配不同的任务。数量有限的工作进程(Worker)使用高效的单线程循环处理连接。每个worker进程每秒可以处理数千个并发连接、请求。

      Nginx模块可分为:核心、事件模块,阶段处理器,协议、变量处理器,过滤器,上游和负载均衡器等。

     

     三、Nginx的配置和使用

    1、配置文件的语法格式

    配置块:名称开头用大口号包裹其对应属性;

    属性:基于空格切分属性名与属性值,属性值可能有多个项,以空格进行切分, 如:access_log  logs/host.access.log  main

    参数:其配置在块名称与大括号之间,其值如果有多个也是通过空格进行拆;

    worker_processes  1;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;

    # 配置一个具体的站点 server { listen
    80; server_name localhost; location / { root html; index index.html index.htm; } location /nginx_status { stub_status on; access_log off; } }
        server {
          listen       80;
          server_name  www.baidu.com  www.qq.com  *.baidu.com  www.baidu.*;
    }
    }

    上面配置中的 events、http、server、location、upstream等属于配置项块。而worker_processes 、worker_connections、include、listen  属于配置项块中的属性,一个属性名可以有多个属性值,中间用空格分隔。   /nginx_status   属于配置块的特定参数。其中server块嵌套于http块,其可以直接继承访问Http块当中的参数。

    http 语句块只能有一个,http 中可以有多个 server (注意server和大括号之间有一个空格), server_name 配置的域名;

    listen 一样,按照 server_name去匹配:匹配的优先级一样,哪个在前就先匹配哪个;若都没有匹配到,就按照最前面的匹配;

    location为路径;

    Nginx的实践

    (1)nginx的配置文件,如下:

    worker_processes  1;
    pid        /usr/local/nginx/logs/nginx.pid;
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        #gzip  on;
    server { listen
    80; server_name www.yufeng.com; root /usr1/nginx/yufeng/; location / { index index.html index.htm; } location /old { alias /usr1/nginx/old_yufeng/; index index.html; } location = /old/baidu { proxy_pass http://www.baidu.com/; } location ~ .(png|jpg|gif|avi|mp4|css|js)$ { root /usr1/nginx/yufeng/static; } } server { listen 80; server_name 192.168.172.20; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }

    (2)目录及文件的实战

    a. 创建/usr1/nginx/yufeng/index.html文件,内容为;Hello, yufeng.com!!

    b. 创建 /usr1/nginx/yufeng/user/user.html 文件,内容为:Hello,User!

    c. 创建 /usr1/nginx/old_yufeng/index.html文件,内容为;Hello, old -- yufeng.com!!

    d. 创建 /usr1/nginx/old_yufeng/user/user.html文件,内容为;Hello,OLd -- User!

     

      

    root:站点根目录,绝对匹配,location下的root优先级高于server下的优先级;
    alias:站点别名,可以去除location中对应的前缀,只能配置在location下面;

     2、location 

    语法:location [=|~|~*|^~|@]/uri/{……}

     配置块 server

    •  =表示把URI作为字符串,以便与参数中的uri做完全匹配。(优先级最高)
    • ~表示正则匹配URI时是字母大小写敏感的。
    • / 基于uri目录匹配
    • ~表示正则匹配URI时是字母大小写敏感的。
    • ~*表示正则匹配URI时忽略字母大小写问题。
    • ^~表示正则匹配URI时只需要其前半部分与uri参数匹配即可。

     (1) = 示例:

    http {
        server {
            listen       80;
            server_name  www.yufeng.com;
            root /usr1/nginx/yufeng/;
            location / {
                index index.html index.htm;
            }
    
            location /old {
                alias /usr1/nginx/old_yufeng/;
                index index.html;
            }
    
            location = /old/baidu {
                proxy_pass http://www.baidu.com/;
            }
         }
    }

     (2)~ 正则匹配(大小写敏感)

    在nginx服务器上创建:/usr1/nginx/yufeng/static/st.css 文件;

    基于正则动静分离的匹配

    location ~ .(png|jpg|gif|avi|mp4|css|js)$ {
        root /usr1/nginx/yufeng/static;
    }

     匹配优先级: =  > 正则匹配 > 前缀最大匹配 > 配置靠前匹配

    (3)防盗链配置演示

    location ~ .(png|jpg|gif|avi|mp4|css|js)$ {
        root /usr1/nginx/yufeng/static;
    
        #防盗链的配置(只允许*.yufeng.com的域名访问)
        valid_referers none blocked *.yufeng.com;
        if ($invalid_referer) {
             return 403;
        }
    }

     

     (4)下载限速

    location /download {
        limit_rate 1m; //限制每S下载速度
        limit_rate_after 30m; // 超过30 之 后在下载
    }

    (5)创建 IP 黑名单

    #封禁指定IP
    deny 192.168.0.1;
    allow 192.168.0.1;
    #开放指定IP 段 allow
    192.168.0.0/24;
    #封禁所有 deny all;
    #开放所有 allow all;
    # 创建黑名单文件
    echo 'deny 192.168.0.132;' >> balck.ip
    #http 配置块中引入 黑名单文件 include black.ip;

    (6)日志格式配置(worker进程要有权限)

    nginx 的变量:http://nginx.org/en/docs/varindex.html

    日志格式:
    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; #基于域名打印日志 access_log logs/$host.access.log main;

    error日志的设置

    语法:error_log /path/file level;
    默认:error_log logs/error.log error;
    level是日志的输出级别,取值范围是debug、info、notice、warn、error、crit、alert、emerg;

    针对指定的客户端输出debug级别的日志

    语法:debug_connection[IP|CIDR]
    events {
      debug_connection 192.168.0.147; 
      debug_connection 10.224.57.0/200;
    }

    注意:debug 日志开启 必须在nginx安装时 添加  --with-debug (允许debug)

  • 相关阅读:
    Visio画出的图,裁剪成固定大小再添加马赛克的方法
    单张PPT转成单张PDF的PDF文件怎么设置打印出一页纸有6页PPT
    MVC下载电子表格到本地((导出表格4-4)
    获取配置文件(导出表格4-3)
    获取随机字符串(导出表格4-2)
    ExcelHelper 电子表格帮助类(导出表格4-1)
    二、操作NPOI_从数据库中导出数据到Excel_支持.xls格式
    一、操作NPOI从Excel中导入数据到SqlServer数据库中_xls格式
    Fetch(Promise微队列) 增删改查
    C#获取枚举的描述
  • 原文地址:https://www.cnblogs.com/yufeng218/p/12616770.html
Copyright © 2011-2022 走看看