关于linux:Nginx服务器-Nginx配置服务实战

38次阅读

共计 8031 个字符,预计需要花费 21 分钟才能阅读完成。

When you realize you want to spend the rest of your life with somebody,you want the rest of your life to start as soon as possible.<br/>
当你意识到想和某人共度余生时,便会巴不得下半场人生马上开始。——《当哈利遇到莎莉》1989

根本概述


或者当提前 80 端口和 443 端口的时候, 咱们就能想起对应的 Http 拜访 [基于 HTTP 协定] 和 Https 拜访[基于 HTTP 协定 +SSL 证书]。记忆中比拟粗浅的,就是开发微信小程序时, 对应域名配置述求,必须是备案认证通过的 Https 的服务。因而,在配置之前,咱们须要理解 Nginx 蕴含着那些模块以及配置规定, 工作原理能力更好地应用 Nginx 以及意识 Nginx。
Nginx 由内核和模块组成,其中,内核的设计十分渺小和简洁,实现的工作也非常简单,仅仅通过查找配置文件将客户端申请映射到一个 location block(location 是 Nginx 配置中的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令将会启动不同的模块去实现相应的工作。
Nginx 的模块从构造上分为外围模块、根底模块和第三方模块,HTTP 模块、EVENT 模块和 MAIL 模块等属于外围模块,HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块属于根本模块,而 HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块属于第三方模块,用户依据本人的须要开发的模块都属于第三方模块。正是有了这么多模块的撑持,Nginx 的性能才会如此弱小。
Nginx 由内核和模块组成,其中,内核的设计十分渺小和简洁,实现的工作也非常简单,仅仅通过查找配置文件将客户端申请映射到一个 location block(location 是 Nginx 配置中的一个指令,用于 URL 匹配),而在这个 location 中所配置的每个指令将会启动不同的模块去实现相应的工作。

Nginx 构造剖析

以 nginx-1.19.8 版本为例:

Nginx 的源码次要散布在 src/ 目录下,而 src/ 目录下次要蕴含三局部比拟重要的模块:

  • core:根底外围库和框架


Nginx 的外围源代码,包含罕用数据结构的以及 Nginx 内核实现的外围代码。

  • event:事件驱动模型


Nginx 事件驱动模型,以及定时器的实现相干代码。

  • http:HTTP 的模块


Nginx 实现 http 服务器相干的代码。

  • mail:邮件服务模块


Nginx 实现邮件代理服务器相干的代码。

  • misc:整合模块


辅助代码,测试 C ++ 头 的兼容性,以及对 Google_PerfTools 的反对。

  • os:零碎模块


不同体系统结构所提供的零碎函数的封装,提供对外对立的零碎调用接口。

  • stream:流解决模块


Nginx(tcp/udp)反向代理及与上游通信的根底模块。

Nginx 事件驱动模型


Nginx 提供反对的模型次要有 Select 库,Eventport 库,Poll 库,Epoll 库,Kqueue 库,Devpoll 库以及 Eventport 库等。

  • Select 库:在 linux 和 windows 平台都根本反对的 事件驱动模型库,并且在接口的定义也基本相同,只是局部参数的含意略有差别,最大并发限度 1024,只最晚期的事件驱动模型。
  • Poll 库: 在 Linux 的根本驱动模型,windows 不反对此驱动模型,是 select 的升级版,勾销了最大的并发限度,在编译 nginx 的时候能够应用 –with-poll_module 和 –without-poll_module 这两个指定是否编译 select 库。
  • Epoll 库:Nginx 服务器反对的最高性能的事件驱动库之一,是公认的十分优良的事件驱动模型,它和 select 和 poll 有很大的区别,epoll 是 poll 的升级版,然而与 poll 的效率有很大的区别.epoll 的解决形式是创立一个待处理的事件列表,而后把这个列表发给内核,返回的时候在去轮训查看这个表,以判断事件是否产生,epoll 反对一个过程关上的最大事件描述符的下限是零碎能够关上的文件的最大数,同时 epoll 库的 IO 效率不随描述符数目减少而线性降落,因为它只会对内核上报的“沉闷”的描述符进行操作。
  • Kqueue 库:用于反对 BSD 系列平台的高校事件驱动模型,次要用在 FreeBSD 4.1 及以上版本、OpenBSD 2.0 级以上版本,NetBSD 级以上版本及 Mac OS X 平台上,该模型也是 poll 库的变种,因而和 epoll 没有实质上的区别,都是通过防止轮训操作提供效率。
  • Devpoll 库:用于反对 unix 衍生平台的高效事件驱动模型,次要在 Solaris 平台、HP/UX,该模型是 sun 公司在开发 Solaris 系列平台的时候提出的用于实现事件驱动机制的计划,它应用了虚构的 /dev/poll 设施,开发人员将要见识的文件描述符退出这个设施,而后通过 ioctl()调用来获取事件告诉,因而运行在以上系列平台的时候请应用 /dev/poll 事件驱动机制。
  • Eventport 库:是 sun 公司在开发 Solaris 的时候提出的事件驱动库,只是 Solaris 10 以上的版本,该驱动库看避免内核解体等状况的产生。
Nginx 工作原理

Nginx 的模块从性能上分为三类,别离是:

  • Handlers(处理器模块): 间接解决申请,并进行输入内容和批改 headers 信息等操作。handlers 处理器模块个别只能有一个。
  • Filters -> 过滤器模块: 次要对其余处理器模块输入的内容进行批改操作,最初由 Nginx 输入。
  • Proxies-> 代理类模块: Nginx 的 HTTP Upstream 之类的模块,这些模块次要与后端一些服务比方 fastcgi 等操作交互,实现服务代理和负载平衡等性能。

在 Nginx 的模块下, 一次惯例的 HTTP 申请和响应的过程:

在工作形式上,Nginx 分为单工作过程和多工作过程两种模式:

  • 在单工作过程模式下,除主过程外,还有一个工作过程,工作过程是单线程的
  • 在多工作过程模式下,每个工作过程蕴含多个线程

Nginx 默认为单工作过程模式。Nginx 的模块间接被编译进 Nginx,因而属于动态编译形式。启动 Nginx 后,Nginx 的模块被主动加载,不像在 Apache 一样,首先将模块编译为一个 so 文件,而后在配置文件中指定是否进行加载。在解析配置文件时,Nginx 的每个模块都有可能去解决某个申请,然而同一个解决申请只能由一个模块来实现

Nginx 的 Http 模块



Nginx 罕用的模块:

  • ngx_http_access_module 模块 :只有 allow[容许拜访] 和 deny[回绝拜访]2 个值,个别用于设置和管制 IP 的申请,相似于网络黑名单的性能。
location / {
     root   html;
     index  index.html index.htm;
     allow 127.0.0.1;  ## 容许 127.0.0.1 拜访
     deny 127.0.0.1;    ## 回绝 127.0.0.1 拜访
}
  • ngx_http_auth_basic_module 模块:实现基于用户的访问控制,应用 basic 机制进行用户认证
location / {
     root   html;
     index  index.html index.htm;
     auth_basic  "Admin"; ## 认证对话框的提醒字符串显示的内容
     auth_basic_user_file /etc/nginx/conf/htpasswd; ## 寄存认证用的用户名和文件,须要用 htpasswd 命令生成
}

对于 htpasswd 的利用须要装置 httpd-tools:

yum install httpd-tools

应用命令生成:htpasswd -c /etc/nginx/conf/htpasswd nginx

[root@cotos-pivotal nginx]# htpasswd  -c /etc/nginx/conf/htpasswd nginx
New password: 
Re-type new password: 
Adding password for user nginx
  • ngx_http_stub_status_module 模块:用来查看 http 的状态信息的,应用形式间接在 location 外面加 stub_status
location / {
     root   html;
     index  index.html index.htm;
     auth_basic  "Admin"; ## 认证对话框的提醒字符串显示的内容
     auth_basic_user_file /etc/nginx/conf/htpasswd; ## 寄存认证用的用户名和文件,须要用 htpasswd 命令生成
         stub_status;
}

状态参数解析:

  • Active connections: 活动状态的连接数;
  • accepts:曾经承受的客户端申请的总数;
  • handled:曾经解决实现的客户端申请的总数;
  • requests:客户端发来的总的申请数;
  • Reading:处于读取客户端申请报文首部的连贯的连接数;
  • Writing:处于向客户端发送响应报文过程中的连接数;
  • Waiting:处于期待客户端发出请求的闲暇连接数;
  • ngx_http_log_module 模块:日志模块
  • ngx_http_gzip_module 模块:压缩模块,有利于传输数据的大小缩小,然而 cpu 应用会变高。因为要对传输的数据进行压缩
gzip  on;
gzip_comp_level 6;
gzip_min_length 64;
gzip_proxied any;
gzip_types text/xml text/css  application/javascript;   
  • ngx_http_ssl_module 模块:设置 https 连贯的模块
    server {
        listen       443 ssl;
        server_name  www.ice.com;
        root /var/www/html;
        ssl on; 
        ssl_certificate /usr/local/nginx/ssl/ssl.crt;
        ssl_certificate_key /usr/local/nginx/ssl/ssl.key;
        ssl_session_cache shared:sslcache:20m;
        location / {index  index.html index.htm;}
    }
  • ngx_http_rewrite_module 模块:重写指令

rewrite regex replacement [flag]:将用户申请的 URI 基于 regex 所形容的模式进行查看,匹配到时将其替换为 replacement 指定的新的 URI;
在同一级配置块中存在多个 rewrite 规定,那么会自下而下一一查看;被某条件规定替换实现后,会从新一轮的替换查看,因而,隐含有循环机制;[flag]所示意的标记位用于管制此循环机制;
其中:

  • last:如果规定有很多条。这里重写实现一次之后就会从新开始匹配规定,直至最初一条。也就是说。如果规定写的不好很容易造成死循环,不停的重写规定。
  • break:重写实现之后不再从头再次匹配规定。间接跳出循环
  • redirect:重写实现后以长期重定向形式间接返回重写后生成的新 URI 给客户端,由客户端从新发动申请;不能以 http:// 或 https:// 结尾;
  • permanent: 重写实现后以永恒重定向形式间接返回重写后生成的新 URI 给客户端,由客户端从新发动申请;
  • ngx_http_referer_module 模块:防盗链

定义 referer 首部的非法可用值:

  • none:申请报文首部没有 referer 首部
  • blocked:申请报文的 referer 首部没有值
  • server_names:参数,其能够有值作为主机名或主机名模式
  • arbitrary_string:间接字符串,但可应用 * 作通配符
  • regular expression:被指定的正则表达式模式匹配到的字符串;要应用~ 打头
valid_referers none block server_names *.pivotal.com ; 
if($invalid_referer) {return 403;}
  • ngx_http_headers_module 模块:向由代理服务器响应给客户端的响应报文增加自定义配置部

残缺的 Nginx 配置文件:

#Setting Nginx User Group
user  root;
#Setting Nginx Processes
worker_processes  1;
#Setting Nginx Max Nofile
worker_rlimit_nofile 51200;
#Setting Nginx Events
events {worker_connections  51200;}
#Setting Nginx Http
http {
    include       mime.types;
    default_type  application/octet-stream;
    #Setting Nginx FastCGI[防止 504 502 等]
    fastcgi_connect_timeout 600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    fastcgi_buffer_size 256k;
    fastcgi_buffers 16 256k;
    fastcgi_busy_buffers_size 512k;
    fastcgi_temp_file_write_size 512k;
    send_timeout 60000;
    client_header_buffer_size 64k;
    large_client_header_buffers 4 64k;
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;
    #keepalive_timeout  0;
    keepalive_timeout  120;
      #文件上传最大限度 50M 默认是 1m
    client_max_body_size 100m;
    #gzip  on;
    #Setting  Nginx Gzip
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
      #Setting Nginx Reverse Proxy [反向代理配置 负载平衡]
      #后盾零碎 web 层 tomcat 端口 monitor-8090
      upstream monitor.com{
    ip_hash;
    server localhost:8090 ;
    }
    #前台接口 web 层 tomcat 端口 proscenium-8091
    upstream proscenium.com{
    ip_hash;
    server localhost:8091;
    }
    #挪动接口 web 层 tomcat 端口 mobile-8092
    upstream mobile.com{
    ip_hash;
    server localhost:8092;
    }
    #后盾零碎 web 层 tomcat 端口 schedule-8093
    upstream schedule.com{
      ip_hash;
      server localhost:8093;
    }
    server {
         listen       80;
         server_name  localhost;
         #解决 websocket 申请
         location /monitor {
         #申请转向定义的服务器列表
         proxy_pass  http://monitor.com/zhimeng;
         add_header Access-Control-Allow-Origin *;
         add_header Access-Control-Allow-Headers X-Requested-With;
         add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         # 超时设置 默认 300s
         proxy_read_timeout 300s;
         proxy_send_timeout 300s;
        }
        location /proscenium {
        #申请转向定义的服务器列表
        proxy_pass  http://proscenium.com;
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Headers X-Requested-With;
        add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 超时设置 默认 300s
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
       }
        location /mobile {
       #申请转向定义的服务器列表
       proxy_pass  http://mobile.com;
       add_header Access-Control-Allow-Origin *;
       add_header Access-Control-Allow-Headers X-Requested-With;
       add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       # 超时设置 默认 300s
       proxy_read_timeout 300s;
       proxy_send_timeout 300s;
        }
        location /schedule {
       #申请转向定义的服务器列表
       proxy_pass  http://schedule.com/;
       add_header Access-Control-Allow-Origin *;
       add_header Access-Control-Allow-Headers X-Requested-With;
       add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       # 超时设置 默认 300s
       proxy_read_timeout 300s;
       proxy_send_timeout 300s;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {root   html;}
        location /staticFile {
        alias /root/repository/staticFile;
        autoindex on;
        autoindex_exact_size on;
        autoindex_localtime on;
       }
    }
}

版权申明:本文为博主原创文章,遵循相干版权协定,如若转载或者分享请附上原文出处链接和链接起源。

正文完
 0